Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Trong bài viết này, chúng ta sẽ xem cấu hình failover high-available của hai squid (Linux) proxy server để truy cập Internet từ LAN doanh nghiệp. Để xây dựng cấu hình failover, chúng ta sẽ tạo HA cluster dùng keepalived.
Một HA cluster là nhóm server với dự phòng nhúng để giảm thiểu downtime ứng dụng nếu có sự cố phần cứng hoặc phần mềm của bất kỳ server nào trong nhóm. Theo định nghĩa này, sau đây phải triển khai cho hoạt động đúng của HA cluster:

  • Kiểm tra trạng thái server;
  • Chuyển đổi tài nguyên tự động nếu server lỗi.

Keepalived cho phép cả hai. Keepalived là system daemon trong hệ thống Linux cho phép failover dịch vụ và cân bằng tải. Failover được cung cấp bằng địa chỉ IP floating chuyển sang server khác nếu server chính lỗi. Để tự động chuyển địa chỉ IP giữa các server, keepalived dùng VRRP (Virtual Router Redundancy Protocol — https://www.ietf.org/rfc/rfc2338.txt).

Nguyên lý VRRP

Trước hết, hãy xem lý thuyết và định nghĩa chính VRRP.

  • VIP — Virtual IP, địa chỉ IP ảo có thể tự động chuyển giữa các server nếu lỗi;
  • Master — server VIP đang hoạt động;
  • Backup — server VIP sẽ chuyển sang nếu Master lỗi;
  • VRID — Virtual Router ID, các server chia sẻ IP ảo (VIP) tạo thành một virtual router và định danh duy nhất có giá trị 1-255. Một server có thể thuộc nhiều VRID cùng lúc, nhưng mỗi VRID phải có địa chỉ IP ảo duy nhất.

Thuật toán hoạt động cơ bản:

  • Khoảng thời gian cố định, Master server gửi gói VRRP (heartbeats) đến địa chỉ multicast 224.0.0.18, và tất cả slave server lắng nghe địa chỉ này. Multicast nghĩa là một người gửi và nhiều người nhận;Mẹo. Để server hoạt động chế độ multicast, thiết bị mạng phải hỗ trợ traffic multicast.
  • Nếu Slave server không nhận gói heartbeat, nó bắt đầu thủ tục chọn Master. Nếu server thành Master theo priority, nó sẽ kích hoạt VIP và gửi gratuitous ARP. Gratuitous ARP là loại ARP response đặc biệt cập nhật bảng MAC trên switch để thông báo thay đổi chủ sở hữu Virtual IP và địa chỉ MAC để chuyển hướng traffic.

Cài đặt và cấu hình keepalived trên CentOS

Chúng ta sẽ cài đặt và cấu hình keepalived trên hai máy chủ Linux (proxy-serv01 và proxy-serv02) chạy CentOS 7 với Squid cài đặt. Trong sơ đồ, dùng phương pháp load balancing đơn giản — Round Robin DNS. Phương pháp này gợi ý một tên DNS có nhiều IP đăng ký, và client nhận địa chỉ lần lượt. Vì vậy cần hai địa chỉ IP ảo đăng ký cho một tên DNS (proxy-serv). Sơ đồ mạng:

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Mỗi server Linux có hai giao diện mạng vật lý: eth1 với IP public (trắng) và eth0 trong mạng cục bộ.

Các địa chỉ IP server dùng làm real:

192.168.2.251 — cho proxy-server01
192.168.2.252 — cho proxy-server02

Các địa chỉ IP sau dùng làm ảo, tự động chuyển giữa server nếu lỗi:

192.168.2.101
192.168.2.102
Quan trọng. Khi cấu hình VRRP, không bao giờ dùng IP server thật làm IP ảo, vì nếu server lỗi địa chỉ sẽ chuyển sang server tiếp theo, và sau failback server đầu có thể bị cô lập mạng. Vấn đề là để lấy lại IP, server phải gửi gói VRRP, nhưng nó không có IP để làm vậy.

Bạn có thể cài keepalived trên cả hai server dùng yum package manager (hoặc dnf trên CentOS 8):

# yum install keepalived

Sau khi cài xong trên cả hai server, thay đổi file cấu hình keepalived trên cả hai server:

# nano /etc/keepalived/keepalived.conf

Các dòng với tham số khác nhau được highlight:

proxy-serv01 proxy-serv02
Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Mô tả chi tiết tùy chọn:

  1. vrrp_instance <name> — phần định nghĩa instance VRRP;
  2. state <MASTER|BACKUP> — trạng thái node ban đầu khi khởi động;
  3. interface <interface name> — giao diện VRRP chạy trên đó;
  4. virtual_router_id <number from 0 to 255> — định danh duy nhất instance VRRP, phải giống nhau trên tất cả server;
  5. priority <number from 0 to 255> — đặt priority server, server priority cao hơn thành MASTER;
  6. virtual_ipaddress — khối địa chỉ IP ảo hoạt động trên server ở trạng thái MASTER. Phải giống nhau trên tất cả server trong instance VRRP
Lưu ý. Bạn có thể thấy nhiều ví dụ dùng tùy chọn authentication trong cấu hình VRRP. Tuy nhiên, tài liệu keepalived nhắc authentication đã bị loại khỏi VRRPv2 trong RFC3768 (https://tools.ietf.org/html/rfc3768) năm 2004, vì không cung cấp bảo mật thực. Không khuyến khích dùng tùy chọn này.

Nếu cấu hình mạng hiện tại không cho dùng multicast, keepalived cung cấp tùy chọn unicast, ví dụ gói VRRP heartbeat gửi trực tiếp đến server theo danh sách. Để dùng unicast, cần các tùy chọn:

  • unicast_src_ip — địa chỉ nguồn cho gói VRRP
  • unicast_peer — khối IP server, gói VRRP sẽ gửi đến.

Vậy cấu hình xác định hai instance VRRP, proxy_ip1 và proxy_ip2. Khi hoạt động bình thường, proxy-serv01 sẽ là MASTER cho IP ảo 192.168.2.101 và BACKUP cho 192.168.2.102, và ngược lại, proxy-serv02 sẽ là MASTER cho IP ảo 192.168.2.102, và BACKUP cho 192.168.2.101.

Nếu tường lửa được bật trên server, bạn phải thêm quy tắc cho phép traffic multicast và VRRP dùng iptables:

# iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p vrrp -i eth0 -j ACCEPT

Bật dịch vụ keepalived tự khởi động và chạy trên cả hai server:

# systemctl enable keepalived
# systemctl start keepalived

Sau khi keepalived khởi động, IP ảo sẽ được gán cho giao diện từ file cấu hình. Xem IP hiện tại eth0 trên server:

# ip a show eth0

Trên proxy-serv01:

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Trên proxy-serv02:

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Cách thực hiện Healthcheck ứng dụng hoặc giao diện với Keepalived?

Giao thức VRRP cung cấp giám sát trạng thái server. Ví dụ, hữu ích nếu lỗi server vật lý hoặc cổng switch/server NIC. Tuy nhiên, vấn đề khác cũng có thể xảy ra:

  • Lỗi proxy server (hoặc app khác) — client truy cập địa chỉ ảo server sẽ nhận lỗi proxy unavailable;
  • Lỗi truy cập Internet của giao diện thứ hai — client nhận lỗi không thể thiết lập kết nối.

Để xử lý các tình huống trên, dùng các tùy chọn:

  • track_interface — giám sát trạng thái giao diện, đặt trạng thái FAULT cho instance VRRP nếu giao diện liệt kê DOWN;
  • track_script — thực hiện healthcheck ứng dụng HA dùng script trả về 0 nếu check thành công, hoặc 1 nếu thất bại.

Cập nhật cấu hình thêm giám sát giao diện eth1 (mặc định instance VRRP kiểm tra giao diện nó gắn: eth0 trong cấu hình hiện tại).

track_interface { eth1 }

Chỉ thị track_script chạy script với tham số xác định bởi khối vrrp_script theo định dạng:

vrrp_script <name> {
  script <"path to the executable file">
  interval <number, seconds> - chu kỳ chạy script, 1 giây mặc định
  fall <number> - số lần script trả về giá trị khác 0 để chuyển sang FAULT
  rise <number> - số lần script trả về 0 để thoát FAULT (failback)
  timeout <number> - thời gian chờ script trả kết quả (hết giờ trả non-zero)
  weight <number> - giá trị giảm priority server nếu vào FAULT. Mặc định 0, nghĩa là server vào FAULT sau số lần fall
}

Cấu hình health check Squid proxy. Dùng lệnh sau kiểm tra tiến trình squid hoạt động:

# squid -k check

Tạo vrrp_script chạy 3 giây/lần. Khối này định nghĩa bên ngoài vrrp_instance.

vrrp_script chk_squid_service {
  script "/usr/sbin/squid -k check"
  interval 3
}

Thêm script giám sát vào cả hai khối vrrp_instance:

track_script { chk_squid_service }

Nếu Squid lỗi, IP ảo sẽ chuyển sang server khác.

Bạn có thể chỉ định hành động bổ sung khi trạng thái server thay đổi.

Nếu Squid cấu hình chấp nhận kết nối từ bất kỳ giao diện, ví dụ http_port 0.0.0.0:3128, không vấn đề khi IP ảo chuyển, Squid sẽ chấp nhận kết nối đến địa chỉ mới. Tuy nhiên, nếu IP cụ thể được cấu hình, ví dụ:

http_port 192.168.2.101:3128
http_port 192.168.2.102:3128

Squid sẽ không biết địa chỉ mới xuất hiện để lắng nghe yêu cầu client. Để xử lý khi cần hành động bổ sung khi IP ảo chuyển, keepalived cho phép chạy script nếu trạng thái server thay đổi, ví dụ từ MASTER sang BACKUP, hoặc ngược lại. Triển khai bằng tùy chọn:

notify "path to the executable file"

Kiểm tra Keepalived Failover khi có sự cố

Sau cấu hình IP ảo, đảm bảo sự cố được xử lý đúng. Kiểm tra đầu tiên mô phỏng lỗi server. Tắt eth0 trên proxy-serv01, nó sẽ ngừng gửi gói VRRP heartbeat. proxy-serv02 phải kích hoạt IP ảo 192.168.2.101. Kiểm tra bằng lệnh:

# ip a show eth0

Trên proxy-serv01:

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Trên proxy-serv02:

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Như kỳ vọng, proxy-serv02 kích hoạt IP ảo 192.168.2.101. Xem log bằng lệnh:

cat /var/log/messages | grep -i keepalived

trên proxy-serv01 trên proxy-serv02
Keepalived_vrrp[xxxxx]: Kernel is reporting: interface eth0 DOWN
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering FAULT STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Now in FAULT state
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived nhận tín hiệu eth0 DOWN và đặt FAULT cho proxy_ip1 VRRP instance, giải phóng IP ảo. Keepalived đặt MASTER cho proxy_ip1 VRRP instance, kích hoạt IP 192.168.2.101 trên eth0 và gửi gratuitous ARP.

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Đảm bảo khi bật eth0 trên proxy-serv01 lại, IP ảo 192.168.2.101 chuyển về.

trên proxy-serv01 trên proxy-serv02
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) forcing a new MASTER election
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering MASTER STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) setting protocol VIPs.
Keepalived_vrrp[xxxxx]: Sending gratuitous ARP on eth0 for 192.168.2.101
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Received advert with higher priority 255, ours 100
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering BACKUP STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived nhận tín hiệu eth0 lên và bắt đầu chọn MASTER cho proxy_ip1 VRRP instance. Sau khi đạt MASTER, server kích hoạt IP 192.168.2.101 trên eth0 và gửi gratuitous ARP. Keepalived nhận gói priority cao hơn cho proxy_ip1 VRRP instance, chuyển proxy_ip1 sang BACKUP và giải phóng IP.

Kiểm tra thứ hai mô phỏng lỗi giao diện mạng bên ngoài. Tắt giao diện eth1 trên proxy-serv01. Xem kết quả trong log.

trên proxy-serv01 trên proxy-serv02
Keepalived_vrrp[xxxxx]: Kernel is reporting: interface eth1 DOWN
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering FAULT STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Now in FAULT state
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering MASTER STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) setting protocol VIPs.
Keepalived_vrrp[xxxxx]: Sending gratuitous ARP on eth0 for 192.168.2.101
Keepalived nhận tín hiệu eth1 DOWN và đặt FAULT cho proxy_ip1 VRRP instance, giải phóng IP ảo. Keepalived đặt MASTER cho proxy_ip1 VRRP instance, kích hoạt IP 192.168.2.101 trên eth0 và gửi gratuitous ARP.

Keepalived: Cấu hình High Availability với IP Failover trên CentOS/RHEL

Kiểm tra thứ ba mô phỏng lỗi Squid. Dừng service thủ công:

# systemctl stop squid

Xem kết quả trong log:

trên proxy-serv01 trên proxy-serv02
Keepalived_vrrp[xxxxx]: VRRP_Script(chk_squid_service) failed
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering FAULT STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) removing protocol VIPs.
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Now in FAULT state
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Transition to MASTER STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) Entering MASTER STATE
Keepalived_vrrp[xxxxx]: VRRP_Instance(proxy_ip1) setting protocol VIPs.
Keepalived_vrrp[xxxxx]: Sending gratuitous ARP on eth0 for 192.168.2.101
Script kiểm tra hoạt động Squid proxy trả lỗi. Keepalived đặt FAULT cho proxy_ip1 VRRP instance, giải phóng IP ảo. Keepalived đặt MASTER cho proxy_ip1 VRRP instance, kích hoạt IP 192.168.2.101 trên eth0 và gửi gratuitous ARP.

Ba kiểm tra đều pass, keepalived cấu hình đúng. Sau chúng ta sẽ cấu hình HA cluster dùng Pacemaker và so sánh tính năng.

File cấu hình cuối /etc/keepalived/keepalived.conf cho proxy-serv01:

vrrp_script chk_squid_service {
  script "/usr/sbin/squid -k check"
  interval 3
}
vrrp_instance proxy_ip1 {
  state MASTER
  interface eth0
  virtual_router_id 1
  priority 255
  virtual_ipaddress {
    192.168.2.101/24 dev eth0 label eth0:1
  }
  track_interface { eth1 }
  track_script { chk_squid_service }
}
vrrp_instance proxy_ip2 {
  state BACKUP
  interface eth0
  virtual_router_id 2
  priority 100
  virtual_ipaddress {
    192.168.2.102/24 dev eth0 label eth0:2
  }
  track_interface { eth1 }
  track_script { chk_squid_service }
}

File cấu hình cuối /etc/keepalived/keepalived.conf cho proxy-serv02:

vrrp_script chk_squid_service {
  script "/usr/sbin/squid -k check"
  interval 3
}
vrrp_instance proxy_ip1 {
  state BACKUP
  interface eth0
  virtual_router_id 1
  priority 100
  virtual_ipaddress {
    192.168.2.101/24 dev eth0 label eth0:1
  }
  track_interface { eth1 }
  track_script { chk_squid_service }
}
vrrp_instance proxy_ip2 {
  state MASTER
  interface eth0
  virtual_router_id 2
  priority 255
  virtual_ipaddress {
    192.168.2.102/24 dev eth0 label eth0:2
  }
  track_interface { eth1 }
  track_script { chk_squid_service }
}