PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pengaturan &Pemeliharaan Replikasi PostgreSQL Menggunakan Ansible

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.

  1. 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"
  2. 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
  3. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memilih lebih dari 1 catatan per hari?

  2. Bidang gabungan CTE rekursif dengan orang tua dari titik sewenang-wenang

  3. Salin tabel dari satu database ke database lain di Postgres

  4. tidak dapat menghapus objek karena batasan kunci asing

  5. Hibernate + PostgreSQL + Jenis Alamat Jaringan (inet, cdir)