sql >> Databáze >  >> RDS >> PostgreSQL

Nastavení a údržba replikace PostgreSQL pomocí Ansible

Replikace je klíčovou funkcí pro většinu nastavení a je podporována většinou databázových technologií na trhu. Komunita PostgreSQL zavedla replikaci ve verzi 9.0 (nazývanou Streaming Replication nebo SR), od té doby se replikace v PostgreSQL vyvinula s dalšími funkcemi, jako je kaskádová replikace, logické dekódování a několik dalších optimalizací.

V tomto blogu se podíváme na použití role Ansible postgresql, jak byla vyvinuta „Demonware“ (fork role „ANXS/postgresql“). O použití role „ANXS/postgresql“ jsem již mluvil ve svém předchozím blogu, ale nemluvil jsem o funkci replikace. Role Ansible „postgresql“ přidává možnost nastavit replikaci PostgreSQL pomocí repmgr.

O Repmgr

Repmgr je open-source nástroj příkazového řádku vyvinutý a spravovaný společností 2ndQuadrant. Nástroj automatizuje většinu úkolů souvisejících se správou replikačního clusteru PostgreSQL. Níže je uveden seznam úloh, které lze hladce provést pomocí příkazu repmgr a démona repmgrd.

  • Zavedení replikačního clusteru PostgreSQL.
  • Automatické přepnutí při selhání a ruční přepnutí primární instance.
  • Přidání a odebrání pohotovostních instancí (repliky pro čtení).

Příprava řídicího uzlu

Připravte uzel řadiče pomocí role Ansible PostgreSQL, příruček, inventářů a vlastní replikace PostgreSQL.

$ mkdir demo
$ pushd demo
$ mkdir roles
$ git clone https://github.com/Demonware/postgresql roles/postgresql
$ pushd roles/postgresql
$ git checkout add-repmgr-extension

Ve stažené roli jsou dva výchozí proměnné soubory main.yml a soubor repmgr.yml. Ansible však vezme v úvahu pouze soubor main.yml. Aby Ansible také používal soubor repmgr.yml, přesouváme oba soubory do adresáře defaults/main.

$ mkdir defaults/main
$ mv defaults/main.yml defaults/repmgr.yml defaults/main
$ popd

Ansible Inventory File

Pro ukázku nastavíme replikační cluster PostgreSQL na třech uzlech. Vytvořil jsem tři virtuální počítače CentOS vm-01, vm-02 a vm-03, všechny jsou uvedeny ve skupině postgres_cluster v souboru development.yaml.

$ cat development.yaml
all:
  children:
    postgres_cluster:
      hosts:
        vm-01:
        vm-02:
        vm-03:
      vars:
        ansible_user: "vagrant"

Proveďte Ansible ping a ujistěte se, že jsme schopni oslovit všechny hostitele ve skupině 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"
}

Soubor s vlastní proměnnou

V souboru vlastních proměnných custom-vars.yaml definujeme následující věci:

  • Verze PostgreSQL k instalaci a kódování k použití
  • Úpravou konfigurace PostgreSQL pro umožnění replikace upravíme parametry jako wal_level, max_wal_senders, max_replication_slots, hot_standby, archive_mode, archive_command
  • Vytvoření potřebných uživatelů a databáze
  • Úprava souboru pg_hba.conf tak, aby umožňovala nezbytné připojení z aplikace a replikace repmgr
  • Některé proměnné související s 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"

Níže jsou uvedeny některé z významných proměnných definovaných v custom-vars.yaml:

  • postgresql_version:11 – Nainstaluje PostgreSQL verze 11
  • postgresql_ext_install_repmgr:yes – Nainstaluje rozšíření repmgr na cluster PostgreSQL
  • repmgr_target_group:"postgres_cluster" - Repmgr funguje na hostitelích definovaných ve skupině "postgres_cluster" definované v souboru inventáře
  • repmgr_master:"vm-03" – hostitel vm-03 bude primární instancí PostgreSQL, vm-01 a vm--02 se budou replikovat z vm-03

Příručka Ansible

V níže uvedené příručce postgres-play.yaml jsem přiřadil roli postgresql proti hostitelské skupině postgres_cluster. Zahrnul jsem také soubor vlastních proměnných custom-vars.yaml, který má konfiguraci pro PostgreSQL a repmgr.

$ cat postgres-play.yaml 
- hosts: postgres_cluster
  become: yes
  vars_files:
    - ./custom-vars.yaml
  roles:
    - postgresql

Spuštění Ansible Playbook

Nyní jsme vytvořili následující artefakty Ansible a jsme připraveni spustit příručku Ansible.

  • roles/postgresql, adresář rolí Ansible.
  • custom-vars.yaml, soubor proměnných Ansible.
  • development.yaml, soubor inventáře Ansible.
  • postgres-play.yam, soubor Ansible playbook.

Spusťte níže uvedený příkaz ansible-playbook z uzlu ovladače. Protože role postgresql očekává sudo přístup kontroleru, zadáváme v příkazu volbu -K, která nás obratem požádá o zadání SUDO hesla uzlu kontroleru.

$ 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

Zkontrolujte PLAY RECAP ve výstupu příkazu a ujistěte se, že počet selhání je 0.

Zkontrolujte replikaci PostgreSQL

Pomocí níže uvedeného příkazu repmgr cluster show můžeme zkontrolovat stav replikačního clusteru PostgreSQL. Zobrazuje roli, stav a časovou osu celé instance PostgreSQL v replikačním clusteru.

$ 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

Z výstupu výše uvedeného příkazu je vm-03 primární a vm-01,vm02 jsou záložní instance replikující se z upstream uzlu vm-03. Všechny instance PostgreSQL jsou ve spuštěném stavu.

Kontrola zobrazení pg_stat_replication na primárním vm-03, aby se potvrdilo, že vm-01 i vm-02 se replikují v pořádku.

$ 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)

Přidání dalšího pohotovostního uzlu do clusteru

Pro přidání dalšího PostgreSQL uzlu do clusteru musíme po přidání konkrétního hostitele do inventáře znovu spustit Ansible playbook. V níže uvedených krocích přidávám vm-04 do svého existujícího replikačního clusteru Repmgr Postgresql.

  1. Přidání vm-04 do souboru inventáře Ansible developmentmeb
    $ cat development.yaml
    all:
      children:
        postgres_cluster:
          hosts:
            vm-01:
            vm-02:
            vm-03:
            vm-04:
          vars:
            ansible_user: "vagrant"
  2. Spustit 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
  3. Zkontrolovat replikační cluster
    $ 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

Závěr

Doposud jsme viděli nastavení replikačního clusteru Repmgr PostgreSQL pomocí Ansible. Jakmile je cluster repmgr nastaven, můžeme pomocí příkazu repmgr provádět další údržbu replikačního clusteru, jako je přepnutí při selhání a přepnutí primárního uzlu a nastavení kaskádové replikace. Další podrobnosti naleznete v dokumentaci k repmgr.


  1. Převod Base 36 na Base 10 pouze pomocí SQL

  2. Android sqlite, limit počtu řádků v databázi

  3. Chyba serveru SQL - HRESULT E_FAIL byla vrácena z volání komponenty COM

  4. Jak deklarovat proměnnou v PostgreSQL