Đố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ị down 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 là keepalived với tính năng tự động switch Virtual IP (VIP) giữa các máy chủ theo mô hình Active/Passive.

Bạn nào lười đọc lý thuyết thì có thể kéo thẳng xuống phần thực hành ở 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 dùng chung này thay vì phải truy cập vào những đị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 đảm bảo tính ổn định của dịch vụ chạy trên máy chủ, nó chỉ đảm bảo rằng sẽ luôn có ít nhất một máy chủ chịu trách nhiệm cho IP dùng chung khi có sự cố xảy ra.
  • Keepalived thường được dùng để dựng các hệ thống HA (High Availability) dùng nhiều router/firewall/server để đảm bảo hệ thống được hoạt động liên tục.
  • Keepalived dùng giao thức VRRP (Virtual Router Redundancy Protocol) để liên lạc giữa các thiết bị trong nhóm.

Giới thiệu về giao thức VRRP

Virtual router đại diện cho một nhóm thiết bị sẽ có một virtual IP và một đỉa chỉ MAC (Media Access Control) đặc biệt là 00-00-5E-00-01-XX. Trong đó, XX là số định danh của router ảo – Virtual Router Identifier (VRID), mỗi virtual router trong một mạng sẽ có một giá trị VRID khác nhau. Vào mỗi thời điểm nhất định, chỉ có một router vật lý dùng địa chỉ MAC ảo này. Khi có ARP request gởi tới virtual IP thì router vật lý đó sẽ trả về địa chỉ MAC này.

Các router 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 router vật lý sẽ có độ ưu tiên (priority) trong khoảng từ 1 – 254, và router có độ ưu tiên cao nhất sẽ thành Master, các router còn lại sẽ thành các Slave/Backup, hoạt động ở chế độ chờ.

Cơ chế hoạt động

Như đã nói ở trên, các router/server vật lý dùng chung VIP sẽ có 2 trạng thái là MASTER/ACTIVEBACKUP/SLAVE. Cơ chế failover được xử lý bởi giao thức VRRP, khi khởi động dịch vụ, toàn bộ các server dùng chung VIP sẽ gia nhập vào một nhóm multicast. Nhóm multicast này dùng để gởi/nhận các gói tin quảng bá VRRP. Các router sẽ quảng bá độ ưu tiên (priority) của mình, server với độ ư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 multicast.

Nếu vì một sự cố gì đó mà các server 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ẽ tiếp quản địa chỉ VIP của nhóm và gởi các gói tin ARP báo là nó đang giữ địa chỉ VIP này. Khi MASTER cũ hoạt động bình thường trở lại thì router này có thể lại trở thành MASTER hoặc trở thành BACKUP tùy theo cấu hình độ ưu tiên của các router.

Cấu hình

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

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

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 node

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

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

  • global_defs: cấu hình global cho keepalived như gởi email thông báo tới đâu, tên của cluster đang cấu hình.
  • vrrp_script: chứa script hoặc đường dẫn tới script kiểm tra dịch vụ (Ví dụ: nếu dịch vụ này down thì keepalived sẽ chuyển VIP sang 1 server khác).
  • vrrp_instance: thông tin chi tiết về 1 server vật lý trong nhóm dùng chung VRRP. Gồm các thông tin như interface dùng để liên lạc của server này, độ ưu tiên để, virtual IP tương ứng với interface, cách thức chứng thực, script 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 process nginx trên node MASTER để quyết định trạng thái của node này. Cấu hình mẫu theo mô hình Active/Passive:

Node MASTER

Node BACKUP

Khởi động lại dịch vụ và kiểm tra log

Kết quả

Khởi động server Master

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

BACKUP server 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 bá ARP cho những node khác biết là nó đang giữ VIP này.

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

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

Bạn có thể cấu hình nâng cao thành mô hình Active/Active với 2 Virtual IP bằng cách tham khảo thêm file cấu hình của mình tại đây: GitHub

LEAVE A REPLY

Please enter your comment!
Please enter your name here