mirror of
https://gitea.0xace.cc/ansible-galaxy/patroni.git
synced 2024-11-24 23:56:39 +00:00
add restore support
This commit is contained in:
parent
11d311a96a
commit
4759d93a91
@ -23,7 +23,8 @@ patroni_replication_password: "replicator"
|
||||
# Patroni REST API options
|
||||
patroni_restapi_username: "admin"
|
||||
patroni_restapi_password: "admin"
|
||||
patroni_restapi_listen_port: 8008
|
||||
patroni_restapi_listen_port: "8008"
|
||||
patroni_restapi_listen_address: "0.0.0.0"
|
||||
|
||||
# Patroni SSL options
|
||||
patroni_ssl: false
|
||||
@ -36,21 +37,30 @@ patroni_play_group: "patroni"
|
||||
patroni_dcs_exists: false
|
||||
patroni_dcs_type: "consul"
|
||||
|
||||
## Backup and restore options
|
||||
## WAL-G backup and restore options
|
||||
patroni_wal_g_install: false
|
||||
patroni_wal_g_restore_from_backup: false
|
||||
patroni_wal_g_pitr: 'latest'
|
||||
patroni_wal_g_restore_backup_name: 'LATEST'
|
||||
patroni_wal_g_pg_binary_name: 'wal-g-pg'
|
||||
patroni_postgresql_archive_mode: "{{ 'on' if patroni_wal_g_install else 'off' }}"
|
||||
patroni_postgresql_archive_command: "{{ 'http_proxy=' ~ wal_g_http_proxy ~ ' ' if wal_g_http_proxy is defined else '' }}{{ 'https_proxy=' ~ wal_g_https_proxy ~ ' ' if wal_g_https_proxy is defined else 'https_proxy=' ~ wal_g_http_proxy ~ ' ' if wal_g_http_proxy is defined else '' }}{{ wal_g_pg_binary_name ~ ' wal-push %p' if patroni_wal_g_install else '' }}"
|
||||
patroni_wal_g_config_name: ".walg.json"
|
||||
patroni_wal_g_restore_config_name: ".walg-restore.json"
|
||||
patroni_restore_script: "{{ patroni_postgresql_home_dir }}/restore.sh"
|
||||
#patroni_postgresql_archive_command: "wal-g wal-push %p"
|
||||
#patroni_postgresql_restore_command: "wal-g wal-fetch %f %p"
|
||||
#patroni_cluster_bootstrap_command: "wal-g backup-fetch latest"
|
||||
## "restore_command" written to recovery.conf when configuring follower (create replica)
|
||||
#patroni_cluster_restore_command: "wal-g wal-fetch %f %p"
|
||||
#patroni_wal_g_create_replica_methods:
|
||||
# - {option: "command", value: "{{ patroni_cluster_bootstrap_command }}"}
|
||||
# - {option: "no_params", value: "True"}
|
||||
#patroni_basebackup_create_replica_methods:
|
||||
# - {option: "max-rate", value: "1000M"}
|
||||
# - {option: "checkpoint", value: "fast"}
|
||||
|
||||
patroni_wal_g_create_replica_methods:
|
||||
- {option: "command", value: "{{ 'http_proxy=' ~ wal_g_http_proxy ~ ' ' if wal_g_http_proxy is defined else '' }}{{ 'https_proxy=' ~ wal_g_https_proxy ~ ' ' if wal_g_https_proxy is defined else 'https_proxy=' ~ wal_g_http_proxy ~ ' ' if wal_g_http_proxy is defined else '' }}{{ wal_g_pg_binary_name }} backup-fetch {{ patroni_postgresql_data_dir }} LATEST"}
|
||||
- {option: "no_params", value: "True"}
|
||||
patroni_basebackup_create_replica_methods:
|
||||
- {option: "max-rate", value: "1000M"}
|
||||
- {option: "checkpoint", value: "fast"}
|
||||
|
||||
# "restore_command" written to recovery.conf when configuring follower (create replica)
|
||||
patroni_postgresql_restore_command: "{{ 'http_proxy=' ~ wal_g_http_proxy ~ ' ' if wal_g_http_proxy is defined else '' }}{{ 'https_proxy=' ~ wal_g_https_proxy ~ ' ' if wal_g_https_proxy is defined else 'https_proxy=' ~ wal_g_http_proxy ~ ' ' if wal_g_http_proxy is defined else '' }}{{ wal_g_pg_binary_name ~ ' wal-fetch %f %p' if patroni_wal_g_install else '' }}"
|
||||
# More examples
|
||||
# patroni_postgresql_restore_command: "pgbackrest --stanza={{ pgbackrest_stanza }} archive-get %f %p" # restore WAL-s using pgbackrest
|
||||
# patroni_postgresql_restore_command: "pg_probackup-{{ pg_probackup_version }} archive-get -B {{ pg_probackup_dir }} --instance {{ pg_probackup_instance }} --wal-file-path=%p --wal-file-name=%f" # restore WAL-s using pg_probackup
|
||||
|
||||
patroni_synchronous_mode: false # or 'true' for enable synchronous database replication
|
||||
patroni_synchronous_mode_strict: false # if 'true' then block all client writes to the master, when a synchronous replica is not available
|
||||
@ -94,11 +104,11 @@ patroni_postgresql_backup_parameters:
|
||||
parameters:
|
||||
archive_command: "{{ patroni_postgresql_archive_command if patroni_wal_g_install else 'cd .' }}"
|
||||
restore_command: "{{ patroni_postgresql_restore_command if patroni_wal_g_install else 'cd .' }}"
|
||||
archive_mode: "on"
|
||||
archive_timeout: "1800s"
|
||||
|
||||
# postgresql parameters to bootstrap dcs (are parameters for example)
|
||||
patroni_postgresql_default_parameters:
|
||||
archive_mode: "on"
|
||||
archive_timeout: "1800s"
|
||||
max_connections: "1000"
|
||||
superuser_reserved_connections: "5"
|
||||
password_encryption: "{{ patroni_postgresql_password_encryption_algorithm }}"
|
||||
|
@ -3,10 +3,6 @@
|
||||
set_fact:
|
||||
patroni_postgresql_parameters_combined: "{{ patroni_postgresql_default_parameters | combine(patroni_postgresql_parameters|default({}), recursive=true) }}"
|
||||
|
||||
- name: Merge backup options for PostgreSQL part of Patroni config
|
||||
set_fact:
|
||||
patroni_postgresql_parameters_combined: "{{ patroni_postgresql_parameters_combined | combine(patroni_postgresql_backup_parameters['postgresql']['parameters']|default({}), recursive=true) }}"
|
||||
|
||||
- name: Template Patroni default config
|
||||
set_fact:
|
||||
patroni_default_config: "{{ lookup('template', 'patroni.yaml.j2') | from_yaml }}"
|
||||
@ -45,3 +41,11 @@
|
||||
register: patroni_config_file
|
||||
when: not patroni_config_file_exists_result.stat.exists
|
||||
notify: Restart Patroni
|
||||
|
||||
- name: Propagate Patroni restore script
|
||||
template:
|
||||
src: "restore.sh.j2"
|
||||
dest: "{{ patroni_restore_script }}"
|
||||
owner: "postgres"
|
||||
group: "postgres"
|
||||
mode: 0755
|
||||
|
@ -15,7 +15,22 @@
|
||||
- name: Dynamic configuration parameters for Patroni
|
||||
when: patroni_dynamic_config_file.changed
|
||||
block:
|
||||
- name: Find Patroni master
|
||||
- name: Wait for Patroni leader
|
||||
vars:
|
||||
_query: 'json.members[].role'
|
||||
ansible.builtin.uri:
|
||||
url: "{{ 'https://' if patroni_ssl else 'http://' }}{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ patroni_restapi_listen_port }}/cluster"
|
||||
method: GET
|
||||
body_format: json
|
||||
status_code:
|
||||
- 200
|
||||
- 503
|
||||
register: patroni_role
|
||||
until: patroni_role | json_query(_query) | regex_findall('leader') | count > 0
|
||||
retries: 100
|
||||
delay: 10
|
||||
|
||||
- name: Get Patroni nodes roles
|
||||
ansible.builtin.uri:
|
||||
url: "{{ 'https://' if patroni_ssl else 'http://' }}{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ patroni_restapi_listen_port }}"
|
||||
method: GET
|
||||
@ -39,4 +54,5 @@
|
||||
force_basic_auth: yes
|
||||
when:
|
||||
- "hostvars[inventory_hostname]['role'] == 'master'"
|
||||
|
||||
rescue:
|
||||
- include_tasks: dynamic_config.yaml
|
||||
|
@ -70,9 +70,10 @@
|
||||
register: patroni_enable_and_start
|
||||
tags: patroni, patroni_start
|
||||
|
||||
- name: "Dynamic Patroni configuration"
|
||||
include_tasks: dynamic_config.yaml
|
||||
#when:
|
||||
# - patroni_postgresql_dynamic_parameters
|
||||
tags: patroni_dynamic_configure
|
||||
#- name: Patroni cluster reconfiguration after restore from backup
|
||||
# include_tasks: restore.yaml
|
||||
# when: patroni_wal_g_restore_from_backup
|
||||
|
||||
- name: Dynamic Patroni configuration
|
||||
include_tasks: dynamic_config.yaml
|
||||
tags: patroni_dynamic_configure
|
||||
|
7
tasks/restore.yaml
Normal file
7
tasks/restore.yaml
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
- name: Copy walg-backup to walg-restore after restore
|
||||
copy:
|
||||
src: "{{ patroni_postgresql_home_dir ~ '/' ~ patroni_wal_g_backup_config_name }}"
|
||||
dest: "{{ patroni_postgresql_home_dir ~ '/' ~ patroni_wal_g_restore_config_name }}"
|
||||
remote_src: true
|
||||
when: patroni_wal_g_backup
|
@ -25,7 +25,7 @@ ctl:
|
||||
cafile: {{ patroni_ssl_path }}/CA-cert.crt
|
||||
|
||||
restapi:
|
||||
listen: 0.0.0.0:{{ patroni_restapi_listen_port }}
|
||||
listen: {{ patroni_restapi_listen_address }}:{{ patroni_restapi_listen_port }}
|
||||
connect_address: {{ hostvars[inventory_hostname]['ansible_host'] }}:{{ patroni_restapi_listen_port }}
|
||||
{% if patroni_ssl|bool %}
|
||||
certfile: {{ patroni_ssl_path }}/{{ patroni_self_signed_cert_name }}.crt
|
||||
@ -57,12 +57,12 @@ bootstrap:
|
||||
method: {{ patroni_cluster_bootstrap_method }}
|
||||
{% if patroni_cluster_bootstrap_method == 'wal-g' %}
|
||||
wal-g:
|
||||
command: {{ patroni_wal_g_cluster_bootstrap_command }}
|
||||
command: {{ patroni_restore_script }}
|
||||
no_params: True
|
||||
recovery_conf:
|
||||
recovery_target_action: promote
|
||||
recovery_target_timeline: latest
|
||||
restore_command: {{ patroni_wal_g_pg_binary_name }} wal-fetch %f %p
|
||||
recovery_target_timeline: {{ patroni_wal_g_pitr }}
|
||||
restore_command: {{ patroni_cluster_restore_command }}
|
||||
{% endif %}
|
||||
{% if patroni_cluster_bootstrap_method == 'pg_probackup' %}
|
||||
pg_probackup:
|
||||
@ -126,9 +126,9 @@ postgresql:
|
||||
listen: {{ hostvars[inventory_hostname]['ansible_host'] }},127.0.0.1:{{ patroni_postgresql_port }}
|
||||
connect_address: {{ hostvars[inventory_hostname]['ansible_host'] }}:{{ patroni_postgresql_port }}
|
||||
use_unix_socket: true
|
||||
data_dir: {{ patroni_postgresql_home_dir }}/{{ patroni_postgresql_major_version }}/data
|
||||
data_dir: {{ patroni_postgresql_home_dir }}/{{ patroni_postgresql_major_version }}/{{ patroni_postgresql_cluster_name }}
|
||||
bin_dir: {{ patroni_postgresql_bin_dir }}
|
||||
config_dir: {{ patroni_postgresql_home_dir }}/{{ patroni_postgresql_major_version }}/data
|
||||
config_dir: {{ patroni_postgresql_home_dir }}/{{ patroni_postgresql_major_version }}/{{ patroni_postgresql_cluster_name }}
|
||||
pgpass: {{ patroni_postgresql_home_dir }}/.pgpass_patroni
|
||||
authentication:
|
||||
replication:
|
||||
@ -215,11 +215,6 @@ postgresql:
|
||||
max-rate: '100M'
|
||||
{% endif %}
|
||||
|
||||
{% if patroni_postgresql_restore_command is defined and patroni_postgresql_restore_command | length > 0 and patroni_wal_g_install %}
|
||||
recovery_conf:
|
||||
restore_command: {{ patroni_postgresql_restore_command }}
|
||||
{% endif %}
|
||||
|
||||
watchdog:
|
||||
mode: off # Allowed values: off, automatic, required
|
||||
device: /dev/watchdog
|
||||
|
2
templates/restore.sh.j2
Normal file
2
templates/restore.sh.j2
Normal file
@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env bash
|
||||
{{ patroni_cluster_bootstrap_command }}
|
@ -7,7 +7,7 @@ patroni_apt_repository:
|
||||
filename: postgresql
|
||||
|
||||
patroni_deps_packages:
|
||||
- gnupg
|
||||
- gnupg2
|
||||
- python3-psycopg2
|
||||
- python3-consul
|
||||
- python3-zookeeper
|
||||
|
@ -7,7 +7,7 @@ patroni_apt_repository:
|
||||
filename: postgresql
|
||||
|
||||
patroni_deps_packages:
|
||||
- gnupg
|
||||
- gnupg2
|
||||
- python3-psycopg2
|
||||
- python3-consul
|
||||
- python3-zookeeper
|
||||
|
@ -23,6 +23,7 @@ patroni_postgresql_package_name: "postgresql"
|
||||
patroni_postgresql_package: "{{ patroni_postgresql_package_name }}-{{ patroni_postgresql_version }}"
|
||||
patroni_postgresql_data_dir: "{{ patroni_postgresql_home_dir }}/{{ patroni_postgresql_major_version }}/data"
|
||||
patroni_postgresql_wal_dir: ""
|
||||
patroni_postgresql_cluster_name: "data"
|
||||
patroni_postgresql_conf_dir: "{{ patroni_postgresql_data_dir }}"
|
||||
patroni_postgresql_log_dir: "/var/log/postgresql"
|
||||
patroni_postgresql_unix_socket_dir: "/var/run/postgresql"
|
||||
|
@ -7,7 +7,7 @@ patroni_apt_repository:
|
||||
filename: postgresql
|
||||
|
||||
patroni_deps_packages:
|
||||
- gnupg
|
||||
- gnupg2
|
||||
- python3-psycopg2
|
||||
- python3-consul
|
||||
- python3-zookeeper
|
||||
|
@ -7,7 +7,7 @@ patroni_apt_repository:
|
||||
filename: postgresql
|
||||
|
||||
patroni_deps_packages:
|
||||
- gnupg
|
||||
- gnupg2
|
||||
- python3-psycopg2
|
||||
- python3-consul
|
||||
- python3-zookeeper
|
||||
|
Loading…
Reference in New Issue
Block a user