sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-replicatie instellen en onderhouden met Ansible

Replicatie is een belangrijke functie voor de meeste instellingen en wordt ondersteund door de meeste databasetechnologieën op de markt. De PostgreSQL-gemeenschap introduceerde replicatie in versie 9.0 (genaamd Streaming Replication of SR), sindsdien is de replicatie in PostgreSQL geëvolueerd met extra functies zoals Cascading Replication, Logical Decoding en nog een aantal andere optimalisaties.

In deze blog zullen we kijken naar het gebruik van de Ansible-rol postgresql zoals ontwikkeld door "Demonware" (een afsplitsing van de rol "ANXS/postgresql"). Ik had het al gehad over het gebruik van de "ANXS/postgresql"-rol in mijn vorige blog, maar ik heb de replicatiefunctie niet besproken. De Ansible-rol "postgresql" voegt de mogelijkheid toe om PostgreSQL-replicatie in te stellen met behulp van repmgr.

Over Repmgr

Repmgr is een open-source opdrachtregelprogramma ontwikkeld en onderhouden door 2ndQuadrant. De tool automatiseert de meeste taken die verband houden met het beheer van het PostgreSQL-replicatiecluster. Hieronder vindt u de lijst met taken die soepel kunnen worden uitgevoerd met het repmgr-commando en de repmgrd-daemon.

  • Bootstrapping van het PostgreSQL-replicatiecluster.
  • Auto-failover en handmatige omschakeling van de primaire instantie uitvoeren.
  • De standby-instanties (read-replica) toevoegen en verwijderen.

Het controllerknooppunt voorbereiden

Bereid het controllerknooppunt voor met de Ansible PostgreSQL-rol, playbooks, inventarissen en aangepaste PostgreSQL-replicatie.

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

In de gedownloade rol zijn er twee standaard variabele bestanden main.yml en repmgr.yml bestand. Ansible houdt echter alleen rekening met het bestand main.yml. Om de Ansible ook het bestand repmgr.yml te maken, verplaatsen we beide bestanden naar de directory defaults/main.

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

Ansible-inventarisbestand

Voor de demo zullen we het PostgreSQL-replicatiecluster op drie knooppunten instellen. Ik heb drie CentOS-VM's vm-01, vm-02 en vm-03 gemaakt, ze worden allemaal vermeld onder de groep postgres_cluster in het bestand development.yaml.

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

Voer Ansible-ping uit en zorg ervoor dat we alle hosts onder de groep postgres_cluster kunnen bereiken.

$ 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"
}

Aangepast variabele bestand

In het bestand met aangepaste variabelen custom-vars.yaml zullen we de volgende dingen definiëren:

  • PostgreSQL-versie om te installeren en te coderen om te gebruiken
  • Als we de PostgreSQL-configuratie aanpassen om replicatie mogelijk te maken, zullen we de parameters zoals wal_level, max_wal_senders, max_replication_slots, hot_standby, archive_mode, archive_command aanpassen
  • Aanmaken van de benodigde gebruikers en database
  • Het pg_hba.conf-bestand wijzigen om de noodzakelijke verbinding vanuit de applicatie en de repmgr-replicatie toe te staan
  • Enkele repmgr-gerelateerde variabelen
$ 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"

Hieronder volgen enkele van de opmerkelijke variabelen die zijn gedefinieerd in custom-vars.yaml:

  • postgresql_version:11 - Installeert PostgreSQL versie 11
  • postgresql_ext_install_repmgr:ja - installeert de repmgr-extensie op het PostgreSQL-cluster
  • repmgr_target_group:"postgres_cluster" - Repmgr werkt op de hosts gedefinieerd onder de groep "postgres_cluster" gedefinieerd in het inventarisbestand
  • repmgr_master:"vm-03" - Host vm-03 wordt de primaire instantie van PostgreSQL, vm-01 en vm--02 repliceren van vm-03

Ansible Playbook

In het onderstaande postgres-play.yaml-playbook heb ik de rol postgresql toegewezen aan de hostgroep postgres_cluster. Ik heb ook het aangepaste variabele bestand custom-vars.yaml toegevoegd dat de configuratie heeft voor PostgreSQL en repmgr.

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

Ansible Playbook gebruiken

We hebben nu de volgende Ansible-artefacten gemaakt en we zijn klaar om het Ansible-playbook uit te voeren.

  • roles/postgresql, Ansible-rollenmap.
  • custom-vars.yaml, Ansible variabel bestand.
  • development.yaml, Ansible-inventarisbestand.
  • postgres-play.yam, Ansible playbook-bestand.

Voer de onderstaande ansible-playbook-opdracht uit vanaf het controllerknooppunt. Omdat de postgresql-rol de sudo-toegang van de controller verwacht, specificeren we de optie -K in de opdracht, die ons op zijn beurt vraagt ​​om het SUDO-wachtwoord van het controllerknooppunt in te voeren.

$ 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

Controleer de PLAY RECAP in de opdrachtuitvoer en zorg ervoor dat de mislukte telling 0 is.

Controleer PostgreSQL-replicatie

Met de onderstaande opdracht repmgr cluster show kunnen we de status van het PostgreSQL-replicatiecluster controleren. Het toont de rol, status en tijdlijn van alle PostgreSQL-instanties in het replicatiecluster.

$ 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

Uit de uitvoer van de bovenstaande opdracht is vm-03 de primaire en vm-01, vm02 zijn de standby-instantie die repliceert vanaf het stroomopwaartse knooppunt vm-03. Alle PostgreSQL-instanties zijn actief.

Controle pg_stat_replication view op primaire vm-03 om te bevestigen dat zowel vm-01 als vm-02 goed repliceren.

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

Een ander stand-byknooppunt aan het cluster toevoegen

Om nog een PostgreSQL-knooppunt aan het cluster toe te voegen, hoeven we alleen het Ansible-playbook opnieuw uit te voeren nadat we de specifieke host in de inventaris hebben toegevoegd. In de onderstaande stappen voeg ik vm-04 toe aan mijn bestaande Repmgr Postgresql-replicatiecluster.

  1. vm-04 toevoegen aan het Ansible-inventarisbestand developmentmeb
    $ cat development.yaml
    all:
      children:
        postgres_cluster:
          hosts:
            vm-01:
            vm-02:
            vm-03:
            vm-04:
          vars:
            ansible_user: "vagrant"
  2. Voer 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. Controleer replicatiecluster
    $ 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

Conclusie

Tot nu toe hebben we gezien bij het opzetten van het Repmgr PostgreSQL-replicatiecluster met behulp van Ansible. Nadat het repmgr-cluster is ingesteld, kunnen we het repmgr-commando gebruiken om ander onderhoud aan het replicatiecluster uit te voeren, zoals het uitvoeren van een failover en omschakeling van het primaire knooppunt en het instellen van cascadereplicatie. Raadpleeg de repmgr-documentatie voor meer details.


  1. Wat is de beste manier om mediabestanden op te slaan in een database?

  2. Wat is het verschil tussen LATERAL JOIN en een subquery in PostgreSQL?

  3. Zoek het aantal kolommen in een tabel

  4. PostgreSQL Connection Pooling:Part 3 – Pgpool-II