ProxySQL ने v1.4.2.2 से देशी क्लस्टरिंग का समर्थन किया है। इसका मतलब है कि एकाधिक ProxySQL उदाहरण क्लस्टर-जागरूक हैं; वे एक-दूसरे की स्थिति से अवगत हैं और कॉन्फ़िगरेशन संस्करण, टाइमस्टैम्प और चेकसम मान के आधार पर सबसे अद्यतित कॉन्फ़िगरेशन को सिंक करके स्वचालित रूप से कॉन्फ़िगरेशन परिवर्तनों को संभालने में सक्षम हैं। इस ब्लॉग पोस्ट को देखें जो दर्शाता है कि प्रॉक्सीएसक्यूएल के लिए क्लस्टरिंग समर्थन को कैसे कॉन्फ़िगर किया जाए और आप इसे कैसे व्यवहार करने की उम्मीद कर सकते हैं।
ProxySQL एक विकेन्द्रीकृत प्रॉक्सी है, जिसे एप्लिकेशन के करीब तैनात करने की अनुशंसा की जाती है। यह दृष्टिकोण सैकड़ों नोड्स तक भी बहुत अच्छी तरह से स्केल करता है, क्योंकि इसे रनटाइम पर आसानी से पुन:कॉन्फ़िगर करने योग्य बनाया गया था। कई प्रॉक्सीएसक्यूएल नोड्स को कुशलता से प्रबंधित करने के लिए, किसी को यह सुनिश्चित करना होगा कि किसी एक नोड पर किए गए परिवर्तन को फ़ार्म के सभी नोड्स में लागू किया जाना चाहिए। देशी क्लस्टरिंग के बिना, किसी को मैन्युअल रूप से कॉन्फ़िगरेशन को निर्यात करना होगा और उन्हें अन्य नोड्स में आयात करना होगा (यद्यपि, आप इसे अपने आप स्वचालित कर सकते हैं)।
पिछले ब्लॉग पोस्ट में, हमने Kubernetes ConfigMap के माध्यम से ProxySQL क्लस्टरिंग को कवर किया है। ConfigMap में केंद्रीकृत कॉन्फ़िगरेशन दृष्टिकोण के साथ यह दृष्टिकोण कमोबेश काफी कुशल है। ConfigMap में जो कुछ भी लोड किया गया है उसे पॉड्स में माउंट किया जाएगा। कॉन्फ़िगरेशन को अपडेट करना वर्जनिंग के माध्यम से किया जा सकता है (proxysql.cnf सामग्री को संशोधित करें और इसे किसी अन्य नाम से ConfigMap में लोड करें) और फिर परिनियोजन विधि शेड्यूलिंग और अपडेट रणनीति के आधार पर पॉड्स पर पुश करें।
हालाँकि, तेजी से बदलते परिवेश में, यह ConfigMap दृष्टिकोण शायद सबसे अच्छा तरीका नहीं है क्योंकि नए कॉन्फ़िगरेशन को लोड करने के लिए, ConfigMap वॉल्यूम को रिमाउंट करने के लिए पॉड पुनर्निर्धारण की आवश्यकता होती है और यह ProxySQL सेवा को समग्र रूप से ख़तरे में डाल सकता है। उदाहरण के लिए, मान लें कि हमारे वातावरण में, हमारी सख्त पासवर्ड नीति के लिए हर 7 दिनों के लिए MySQL उपयोगकर्ता पासवर्ड की समाप्ति को बाध्य करने की आवश्यकता होती है, जिसे हमें साप्ताहिक आधार पर नए पासवर्ड के लिए ProxySQL ConfigMap को अपडेट करते रहना होगा। एक साइड नोट के रूप में, प्रॉक्सीएसक्यूएल के अंदर MySQL उपयोगकर्ता को बैकएंड MySQL सर्वर पर एक से मेल खाने के लिए उपयोगकर्ता और पासवर्ड की आवश्यकता होती है। यहीं से हमें Kubernetes में ProxySQL नेटिव क्लस्टरिंग सपोर्ट का उपयोग करना शुरू करना चाहिए, ताकि ConfigMap वर्जनिंग और पॉड रीशेड्यूलिंग की परेशानी के बिना कॉन्फ़िगरेशन परिवर्तनों को स्वचालित रूप से लागू किया जा सके।
इस ब्लॉग पोस्ट में, हम आपको दिखाएंगे कि कुबेरनेट्स पर हेडलेस सेवा के साथ प्रॉक्सीएसक्यूएल देशी क्लस्टरिंग कैसे चलाएं। हमारी उच्च-स्तरीय वास्तुकला को नीचे दिखाया जा सकता है:
हमारे पास 3 गैलेरा नोड हैं जो क्लस्टरकंट्रोल द्वारा तैनात और प्रबंधित बेयर-मेटल इन्फ्रास्ट्रक्चर पर चल रहे हैं:
- 192.168.0.21
- 192.168.0.22
- 192.168.0.23
हमारे सभी एप्लिकेशन कुबेरनेट्स के भीतर पॉड के रूप में चल रहे हैं। रिवर्स प्रॉक्सी के रूप में काम करने के लिए एप्लिकेशन और हमारे डेटाबेस क्लस्टर के बीच दो प्रॉक्सीएसक्यूएल इंस्टेंस को पेश करने का विचार है। अनुप्रयोग तब Kubernetes सेवा के माध्यम से ProxySQL पॉड्स से कनेक्ट होंगे जो कई ProxySQL प्रतिकृतियों में संतुलित और फ़ेलओवर लोड होगा।
हमारे कुबेरनेट्स सेटअप का सारांश निम्नलिखित है:
[email protected]:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kube1 Ready master 5m v1.15.1 192.168.100.201 <none> Ubuntu 18.04.1 LTS 4.15.0-39-generic docker://18.9.7
kube2 Ready <none> 4m1s v1.15.1 192.168.100.202 <none> Ubuntu 18.04.1 LTS 4.15.0-39-generic docker://18.9.7
kube3 Ready <none> 3m42s v1.15.1 192.168.100.203 <none> Ubuntu 18.04.1 LTS 4.15.0-39-generic docker://18.9.7
ConfigMap के माध्यम से ProxySQL कॉन्फ़िगरेशन
आइए पहले अपना आधार विन्यास तैयार करें जिसे ConfigMap में लोड किया जाएगा। Proxysql.cnf नामक एक फ़ाइल बनाएँ और निम्नलिखित पंक्तियाँ जोड़ें:
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="proxysql-admin:adminpassw0rd;cluster1:secret1pass"
mysql_ifaces="0.0.0.0:6032"
refresh_interval=2000
cluster_username="cluster1"
cluster_password="secret1pass"
cluster_check_interval_ms=200
cluster_check_status_frequency=100
cluster_mysql_query_rules_save_to_disk=true
cluster_mysql_servers_save_to_disk=true
cluster_mysql_users_save_to_disk=true
cluster_proxysql_servers_save_to_disk=true
cluster_mysql_query_rules_diffs_before_sync=3
cluster_mysql_servers_diffs_before_sync=3
cluster_mysql_users_diffs_before_sync=3
cluster_proxysql_servers_diffs_before_sync=3
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
default_schema="information_schema"
stacksize=1048576
server_version="5.1.30"
connect_timeout_server=10000
monitor_history=60000
monitor_connect_interval=200000
monitor_ping_interval=200000
ping_interval_server_msec=10000
ping_timeout_server=200
commands_stats=true
sessions_sort=true
monitor_username="proxysql"
monitor_password="proxysqlpassw0rd"
monitor_galera_healthcheck_interval=2000
monitor_galera_healthcheck_timeout=800
}
mysql_galera_hostgroups =
(
{
writer_hostgroup=10
backup_writer_hostgroup=20
reader_hostgroup=30
offline_hostgroup=9999
max_writers=1
writer_is_also_reader=1
max_transactions_behind=30
active=1
}
)
mysql_servers =
(
{ address="192.168.0.21" , port=3306 , hostgroup=10, max_connections=100 },
{ address="192.168.0.22" , port=3306 , hostgroup=10, max_connections=100 },
{ address="192.168.0.23" , port=3306 , hostgroup=10, max_connections=100 }
)
mysql_query_rules =
(
{
rule_id=100
active=1
match_pattern="^SELECT .* FOR UPDATE"
destination_hostgroup=10
apply=1
},
{
rule_id=200
active=1
match_pattern="^SELECT .*"
destination_hostgroup=20
apply=1
},
{
rule_id=300
active=1
match_pattern=".*"
destination_hostgroup=10
apply=1
}
)
mysql_users =
(
{ username = "wordpress", password = "passw0rd", default_hostgroup = 10, transaction_persistent = 0, active = 1 },
{ username = "sbtest", password = "passw0rd", default_hostgroup = 10, transaction_persistent = 0, active = 1 }
)
proxysql_servers =
(
{ hostname = "proxysql-0.proxysqlcluster", port = 6032, weight = 1 },
{ hostname = "proxysql-1.proxysqlcluster", port = 6032, weight = 1 }
)
ऊपर दी गई कुछ कॉन्फ़िगरेशन लाइनों को प्रति सेक्शन नीचे समझाया गया है:
admin_variables
admin_credentials पर ध्यान दें वेरिएबल जहां हमने गैर-डिफ़ॉल्ट उपयोगकर्ता का उपयोग किया जो "proxysql-admin" है। ProxySQL स्थानीय कनेक्शन के लिए केवल लोकलहोस्ट के माध्यम से डिफ़ॉल्ट "व्यवस्थापक" उपयोगकर्ता को सुरक्षित रखता है। इसलिए, हमें प्रॉक्सीएसक्यूएल इंस्टेंस को दूरस्थ रूप से एक्सेस करने के लिए अन्य उपयोगकर्ताओं का उपयोग करना होगा। अन्यथा, आपको निम्न त्रुटि प्राप्त होगी:
ERROR 1040 (42000): User 'admin' can only connect locally
हमने cluster_username . को भी जोड़ा है और cluster_password admin_credentials . में मान स्वचालित समन्वयन की अनुमति देने के लिए अर्धविराम द्वारा अलग की गई पंक्ति। cluster_* . के साथ पहले लगे सभी वेरिएबल ProxySQL देशी क्लस्टरिंग से संबंधित हैं और स्व-व्याख्यात्मक हैं।
mysql_galera_hostgroups
यह ProxySQL 2.x के लिए पेश किया गया एक नया निर्देश है (हमारी ProxySQL छवि 2.0.5 पर चल रही है)। यदि आप ProxySQL 1.x पर चलाना चाहते हैं, तो इस भाग को हटा दें और इसके बजाय अनुसूचक तालिका का उपयोग करें। हमने पहले ही इस ब्लॉग पोस्ट में कॉन्फ़िगरेशन विवरण की व्याख्या की है, "ProxySQL 2.x सपोर्ट फॉर गैलेरा क्लस्टर" के तहत डॉकर पर MySQL गैलेरा क्लस्टर के लिए ProxySQL 2.0 को कैसे चलाएं और कॉन्फ़िगर करें।
mysql_servers
सभी लाइनें स्व-व्याख्यात्मक हैं, जो कि MySQL गैलेरा क्लस्टर में चल रहे तीन डेटाबेस सर्वरों पर आधारित है, जैसा कि क्लस्टरकंट्रोल से लिए गए निम्नलिखित टोपोलॉजी स्क्रीनशॉट में संक्षेप में दिया गया है:
proxysql_servers
यहां हम ProxySQL साथियों की सूची परिभाषित करते हैं:
- होस्टनाम - पीयर का होस्टनाम/आईपी पता
- पोर्ट - पीयर का एडमिन पोर्ट
- वजन - वर्तमान में अप्रयुक्त, लेकिन भविष्य में सुधार के लिए रोडमैप में
- टिप्पणी - फ्री फॉर्म कमेंट फील्ड
Docker/Kubernetes वातावरण में, कंटेनर होस्टनाम या IP पतों को खोजने और लिंक करने और उन्हें इस तालिका में सम्मिलित करने के कई तरीके हैं, या तो ConfigMap, मैन्युअल इंसर्ट, entrypoint.sh स्क्रिप्टिंग, पर्यावरण चर या कुछ अन्य माध्यमों का उपयोग करके। Kubernetes में, उपयोग किए गए प्रतिकृति नियंत्रक या परिनियोजन विधि के आधार पर, पॉड के हल करने योग्य होस्टनाम का पहले से अनुमान लगाना थोड़ा मुश्किल है, जब तक कि आप StatefulSet पर नहीं चल रहे हों।
स्टेटफुलस्टेट पॉड ऑर्डिनल इंडेक्स पर इस ट्यूटोरियल को देखें जो बनाए गए पॉड्स के लिए एक स्थिर रिजॉल्वेबल होस्टनाम प्रदान करता है। इसे हेडलेस सर्विस (आगे नीचे समझाया गया) के साथ मिलाएं, हल करने योग्य होस्टनाम प्रारूप होगा:
{app_name}-{index_number}.{service}
जहां {service} एक हेडलेस सर्विस है, जो बताती है कि "proxysql-0.proxysqlcluster" और "proxysql-1.proxysqlcluster" कहां से आते हैं। यदि आप 2 से अधिक प्रतिकृतियां रखना चाहते हैं, तो स्टेटफुलसेट एप्लिकेशन नाम के सापेक्ष आरोही अनुक्रमणिका संख्या जोड़कर तदनुसार अधिक प्रविष्टियां जोड़ें।
अब हम कॉन्फ़िगरेशन फ़ाइल को ConfigMap में धकेलने के लिए तैयार हैं, जिसे परिनियोजन के दौरान प्रत्येक ProxySQL पॉड में माउंट किया जाएगा:
$ kubectl create configmap proxysql-configmap --from-file=proxysql.cnf
सत्यापित करें कि क्या हमारा ConfigMap सही ढंग से लोड किया गया है:
$ kubectl get configmap
NAME DATA AGE
proxysql-configmap 1 7h57m
ProxySQL मॉनिटरिंग उपयोगकर्ता बनाना
परिनियोजन शुरू करने से पहले अगला कदम हमारे डेटाबेस क्लस्टर में एक प्रॉक्सीएसक्यूएल निगरानी उपयोगकर्ता बनाना है। चूंकि हम गैलेरा क्लस्टर पर चल रहे हैं, गैलेरा नोड्स में से किसी एक पर निम्नलिखित कथन चलाएँ:
mysql> CREATE USER 'proxysql'@'%' IDENTIFIED BY 'proxysqlpassw0rd';
mysql> GRANT USAGE ON *.* TO 'proxysql'@'%';
यदि आपने MySQL उपयोगकर्ता नहीं बनाए हैं (जैसा कि ऊपर mysql_users अनुभाग में निर्दिष्ट किया गया है), तो हमें उन्हें भी बनाना होगा:
mysql> CREATE USER 'wordpress'@'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
mysql> CREATE USER 'sbtest'@'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON sbtest.* TO 'proxysql'@'%';
यही बात है। अब हम परिनियोजन शुरू करने के लिए तैयार हैं।
एक स्टेटफुलसेट परिनियोजित करना
हम स्टेटफुलसेट का उपयोग करते हुए दो ProxySQL इंस्टेंस, या रिडंडेंसी उद्देश्यों के लिए प्रतिकृतियां बनाकर शुरू करेंगे।
चलिए एक टेक्स्ट फ़ाइल बनाकर शुरू करते हैं जिसे proxysql-ss-svc.yml कहा जाता है और निम्नलिखित पंक्तियाँ जोड़ें:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: proxysql
labels:
app: proxysql
spec:
replicas: 2
serviceName: proxysqlcluster
selector:
matchLabels:
app: proxysql
tier: frontend
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: proxysql
tier: frontend
spec:
restartPolicy: Always
containers:
- image: severalnines/proxysql:2.0.4
name: proxysql
volumeMounts:
- name: proxysql-config
mountPath: /etc/proxysql.cnf
subPath: proxysql.cnf
ports:
- containerPort: 6033
name: proxysql-mysql
- containerPort: 6032
name: proxysql-admin
volumes:
- name: proxysql-config
configMap:
name: proxysql-configmap
---
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
app: proxysql
tier: frontend
name: proxysql
spec:
ports:
- name: proxysql-mysql
nodePort: 30033
port: 6033
protocol: TCP
targetPort: 6033
- name: proxysql-admin
nodePort: 30032
port: 6032
protocol: TCP
targetPort: 6032
selector:
app: proxysql
tier: frontend
type: NodePort
उपरोक्त परिभाषा के दो खंड हैं - स्टेटफुलसेट और सर्विस। स्टेटफुलसेट हमारे पॉड्स या प्रतिकृतियों की परिभाषा है और हमारे कॉन्फिग मैप वॉल्यूम के लिए आरोह बिंदु है, जिसे प्रॉक्सीएसक्यूएल-कॉन्फिगमैप से लोड किया गया है। अगला खंड सेवा परिभाषा है, जहां हम परिभाषित करते हैं कि पॉड्स को कैसे उजागर किया जाना चाहिए और आंतरिक या बाहरी नेटवर्क के लिए रूट किया जाना चाहिए।
ProxySQL स्टेटफुल सेट और सर्विस बनाएं:
$ kubectl create -f proxysql-ss-svc.yml
पॉड और सेवा की स्थिति की पुष्टि करें:
$ kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/proxysql-0 1/1 Running 0 4m46s
pod/proxysql-1 1/1 Running 0 2m59s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10h
service/proxysql NodePort 10.111.240.193 <none> 6033:30033/TCP,6032:30032/TCP 5m28s
यदि आप पॉड के लॉग को देखते हैं, तो आप देखेंगे कि हम इस चेतावनी से भर गए हैं:
$ kubectl logs -f proxysql-0
...
2019-08-01 19:06:18 ProxySQL_Cluster.cpp:215:ProxySQL_Cluster_Monitor_thread(): [WARNING] Cluster: unable to connect to peer proxysql-1.proxysqlcluster:6032 . Error: Unknown MySQL server host 'proxysql-1.proxysqlcluster' (0)
उपरोक्त का सीधा सा मतलब है कि प्रॉक्सीएसक्यूएल-0 "proxysql-1.proxysqlcluster" को हल करने और उससे कनेक्ट करने में असमर्थ था, जो कि अपेक्षित है क्योंकि हमने DNS रिकॉर्ड्स के लिए हमारी हेडलेस सेवा नहीं बनाई है जो इंटर-प्रॉक्सीएसक्यूएल संचार के लिए आवश्यक हैं।
कुबेरनेट्स हेडलेस सर्विस
ProxySQL पॉड्स प्रत्याशित FQDN को हल करने और इसे सीधे कनेक्ट करने में सक्षम होने के लिए, समाधान प्रक्रिया को असाइन किए गए लक्ष्य पॉड IP पते को देखने में सक्षम होना चाहिए न कि वर्चुअल IP पता। यह वह जगह है जहां हेडलेस सर्विस तस्वीर में आती है। "क्लस्टरआईपी =कोई नहीं" सेट करके एक हेडलेस सेवा बनाते समय, कोई लोड-बैलेंसिंग कॉन्फ़िगर नहीं किया गया है और इस सेवा के लिए कोई क्लस्टर आईपी (वर्चुअल आईपी) आवंटित नहीं किया गया है। केवल DNS स्वचालित रूप से कॉन्फ़िगर किया गया है। जब आप हेडलेस सेवा के लिए DNS क्वेरी चलाते हैं, तो आपको पॉड्स के आईपी पते की सूची मिल जाएगी।
यदि हम "proxysqlcluster" के लिए हेडलेस सर्विस DNS रिकॉर्ड्स को देखें तो यह ऐसा दिखता है (इस उदाहरण में हमारे पास 3 ProxySQL इंस्टेंस थे):
$ host proxysqlcluster
proxysqlcluster.default.svc.cluster.local has address 10.40.0.2
proxysqlcluster.default.svc.cluster.local has address 10.40.0.3
proxysqlcluster.default.svc.cluster.local has address 10.32.0.2
जबकि निम्न आउटपुट "proxysql" नामक मानक सेवा के लिए DNS रिकॉर्ड दिखाता है जो क्लस्टरआईपी को हल करता है:
$ host proxysql
proxysql.default.svc.cluster.local has address 10.110.38.154
एक हेडलेस सर्विस बनाने और इसे पॉड्स से जोड़ने के लिए, स्टेटफुलसेट डिक्लेरेशन के अंदर सर्विसनाम को परिभाषित करना होगा, और सर्विस डेफिनिशन में "क्लस्टरआईपी =कोई नहीं" होना चाहिए जैसा कि नीचे दिखाया गया है। Proxysql-headless-svc.yml नाम से एक टेक्स्ट फ़ाइल बनाएँ और निम्न पंक्तियाँ जोड़ें:
apiVersion: v1
kind: Service
metadata:
name: proxysqlcluster
labels:
app: proxysql
spec:
clusterIP: None
ports:
- port: 6032
name: proxysql-admin
selector:
app: proxysql
बिना सिर वाली सेवा बनाएं:
$ kubectl create -f proxysql-headless-svc.yml
केवल सत्यापन के लिए, इस समय, हमारे पास निम्नलिखित सेवाएं चल रही हैं:
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
proxysql NodePort 10.110.38.154 <none> 6033:30033/TCP,6032:30032/TCP 23m
proxysqlcluster ClusterIP None <none> 6032/TCP 4s
अब, हमारे पॉड के लॉग में से एक को देखें:
$ kubectl logs -f proxysql-0
...
2019-08-01 19:06:19 ProxySQL_Cluster.cpp:215:ProxySQL_Cluster_Monitor_thread(): [WARNING] Cluster: unable to connect to peer proxysql-1.proxysqlcluster:6032 . Error: Unknown MySQL server host 'proxysql-1.proxysqlcluster' (0)
2019-08-01 19:06:19 [INFO] Cluster: detected a new checksum for mysql_query_rules from peer proxysql-1.proxysqlcluster:6032, version 1, epoch 1564686376, checksum 0x3FEC69A5C9D96848 . Not syncing yet ...
2019-08-01 19:06:19 [INFO] Cluster: checksum for mysql_query_rules from peer proxysql-1.proxysqlcluster:6032 matches with local checksum 0x3FEC69A5C9D96848 , we won't sync.
आप देखेंगे कि क्लस्टर घटक "proxysqlcluster" नामक हेडलेस सेवा के माध्यम से पोर्ट 6032 पर अन्य सहकर्मी, proxysql-1.proxysqlcluster से एक नए चेकसम को हल करने, कनेक्ट करने और पहचानने में सक्षम है। ध्यान दें कि यह सेवा केवल कुबेरनेट्स नेटवर्क के भीतर पोर्ट 6032 को उजागर करती है, इसलिए यह बाहरी रूप से पहुंच योग्य नहीं है।
इस बिंदु पर, हमारा परिनियोजन अब पूरा हो गया है।
ProxySQL से कनेक्ट हो रहा है
ProxySQL सेवाओं से जुड़ने के कई तरीके हैं। लोड-संतुलित MySQL कनेक्शन कुबेरनेट्स नेटवर्क के भीतर से पोर्ट 6033 पर भेजे जाने चाहिए और यदि क्लाइंट बाहरी नेटवर्क से कनेक्ट हो रहा है तो पोर्ट 30033 का उपयोग करें।
बाहरी नेटवर्क से ProxySQL व्यवस्थापक इंटरफ़ेस से कनेक्ट करने के लिए, हम NodePort सेक्शन के तहत परिभाषित पोर्ट से कनेक्ट कर सकते हैं, 30032 (192.168.100.203 होस्ट kube3.local का प्राथमिक IP पता है):
$ mysql -uproxysql-admin -padminpassw0rd -h192.168.100.203 -P30032
यदि आप कुबेरनेट्स नेटवर्क में अन्य पॉड्स से इसे एक्सेस करना चाहते हैं, तो पोर्ट 6032 पर क्लस्टरआईपी 10.110.38.154 ("प्रॉक्सीस्क्ल" सेवा के तहत परिभाषित) का उपयोग करें।
फिर अपनी इच्छानुसार ProxySQL कॉन्फ़िगरेशन परिवर्तन करें और उन्हें रनटाइम पर लोड करें:
mysql> INSERT INTO mysql_users (username,password,default_hostgroup) VALUES ('newuser','passw0rd',10);
mysql> LOAD MYSQL USERS TO RUNTIME;
आप पॉड्स में से किसी एक में निम्न पंक्तियाँ देखेंगे जो दर्शाती हैं कि कॉन्फ़िगरेशन सिंकिंग पूर्ण हो गई है:
$ kubectl logs -f proxysql-0
...
2019-08-02 03:53:48 [INFO] Cluster: detected a peer proxysql-1.proxysqlcluster:6032 with mysql_users version 2, epoch 1564718027, diff_check 4. Own version: 1, epoch: 1564714803. Proceeding with remote sync
2019-08-02 03:53:48 [INFO] Cluster: detected peer proxysql-1.proxysqlcluster:6032 with mysql_users version 2, epoch 1564718027
2019-08-02 03:53:48 [INFO] Cluster: Fetching MySQL Users from peer proxysql-1.proxysqlcluster:6032 started
2019-08-02 03:53:48 [INFO] Cluster: Fetching MySQL Users from peer proxysql-1.proxysqlcluster:6032 completed
ध्यान रखें कि स्वचालित सिंकिंग केवल तभी होती है जब ProxySQL रनटाइम में कॉन्फ़िगरेशन परिवर्तन होता है। इसलिए, कार्रवाई देखने से पहले "LOAD ... TO RUNTIME" कथन चलाना महत्वपूर्ण है। दृढ़ता के लिए ProxySQL परिवर्तनों को डिस्क में सहेजना न भूलें:
mysql> SAVE MYSQL USERS TO DISK;
सीमा
ध्यान दें कि इस सेटअप की एक सीमा है क्योंकि ProxySQL सक्रिय कॉन्फ़िगरेशन को टेक्स्ट कॉन्फ़िगरेशन फ़ाइल में सहेजने/निर्यात करने का समर्थन नहीं करता है जिसे हम बाद में कॉन्फिग मैप में दृढ़ता के लिए लोड करने के लिए उपयोग कर सकते हैं। इसके लिए एक फीचर अनुरोध है। इस बीच, आप संशोधनों को मैन्युअल रूप से ConfigMap पर धकेल सकते हैं। अन्यथा, यदि पॉड्स गलती से हटा दिए गए थे, तो आप अपना वर्तमान कॉन्फ़िगरेशन खो देंगे क्योंकि नए पॉड्स को कॉन्फिग मैप में परिभाषित किसी भी चीज़ द्वारा बूटस्ट्रैप किया जाएगा।
संपत कामिनेनी का विशेष धन्यवाद, जिन्होंने इस ब्लॉग पोस्ट के विचार को जन्म दिया और उपयोग के मामलों और कार्यान्वयन के बारे में जानकारी प्रदान की।