Tính sẵn sàng cao của bộ định tuyến mysql

Đối với những mô hình dịch vụ cần đảm bảo tính sẵn sàng cao (High Availability – HA), thì việc hệ thống bị sập là không thể chấp nhận được. Hiện có rất nhiều phần mềm, giải pháp để đảm bảo tính HA cho các hệ thống nhưng mình sẽ giới thiệu phần mềm đơn giản nhất được keepalived với tính năng tự động chuyển đổi IP ảo (VIP) giữa các máy chủ theo mô hình Active/

Bạn nào học vẽ lý thuyết thì có thể thẳng xuống phần thực thi ở bên dưới hoặc làm theo cheatsheet này 😉
Link github

Giới thiệu về keepalived

Keepalived là một phần mềm định tuyến, được viết bằng ngôn ngữ C. Chương trình keepalived cho phép nhiều máy tính cùng chia sẻ một địa chỉ IP ảo với nhau theo mô hình Active – Passive (ta có thể cấu hình thêm một chút để chuyển thành mô hình Active – Active)

Khi người dùng cần truy cập vào dịch vụ, người dùng chỉ cần truy cập vào địa chỉ IP ảo sử dụng chung này vì phải truy cập vào địa chỉ IP thật của các thiết bị kia

Một số đặc điểm của phần mềm Keepalived

  • Keepalived không chắc chắn về tính ổn định của dịch vụ chạy trên máy chủ, nó chỉ chắc chắn rằng sẽ luôn có ít nhất một máy chủ chịu trách nhiệm cho IP sử dụng chung khi có sự cố xảy ra.
  • Keepalived thường được sử dụng để xây dựng các hệ thống HA (High Availability) sử dụng nhiều bộ định tuyến/tường lửa/máy chủ để đảm bảo hệ thống đang hoạt động liên tục
  • Keepalived sử dụng giao thức VRRP (Giao thức dự phòng bộ định tuyến ảo) để liên kết giữa các thiết bị trong nhóm
Giới thiệu về giao thức VRRP

Bộ định tuyến ảo đại diện cho một nhóm thiết bị sẽ có một IP ảo và một địa chỉ MAC (Kiểm soát truy cập phương tiện) cụ thể là 00-00-5E-00-01-XX. Trong đó, XX là số định danh của bộ định tuyến ảo – Virtual Router Identifier (VRID), mỗi bộ định tuyến ảo trong một mạng sẽ có một giá trị VRID khác nhau. Vào mỗi thời điểm định trước, chỉ có một bộ định tuyến vật lý sử dụng địa chỉ MAC ảo này. Khi có yêu cầu ARP gửi đến IP ảo, bộ định tuyến vật lý đó sẽ trả về địa chỉ MAC này

Các bộ định tuyến vật lý sử dụng chung VIP phải liên lạc với nhau bằng địa chỉ multicast 224. 0. 0. 18 bằng giao thức VRRP. Các vật lý của bộ định tuyến sẽ có mức ưu tiên (ưu tiên) trong khoảng từ 1 – 254 và bộ định tuyến có mức ưu tiên cao nhất sẽ thành Master, các bộ định tuyến còn lại sẽ thành Slave/Backup, hoạt động ở chế độ chờ.

Active mode

Như đã nói ở trên, các bộ định tuyến/máy chủ vật lý sử dụng chung VIP sẽ có 2 trạng thái là MASTER/ACTIVE và BACKUP/SLAVE. Cơ chế chuyển đổi dự phòng được xử lý bởi giao thức VRRP, khi khởi động dịch vụ, toàn bộ máy chủ sử dụng chung VIP sẽ được nhập vào một nhóm phát đa hướng. Nhóm multicast này được sử dụng để gửi/nhận các gói tin quảng bá VRRP. Các bộ định tuyến sẽ quảng bá mức độ ưu tiên (ưu tiên) của mình, máy chủ với mức độ ưu tiên cao nhất sẽ được chọn làm MASTER. Một khi nhóm đã có 1 MASTER thì MASTER này sẽ chịu trách nhiệm gửi các gói tin quảng bá VRRP định kỳ cho nhóm phát đa hướng

Nếu vì một sự cố nào đó mà các máy chủ BACKUP không nhận được các gói tin quảng bá từ MASTER trong một khoảng thời gian nhất định thì cả nhóm sẽ bầu ra một MASTER mới. MASTER mới này sẽ quản lý địa chỉ VIP của nhóm và gửi các gói tin ARP thông báo rằng nó đang giữ địa chỉ VIP này. Khi MASTER cũ đang hoạt động bình thường trở lại thì bộ định tuyến này có thể trở lại thành MASTER hoặc trở thành BACKUP tùy theo cấu hình ưu tiên của các bộ định tuyến

Configure

Trong mô hình này, ta sẽ có 2 bộ cân bằng tải chạy Nginx (bạn có thể chuyển đổi thành tùy chọn HAProxy) phân tải cho 2 máy chủ web Nginx ở phía sau. 2 bộ cân bằng tải này sẽ được cấu hình bằng chung một VIP. Bình thường thì VIP này sẽ cho nút Master phụ trách, nút Backup sẽ ở trạng thái chờ. Khi có sự cố xảy ra với node Master, node Backup sẽ nhận VIP này và chịu trách nhiệm phân tải về các backend server nằm sau

Tính sẵn sàng cao của bộ định tuyến mysql

Mô hình thử nghiệm với keepalived và nginx

Tính sẵn sàng cao của bộ định tuyến mysql

VIP sẽ được chuyển cho 1 Master khác nếu dịch vụ trên Master chính gặp sự cố

Để cài đặt dịch vụ keepalived trên yum, ta làm theo câu lệnh sau trên cả 2 nút

yum update
yum install gcc kernel-headers kernel-devel
yum install keepalived

Cấu hình cho phép gắn địa chỉ IP ảo lên thẻ mạng

echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p

Để cấu hình dịch vụ keepalived, ta cần phải chỉnh sửa tệp /etc/keepalived/keepalived. conf. Một số khối đáng chú ý trong tệp này như sau

  • global_defs. cấu hình toàn cầu cho keepalived dưới dạng gửi email thông báo tới đâu, tên của cụm đang cấu hình
  • vrrp_script. Chứa tập lệnh hoặc đường dẫn đến tập lệnh kiểm tra dịch vụ (Ví dụ. if this service down, keepalived will transfer VIP sang 1 server khác)
  • vrrp_instance. thông tin chi tiết về 1 máy chủ vật lý trong nhóm sử dụng chung VRRP. Bao gồm các thông tin như giao diện được sử dụng để liên lạc với máy chủ này, mức độ ưu tiên cho, IP ảo tương ứng với giao diện, cách thức chứng thực, tập lệnh kiểm tra dịch vụ…

Ta sẽ cấu hình cho 2 node dùng chung VIP 192. 168. 31. 10, keepalived sẽ kiểm tra trạng thái của tiến trình nginx trên nút MASTER để quyết định trạng thái của nút này. Configure pattern theo Active/Passive model

Nút MASTER

global_defs {
	vrrp_version 3
}

vrrp_script chk_nginx {
	# Check status of nginx main process
	script "pidof nginx"
	# Time interval
	interval 2
}

vrrp_instance VIP1 {
	state MASTER
	# Master priority (1-254)
	priority 200
	# VRRP sending interval
	advert_int 1
	
	virtual_router_id 11
	virtual_ipaddress
	{
		192.168.31.10/24 dev ens33 label ens33:vip_1
	}
	
	authentication
	{
		# Use IP-Sec Authentication Header
		# More secure than plain text password
		auth_type AH
		# The auth_pass will only use the first 8 characters entered.
		auth_pass aabbccdd
	}
	
	track_script 
	{
		chk_nginx
	}
}

SAO LƯU nút

global_defs {
	vrrp_version 3
}

vrrp_script chk_nginx {
	# Check status of nginx main process
	script "pidof nginx"
	# Time interval
	interval 2
}

vrrp_instance VIP1 {
	state BACKUP
	# Backup priority (1-254)
	priority 100
	# VRRP sending interval
	advert_int 1
	
	virtual_router_id 11
	virtual_ipaddress
	{
		192.168.31.10 dev ens33 label ens33:vip    
	}
	
	authentication
	{
		# Use IP-Sec Authentication Header
		# More secure than plain text password
		auth_type AH
		# The auth_pass will only use the first 8 characters entered.
		auth_pass aabbccdd
	}
	
	track_script 
	{
		chk_nginx
	}
}

Khởi động lại dịch vụ và kiểm tra nhật ký

# Start keepalived service on both VM #
systemctl start keepalived
systemctl enabled keepalived
systemctl status keepalived

# Check if keepalived works #
ip addr show
tail -f /var/log/messages | grep vrrp
tcpdump -vvv -n -i ens34 vrrp

# Allow VRRP traffice through iptables
iptables -I INPUT -p vrrp -j ACCEPT
iptables -I OUTPUT -p vrrp -j ACCEPT
Kết quả

Khởi động máy chủ Master

centos-master Keepalived_vrrp[1084]: VRRP_Script(chk_nginx) succeeded
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) Transition to MASTER STATE
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) Entering MASTER STATE
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) setting protocol VIPs.
centos-master Keepalived_vrrp[1084]: Sending gratuitous ARP on ens33 for 192.168.31.10
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) Sending/queueing gratuitous ARPs on ens33 for 192.168.31.10
centos-master Keepalived_vrrp[1084]: Sending gratuitous ARP on ens33 for 192.168.31.10
centos-master Keepalived_vrrp[1084]: Sending gratuitous ARP on ens33 for 192.168.31.10

Ta tắt thử dịch vụ nginx trên nút MASTER thì thấy nút này chuyển thành FAULT STATE, không còn giữ VIP nữa

centos-master systemd: Stopping nginx - high performance web server...
centos-master systemd: Stopped nginx - high performance web server.
centos-master Keepalived_vrrp[1084]: /usr/sbin/pidof nginx exited with status 1
centos-master Keepalived_vrrp[1084]: VRRP_Script(chk_nginx) failed
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP2) Now in FAULT state
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) Entering FAULT STATE
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) removing protocol VIPs.
centos-master Keepalived_vrrp[1084]: VRRP_Instance(VIP1) Now in FAULT state
centos-master ntpd[664]: Deleting interface #8 ens33:vip_1, 192.168.31.10#123, interface stats: received=0, sent=0, dropped=0, active_time=310 secs

Máy chủ BACKUP lúc này sẽ tự động chuyển sang MASTER và nhận VIP 192. 168. 31. 10. Node BACKUP sẽ gửi các gói tin quảng cáo ARP cho các nút khác biết rằng nó đang giữ VIP này

centos-minion1 Keepalived_vrrp[835]: VRRP_Instance(VIP1) Transition to MASTER STATE
centos-minion1 Keepalived_vrrp[835]: VRRP_Instance(VIP1) Entering MASTER STATE
centos-minion1 Keepalived_vrrp[835]: VRRP_Instance(VIP1) setting protocol VIPs.
centos-minion1 Keepalived_vrrp[835]: Sending gratuitous ARP on ens33 for 192.168.31.10
centos-minion1 Keepalived_vrrp[835]: VRRP_Instance(VIP1) Sending/queueing gratuitous ARPs on ens33 for 192.168.31.10
centos-minion1 Keepalived_vrrp[835]: Sending gratuitous ARP on ens33 for 192.168.31.10
centos-minion1 Keepalived_vrrp[835]: Sending gratuitous ARP on ens33 for 192.168.31.10

Khi dịch vụ nginx trên node MASTER đã được khởi động lại, node này quay về trạng thái MASTER

________số 8

Như vậy là ta đã cấu hình thành công chương trình keepalived theo cấu hình Active/Passive

Đang hoạt động/Thiết lập đang hoạt động

Cấu hình Active/Active setup cũng sẽ tương tự như mô hình Active/Passive. Tuy nhiên, bạn sẽ cần thêm 1 VIP (VRRP instance) nữa và thiết lập DNS Round Robin tới 2x VIP này

Do bài viết đã dài, bạn nào quan tâm có thể tham khảo thêm Ansible Role này của mình để tìm hiểu cách setup