Atelier Industrialisation PostgreSQL
Dalibo & Contributors
dalibo.pglift
dalibo.essential
: PostgreSQL, réplication, monitoring,
sauvergardedalibo.advanced
: HA, performances, audit, ldap,
poolerdalibo.extras
: Tous les outils annexes
(ETCD,rsyslog, logrotate, etc)postgres
Installer PostgreSQL 16 :
[root@srv-pg1 ~]# dnf install -y postgresql16 postgresql16-server \
postgresql16-contrib
Installer pgBackRest :
[root@srv-pg1 ~]# dnf install -y pgbackrest
Installer pglift avec pipx
, en tant que
postgres
:
[root@srv-pg1 ~]# su - postgres << EOF
pip3.9 install pipx
~/.local/bin/pipx install "pglift[cli]" --include-deps
~/.local/bin/pipx ensurepath
EOF
Ouvrir une nouvelle session est nécessaire pour que le binaire
pglift
soit dans le ${PATH}
de l’utilisateur
postgres
~/.config/pglift/settings.yaml
/etc/pglift/settings.yaml
pglift site-configure install
$ pglift instance create main \
--pgbackrest-stanza=main
Inventaire Ansible : ~/ansible/inventory
srv-pg1 ansible_port=2201
srv-pg2 ansible_port=2202
srv-pg3 ansible_port=2203
[all:vars]
ansible_connection=ssh
ansible_host=127.0.0.1
ansible_user=dalibo
ansible_ssh_pass=Password
[etcd]
srv-pg1
srv-pg2
srv-pg3
[database]
srv-pg1
srv-pg2
[primary]
srv-pg1
[standby]
srv-pg2
[temboard]
srv-pg3
collections:
- dalibo.pglift
- community.general
- dalibo.essential
- dalibo.advanced
- dalibo.extras
$ ansible-galaxy collection install -fr collections/requirements.yml
$ ansible-playbook -i inventory prerequisites.yml
dalibo.essential.temboard
: Pour l’installationtemboard
: Pour la configurationtemboard.yml
$ ansible-playbook -i inventory temboard.yml
dalibo.extras.etcd
: Pour l’installation et la
configurationetcd.yml
$ ansible-playbook -i inventory etcd.yml
- name: Install Database Server
hosts: database
become: true
roles:
- dalibo.extras.repo_epel
- dalibo.essential.repo_pgdg
- dalibo.essential.repo_dalibo
- dalibo.extras.accounts
- dalibo.essential.postgresql
- dalibo.essential.pgbackrest
- dalibo.advanced.patroni
- dalibo.essential.temboard_agent
- dalibo.essential.pglift
$ ansible-playbook -i inventory postgresql.yml
dalibo.pglift.instance
---
- name: Deploy a standalone Instance
hosts: primary
become: true
become_user: postgres
tasks:
- name: Create Instance
dalibo.pglift.instance:
name: main
state: started
version: 16
port: 5432
surole_password: Passw0rd
pgbackrest:
password: Passw0rd
stanza: main-stz
temboard:
password: Passw0rd
replrole_password: Passw0rd
databases:
- name: ws1
$ ansible-playbook -i inventory instance_standalone.yml
---
- name: Get instances gather facts
hosts: primary
gather_facts: true
- name: Deploy standby Instance
hosts: standby
become: true
become_user: postgres
tasks:
- name: Creating standby Instance
dalibo.pglift.instance:
name: standby
state: started
version: 16
port: 5432
surole_password: Passw0rd
pgbackrest:
password: Passw0rd
stanza: main-stz
standby:
primary_conninfo: "host={{ hostvars[item]['ansible_eth1'].ipv4.address }} user=replication port=5432"
password: Passw0rd
temboard:
password: Passw0rd
loop: "{{ groups['primary'] }}"
$ ansible-playbook -i inventory standby_instance.yml
$ pglift instance backup main
INFO backing up instance 16/main with pgBackRest
$ pglift database -i main drop ws1
INFO dropping 'ws1' database
$ pglift instance stop main
INFO stopping PostgreSQL 16-main
$ pglift instance restore main --label '20240118-084757F_20240118-085536I'
INFO restoring instance 16/main with pgBackRest
pglift pgconf
edit
, remove
,
set
, show
pg_hba.conf
avec la commande
pglift pghba
add
, remove
$ pglift database -i main run "ANALYZE"
$ pglift database -i main run -d postgres "VACUUM FULL"
$ pglift database -i main run -x postgres "VACUUM"
~/.config/pglift/settings.yaml
pg_hba.conf
)pglift
dalibo.pglift
$ pglift instance create main --pgbackrest-stanza=main-app \
--replrole-password PasswOrd \
--patroni-cluster maincluster \
--patroni-node <node_name> \
--patroni-restapi-connect-address "<IP-Machine>:8008" \
--patroni-restapi-listen "<IP-Machine>:8008" \
--patroni-postgresql-connect-host <IP-Machine>
dalibo.pglift.instance
---
- name: Create Instances
hosts: database
become_user: postgres
become: true
tasks:
- name: Managing instances
dalibo.pglift.instance:
name: main
state: started
version: 16
port: 5432
surole_password: Passw0rd
replrole_password: Passw0rd
temboard:
password: Passw0rd
pgbackrest:
password: Passw0rd
stanza: maincluster-stz
patroni:
cluster: maincluster
node: "{{ ansible_hostname }}"
restapi:
connect_address: "{{ ansible_eth1.ipv4.address }}:8008"
listen: "{{ ansible_eth1.ipv4.address }}:8008"
postgresql:
connect_host: "{{ ansible_default_ipv4.address }}"
throttle: 1
$ ansible-playbook -i inventory instance_ha.yml
$ pglift instance exec main -- patronictl edit-config maincluster
$ pglift pgconf -i main edit
$ pglift instance exec main -- patronictl list
+ Cluster: maincluster (7334815726709754190) ----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------+-----------------+--------------+-----------+----+-----------+
| srv-pg1 | 192.168.121.172 | Leader | running | 1 | |
| srv-pg2 | 192.168.121.89 | Sync Standby | streaming | 1 | 0 |
+---------+-----------------+--------------+-----------+----+-----------+
$ pglift instance exec main -- patronictl switchover
$ pkill -9 patroni
srv-pg2
redémarre suite au déclanchement du
watchdog par patronitemboard
temboard-agent
---
- name: Get instances gather facts
hosts: database
gather_facts: true
- name: Register instances in temBoard
hosts: temboard
gather_facts: true
become: true
become_user: temboard
tasks:
- name: Register instances in temBoard
ansible.builtin.shell: "temboard register-instance {{ hostvars[item]['ansible_default_ipv4']['address'] }} 2345 -e default"
loop: "{{ groups['primary'] }}"
- name: Register instances in temBoard
ansible.builtin.shell: "temboard register-instance {{ hostvars[item]['ansible_default_ipv4']['address'] }} 2345 -e default"
loop: "{{ groups['standby'] }}"
$ ansible-playbook -i inventory temboard_register.yml
VACUUM [FULL]
, ANALYZE
,
REINDEX
)