Trong phần đầu tiên, chúng ta đã kết thúc với một cụm cmon HA đang hoạt động:
[email protected]:~# s9s controller --list --long
S VERSION OWNER GROUP NAME IP PORT COMMENT
l 1.7.4.3565 system admins 10.0.0.101 10.0.0.101 9501 Acting as leader.
f 1.7.4.3565 system admins 10.0.0.102 10.0.0.102 9501 Accepting heartbeats.
f 1.7.4.3565 system admins 10.0.0.103 10.0.0.103 9501 Accepting heartbeats.
Total: 3 controller(s)
Chúng tôi có ba nút đang hoạt động, một nút hoạt động như một nhà lãnh đạo và còn lại là những người theo dõi, có thể truy cập được (chúng nhận nhịp tim và trả lời chúng). Thách thức còn lại là định cấu hình quyền truy cập giao diện người dùng theo cách cho phép chúng tôi luôn truy cập giao diện người dùng trên nút lãnh đạo. Trong bài đăng trên blog này, chúng tôi sẽ trình bày một trong những giải pháp khả thi sẽ cho phép bạn thực hiện được điều đó.
Thiết lập HAProxy
Vấn đề này không mới đối với chúng tôi. Với mọi cụm sao chép, MySQL hoặc PostgreSQL, điều đó không thành vấn đề, có một nút duy nhất mà chúng ta nên gửi các bản ghi của mình đến. Một cách để hoàn thành điều đó là sử dụng HAProxy và thêm một số kiểm tra bên ngoài để kiểm tra trạng thái của nút và dựa trên đó, trả về các giá trị thích hợp. Về cơ bản, đây là những gì chúng tôi sẽ sử dụng để giải quyết vấn đề của chúng tôi. Chúng tôi sẽ sử dụng HAProxy làm proxy lớp 4 đã được kiểm tra tốt và chúng tôi sẽ kết hợp nó với các kiểm tra HTTP lớp 7 mà chúng tôi sẽ viết chính xác cho trường hợp sử dụng của mình. Đầu tiên, hãy cài đặt HAProxy. Chúng tôi sẽ kết hợp nó với ClusterControl, nhưng nó cũng có thể được cài đặt trên một nút riêng biệt (lý tưởng là các nút - để loại bỏ HAProxy là điểm lỗi duy nhất).
apt install haproxy
Điều này thiết lập HAProxy. Sau khi hoàn tất, chúng tôi phải giới thiệu cấu hình của mình:
global
pidfile /var/run/haproxy.pid
daemon
user haproxy
group haproxy
stats socket /var/run/haproxy.socket user haproxy group haproxy mode 600 level admin
node haproxy_10.0.0.101
description haproxy server
#* Performance Tuning
maxconn 8192
spread-checks 3
quiet
defaults
#log global
mode tcp
option dontlognull
option tcp-smart-accept
option tcp-smart-connect
#option dontlog-normal
retries 3
option redispatch
maxconn 8192
timeout check 10s
timeout queue 3500ms
timeout connect 3500ms
timeout client 10800s
timeout server 10800s
userlist STATSUSERS
group admin users admin
user admin insecure-password admin
user stats insecure-password admin
listen admin_page
bind *:9600
mode http
stats enable
stats refresh 60s
stats uri /
acl AuthOkay_ReadOnly http_auth(STATSUSERS)
acl AuthOkay_Admin http_auth_group(STATSUSERS) admin
stats http-request auth realm admin_page unless AuthOkay_ReadOnly
#stats admin if AuthOkay_Admin
listen haproxy_10.0.0.101_81
bind *:81
mode tcp
tcp-check connect port 80
timeout client 10800s
timeout server 10800s
balance leastconn
option httpchk
# option allbackups
default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
server 10.0.0.101 10.0.0.101:443 check
server 10.0.0.102 10.0.0.102:443 check
server 10.0.0.103 10.0.0.103:443 check
Bạn có thể muốn thay đổi một số thứ ở đây như tên nút hoặc tên phụ trợ, bao gồm cả IP của nút ở đây. Bạn chắc chắn sẽ muốn thay đổi các máy chủ mà bạn sẽ đưa vào HAProxy của mình.
Các bit quan trọng nhất là:
bind *:81
HAProxy sẽ lắng nghe trên cổng 81.
option httpchk
Chúng tôi đã bật kiểm tra lớp 7 trên các nút phụ trợ.
default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
Kiểm tra lớp 7 sẽ được thực hiện trên cổng 9201.
Sau khi hoàn tất, hãy khởi động HAProxy.
Thiết lập xinetd và Kiểm tra Tập lệnh
Chúng tôi sẽ sử dụng xinetd để thực hiện kiểm tra và trả về các phản hồi chính xác cho HAProxy. Các bước được mô tả trong đoạn này phải được thực hiện trên tất cả các nút cụm cmon HA.
Trước tiên, hãy cài đặt xinetd:
[email protected]:~# apt install xinetd
Sau khi hoàn tất, chúng ta phải thêm dòng sau:
cmonhachk 9201/tcp
to / etc / services - điều này sẽ cho phép xinetd mở một dịch vụ sẽ lắng nghe trên cổng 9201. Sau đó, chúng tôi phải thêm chính tệp dịch vụ đó. Nó phải được đặt trong /etc/xinetd.d/cmonhachk:
# default: on
# description: cmonhachk
service cmonhachk
{
flags = REUSE
socket_type = stream
port = 9201
wait = no
user = root
server = /usr/local/sbin/cmonhachk.py
log_on_failure += USERID
disable = no
#only_from = 0.0.0.0/0
only_from = 0.0.0.0/0
per_source = UNLIMITED
}
Cuối cùng, chúng ta cần tập lệnh kiểm tra được gọi bởi xinetd. Như đã định nghĩa trong tệp dịch vụ, nó nằm trong /usr/local/sbin/cmonhachk.py.
#!/usr/bin/python3.5
import subprocess
import re
import sys
from pathlib import Path
import os
def ret_leader():
leader_str = """HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n
Content-Length: 48\r\n
\r\n
<html><body>This node is a leader.</body></html>\r\n
\r\n"""
print(leader_str)
def ret_follower():
follower_str = """
HTTP/1.1 503 Service Unavailable\r\n
Content-Type: text/html\r\n
Content-Length: 50\r\n
\r\n
<html><body>This node is a follower.</body></html>\r\n
\r\n"""
print(follower_str)
def ret_unknown():
unknown_str = """
HTTP/1.1 503 Service Unavailable\r\n
Content-Type: text/html\r\n
Content-Length: 59\r\n
\r\n
<html><body>This node is in an unknown state.</body></html>\r\n
\r\n"""
print(unknown_str)
lockfile = "/tmp/cmonhachk_lockfile"
if os.path.exists(lockfile):
print("Lock file {} exists, exiting...".format(lockfile))
sys.exit(1)
Path(lockfile).touch()
try:
with open("/etc/default/cmon", 'r') as f:
lines = f.readlines()
pattern1 = "RPC_BIND_ADDRESSES"
pattern2 = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
m1 = re.compile(pattern1)
m2 = re.compile(pattern2)
for line in lines:
res1 = m1.match(line)
if res1 is not None:
res2 = m2.findall(line)
i = 0
for r in res2:
if r != "127.0.0.1" and i == 0:
i += 1
hostname = r
command = "s9s controller --list --long | grep {}".format(hostname)
output = subprocess.check_output(command.split())
state = output.splitlines()[1].decode('UTF-8')[0]
if state == "l":
ret_leader()
if state == "f":
ret_follower()
else:
ret_unknown()
finally:
os.remove(lockfile)
Khi bạn tạo tệp, hãy đảm bảo rằng nó có thể thực thi được:
chmod u+x /usr/local/sbin/cmonhachk.py
Ý tưởng đằng sau tập lệnh này là nó kiểm tra trạng thái của các nút bằng cách sử dụng lệnh “s9s controller --list --long” và sau đó nó kiểm tra đầu ra liên quan đến IP mà nó có thể tìm thấy trên nút cục bộ. Điều này cho phép tập lệnh xác định xem máy chủ lưu trữ mà nó được thực thi có phải là máy chủ hay không. Nếu nút là đầu dẫn, tập lệnh trả về mã “HTTP / 1.1 200 OK”, mã này HAProxy diễn giải là nút khả dụng và định tuyến lưu lượng truy cập đến nó .. Nếu không, nó trả về “HTTP / 1.1 503 Dịch vụ không khả dụng”, được coi là một nút không tốt và lưu lượng truy cập sẽ không được định tuyến ở đó. Do đó, bất kể nút nào sẽ trở thành nút dẫn đầu, HAProxy sẽ phát hiện nó và đánh dấu nó là có sẵn trong phần phụ trợ:
Bạn có thể cần khởi động lại HAProxy và xinetd để áp dụng các thay đổi cấu hình trước tất cả các bộ phận sẽ bắt đầu hoạt động bình thường.
Việc có nhiều HAProxy đảm bảo chúng ta có cách truy cập vào Giao diện người dùng ClusterControl ngay cả khi một trong các nút HAProxy bị lỗi nhưng chúng ta vẫn có hai (hoặc nhiều) tên máy chủ hoặc IP khác nhau để kết nối với Giao diện người dùng ClusterControl. Để làm cho nó thoải mái hơn, chúng tôi sẽ triển khai Keepalived trên HAProxy. Nó sẽ giám sát trạng thái của các dịch vụ HAProxy và gán IP ảo cho một trong số chúng. Nếu HAProxy đó không khả dụng, VIP sẽ được chuyển sang một HAProxy khả dụng khác. Do đó, chúng tôi sẽ có một điểm vào duy nhất (VIP hoặc tên máy chủ được liên kết với nó). Các bước chúng tôi sẽ thực hiện ở đây phải được thực hiện trên tất cả các nút nơi HAProxy đã được cài đặt.
Trước tiên, hãy cài đặt keepalived:
apt install keepalived
Sau đó, chúng ta phải cấu hình nó. Chúng tôi sẽ sử dụng tệp cấu hình sau:
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_HAPROXY {
interface eth1 # interface to monitor
state MASTER
virtual_router_id 51 # Assign one ID for this route
priority 102
unicast_src_ip 10.0.0.101
unicast_peer {
10.0.0.102
10.0.0.103
}
virtual_ipaddress {
10.0.0.130 # the virtual IP
}
track_script {
chk_haproxy
}
# notify /usr/local/bin/notify_keepalived.sh
}
Bạn nên sửa đổi tệp này trên các nút khác nhau. Địa chỉ IP phải được định cấu hình đúng cách và mức độ ưu tiên phải khác nhau trên tất cả các nút. Cũng vui lòng định cấu hình VIP có ý nghĩa trong mạng của bạn. Bạn cũng có thể muốn thay đổi giao diện - chúng tôi đã sử dụng eth1, đây là nơi IP được chỉ định trên các máy ảo do Vagrant tạo.
Khởi động keepalived với tệp cấu hình này và bạn nên bắt đầu. Miễn là VIP có trên một nút HAProxy, bạn sẽ có thể sử dụng nó để kết nối với giao diện người dùng ClusterControl thích hợp:
Điều này hoàn thành phần giới thiệu hai phần của chúng tôi về các cụm có tính khả dụng cao của ClusterControl. Như chúng tôi đã nêu ở phần đầu, tính năng này vẫn ở trạng thái beta nhưng chúng tôi mong nhận được phản hồi từ các thử nghiệm của bạn.