最初の部分では、cmonHAクラスターが機能するようになりました。
[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)
3つのノードが稼働しており、1つはリーダーとして機能し、残りはフォロワーであり、アクセス可能です(ハートビートを受信して返信します)。残りの課題は、リーダーノードのUIに常にアクセスできるようにUIアクセスを構成することです。このブログ投稿では、それを実現するための可能な解決策の1つを紹介します。
HAProxyの設定
apt install haproxy
これにより、HAProxyが設定されます。完了したら、構成を紹介する必要があります:
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
ここでノードのIPを含むノード名やバックエンド名など、いくつかの変更が必要になる場合があります。 HAProxyに含めるサーバーを変更することをお勧めします。
bind *:81
HAProxyはポート81でリッスンします。
option httpchk
default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
これが完了したら、HAProxyを起動します。
xinetdとチェックスクリプトの設定
xinetdを使用してチェックを実行し、HAProxyに正しい応答を返します。この段落で説明する手順は、すべてのcmonHAクラスターノードで実行する必要があります。
まず、xinetdをインストールします:
[email protected]:~# apt install xinetd
これが完了したら、次の行を追加する必要があります:
cmonhachk 9201/tcp
to / etc / services-これにより、xinetdはポート9201でリッスンするサービスを開くことができます。次に、サービスファイル自体を追加する必要があります。 /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
}
最後に、xinetdによって呼び出されるチェックスクリプトが必要です。サービスファイルで定義されているように、それは/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)
ファイルを作成したら、実行可能であることを確認してください:
chmod u+x /usr/local/sbin/cmonhachk.py
このスクリプトの背後にある考え方は、「s9s controller --list --long」コマンドを使用してノードのステータスをテストし、IPに関連する出力をチェックすることです。ローカルノード。これにより、スクリプトは、スクリプトが実行されるホストがリーダーであるかどうかを判別できます。ノードがリーダーの場合、スクリプトは「HTTP / 1.1 200 OK」コードを返します。これは、HAProxyがノードが使用可能であると解釈し、トラフィックをノードにルーティングします。それ以外の場合は、「HTTP /1.1503サービス使用不可」を返します。正常ではなく、トラフィックがそこにルーティングされないノード。その結果、どのノードがリーダーになるかに関係なく、HAProxyはそれを検出し、バックエンドで使用可能としてマークします。
すべての設定変更を適用する前に、HAProxyとxinetdを再起動する必要がある場合があります。パーツが正しく機能し始めます。
複数のHAProxyがあると、HAProxyノードの1つに障害が発生した場合でも、ClusterControl UIに接続するための2つ(またはそれ以上)の異なるホスト名またはIPがある場合でも、ClusterControlUIにアクセスできます。より快適にするために、HAProxyの上にKeepalivedをデプロイします。 HAProxyサービスの状態を監視し、そのうちの1つに仮想IPを割り当てます。そのHAProxyが使用できなくなった場合、VIPは別の使用可能なHAProxyに移動されます。その結果、単一のエントリポイント(VIPまたはそれに関連付けられたホスト名)が作成されます。ここで実行する手順は、HAProxyがインストールされているすべてのノードで実行する必要があります。
まず、keepalivedをインストールしましょう:
apt install keepalived
次に、構成する必要があります。次の構成ファイルを使用します:
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
}
この構成ファイルでキープアライブを開始すると、準備が整います。 VIPが1つのHAProxyノードで稼働している限り、VIPを使用して適切なClusterControlUIに接続できるはずです。
これで、ClusterControlの高可用性クラスターの2部構成の紹介が完了しました。冒頭で述べたように、これはまだベータ状態ですが、テストからのフィードバックをお待ちしています。