Trong bài viết này, chúng tôi sẽ xem xét cấu hình chuyển đổi dự phòng khả dụng cao của hai máy chủ proxy mực (Linux) để truy cập Internet từ mạng LAN công ty. Để xây dựng cấu hình chuyển đổi dự phòng, chúng tôi sẽ tạo một cụm HA bằng cách sử dụng keepalived .
Một cụm HA là một nhóm các máy chủ có nhúng dự phòng để giảm thiểu thời gian ngừng hoạt động của ứng dụng trong trường hợp có sự cố phần cứng hoặc phần mềm của bất kỳ máy chủ nào trong nhóm. Theo định nghĩa này, những điều sau đây phải được thực hiện để hoạt động chính xác của một cụm HA:
- Kiểm tra trạng thái máy chủ;
- Tự động chuyển đổi tài nguyên trong trường hợp máy chủ bị lỗi.
Keepalived cho phép cả hai điều này. Giữ đủ tiêu chuẩn là một daemon hệ thống trong các hệ thống Linux cho phép chuyển đổi dự phòng dịch vụ và cân bằng tải. Chuyển đổi dự phòng được cung cấp bởi một địa chỉ IP nổi được chuyển sang một máy chủ khác nếu máy chủ chính bị lỗi. Để tự động chuyển đổi địa chỉ IP giữa các máy chủ, keepalived đang sử dụng VRRP (Giao thức dự phòng bộ định tuyến ảo - https://www.ietf.org/rfc/rfc2338.txt).
Nguyên tắc của VRRP
Trước hết, hãy xem xét một số lý thuyết và các định nghĩa VRRP chính.
- VIP - IP ảo, một địa chỉ IP ảo có thể tự động chuyển đổi giữa các máy chủ trong trường hợp bị lỗi;
- Master - máy chủ mà VIP hiện đang hoạt động;
- Sao lưu - các máy chủ VIP sẽ chuyển sang trong trường hợp Máy chủ bị lỗi;
- VRID - ID bộ định tuyến ảo, các máy chủ chia sẻ IP ảo (VIP) tạo thành cái gọi là bộ định tuyến ảo và số nhận dạng duy nhất của nó có thể có giá trị từ 1 đến 255. Một máy chủ có thể thuộc nhiều VRID tại một thời điểm, nhưng mọi VRID phải có một địa chỉ IP ảo duy nhất.
Thuật toán hoạt động cơ bản:
- Vào những khoảng thời gian cố định, máy chủ Chính sẽ gửi các gói VRRP ( nhịp tim s) đến địa chỉ đa hướng cụ thể 224.0.0.18 và tất cả máy chủ phụ lắng nghe địa chỉ này. Nhiều người có nghĩa là có một người gửi và nhiều người nhận; Gợi ý . Để làm cho máy chủ hoạt động ở chế độ đa hướng, thiết bị mạng của bạn phải hỗ trợ lưu lượng phát đa hướng.
- Nếu máy chủ Slave không nhận được bất kỳ gói nhịp tim nào, nó sẽ bắt đầu quy trình lựa chọn Master. Nếu máy chủ trở thành Master theo mức độ ưu tiên, nó sẽ kích hoạt VIP và gửi ARP vô cớ . ARP vô cớ là một loại phản hồi ARP đặc biệt giúp cập nhật bảng MAC trên thiết bị chuyển mạch mạng để thông báo về sự thay đổi của chủ sở hữu địa chỉ IP ảo và địa chỉ MAC để chuyển hướng lưu lượng truy cập đến.
Cài đặt và định cấu hình keepalived trên CentOS
Chúng tôi sẽ cài đặt và định cấu hình keepalived trên hai máy chủ Linux (proxy-serv01 và proxy-serv02) chạy CentOS 7 có cài đặt Squid. Trong lược đồ của chúng tôi, chúng tôi sẽ sử dụng phương pháp cân bằng tải đơn giản nhất - Round Robin DNS . Phương pháp này gợi ý rằng một tên DNS duy nhất có nhiều địa chỉ IP đã đăng ký và các máy khách nhận từng địa chỉ này. Vì vậy, chúng ta sẽ cần hai địa chỉ IP ảo được đăng ký cho một tên DNS (proxy-serv). Đây là sơ đồ mạng:
Mỗi máy chủ Linux có hai giao diện mạng vật lý: eth1 với địa chỉ IP công khai (màu trắng) và eth0 trong mạng cục bộ.
Các địa chỉ IP máy chủ sau được sử dụng như địa chỉ thực:
192.168.2.251 - cho proxy-server01192.168.2.252 - cho proxy-server02
Các địa chỉ IP sau sẽ được sử dụng làm địa chỉ ảo được tự động chuyển đổi giữa các máy chủ trong trường hợp bị lỗi:
192.168.2.101192.168.2.102Quan trọng . Khi bạn định cấu hình VRRP, không bao giờ sử dụng địa chỉ IP của máy chủ thực làm địa chỉ ảo, vì trong trường hợp máy chủ bị lỗi, địa chỉ của nó sẽ chuyển sang máy chủ tiếp theo và sau khi dự phòng, máy chủ đầu tiên có thể bị cô lập khỏi mạng. Vấn đề là để lấy lại địa chỉ IP, một máy chủ phải gửi các gói VRRP đến mạng, nhưng nó không có địa chỉ IP để thực hiện việc đó.
Bạn có thể cài đặt keepalived trên cả hai máy chủ bằng trình quản lý gói yum (hoặc dnf
trên CentOS 8):
# yum install keepalived
Sau khi hoàn tất cài đặt trên cả hai máy chủ, hãy thay đổi tệp cấu hình keepalived trên cả hai máy chủ:
# nano /etc/keepalived/keepalived.conf
Các dòng có các tham số khác nhau được đánh dấu:
proxy-serv01 | proxy-serv02 |
1 | 2 |
Hãy mô tả các tùy chọn chi tiết hơn:
- vrrp_instance
- là phần xác định phiên bản VRRP; - trạng thái
- là trạng thái nút ban đầu khi khởi động; - giao diện
- là giao diện VRRP đang chạy; - virtual_router_id
- là số nhận dạng phiên bản VRRP duy nhất, nó phải giống nhau trên tất cả các máy chủ; - ưu tiên
- đặt mức độ ưu tiên của máy chủ, máy chủ có mức độ ưu tiên cao hơn sẽ trở thành MÁY CHỦ; - virtual_ipaddress - là một khối địa chỉ IP ảo đang hoạt động trên máy chủ ở trạng thái MASTER. Chúng phải giống nhau trên tất cả các máy chủ bên trong phiên bản VRRP
Nếu cấu hình mạng hiện tại không cho phép sử dụng multicast, keepalived cung cấp tùy chọn unicast, i. e. Các gói VRRP heartbeat sẽ được gửi trực tiếp đến các máy chủ theo danh sách. Để sử dụng unicast, bạn sẽ cần các tùy chọn sau:
- unicast_src_ip - là địa chỉ nguồn cho các gói VRRP
- unicast_peer - là khối địa chỉ IP của máy chủ, nơi các gói VRRP sẽ được gửi đến.
Do đó, cấu hình của chúng tôi xác định hai phiên bản VRRP, proxy_ip1 và proxy_ip2. Ở hoạt động thông thường, proxy-serv01 sẽ là MASTER cho IP ảo 192.168.2.101 và DỰ PHÒNG cho 192.168.2.102 và ngược lại, proxy-serv02 sẽ là CHÍNH cho IP ảo 192.168.2.102 và DỰ PHÒNG cho 192.168.2.101.
Nếu tường lửa được kích hoạt trên máy chủ, bạn sẽ phải thêm quy tắc cho phép đối với lưu lượng phát đa hướng và VRRP bằ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ự động khởi động khi khởi động hệ thống và chạy nó trên cả hai máy chủ
# systemctl enable keepalived
# systemctl start keepalived
Sau khi keepalived đã được khởi động, địa chỉ IP ảo sẽ được gán cho các giao diện từ tệp cấu hình của bạn. Hãy xem địa chỉ IP eth0 hiện tại của các máy chủ:
# ip a show eth0
Trên proxy-serv01:
Trên proxy-serv02:
Cách Thực hiện Kiểm tra Tình trạng của Ứng dụng hoặc Giao diện với Keepalived?
Giao thức VRRP cung cấp khả năng giám sát trạng thái máy chủ. Ví dụ, điều này hữu ích trong trường hợp máy chủ vật lý bị lỗi hoặc cổng NIC của bộ chuyển mạch / máy chủ. Tuy nhiên, các vấn đề khác cũng có thể xảy ra:
- Lỗi máy chủ proxy (hoặc ứng dụng khác) - các máy khách truy cập vào địa chỉ ảo của máy chủ sẽ nhận được thông báo lỗi trong trình duyệt của họ rằng máy chủ proxy không khả dụng;
- Lỗi truy cập Internet của giao diện thứ hai - các máy khách truy cập vào địa chỉ ảo của máy chủ sẽ nhận được thông báo lỗi trong trình duyệt của họ rằng không thể thiết lập kết nối.
Để xử lý các tình huống được mô tả ở trên, hãy sử dụng các tùy chọn sau:
- track_interface - giám sát trạng thái giao diện và đặt trạng thái FAULT cho phiên bản VRRP nếu một trong các giao diện được liệt kê trong DOWN;
- track_script - thực hiện kiểm tra tình trạng ứng dụng HA của bạn bằng cách sử dụng tập lệnh trả về 0 nếu kiểm tra thành công hoặc 1 nếu kiểm tra không thành công.
Cập nhật cấu hình bằng cách thêm giám sát giao diện eth1 (theo mặc định, phiên bản VRRP sẽ kiểm tra giao diện mà nó bị ràng buộc:nó là eth0 trong cấu hình hiện tại).
track_interface {eth1}
Chỉ thị track_script chạy một tập lệnh với các tham số được xác định bởi khối vrrp_script ở định dạng sau:
vrrp_script{script <"đường dẫn đến tệp thực thi"> khoảng thời gian - chu kỳ chạy tập lệnh, 1 giây theo mặc định rơi- số lần tập lệnh được trả về một giá trị khác 0 để chuyển sang trạng thái FAULT tăng - số lần tập lệnh trả về giá trị 0 để thoát khỏi trạng thái FAULT (dự phòng) hết thời gian chờ- thời gian chờ đến khi tập lệnh trả về kết quả (nếu hết thời gian, tập lệnh trả về giá trị khác 0 value_ weight- giá trị, theo đó mức độ ưu tiên của máy chủ sẽ bị giảm trong trường hợp nó có trạng thái FAULT. Giá trị mặc định là 0, có nghĩa là máy chủ nhận được trạng thái FAULT sau khi tập lệnh bị lỗi trong một số lần được đặt trong tham số Fall}
Hãy định cấu hình kiểm tra tình trạng proxy Squid. Sử dụng lệnh này, bạn có thể kiểm tra xem quy trình mực có đang hoạt động hay không:
# squid -k check
Tạo vrrp_script chạy 3 giây một lần. Khối này được xác định bên ngoài khối vrrp_instance.
vrrp_script chk_squid_service {script "/ usr / sbin / ink -k check" khoảng 3}
Thêm tập lệnh này vào giám sát vào cả hai khối vrrp_instance:
track_script {chk_squid_service}
Nếu Squid không thành công, địa chỉ IP ảo sẽ được chuyển sang một máy chủ khác.
Bạn có thể chỉ định bất kỳ hành động bổ sung nào được thực hiện nếu trạng thái máy chủ thay đổi.
Nếu Squid được cấu hình để chấp nhận các kết nối từ bất kỳ giao diện nào, i. e. http_port 0.0.0.0:3128
, sẽ không có vấn đề gì xảy ra khi chuyển địa chỉ IP ảo và Squid sẽ chấp nhận các kết nối đến địa chỉ mới. Tuy nhiên, nếu các địa chỉ IP cụ thể được cấu hình, e. g:
http_port 192.168.2.101:3128http_port 192.168.2.102:3128
Squid sẽ không biết rằng một địa chỉ mới đã xuất hiện trong hệ thống để lắng nghe các yêu cầu của khách hàng. Để xử lý các tình huống khi một số hành động bổ sung là cần thiết khi địa chỉ IP ảo đã được chuyển đổi, keepalived cho phép chạy một tập lệnh nếu trạng thái máy chủ thay đổi, chẳng hạn như từ MASTER thành BACKUP hoặc ngược lại. Nó được triển khai bằng cách sử dụng tùy chọn này:
thông báo "đường dẫn đến tệp thực thi"
Kiểm tra chuyển đổi dự phòng đủ điều kiện trong trường hợp bị lỗi
Sau khi bạn đã định cấu hình các IP ảo, hãy đảm bảo rằng các lỗi được xử lý đúng cách. Kiểm tra đầu tiên là mô phỏng lỗi máy chủ. Tắt eth0 trên proxy-serv01 và nó sẽ ngừng gửi các gói nhịp tim VRRP. Proxy-serv02 phải kích hoạt địa chỉ IP ảo 192.168.2.101. Kiểm tra nó bằng lệnh sau:
# ip a show eth0
Trên proxy-serv01:
Trên proxy-serv02:
Như mong đợi, proxy-serv02 đã kích hoạt địa chỉ IP ảo 192.168.2.101. Hãy xem những gì đã được viết trong nhật ký bằng lệnh sau:
cat /var/log/messages | grep -i keepalived
trên proxy-serv01 | trên proxy-serv02 |
Keepalived_vrrp [xxxxx]:Kernel đang báo cáo:interface eth0 DOWNKeepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Nhập FAULT STATEKeepalived_vrrp [xxxxx]:VRRPxx_Instance (proxyP_ip1) loại bỏ giao thức VRRepali [VIPs_vrance] (proxy_ip1) Hiện ở trạng thái FAULT | Keepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Chuyển sang MASTER STATE |
Keepalived nhận được tín hiệu rằng eth0 đang ở trạng thái DOWN và đặt trạng thái FAULT cho phiên bản VRRP proxy_ip1, do đó giải phóng các địa chỉ IP ảo. | Keepalived đặt trạng thái MASTER cho phiên bản VRRP proxy_ip1, kích hoạt địa chỉ IP 192.168.2.101 trên eth0 và gửi ARP vô cớ. |
Và đảm bảo rằng khi bạn bật lại eth0 trên proxy-serv01, địa chỉ IP ảo 192.168.2.101 sẽ được chuyển trở lại.
trên proxy-serv01 | trên proxy-serv02 |
Keepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) bắt buộc một cuộc bầu cử MASTER mớiKeepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Chuyển sang MASTER STATEKeepalived_vreprp [xxxxx]:VRrpxx MASTER_ATE1Kr:VRrpxx Giao thức cài đặt VRRP_Instance (proxy_ip1) VIPs.Keepalived_vrrp [xxxxx]:Gửi ARP vô cớ trên eth0 cho 192.168.2.101 | Keepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Đã nhận quảng cáo có mức độ ưu tiên cao hơn 255, 100Keepalived_vrrp [xxxxx] của chúng tôi:VRRP_Instance (proxy_ip1) Đang nhập BACKUP STATE> |
Keepalived nhận được tín hiệu rằng eth0 đã trở lại và bắt đầu chọn MASTER cho phiên bản VRRP proxy_ip1. Sau khi nó đạt được trạng thái MASTER, máy chủ sẽ kích hoạt địa chỉ IP 192.168.2.101 trong eth0 và gửi ARP vô cớ. | Keepalived nhận gói có mức độ ưu tiên cao hơn cho phiên bản VRRP proxy_ip1, chuyển proxy_ip1 sang trạng thái DỰ PHÒNG và giải phóng địa chỉ IP. |
Kiểm tra thứ hai là mô phỏng lỗi giao diện mạng bên ngoài. Để làm điều đó, hãy tắt giao diện mạng bên ngoài eth1 trên proxy-serv01. Xem kết quả trong nhật ký.
trên proxy-serv01 | trên proxy-serv02 |
Keepalived_vrrp [xxxxx]:Kernel đang báo cáo:interface eth1 DOWNKeepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Đang nhập FAULT STATEKeepalived_vrrp [xxxxx]:VRRPxx_Instance (proxyP_ip1) loại bỏ giao thức VRRepali [VIPs_vrance] VRRepalived. (proxy_ip1) Hiện ở trạng thái FAULT | Keepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Chuyển sang MASTER STATEKeepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Vào MASTER STATEKeepalived_vrrp [xxxxx]:VRRP_Instance cài đặt giao thức [proxy xxxtu_itous] ARPKrpali trên eth0 cho 192.168.2.101 |
Keepalived nhận được tín hiệu rằng eth1 đang XUỐNG và đặt trạng thái FAULT cho phiên bản VRRP proxy_ip1, do đó giải phóng các địa chỉ IP ảo. | Keepalived đặt trạng thái MASTER cho phiên bản VRRP proxy_ip1, kích hoạt địa chỉ IP 192.168.2.101 trong eth0 và gửi ARP vô cớ. |
Kiểm tra thứ ba là mô phỏng lỗi Squid. Để thực hiện, hãy dừng dịch vụ theo cách thủ công bằng lệnh sau:
# systemctl stop squid
Xem kết quả trong nhật ký:
trên proxy-serv01 | trên proxy-serv02 |
Keepalived_vrrp [xxxxx]:VRRP_Script (chk_squid_service) failKeepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Đang nhập FAULT STATE ) Hiện ở trạng thái FAULT | Keepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Chuyển sang MASTER STATEKeepalived_vrrp [xxxxx]:VRRP_Instance (proxy_ip1) Vào MASTER STATEKeepalived_vrrp [xxxxx]:VRRP_Instance cài đặt giao thức [proxy xxxtu_itous] ARPKrpali trên eth0 cho 192.168.2.101 |
Tập lệnh kiểm tra hoạt động của dịch vụ proxy Squid trả về lỗi. Keepalived đặt trạng thái FAULT cho phiên bản VRRP proxy_ip1, do đó giải phóng các địa chỉ IP ảo. | Keepalived đặt trạng thái MASTER cho phiên bản VRRP proxy_ip1, kích hoạt địa chỉ IP 192.168.2.101 trong eth0 và gửi ARP vô cớ. |
Tất cả ba lần kiểm tra đều vượt qua thành công và keepalived được định cấu hình chính xác. Sau đó, chúng tôi sẽ định cấu hình cụm HA bằng Máy tạo nhịp tim và mô tả các tính năng của chúng.
Tệp cấu hình cuối cùng /etc/keepalived/keepalived.conf cho proxy-serv01 :
vrrp_script chk_squid_service {script "/ usr / sbin / ink -k check" khoảng 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}} / tệp cấu hình cuối cùng /keepalived.conf cho proxy-serv02 :
vrrp_script chk_squid_service {script "/ usr / sbin / ink -k check" khoảng 3} vrrp_instance proxy_ip1 {state BACKUP giao diện eth0 virtual_router_id 1 ưu tiên 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}}