प्रतिकृति अधिकांश सेटअप के लिए एक प्रमुख विशेषता है और यह बाजार पर अधिकांश डेटाबेस प्रौद्योगिकियों द्वारा समर्थित है। PostgreSQL समुदाय ने संस्करण 9.0 (स्ट्रीमिंग प्रतिकृति या SR कहा जाता है) में प्रतिकृति की शुरुआत की, तब से PostgreSQL में प्रतिकृति कैस्केडिंग प्रतिकृति, तार्किक डिकोडिंग और कई अन्य अनुकूलन जैसी अतिरिक्त सुविधाओं के साथ विकसित हुई है।
इस ब्लॉग में, हम "डेमनवेयर" ("एएनएक्सएस / पोस्टग्रेस्क्ल" की भूमिका का एक कांटा) द्वारा विकसित के रूप में उत्तरदायी भूमिका पोस्टग्रेस्क्ल का उपयोग करने पर विचार करेंगे। मैंने अपने पिछले ब्लॉग में "ANXS/postgresql" भूमिका का उपयोग करने के बारे में पहले ही बात कर ली थी, लेकिन मैंने प्रतिकृति सुविधा पर चर्चा नहीं की। उत्तरदायी भूमिका "postgresql" repmgr का उपयोग करके PostgreSQL प्रतिकृति स्थापित करने की क्षमता जोड़ती है।
Repmgr के बारे में
Repmgr 2ndQuadrant द्वारा विकसित और अनुरक्षित एक ओपन-सोर्स कमांड लाइन टूल है। टूल PostgreSQL प्रतिकृति क्लस्टर के प्रबंधन से संबंधित अधिकांश कार्यों को स्वचालित करता है। नीचे उन कार्यों की सूची दी गई है जिन्हें repmgr कमांड और repmgrd daemon का उपयोग करके आसानी से किया जा सकता है।
- PostgreSQL प्रतिकृति क्लस्टर को बूटस्ट्रैप करना।
- प्राथमिक इंस्टेंस का ऑटो-फेलओवर और मैन्युअल स्विच-ओवर करना।
- स्टैंडबाय (रीड-रेप्लिका) इंस्टेंस को जोड़ना और हटाना।
नियंत्रक नोड तैयार करना
Ansible PostgreSQL भूमिका, प्लेबुक, इन्वेंट्री और कस्टम PostgreSQL प्रतिकृति के साथ कंट्रोलर नोड तैयार करें।
$ mkdir demo
$ pushd demo
$ mkdir roles
$ git clone https://github.com/Demonware/postgresql roles/postgresql
$ pushd roles/postgresql
$ git checkout add-repmgr-extension
डाउनलोड की गई भूमिका में, दो डिफ़ॉल्ट चर फ़ाइलें main.yml और repmgr.yml फ़ाइल हैं। हालाँकि, Ansible केवल main.yml फ़ाइल पर विचार करेगा। Ansible को repmgr.yml फ़ाइल का उपयोग करने के लिए हम दोनों फ़ाइलों को निर्देशिका डिफ़ॉल्ट/मुख्य के अंतर्गत ले जा रहे हैं।
$ mkdir defaults/main
$ mv defaults/main.yml defaults/repmgr.yml defaults/main
$ popd
उत्तरदायी सूची फ़ाइल
डेमो के लिए, हम तीन नोड्स पर PostgreSQL प्रतिकृति क्लस्टर स्थापित करेंगे। मैंने तीन CentOS VMs vm-01, vm-02 और vm-03 बनाए, ये सभी विकास.yaml फ़ाइल में समूह postgres_cluster के अंतर्गत सूचीबद्ध हैं।
$ cat development.yaml
all:
children:
postgres_cluster:
hosts:
vm-01:
vm-02:
vm-03:
vars:
ansible_user: "vagrant"
Ansible पिंग करें और सुनिश्चित करें कि हम postgres_cluster समूह के तहत सभी मेजबानों तक पहुंचने में सक्षम हैं।
$ ansible -i development.yaml -m ping postgres_cluster
vm-01 | SUCCESS => {
"changed": false,
"ping": "pong"
}
vm-03 | SUCCESS => {
"changed": false,
"ping": "pong"
}
vm-02 | SUCCESS => {
"changed": false,
"ping": "pong"
}
कस्टम वैरिएबल फ़ाइल
कस्टम चर फ़ाइल custom-vars.yaml में, हम निम्नलिखित चीजों को परिभाषित करेंगे:
- इंस्टॉल करने के लिए PostgreSQL संस्करण और उपयोग के लिए एन्कोडिंग
- प्रतिकृति को सक्षम करने के लिए PostgreSQL कॉन्फ़िगरेशन को संशोधित करते हुए, हम wal_level, max_wal_senders, max_replication_slots, hot_standby, archive_mode, archive_command जैसे मापदंडों को संशोधित करेंगे।
- आवश्यक उपयोगकर्ता और डेटाबेस बनाना
- एप्लिकेशन और repmgr प्रतिकृति से आवश्यक कनेक्शन की अनुमति देने के लिए pg_hba.conf फ़ाइल को संशोधित करना
- कुछ repmgr संबंधित चर
$ cat custom-vars.yaml
# Basic settings
postgresql_version: 11
postgresql_encoding: "UTF-8"
postgresql_locale: "en_US.UTF-8"
postgresql_ctype: "en_US.UTF-8"
postgresql_admin_user: "postgres"
postgresql_default_auth_method: "peer"
postgresql_listen_addresses: "*"
postgresql_wal_level: "replica"
postgresql_max_wal_senders: 10
postgresql_max_replication_slots: 10
postgresql_wal_keep_segments: 100
postgresql_hot_standby: on
postgresql_archive_mode: on
postgresql_archive_command: "/bin/true"
postgresql_shared_preload_libraries:
- repmgr
postgresql_users:
- name: "{{repmgr_user}}"
pass: "password"
postgresql_databases:
- name: "{{repmgr_database}}"
owner: "{{repmgr_user}}"
encoding: "UTF-8"
postgresql_user_privileges:
- name: "{{repmgr_user}}"
db: "{{repmgr_database}}"
priv: "ALL"
role_attr_flags: "SUPERUSER,REPLICATION"
postgresql_pg_hba_custom:
- { type: "host", database: "all", user: "all", address: "192.168.0.0/24", method: "md5" }
- { type: "host", database: "replication", user: "repmgr", address: "192.168.0.0/24", method: "md5" }
- { type: "host", database: "replication", user: "repmgr", address: "127.0.0.1/32", method: "md5" }
# repmgr related variables
postgresql_ext_install_repmgr: yes
repmgr_target_group: "postgres_cluster"
repmgr_target_group_hosts: "{{ groups[repmgr_target_group] }}"
repmgr_master: "vm-03"
Custom-vars.yaml में परिभाषित कुछ उल्लेखनीय चर निम्नलिखित हैं:
- postgresql_version:11 - PostgreSQL संस्करण 11 स्थापित करता है
- postgresql_ext_install_repmgr:हाँ - PostgreSQL क्लस्टर पर repmgr एक्सटेंशन इंस्टॉल करता है
- repmgr_target_group:"postgres_cluster" - रेपमग्र इन्वेंटरी फ़ाइल में परिभाषित "postgres_cluster" समूह के तहत परिभाषित मेजबानों पर काम करता है
- repmgr_master:"vm-03" - होस्ट vm-03 PostgreSQL प्राथमिक उदाहरण होगा, vm-01 और vm--02 vm-03 से दोहराया जाएगा
उत्तरदायी प्लेबुक
नीचे दिए गए postgres-play.yaml प्लेबुक में, मैंने होस्ट समूह postgres_cluster के विरुद्ध postgresql की भूमिका सौंपी है। मैंने कस्टम चर फ़ाइल custom-vars.yaml भी शामिल किया है जिसमें PostgreSQL और repmgr के लिए कॉन्फ़िगरेशन है।
$ cat postgres-play.yaml
- hosts: postgres_cluster
become: yes
vars_files:
- ./custom-vars.yaml
roles:
- postgresql
Ansible Playbook चलाना
हमने अब निम्नलिखित Ansible कलाकृतियाँ बनाई हैं और हम Ansible playbook चलाने के लिए तैयार हैं।
- भूमिकाएं/पोस्टग्रेस्क्ल, उत्तरदायी भूमिका निर्देशिका।
- custom-vars.yaml, उत्तरदायी चर फ़ाइल।
- Development.yaml, Ansible इन्वेंट्री फ़ाइल।
- postgres-play.yam, Ansible playbook फ़ाइल।
कंट्रोलर नोड से नीचे दिए गए ansible-playbook कमांड को रन करें। चूंकि postgresql भूमिका नियंत्रक की sudo पहुंच की अपेक्षा करती है, हम कमांड में -K विकल्प निर्दिष्ट कर रहे हैं, जो बदले में हमें नियंत्रक नोड का SUDO पासवर्ड दर्ज करने के लिए कहता है।
$ ansible-playbook -Ki development.yaml postgres-play.yaml
SUDO password:
PLAY [postgres_cluster] ********************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************************************************
ok: [vm-01]
ok: [vm-02]
ok: [vm-03]
...
...
PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
vm-01 : ok=41 changed=4 unreachable=0 failed=0
vm-02 : ok=41 changed=5 unreachable=0 failed=0
vm-03 : ok=43 changed=5 unreachable=0 failed=0
कमांड आउटपुट में PLAY RECAP की जाँच करें और सुनिश्चित करें कि विफल गिनती 0 है।
PostgreSQL प्रतिकृति की जाँच करें
नीचे दिए गए repmgr क्लस्टर शो कमांड से हम PostgreSQL प्रतिकृति क्लस्टर की स्थिति की जांच कर सकते हैं। यह प्रतिकृति क्लस्टर में सभी PostgreSQL उदाहरण की भूमिका, स्थिति, समयरेखा दिखाता है।
$ sudo -u postgres /usr/pgsql-11/bin/repmgr -f /etc/postgresql/11/data/repmgr.conf cluster show
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------
1 | vm-01 | standby | running | vm-03 | default | 100 | 1 | host=vm-01 user=repmgr dbname=repmgr connect_timeout=2
2 | vm-02 | standby | running | vm-03 | default | 100 | 1 | host=vm-02 user=repmgr dbname=repmgr connect_timeout=2
3 | vm-03 | primary | * running | | default | 100 | 1 | host=vm-03 user=repmgr dbname=repmgr connect_timeout=2
उपरोक्त कमांड के आउटपुट से, vm-03 प्राथमिक है और vm-01,vm02 अपस्ट्रीम नोड vm-03 से नकल करने वाले स्टैंडबाय इंस्टेंस हैं। सभी PostgreSQL उदाहरण चालू स्थिति में हैं।
vm-01 और vm-02 दोनों की पुष्टि करने के लिए प्राथमिक vm-03 पर pg_stat_replication दृश्य की जाँच करना ठीक प्रतिकृति है।
$ sudo -iu postgres /usr/pgsql-11/bin/psql -h vm-03 -c 'select * from pg_stat_replication'
Password for user postgres:
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
------+----------+---------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------
8480 | 16384 | repmgr | vm-02 | 192.168.0.122 | | 59972 | 2019-07-18 09:04:44.315859+00 | | streaming | 0/A000870 | 0/A000870 | 0/A000870 | 0/A000870 | | | | 0 | async
8481 | 16384 | repmgr | vm-01 | 192.168.0.121 | | 35598 | 2019-07-18 09:04:44.336693+00 | | streaming | 0/A000870 | 0/A000870 | 0/A000870 | 0/A000870 | | | | 0 | async
(2 rows)
क्लस्टर में एक और स्टैंडबाय नोड जोड़ना
क्लस्टर में एक और पोस्टग्रेएसक्यूएल नोड जोड़ने के लिए, हमें इन्वेंट्री में विशेष होस्ट को जोड़ने के बाद बस अंसिबल प्लेबुक को फिर से चलाना होगा। नीचे दिए गए चरणों में, मैं अपने मौजूदा Repmgr Postgresql प्रतिकृति क्लस्टर में vm-04 जोड़ रहा हूं।
- vm-04 को Ansible इन्वेंट्री फ़ाइल में जोड़ना developmentmeb
$ cat development.yaml all: children: postgres_cluster: hosts: vm-01: vm-02: vm-03: vm-04: vars: ansible_user: "vagrant"
- Ansible playbook चलाएं
$ ansible-playbook -Ki development.yaml postgres-play.yaml SUDO password: PLAY [postgres_cluster] ******************************************************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************************************************* ok: [vm-01] ok: [vm-04] ok: [vm-03] ok: [vm-02] ... ... RUNNING HANDLER [postgresql : restart postgresql] ****************************************************************************************************************************************************************************************************************************** changed: [vm-04] changed: [vm-02] changed: [vm-01] changed: [vm-03] PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************* vm-01 : ok=41 changed=4 unreachable=0 failed=0 vm-02 : ok=41 changed=5 unreachable=0 failed=0 vm-03 : ok=43 changed=5 unreachable=0 failed=0 vm-04 : ok=46 changed=32 unreachable=0 failed=0
- प्रतिकृति क्लस्टर की जाँच करें
$ sudo -u postgres /usr/pgsql-11/bin/repmgr -f /etc/postgresql/11/data/repmgr.conf cluster show ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string ----+-------+---------+-----------+----------+----------+----------+----------+-------------------------------------------------------- 1 | vm-01 | standby | running | vm-03 | default | 100 | 1 | host=vm-01 user=repmgr dbname=repmgr connect_timeout=2 2 | vm-02 | standby | running | vm-03 | default | 100 | 1 | host=vm-02 user=repmgr dbname=repmgr connect_timeout=2 3 | vm-03 | primary | * running | | default | 100 | 1 | host=vm-03 user=repmgr dbname=repmgr connect_timeout=2 4 | vm-04 | standby | running | vm-03 | default | 100 | 1 | host=vm-04 user=repmgr dbname=repmgr connect_timeout=2
निष्कर्ष
अब तक हमने Ansible का उपयोग करके Repmgr PostgreSQL प्रतिकृति क्लस्टर स्थापित करने के बारे में देखा है। एक बार repmgr क्लस्टर सेटअप हो जाने के बाद हम प्रतिकृति क्लस्टर पर अन्य रखरखाव करने के लिए repmgr कमांड का उपयोग कर सकते हैं जैसे कि प्राथमिक नोड का फेलओवर और स्विच-ओवर करना और कैस्केड प्रतिकृति सेट करना। अधिक विवरण के लिए कृपया repmgr दस्तावेज़ देखें।