Pacemaker
, Corosync
và pcsd
là các thành phần chính của một cụm Linux để đảm bảo tính sẵn sàng cao (High Availability – HA).
Trong hướng dẫn này, mình sẽ hướng dẫn bạn từng bước về cách tạo High Availability Nginx với Pacemaker, Corosync và Pcsd, mình sẽ tạo server web Nginx Active-Passive Cluster hoặc Failover-cluster bằng Pacemaker trên hệ thống Ubuntu 20.04.
Pacemaker: Đây là một dịch vụ quản lý cụm, nó quản lý việc khởi động và dừng các dịch vụ, phát hiện và khắc phục sự cố, và quản lý việc chuyển đổi dịch vụ giữa các nút cụm.
Corosync: Đây là một dịch vụ cung cấp giao tiếp giữa các nút trong cụm. Nó đảm bảo rằng tất cả các nút trong cụm đều có cùng một quan điểm về trạng thái cụm.
pcsd (Pacemaker/Corosync Configuration System Daemon): Đây là một giao diện web, cli và dịch vụ RESTful cho Pacemaker. Nó cho phép bạn quản lý và cấu hình cụm từ một giao diện web hoặc thông qua các lệnh RESTful.
Sự kết hợp của ba phần mềm này tạo nên một giải pháp HA mạnh mẽ cho Linux, cho phép bạn quản lý và duy trì tính sẵn sàng cao cho các dịch vụ quan trọng.
Điều kiện tiên quyết
- Hai hoặc nhiều server Ubuntu 20.04
- webserver-01 192.168.13.231
- webserver-02 192.168.13.232
- webserver-03 192.168.13.233
- Virtual_ip: 192.168.13.230
- Quyền root
Bước 1 – Trỏ file host (áp dụng cho cả 3 server webserver-01, webserver-02, webserver-03).
Bước đầu tiên chúng ta phải làm là chỉnh sửa file host trên mỗi server để ánh xạ tên server của tất cả các server. Chúng ta có các server ‘webserver-01’, ‘webserver-02’ và ‘webserver-03’, bạn hãy đăng nhập vào từng server bằng tài khoản ssh và chạy lệnh dưới.
echo '''192.168.13.231 webserver-01.hoanghd.com
192.168.13.232 webserver-02.hoanghd.com
192.168.13.233 webserver-03.hoanghd.com'''>> /etc/hosts
Bây giờ hãy kiểm tra cấu hình ánh xạ của server đảm bảo ‘webserver-01’, ‘webserver-02’ và ‘webserver-03’ được ánh xạ tới các địa chỉ IP chính xác.
shell> ping webserver-01.hoanghd.com
PING webserver-01.hoanghd.com (192.168.13.231) 56(84) bytes of data.
64 bytes from webserver-01.hoanghd.com (192.168.13.231): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from webserver-01.hoanghd.com (192.168.13.231): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from webserver-01.hoanghd.com (192.168.13.231): icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from webserver-01.hoanghd.com (192.168.13.231): icmp_seq=4 ttl=64 time=0.049 ms
--- webserver-01.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3074ms
rtt min/avg/max/mdev = 0.025/0.050/0.082/0.020 ms
$ ping webserver-02.hoanghd.com
PING webserver-02.hoanghd.com (192.168.13.232) 56(84) bytes of data.
64 bytes from webserver-02.hoanghd.com (192.168.13.232): icmp_seq=1 ttl=64 time=0.502 ms
64 bytes from webserver-02.hoanghd.com (192.168.13.232): icmp_seq=2 ttl=64 time=0.658 ms
64 bytes from webserver-02.hoanghd.com (192.168.13.232): icmp_seq=3 ttl=64 time=0.564 ms
64 bytes from webserver-02.hoanghd.com (192.168.13.232): icmp_seq=4 ttl=64 time=0.550 ms
--- webserver-02.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3058ms
rtt min/avg/max/mdev = 0.502/0.568/0.658/0.056 ms
$ ping webserver-03.hoanghd.com
PING webserver-03.hoanghd.com (192.168.13.233) 56(84) bytes of data.
64 bytes from webserver-03.hoanghd.com (192.168.13.233): icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from webserver-03.hoanghd.com (192.168.13.233): icmp_seq=2 ttl=64 time=0.547 ms
64 bytes from webserver-03.hoanghd.com (192.168.13.233): icmp_seq=3 ttl=64 time=0.487 ms
64 bytes from webserver-03.hoanghd.com (192.168.13.233): icmp_seq=4 ttl=64 time=0.483 ms
--- webserver-03.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3045ms
rtt min/avg/max/mdev = 0.483/0.667/1.154/0.281 ms
Bước 2: Cài đặt và cấu hình Nginx (áp dụng cho cả 3 server webserver-01, webserver-02, webserver-03).
Trong bước này, chúng ta sẽ cài đặt server web Nginx.
sudo apt install nginx -y
Sau khi quá trình cài đặt hoàn tấ, bạn hãy khởi động Nginx và cho phép tất Nginx tự động khởi chạy khi khởi động hệ thống.
sudo systemctl start nginx
sudo systemctl enable nginx
Để dễ phân biệt website đang chạy ở server nào, bạn hãy thay đổi nội dung website mặc định trên mỗi server bằng một trang mới.
#Chạy Lệnh trên 'webserver-01'
echo 'Chào mừng bạn đến với website 01 của Hà Đăng Hoàng' | sudo tee
#Chạy Lệnh trên 'webserver-02'
echo 'Chào mừng bạn đến với website 02 của Hà Đăng Hoàng' | sudo tee /var/www/html/index.nginx-debian.html
#Run Command on 'webserver-03'
echo 'Chào mừng bạn đến với website 03 của Hà Đăng Hoàng' | sudo tee /var/www/html/index.nginx-debian.html
Bước 3 – Cài đặt và cấu hình Pacemaker, Corosync và Pcsd (áp dụng cho cả 3 server webserver-01, webserver-02, webserver-03).
Pacemaker, Corosync và Pcsd có sẵn trong kho lưu trữ hệ thống mặc định. Vì vậy, tất cả chúng có thể được cài đặt từ kho lưu trữ Ubuntu bằng lệnh apt như sau.
sudo apt install corosync pacemaker pcs -y
Sau khi quá trình cài đặt hoàn tất, hãy cho phép tất cả các dịch vụ tự động khởi chạy khi khởi động hệ thống bằng các lệnh systemctl bên dưới.
sudo systemctl enable pcsd
sudo systemctl enable corosync
sudo systemctl enable pacemaker
Hãy khởi động dịch vụ pcsd Pacemaker trên tất cả các server.
sudo systemctl start pcsd
Tiếp theo, tạo một mật khẩu mới cho người dùng ‘hacluster’ và sử dụng cùng một mật khẩu cho tất cả các server. Người dùng này đã được tạo tự động trong quá trình cài đặt phần mềm.
echo 'hacluster:Hoanghd164' | chpasswd
Bước 4: Tạo và cấu hình 1 cluster mới (chỉ chạy trên webserver-01).
Trong bước này, chúng ta sẽ tạo một cluster mới với 3 server chạy Ubuntu 20.04. Sau đó cấu hình virtual_ip và thêm mới resources Nginx.
Để tạo cluster, chúng ta cần cấp quyền cho tất cả các server bằng lệnh pcs và người dùng hacluster. Cấp quyền cho tất cả các server bằng lệnh pcs, hãy sử dụng username và password của hacluster để xác nhận.
shell> sudo pcs cluster auth
Warning: Unable to read the known-hosts file: No such file or directory: '/var/lib/pcsd/known-hosts'
node1: Not authorized
Nodes to authorize: node1
Username: hacluster
Password:
node1: Authorized
Cấp quyền cho tất cả các server bằng lệnh pcs, username và password của hacluster để xác nhận.
shell> pcs host auth webserver-01.hoanghd.com webserver-02.hoanghd.com webserver-03.hoanghd.com
Username: hacluster
Password:
webserver-01.hoanghd.com: Authorized
webserver-02.hoanghd.com: Authorized
webserver-03.hoanghd.com: Authorized
Bây giờ là lúc thiết lập cluster. Xác định tên cluster và tất cả các server sẽ là một phần của cluster.
shell> pcs cluster setup ha_cluster webserver-01.hoanghd.com webserver-02.hoanghd.com webserver-03.hoanghd.com --force
No addresses specified for host 'webserver-01.hoanghd.com', using 'webserver-01.hoanghd.com'
No addresses specified for host 'webserver-02.hoanghd.com', using 'webserver-02.hoanghd.com'
No addresses specified for host 'webserver-03.hoanghd.com', using 'webserver-03.hoanghd.com'
Warning: webserver-03.hoanghd.com: Running cluster services: 'corosync', 'pacemaker', the host seems to be in a cluster already
Warning: webserver-03.hoanghd.com: Cluster configuration files found, the host seems to be in a cluster already
Warning: webserver-02.hoanghd.com: Running cluster services: 'corosync', 'pacemaker', the host seems to be in a cluster already
Warning: webserver-02.hoanghd.com: Cluster configuration files found, the host seems to be in a cluster already
Warning: webserver-01.hoanghd.com: Running cluster services: 'corosync', 'pacemaker', the host seems to be in a cluster already
Warning: webserver-01.hoanghd.com: Cluster configuration files found, the host seems to be in a cluster already
Destroying cluster on hosts: 'webserver-01.hoanghd.com', 'webserver-02.hoanghd.com', 'webserver-03.hoanghd.com'...
webserver-03.hoanghd.com: Successfully destroyed cluster
webserver-02.hoanghd.com: Successfully destroyed cluster
webserver-01.hoanghd.com: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'webserver-01.hoanghd.com', 'webserver-02.hoanghd.com', 'webserver-03.hoanghd.com'
webserver-02.hoanghd.com: successful removal of the file 'pcsd settings'
webserver-03.hoanghd.com: successful removal of the file 'pcsd settings'
webserver-01.hoanghd.com: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'webserver-01.hoanghd.com', 'webserver-02.hoanghd.com', 'webserver-03.hoanghd.com'
webserver-03.hoanghd.com: successful distribution of the file 'corosync authkey'
webserver-03.hoanghd.com: successful distribution of the file 'pacemaker authkey'
webserver-02.hoanghd.com: successful distribution of the file 'corosync authkey'
webserver-02.hoanghd.com: successful distribution of the file 'pacemaker authkey'
webserver-01.hoanghd.com: successful distribution of the file 'corosync authkey'
webserver-01.hoanghd.com: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'webserver-01.hoanghd.com', 'webserver-02.hoanghd.com', 'webserver-03.hoanghd.com'
webserver-03.hoanghd.com: successful distribution of the file 'corosync.conf'
webserver-02.hoanghd.com: successful distribution of the file 'corosync.conf'
webserver-01.hoanghd.com: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
Tiếp theo hãy khởi động tất cả các dịch vụ cluster.
shell> pcs cluster start --all
webserver-03.hoanghd.com: Starting Cluster...
webserver-02.hoanghd.com: Starting Cluster...
webserver-01.hoanghd.com: Starting Cluster...
Và kích hoạt chúng.
shell> pcs cluster enable --all
webserver-01.hoanghd.com: Cluster Enabled
webserver-02.hoanghd.com: Cluster Enabled
webserver-03.hoanghd.com: Cluster Enabled
Kiểm tra trạng thái cluster.
shell> pcs status cluster
Cluster Status:
Cluster Summary:
* Stack: corosync
* Current DC: webserver-01.hoanghd.com (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Sat Dec 3 12:47:32 2022
* Last change: Sat Dec 3 12:47:18 2022 by hacluster via crmd on webserver-01.hoanghd.com
* 3 nodes configured
* 0 resource instances configured
Node List:
* Online: [ webserver-01.hoanghd.com webserver-02.hoanghd.com webserver-03.hoanghd.com ]
PCSD Status:
webserver-01.hoanghd.com: Online
webserver-02.hoanghd.com: Online
webserver-03.hoanghd.com: Online
Hoặc
shell> pcs status corosync
Membership information
----------------------
Nodeid Votes Name
1 1 webserver-01.hoanghd.com (local)
2 1 webserver-02.hoanghd.com
3 1 webserver-03.hoanghd.com
Bước 5 – Vô hiệu hóa STONITH và bỏ qua Quorum Policy (chỉ chạy trên webserver-01).
STONITH (Shoot The Other Node In The Head) là một cơ chế trong quản lý cụm để xử lý các tình huống khi một nút cụm không phản hồi. Nếu một nút không phản hồi, STONITH sẽ cố gắng tắt nó để đảm bảo rằng nó không thể tiếp tục truy cập vào tài nguyên cụm, điều này giúp tránh tình trạng split brain
(hai nút cùng cung cấp dịch vụ cùng một lúc).
Fencing device là một thiết bị hoặc cơ chế được sử dụng để thực hiện STONITH. Nó có thể là một thiết bị quản lý nguồn điện, một mô-đun quản lý máy chủ, hoặc bất kỳ thiết bị nào khác có thể được sử dụng để tắt một máy chủ.
Khi vô hiệu hóa STONITH, nghĩa là tắt cơ chế STONITH. Điều này có thể làm cho cụm dễ bị split brain
, nhưng trong một số trường hợp, nó có thể là một lựa chọn hợp lý nếu bạn không có fencing device.
Tuy nhiên, nếu bạn đang sử dụng cụm để cung cấp dịch vụ quan trọng, thì nên bật STONITH để đảm bảo tính sẵn sàng cao và tránh split brain.
Có một số trường hợp bạn có thể cần tắt STONITH:
- Trong môi trường phát triển hoặc kiểm thử: Nếu bạn đang thử nghiệm hoặc phát triển và không muốn các nút bị tắt khi có sự cố, bạn có thể tắt STONITH.
- Không có fencing device: STONITH yêu cầu một fencing device (thiết bị hoặc cơ chế có thể tắt hoặc khởi động lại một nút). Nếu bạn không có fencing device, bạn có thể cần tắt STONITH.
- Cụm chỉ có một nút: Nếu cụm của bạn chỉ có một nút, STONITH không cần thiết và có thể được tắt.
Tuy nhiên, hãy lưu ý rằng tắt STONITH có thể làm tăng rủi ro của tình trạng split brain
và các vấn đề nhất quán khác. Trong môi trường sản xuất, nên sử dụng STONITH nếu có thể.
Ví dụ trong Proxmox, STONITH (Shoot The Other Node In The Head) có thể được sử dụng để đảm bảo rằng khi một nút cụm gặp sự cố, nó sẽ được tắt để tránh tình trạng split brain
. Điều này đặc biệt quan trọng khi bạn đang chạy các máy ảo hoặc container trên cụm Proxmox, vì nếu hai nút cùng chạy cùng một máy ảo, điều này có thể dẫn đến mất dữ liệu.
Giả sử bạn có một cụm Proxmox với ba nút và bạn đang chạy một máy ảo quan trọng trên một trong các nút. Nếu nút đó gặp sự cố, Pacemaker sẽ cố gắng chuyển máy ảo đó sang một nút khác. Tuy nhiên, nếu STONITH không được bật, có thể có một khoảng thời gian ngắn khi cả hai nút đều cố gắng chạy máy ảo, điều này có thể dẫn đến mất dữ liệu.
Tuy nhiên, nếu bạn không có một fencing device hoặc nếu bạn đang chạy Proxmox trong một môi trường không quan trọng (như một môi trường kiểm thử hoặc phát triển), bạn có thể chọn tắt STONITH.
Vì mình không sử dụng fencing device
nên mình sẽ vô hiệu hóa STONITH
và để vô hiệu hóa STONITH
, sử dụng lệnh sau.
sudo pcs property set stonith-enabled=false
Quorum policy là một cơ chế trong quản lý cụm để xác định cách cụm sẽ hoạt động khi mất quorum. Quorum là một phần lớn các nút trong cụm, thường là nửa số nút cộng thêm một. Nếu một cụm mất quorum (tức là mất liên lạc với phần lớn các nút), nó có thể không còn nhất quán và có thể dẫn đến các vấn đề như tình trạng split brain
.
Quorum policy thường có hai lựa chọn:
- Ignore (Bỏ qua): Cụm sẽ tiếp tục hoạt động ngay cả khi mất quorum. Điều này có thể hữu ích trong một số trường hợp, nhưng nó cũng có thể tạo ra rủi ro về nhất quán.
- Stop (Dừng): Cụm sẽ dừng hoạt động nếu mất quorum. Điều này giúp đảm bảo nhất quán, nhưng nó cũng có thể dẫn đến việc dịch vụ bị gián đoạn.
Bạn nên vô hiệu hóa quorum policy (đặt nó thành ignore
) trong các trường hợp sau:
- Cụm chỉ có hai nút: Trong một cụm chỉ có hai nút, mất một nút sẽ dẫn đến mất quorum. Trong trường hợp này, bạn có thể muốn vô hiệu hóa quorum policy để cụm có thể tiếp tục hoạt động với một nút.
- Môi trường không quan trọng: Nếu bạn đang chạy cụm trong một môi trường không quan trọng (như một môi trường kiểm thử hoặc phát triển), bạn có thể chọn vô hiệu hóa quorum policy.
Tuy nhiên, trong môi trường sản xuất, bạn nên giữ quorum policy ở chế độ stop
để đảm bảo nhất quán.
Do mình đang ở môi trường test lab nên mình sẽ bỏ qua quorum-policy
bằng lệnh dưới.
sudo pcs property set no-quorum-policy=ignore
Kiểm tra lại đảm bảo rằng stonith và quorum-policy đã bị vô hiệu hóa.
shell> pcs property list
Cluster Properties:
cluster-infrastructure: corosync
cluster-name: ha_cluster
dc-version: 2.0.3-4b1f869f0f
have-watchdog: false
no-quorum-policy: ignore
stonith-enabled: false
Bước 6 – Thêm Floating-IP và Resource (chỉ chạy trên webserver-01).
Một resource trong Pacemaker là một dịch vụ hoặc một tài nguyên mà cụm có thể quản lý, ví dụ như một IP động (Floating IP) hoặc một máy chủ web Nginx.
Mình sẽ tạo ra hai resource
trong một cụm Pacemaker
đó là:
- Floating IP: Đây là một địa chỉ IP có thể di chuyển giữa các máy chủ trong cùng một Trung tâm Dữ liệu (Data Center). Trong trường hợp này, địa chỉ IP động được đặt là
192.168.13.230
. Lệnhsudo pcs resource create floating_ip ocf:heartbeat:IPaddr2 ip=192.168.13.230 cidr_netmask=23 op monitor interval=60s
sẽ tạo một resource mới với tên làfloating_ip
, sử dụng agentocf:heartbeat:IPaddr2
để quản lý địa chỉ IP192.168.13.230/23
. Lệnh này cũng đặt một hoạt động monitor với khoảng thời gian là 60 giây, có nghĩa là Pacemaker sẽ kiểm tra tình trạng của resource này mỗi 60 giây. - Resource cho Nginx
ha-webserver
: Đây là một resource khác được thêm vào cụm (chúng ta sẽ thêm resource ở câu lệnh tiếp theo)
Vậy đê thêm resource Floating IP
, bạn sử dụng lệnh dưới.
sudo pcs resource create floating_ip ocf:heartbeat:IPaddr2 ip=192.168.13.230 cidr_netmask=23 op monitor interval=60s
Lưu ý ocf:heartbeat:IPaddr2
là tên của một agent resource cụ thể trong Pacemaker.
OCF (Open Cluster Framework) là một chuẩn mở cho các cụm máy chủ, và heartbeat
là một thư viện cụ thể của OCF chứa các agent resource. IPaddr2
là một agent trong thư viện heartbeat
được thiết kế để quản lý địa chỉ IP trên một cụm.
Bạn không thể tự đặt tên cho agent này. Nó phải được cài đặt và hỗ trợ bởi hệ thống của bạn. Nếu bạn muốn sử dụng một agent khác, bạn sẽ cần tìm hiểu xem agent đó có được hỗ trợ trong thư viện OCF của bạn hay không.
Tương tự chúng ta thêm resource mới cho Nginx
bằng lệnh pcs như bên dưới.
sudo pcs resource create ha-webserver ocf:heartbeat:nginx configfile="/etc/nginx/nginx.conf" op monitor timeout="5s" interval="5s" --force
Lệnh này tạo một resource mới trong cụm Pacemaker với tên là ha-webserver. Resource này sử dụng agent “cf:heartbeat:nginx để quản lý dịch vụ Nginx.
Cụ thể, các thành phần của lệnh là:
- sudo pcs resource create ha-webserver: Tạo một resource mới với tên là ha-webserver.
- ocf:heartbeat:nginx: Sử dụng agent
ocf:heartbeat:nginx
để quản lý resource. Agent này được thiết kế để quản lý dịch vụ Nginx. - configfile=”/etc/nginx/nginx.conf”: Đặt đường dẫn đến file cấu hình của Nginx.
- op monitor timeout=”5s” interval=”5s”: Đặt một hoạt động
monitor
với khoảng thời gian là 5 giây và thời gian chờ tối đa là 5 giây. Điều này có nghĩa là Pacemaker sẽ kiểm tra tình trạng của resource này mỗi 5 giây, và nếu việc kiểm tra mất nhiều hơn 5 giây, nó sẽ coi như việc kiểm tra đã thất bại. - –force: Thực hiện lệnh mà không cần xác nhận.
Lệnh này liên quan đến lệnh tạo resource IPaddr2
ở trên bởi vì cả hai đều tạo các resource mà cụm Pacemaker sẽ quản lý. Trong trường hợp này, IPaddr2
quản lý địa chỉ IP động, trong khi ha-webserver
quản lý dịch vụ Nginx. Cả hai resource này có thể được di chuyển giữa các nút trong cụm để đảm bảo sự sẵn sàng cao.
Trong lệnh tạo resource cho Nginx, configfile="/etc/nginx/nginx.conf"
chỉ định đường dẫn đến file cấu hình của Nginx mà agent “ocf:heartbeat:nginx” sẽ sử dụng.
Khi agent khởi động, dừng, hoặc kiểm tra tình trạng của dịch vụ Nginx, nó cần biết cấu hình của dịch vụ đó để thực hiện các hoạt động một cách chính xác. Ví dụ, file cấu hình có thể chứa thông tin về cổng mà Nginx cần lắng nghe, các module cần tải, v.v.
Nếu bạn không chỉ định configfile="/etc/nginx/nginx.conf"
khi tạo resource, agent ocf:heartbeat:nginx
sẽ sử dụng file cấu hình mặc định của Nginx để quản lý dịch vụ. Agent vẫn sẽ thực hiện hoạt động monitor
để kiểm tra tình trạng của dịch vụ Nginx, dựa trên trạng thái hoạt động active
hay inactive
của dịch vụ.
Đảm bảo rằng bạn không nhận được kết quả lỗi nào, sau đó hãy kiểm tra các resource đã tạo.
shell> pcs status resources
* floating_ip (ocf::heartbeat:IPaddr2): Started webserver-01.hoanghd.com
* ha-webserver (ocf::heartbeat:nginx): Started webserver-03.hoanghd.com
Bạn sẽ thấy hai resource floating_ip (ocf::heartbeat:IPaddr2)
và ha-webserver (ocf::heartbeat:nginx)
đã được thêm vào.
Bước 7 – Thêm quy tắc ràng buộc vào cluster (chỉ chạy trên webserver-01).
Lệnh pcs constraint colocation add ha-webserver virtual_ip INFINITY
tạo một ràng buộc colocation trong cụm Pacemaker. Ràng buộc colocation đảm bảo rằng hai resource hoặc nhiều hơn sẽ chạy trên cùng một nút trong cụm.
pcs constraint colocation add ha-webserver virtual_ip INFINITY
Cụ thể, các thành phần của lệnh là:
- pcs constraint colocation add: Là cú pháp cố định trong Pacemaker để thêm một ràng buộc colocation mới. Trong cú pháp này,
pcs
là công cụ quản lý cụm,constraint
chỉ đến các ràng buộc cụm,colocation
là loại ràng buộc, vàadd
là hành động thêm một ràng buộc mới. Trong Pacemaker, có ba loại ràng buộc chính:- Ràng buộc Colocation: Đảm bảo rằng các resource sẽ chạy trên cùng một nút. Ví dụ, nếu bạn có một dịch vụ web và một cơ sở dữ liệu, bạn có thể muốn chúng chạy trên cùng một nút để giảm độ trễ.
- Ràng buộc Order: Đảm bảo rằng một resource sẽ không chạy trừ khi một resource khác đã chạy. Ví dụ, nếu bạn có một dịch vụ web và một cơ sở dữ liệu, bạn có thể muốn cơ sở dữ liệu khởi động trước khi dịch vụ web khởi động.
- Ràng buộc Location: Đảm bảo rằng một resource sẽ luôn chạy trên một nút cụ thể, hoặc sẽ không bao giờ chạy trên một nút cụ thể. Ví dụ, nếu một nút có phần cứng mạnh mẽ hơn, bạn có thể muốn một resource tốn nhiều tài nguyên chạy trên nút đó.
- ha-webserver và virtual_ip:
- Đặt ràng buộc colocation giữa hai resource
ha-webserver
vàvirtual_ip
. Điều này có nghĩa là cả hai resource này sẽ luôn chạy trên cùng một nút.
- Chúng là tên của các resource mà bạn muốn đặt ràng buộc colocation giữa chúng. Bạn cần thay thế chúng bằng tên của các resource thực tế trong cụm của bạn.
- Đặt ràng buộc colocation giữa hai resource
- INFINITY: Đặt điểm colocation là
INFINITY
.- Chỉ số colocation là một giá trị số dùng để chỉ định mức độ ưu tiên của ràng buộc. Giá trị cao hơn đại diện cho mức ưu tiên cao hơn.
- Bạn có thể đặt một ràng buộc colocation với mức ưu tiên là 100 và một ràng buộc khác với mức ưu tiên là 200. Trong trường hợp này, Pacemaker sẽ cố gắng tuân thủ ràng buộc với mức ưu tiên 200 trước khi tuân thủ ràng buộc với mức ưu tiên 100.
INFINITY
chỉ là một giá trị đặc biệt đại diện cho mức ưu tiên cao nhất có thể, có nghĩa là ràng buộc này sẽ luôn được tuân thủ.
Ví dụ, nếu bạn đặt một ràng buộc colocation giữa hai resource với giá trị INFINITY
, Pacemaker sẽ luôn đảm bảo rằng cả hai resource đó chạy trên cùng một nút, ngay cả khi điều đó có nghĩa là phải chạy trên một nút không tối ưu.
Tương tự, nếu bạn đặt một ràng buộc order giữa hai resource với giá trị INFINITY
, Pacemaker sẽ luôn đảm bảo rằng resource đầu tiên khởi động trước resource thứ hai, ngay cả khi điều đó có nghĩa là phải chờ đợi một thời gian dài để resource thứ hai khởi động.
Dưới đây là một ví dụ cụ thể về việc sử dụng mức ưu tiên trong các ràng buộc Pacemaker.
Giả sử bạn có ba resource: db
, app
và cache
. Bạn muốn db
và app
chạy trên cùng một nút (colocation) và app
và cache
cũng chạy trên cùng một nút (colocation). Tuy nhiên, nếu có một nút chỉ có thể chạy hai resource, bạn muốn đảm bảo rằng db
và app
luôn được ưu tiên.
Bạn có thể đặt ràng buộc như sau:
pcs constraint colocation add db app score=200
pcs constraint colocation add app cache score=100
Trong ví dụ này, score=200
và score=100
đặt mức ưu tiên cho các ràng buộc. Pacemaker sẽ cố gắng tuân thủ ràng buộc db
và app
trước, vì nó có mức ưu tiên cao hơn (score=200
). Nếu không thể, nó sẽ cố gắng tuân thủ ràng buộc app
và cache
(score=100
).
Trong trường hợp này, lệnh đảm bảo rằng dịch vụ Nginx (được quản lý bởi resource ha-webserver
) và địa chỉ IP động (được quản lý bởi resource virtual_ip
) sẽ luôn chạy trên cùng một nút. Điều này quan trọng vì nếu dịch vụ Nginx và địa chỉ IP động chạy trên các nút khác nhau, người dùng có thể không thể truy cập được dịch vụ.
Luôn đặt tài nguyên virtual_ip
và ha-webserver
trên cùng một server.
pcs constraint order virtual_ip then the ha-webserver
Ràng buộc colocation
và order
trong Pacemaker đều quan trọng nhưng chúng phục vụ cho các mục đích khác nhau.
pcs constraint colocation add ha-webserver virtual_ip INFINITY
: Lệnh này đảm bảo rằng cả hai resourceha-webserver
vàvirtual_ip
sẽ luôn chạy trên cùng một nút. Tuy nhiên, nó không quy định thứ tự khởi động của chúng.pcs constraint order virtual_ip then ha-webserver
: Lệnh này đảm bảo rằng resourcevirtual_ip
sẽ được khởi động trước resourceha-webserver
. Điều này quan trọng vìha-webserver
cầnvirtual_ip
để hoạt động đúng.
Vì vậy, mặc dù cả hai resource đều chạy trên cùng một nút nhờ ràng buộc colocation
, nhưng chúng ta vẫn cần ràng buộc order
để đảm bảo rằng virtual_ip
sẽ được khởi động trước ha-webserver
.
Tiếp theo, dừng cụm và sau đó bắt đầu lại.
pcs cluster stop --all
pcs cluster start --all
Hoặc có thể sử dụng lệnh dưới thay cho 2 lệnh trên, bạn hãy bỏ qua thông báo lỗi “ERROR: (unpack_config)“.
shell> crm configure group cluster1 floating_ip ha-webserver
ERROR: (unpack_config) warning: Blind faith: not fencing unseen nodes
Lệnh crm configure group cluster1 floating_ip ha-webserver
tạo một nhóm các resource trong Pacemaker. Trong trường hợp này, nhóm có tên là cluster1
và bao gồm hai resource: floating_ip
và ha-webserver
.
Khi bạn tạo một nhóm các resource như vậy, Pacemaker sẽ xử lý tất cả các resource trong nhóm như một đơn vị duy nhất. Điều này có nghĩa là tất cả các resource trong nhóm sẽ luôn chạy trên cùng một nút (giống như ràng buộc colocation
), và chúng sẽ được khởi động theo thứ tự mà chúng xuất hiện trong lệnh (giống như ràng buộc order
).
Vì vậy, lệnh này có thể được sử dụng thay thế cho hai lệnh pcs constraint colocation add ha-webserver virtual_ip INFINITY
và pcs constraint order virtual_ip then ha-webserver
, vì nó cung cấp cả hai tính năng: colocation và order.
Cả hai phương pháp đều có thể được sử dụng, tùy thuộc vào yêu cầu cụ thể của bạn.
Nếu bạn muốn có sự linh hoạt hơn trong việc quản lý các resource và ràng buộc của chúng, việc sử dụng các lệnh pcs constraint colocation add
và pcs constraint order
có thể là lựa chọn tốt. Chúng cho phép bạn tạo và quản lý các ràng buộc một cách riêng biệt.
Tuy nhiên, nếu bạn muốn đơn giản hóa cấu hình của mình và luôn muốn các resource cụ thể chạy cùng nhau theo một thứ tự cụ thể, việc sử dụng lệnh crm configure group
có thể là lựa chọn tốt hơn. Nó tạo ra một nhóm các resource, trong đó Pacemaker sẽ xử lý tất cả các resource như một đơn vị duy nhất.
Cuối cùng, lựa chọn tốt nhất phụ thuộc vào yêu cầu cụ thể của bạn và môi trường mà bạn đang làm việc.
Thông báo lỗi “ERROR: (unpack_config) warning: Blind faith: not fencing unseen nodes” xuất hiện khi Pacemaker được cấu hình để không “fencing” (tạm dịch: cô lập) các nút mà nó không thể nhìn thấy hoặc không thể liên lạc được.
Trong một cụm Pacemaker, “fencing” là quá trình cô lập một nút có vấn đề để ngăn nó gây ra sự cố cho cụm. Điều này thường được thực hiện bằng cách khởi động lại nút hoặc ngắt kết nối nó khỏi mạng.
Khi bạn nhận được thông báo lỗi này, điều đó có nghĩa là Pacemaker có thể đang hoạt động trong một trạng thái không an toàn, nơi nó có thể tiếp tục hoạt động mà không cần cô lập các nút có vấn đề. Điều này có thể dẫn đến các vấn đề như “split-brain”, nơi hai nút cố gắng kiểm soát cùng một resource.
Để khắc phục điều này, bạn nên cấu hình Pacemaker để sử dụng một phương pháp “fencing” phù hợp với môi trường của bạn.
Bây giờ khi show lại resource, bạn sẽ thấy floating_ip và ha-webserver đã được gom lại chung 1 group tên là cluster1 và đều cả 2 đều đang được active trên webserver-01.
shell> pcs status resources
* Resource Group: cluster1:
* floating_ip (ocf::heartbeat:IPaddr2): Started webserver-01.hoanghd.com
* ha-webserver (ocf::heartbeat:nginx): Started webserver-01.hoanghd.com
Bước 9 – Kiểm tra.
Chúng ta sẽ thực hiện một số thử nghiệm cho cluster. Kiểm tra trạng thái các server Online hoặc Offline, kiểm tra trạng thái và member corosync, sau đó kiểm tra tính khả dụng cao của server web Nginx bằng cách truy cập địa chỉ virtual_ip.
Kiểm tra trạng thái server bằng lệnh sau.
shell> pcs status nodes
Pacemaker Nodes:
Online: webserver-01.hoanghd.com webserver-02.hoanghd.com webserver-03.hoanghd.com
Standby:
Standby with resource(s) running:
Maintenance:
Offline:
Pacemaker Remote Nodes:
Online:
Standby:
Standby with resource(s) running:
Maintenance:
Offline:
Kiểm tra các member corosync, bạn sẽ nhận được địa chỉ IP của các member Corosync.
shell> corosync-cmapctl | grep members
runtime.members.1.config_version (u64) = 0
runtime.members.1.ip (str) = r(0) ip(192.168.13.231)
runtime.members.1.join_count (u32) = 1
runtime.members.1.status (str) = joined
runtime.members.2.config_version (u64) = 0
runtime.members.2.ip (str) = r(0) ip(192.168.13.232)
runtime.members.2.join_count (u32) = 1
runtime.members.2.status (str) = joined
runtime.members.3.config_version (u64) = 0
runtime.members.3.ip (str) = r(0) ip(192.168.13.233)
runtime.members.3.join_count (u32) = 1
runtime.members.3.status (str) = joined
Kiểm tra các member Corosync và bạn sẽ thấy kết quả như hình bên dưới.
shell> pcs status corosync
Membership information
----------------------
Nodeid Votes Name
1 1 webserver-01.hoanghd.com (local)
2 1 webserver-02.hoanghd.com
3 1 webserver-03.hoanghd.com
Và cuối cùng, hãy kiểm tra tính khả dụng cao của website. Mở trình duyệt web của bạn và nhập địa chỉ http://192.168.13.230
bạn sẽ thấy trang web từ server webserver-01
.
Tiếp theo, dừng server webserver-01
bằng lệnh bên dưới.
shell> pcs cluster stop webserver-01.hoanghd.com
webserver-01.hoanghd.com: Stopping Cluster (pacemaker)...
webserver-01.hoanghd.com: Stopping Cluster (corosync)...
Khi show lại resource bạn sẽ thấy resoure floating_ip
và ha-webserver
đã được chuyển sang chạy tại webserver-02
.
shell> pcs status resources
* Resource Group: cluster1:
* floating_ip (ocf::heartbeat:IPaddr2): Started webserver-02.hoanghd.com
* ha-webserver (ocf::heartbeat:nginx): Started webserver-02.hoanghd.com
Và kiểm tra lại website và bạn sẽ nhận được nội dung website từ server webserver-02
như bên dưới.
Kiểm tra trạng thái cluster bằng lệnh pcs status, bạn sẽ nhận được kết quả như bên dưới.
shell> pcs status
Cluster name: ha_cluster
Cluster Summary:
* Stack: corosync
* Current DC: webserver-02.hoanghd.com (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Sat Dec 3 13:30:06 2022
* Last change: Sat Dec 3 13:13:43 2022 by root via cibadmin on webserver-01.hoanghd.com
* 3 nodes configured
* 2 resource instances configured
Node List:
* Online: [ webserver-02.hoanghd.com webserver-03.hoanghd.com ]
* OFFLINE: [ webserver-01.hoanghd.com ]
Full List of Resources:
* Resource Group: cluster1:
* floating_ip (ocf::heartbeat:IPaddr2): Started webserver-02.hoanghd.com
* ha-webserver (ocf::heartbeat:nginx): Started webserver-02.hoanghd.com
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
Tắt webserver-02
bằng lệnh dưới.
shell> init 0
Connection to 192.168.13.232 closed by remote host.
Connection to 192.168.13.232 closed.
Trên webserver-03
hãy kiểm tra trạng thái resource, kết quả cho thấy cả 2 resource đã được chuyển qua chạy ở webserver-03
.
shell> pcs status resources
* Resource Group: cluster1:
* floating_ip (ocf::heartbeat:IPaddr2): Started webserver-03.hoanghd.com
* ha-webserver (ocf::heartbeat:nginx): Started webserver-03.hoanghd.com
Và đây là kết quả khi truy cập website.
Quá trình thiết lập High Availability của server Nginx với Pacemaker, Corosync và Pcsd trên server Ubuntu đã được hoàn tất thành công.