पहले भाग में, हमने एक काम कर रहे cmon HA क्लस्टर के साथ समाप्त किया:
[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)
हमारे पास तीन नोड ऊपर और चल रहे हैं, एक नेता के रूप में कार्य कर रहा है और शेष अनुयायी हैं, जो पहुंच योग्य हैं (वे दिल की धड़कन प्राप्त करते हैं और उनका जवाब देते हैं)। शेष चुनौती यूआई एक्सेस को इस तरह से कॉन्फ़िगर करना है जो हमें लीडर नोड पर यूआई को हमेशा एक्सेस करने की अनुमति देगा। इस ब्लॉग पोस्ट में हम संभावित समाधानों में से एक प्रस्तुत करेंगे जो आपको इसे पूरा करने की अनुमति देगा।
HAProxy सेट अप करना
यह समस्या हमारे लिए नई नहीं है। प्रत्येक प्रतिकृति क्लस्टर, MySQL या PostgreSQL के साथ, इससे कोई फर्क नहीं पड़ता, एक एकल नोड है जहां हमें अपना लेखन भेजना चाहिए। इसे पूरा करने का एक तरीका यह होगा कि HAProxy का उपयोग किया जाए और कुछ बाहरी जाँचों को जोड़ा जाए जो नोड की स्थिति का परीक्षण करते हैं, और उसके आधार पर, उचित मान लौटाते हैं। यह मूल रूप से हम अपनी समस्या को हल करने के लिए उपयोग करने जा रहे हैं। हम HAProxy को एक अच्छी तरह से परीक्षण की गई परत 4 प्रॉक्सी के रूप में उपयोग करेंगे और हम इसे परत 7 HTTP जांच के साथ जोड़ देंगे जिसे हम अपने उपयोग के मामले के लिए ठीक से लिखेंगे। सबसे पहले चीज़ें, आइए HAProxy स्थापित करें। हम इसे ClusterControl के साथ जोड़ेंगे, लेकिन इसे एक अलग नोड पर भी स्थापित किया जा सकता है (आदर्श रूप से, नोड्स - विफलता के एकल बिंदु के रूप में 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
आप यहां कुछ चीजों को बदलना चाह सकते हैं जैसे कि नोड या बैकएंड नाम जिसमें हमारे नोड का आईपी शामिल है। आप निश्चित रूप से उन सर्वरों को बदलना चाहेंगे जिन्हें आप अपने HAProxy में शामिल करने जा रहे हैं।
सबसे महत्वपूर्ण बिट्स हैं:
bind *:81
HAProxy पोर्ट 81 पर सुनेगा।
option httpchk
हमने बैकएंड नोड्स पर परत 7 जांच सक्षम की है।
default-server port 9201 inter 20s downinter 30s rise 2 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
लेयर 7 चेक पोर्ट 9201 पर निष्पादित किया जाएगा।
एक बार यह हो जाने के बाद, HAProxy शुरू करें।
xinetd और चेक स्क्रिप्ट सेट करना
हम xinetd का उपयोग चेक को निष्पादित करने और HAProxy को सही प्रतिक्रिया देने के लिए करने जा रहे हैं। इस पैराग्राफ में वर्णित चरणों को सभी सीमोन HA क्लस्टर नोड्स पर निष्पादित किया जाना चाहिए।
सबसे पहले, 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 कंट्रोलर --list --long" कमांड का उपयोग करके नोड्स की स्थिति का परीक्षण करता है और फिर यह आईपी से संबंधित आउटपुट की जांच करता है जो इसे पर मिल सकता है स्थानीय नोड। यह स्क्रिप्ट को यह निर्धारित करने की अनुमति देता है कि जिस होस्ट पर इसे निष्पादित किया गया है वह एक नेता है या नहीं। यदि नोड प्रमुख है, तो स्क्रिप्ट "HTTP/1.1 200 OK" कोड लौटाती है, जिसे HAProxy नोड के उपलब्ध होने के रूप में व्याख्या करता है और इसके लिए ट्रैफ़िक को रूट करता है। अन्यथा यह "HTTP / 1.1 503 सेवा अनुपलब्ध" लौटाता है, जिसे माना जाता है एक नोड, जो स्वस्थ नहीं है और वहां यातायात को रूट नहीं किया जाएगा। नतीजतन, कोई फर्क नहीं पड़ता कि कौन सा नोड नेता बन जाएगा, HAProxy इसका पता लगाएगा और इसे बैकएंड में उपलब्ध के रूप में चिह्नित करेगा:
कॉन्फ़िगरेशन परिवर्तन लागू करने से पहले आपको HAProxy और xinetd को पुनरारंभ करना पड़ सकता है। पुर्जे सही ढंग से काम करना शुरू कर देंगे।
एक से अधिक HAProxy होने से यह सुनिश्चित होता है कि हमारे पास ClusterControl UI तक पहुँचने का एक तरीका है, भले ही HAProxy नोड्स में से एक विफल हो जाए, लेकिन हमारे पास अभी भी दो (या अधिक) अलग-अलग होस्टनाम या IP हैं जो ClusterControl UI से कनेक्ट हो सकते हैं। इसे और अधिक आरामदायक बनाने के लिए, हम Keepalived को HAProxy के शीर्ष पर तैनात करेंगे। यह HAProxy सेवाओं की स्थिति की निगरानी करेगा और उनमें से किसी एक को वर्चुअल आईपी असाइन करेगा। यदि वह HAProxy अनुपलब्ध हो जाता है, तो VIP को किसी अन्य उपलब्ध HAProxy में स्थानांतरित कर दिया जाएगा। नतीजतन, हमारे पास प्रवेश का एक ही बिंदु होगा (वीआईपी या इससे जुड़ा एक होस्टनाम)। हम यहां जो कदम उठाएंगे, उन्हें उन सभी नोड्स पर निष्पादित करना होगा जहां HAProxy स्थापित किया गया है।
सबसे पहले, आइए इसे बनाए रखें:
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
}
आपको इस फ़ाइल को विभिन्न नोड्स पर संशोधित करना चाहिए। आईपी पते को ठीक से कॉन्फ़िगर किया जाना चाहिए और सभी नोड्स पर प्राथमिकता अलग-अलग होनी चाहिए। कृपया वीआईपी को भी कॉन्फ़िगर करें जो आपके नेटवर्क में समझ में आता है। आप इंटरफ़ेस को भी बदलना चाह सकते हैं - हमने eth1 का उपयोग किया है, जो कि Vagrant द्वारा बनाई गई वर्चुअल मशीनों पर IP असाइन किया गया है।
इस कॉन्फ़िगरेशन फ़ाइल के साथ रख-रखाव प्रारंभ करें और आपको जाने के लिए अच्छा होना चाहिए। जब तक VIP एक HAProxy नोड पर है, तब तक आप इसका उपयोग उचित ClusterControl UI से कनेक्ट करने के लिए कर सकते हैं:
यह ClusterControl अत्यधिक उपलब्ध क्लस्टर के लिए हमारे दो-भाग के परिचय को पूरा करता है। जैसा कि हमने शुरुआत में कहा था, यह अभी भी बीटा अवस्था में है लेकिन हम आपके परीक्षणों से प्रतिक्रिया की प्रतीक्षा कर रहे हैं।