Replikasi adalah fitur utama untuk sebagian besar pengaturan dan didukung oleh sebagian besar teknologi basis data di pasar. Komunitas PostgreSQL memperkenalkan replikasi di versi 9.0 (disebut Streaming Replication atau SR), sejak saat itu replikasi di PostgreSQL telah berkembang dengan fitur tambahan seperti Cascading Replication, Logical Decoding, dan beberapa pengoptimalan lainnya.
Di blog ini, kita akan melihat penggunaan peran Ansible postgresql yang dikembangkan oleh "Demonware" (cabang dari peran "ANXS/postgresql"). Saya sudah berbicara tentang menggunakan peran "ANXS/postgresql" di blog saya sebelumnya tetapi saya tidak membahas fitur replikasi. Peran Ansible “postgresql” menambahkan kemampuan untuk menyiapkan replikasi PostgreSQL menggunakan repmgr.
Tentang Repmgr
Repmgr adalah alat baris perintah sumber terbuka yang dikembangkan dan dikelola oleh 2ndQuadrant. Alat ini mengotomatiskan sebagian besar tugas yang terkait dengan pengelolaan cluster replikasi PostgreSQL. Di bawah ini adalah daftar tugas yang dapat dilakukan dengan lancar menggunakan perintah repmgr dan daemon repmgr.
- Mem-boot kluster replikasi PostgreSQL.
- Melakukan auto-failover dan manual switch-over dari instance utama.
- Menambahkan dan menghapus instance standby (replika baca).
Mempersiapkan Node Pengontrol
Siapkan node pengontrol dengan peran Ansible PostgreSQL, buku pedoman, inventaris, dan replikasi PostgreSQL kustom.
$ mkdir demo
$ pushd demo
$ mkdir roles
$ git clone https://github.com/Demonware/postgresql roles/postgresql
$ pushd roles/postgresql
$ git checkout add-repmgr-extension
Dalam peran yang diunduh, ada dua file variabel default main.yml dan file repmgr.yml. Namun, Ansible hanya akan mempertimbangkan file main.yml. Untuk membuat Ansible juga menggunakan file repmgr.yml kita pindahkan kedua file tersebut dibawah direktori defaults/main.
$ mkdir defaults/main
$ mv defaults/main.yml defaults/repmgr.yml defaults/main
$ popd
File Inventaris yang Mungkin
Untuk demo, kami akan menyiapkan cluster replikasi PostgreSQL pada tiga node. Saya membuat tiga CentOS VMs vm-01, vm-02 dan vm-03, semuanya terdaftar di bawah grup postgres_cluster di file development.yaml.
$ cat development.yaml
all:
children:
postgres_cluster:
hosts:
vm-01:
vm-02:
vm-03:
vars:
ansible_user: "vagrant"
Lakukan ping yang memungkinkan dan pastikan kami dapat menjangkau semua host di bawah grup 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"
}
File Variabel Khusus
Dalam file variabel kustom custom-vars.yaml, kita akan mendefinisikan hal-hal berikut:
- Versi PostgreSQL untuk diinstal dan encoding untuk digunakan
- Memodifikasi konfigurasi PostgreSQL untuk mengaktifkan replikasi, kami akan mengubah parameter seperti wal_level, max_wal_senders, max_replication_slots, hot_standby, archive_mode, archive_command
- Membuat pengguna dan database yang diperlukan
- Memodifikasi file pg_hba.conf untuk mengizinkan koneksi yang diperlukan dari aplikasi dan replikasi repmgr
- Beberapa variabel terkait 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"
Berikut adalah beberapa variabel penting yang didefinisikan dalam custom-vars.yaml:
- postgresql_version:11 - Menginstal PostgreSQL versi 11
- postgresql_ext_install_repmgr:yes - Menginstal ekstensi repmgr di cluster PostgreSQL
- repmgr_target_group:"postgres_cluster" - Repmgr bekerja pada host yang ditentukan di bawah grup "postgres_cluster" yang ditentukan dalam file inventaris
- repmgr_master:"vm-03" - Host vm-03 akan menjadi instance utama PostgreSQL, vm-01 dan vm--02 akan mereplikasi dari vm-03
Playbook yang Memungkinkan
Dalam playbook postgres-play.yaml di bawah ini, saya telah menetapkan peran postgresql terhadap grup host postgres_cluster. Saya juga menyertakan file variabel kustom custom-vars.yaml yang memiliki konfigurasi untuk PostgreSQL dan repmgr.
$ cat postgres-play.yaml
- hosts: postgres_cluster
become: yes
vars_files:
- ./custom-vars.yaml
roles:
- postgresql
Menjalankan Playbook yang Memungkinkan
Kami sekarang telah membuat artefak Ansible berikut dan kami siap untuk menjalankan buku pedoman Ansible.
- roles/postgresql, Direktori peran yang memungkinkan.
- custom-vars.yaml, file variabel yang memungkinkan.
- development.yaml, File inventaris yang memungkinkan.
- postgres-play.yam, file playbook yang memungkinkan.
Jalankan perintah ansible-playbook di bawah ini dari node controller. Karena peran postgresql mengharapkan akses sudo dari pengontrol, kami menentukan opsi -K dalam perintah, yang pada gilirannya meminta kami untuk memasukkan kata sandi SUDO dari simpul pengontrol.
$ 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
Periksa PLAY RECAP di output perintah dan pastikan hitungan yang gagal adalah 0.
Periksa Replikasi PostgreSQL
Dengan perintah repmgr cluster show di bawah ini, kita dapat memeriksa status cluster replikasi PostgreSQL. Ini menunjukkan peran, status, garis waktu dari semua instance PostgreSQL di cluster replikasi.
$ 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
Dari output perintah di atas, vm-03 adalah yang utama dan vm-01,vm02 adalah contoh siaga yang mereplikasi dari simpul hulu vm-03. Semua instance PostgreSQL dalam status berjalan.
Memeriksa tampilan pg_stat_replication pada vm-03 utama untuk mengonfirmasi bahwa baik vm-01 dan vm-02 mereplikasi dengan baik.
$ 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)
Menambahkan Simpul Siaga Lain ke Cluster
Untuk menambahkan node PostgreSQL lain ke cluster, kita hanya perlu menjalankan kembali playbook Ansible setelah menambahkan host tertentu dalam inventaris. Pada langkah-langkah di bawah ini, saya menambahkan vm-04 ke cluster replikasi Repmgr Postgresql yang ada.
- Menambahkan vm-04 ke file inventori Ansible developmeb
$ cat development.yaml all: children: postgres_cluster: hosts: vm-01: vm-02: vm-03: vm-04: vars: ansible_user: "vagrant"
- Jalankan playbook Ansible
$ 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
- Periksa cluster replikasi
$ 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
Kesimpulan
Sejauh ini kita telah melihat pengaturan kluster replikasi Repmgr PostgreSQL menggunakan Ansible. Setelah kluster repmgr telah diatur, kita dapat menggunakan perintah repmgr untuk melakukan pemeliharaan lain pada kluster replikasi seperti melakukan failover dan peralihan dari node utama dan menyiapkan replikasi kaskade. Silakan periksa dokumentasi repmgr untuk detail lebih lanjut.