Skip to content

Commit ad05154

Browse files
committed
refactor(pgsql): patroni restart node
tested scenarios: - `./pgsql.yml -l <pg_cls> -t pt_restart -e "pt_restart=true"` - all nodes have been restarted - `./pgsql.yml -l '<ip>,&<pg_cls>' -t pt_restart -e "pt_restart=true"` - nodes in ansible_play_hosts_all have been restarted, other nodes in the same pg_cls ignored - `./pgsql.yml -l '<replica>,<primary>,&<pg_cls>' -t pt_restart -e "pt_restart=true"` - nodes in ansible_play_hosts_all have been restarted, other nodes in the same pg_cls ignored - switchover triggered when patroni restart primary failed
1 parent c2d015c commit ad05154

File tree

6 files changed

+61
-114
lines changed

6 files changed

+61
-114
lines changed

roles/pgsql/tasks/grace_patroni_restart.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
#--------------------------------------------------------------#
1515
# tested scenarios:
1616
# - ./pgsql.yml -l <pg_cls> -t pt_restart -e "pt_restart=true"
17-
# all nodes have been restarted
17+
# - all nodes have been restarted
1818
# - ./pgsql.yml -l '<ip>,&<pg_cls>' -t pt_restart -e "pt_restart=true"
19-
# nodes in ansible_play_hosts_all have been restarted,
20-
# other nodes in the same pg_cls ignored
19+
# - nodes in ansible_play_hosts_all have been restarted, other nodes in the same pg_cls ignored
20+
# - ./pgsql.yml -l '<replica>,<primary>,&<pg_cls>' -t pt_restart -e "pt_restart=true"
21+
# - nodes in ansible_play_hosts_all have been restarted, other nodes in the same pg_cls ignored
22+
# - switchover triggered when patroni restart primary failed
2123
#--------------------------------------------------------------#
2224

2325
- name: set variable
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/ansible-playbook
2+
---
3+
#--------------------------------------------------------------#
4+
# get current member of patroni cluster
5+
#--------------------------------------------------------------#
6+
7+
- name: get current member of patroni cluster
8+
tags: [ pg_hugepage, patroni, pg_launch, pt_restart ]
9+
become_user: "{{ pg_dbsu }}"
10+
block:
11+
- name: retrieve current patroni member of {{ pg_cluster }}
12+
command: /pg/bin/pg-member
13+
register: pg_member_name_cmd
14+
15+
- name: set variable curr_pg_member_name
16+
set_fact:
17+
curr_pg_member_name: "{{ pg_member_name_cmd.stdout | default('') | trim }}"
18+
changed_when: false
19+
20+
...
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/ansible-playbook
2+
---
3+
#--------------------------------------------------------------#
4+
# patroni restart nodes individually
5+
#--------------------------------------------------------------#
6+
7+
- name: patroni restart node
8+
tags: [ pg_hugepage, patroni, pg_launch, pt_restart ]
9+
become_user: "{{ pg_dbsu }}"
10+
when: patroni_mode != 'remove'
11+
block:
12+
- name: get current patroni member of {{ pg_cluster }}
13+
import_tasks: patroni_current_member.yml
14+
15+
# result may be success but contains 'Failed' message,
16+
# due to node has multiple ip addresses and got "Failed: ... status code=403, (Access is denied)" for replica
17+
- name: patroni restart members of {{ pg_cluster }}
18+
when: curr_pg_member_name is defined and curr_pg_member_name|length>0
19+
command: /usr/bin/patronictl -c /pg/bin/patroni.yml restart --force {{ pg_cluster }} {{ curr_pg_member_name }}
20+
register: patroni_restart_cmd
21+
failed_when: patroni_restart_cmd.rc != 0 or patroni_restart_cmd.stdout.find('Failed') != -1
22+
23+
- name: sleep after restart if succeed at primary
24+
when: pg_role_runtime is defined and pg_role_runtime == 'primary'
25+
args: { executable: /bin/bash }
26+
shell: |
27+
sync; sync;
28+
sleep 3
29+
changed_when: false
30+
31+
...

roles/pgsql/tasks/util/patroni_restart_at_primary.yml

Lines changed: 0 additions & 59 deletions
This file was deleted.

roles/pgsql/tasks/util/patroni_restart_at_replica.yml

Lines changed: 0 additions & 38 deletions
This file was deleted.

roles/pgsql/tasks/util/patroni_restart_cls.yml

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,12 @@
88
vars:
99
dbsu: "{{ pg_dbsu|default('postgres') }}"
1010
block:
11-
# if ansible_play_hosts_all contains primary node, restart all nodes at primary
12-
- name: restart all nodes of {{ pg_cluster }} at primary
11+
- name: restart primary of {{ pg_cluster }}
1312
when: pg_role == 'primary'
14-
include_tasks: patroni_restart_at_primary.yml
13+
include_tasks: patroni_restart.yml
1514

16-
- name: set variable need_restart_at_replica at all nodes
17-
set_fact:
18-
need_restart_at_replica: "{{ not (hostvars[pg_primary_host_runtime].pt_restart_full_succeed | default(false) | string | trim | bool) }}"
19-
changed_when: false
20-
21-
# if ansible_play_hosts_all not contains primary node,
22-
# or primary node restart failed,
23-
# restart affected replica nodes at replica
24-
- name: patroni restart ansible_play_hosts_all at replica if needed
25-
include_tasks: patroni_restart_at_replica.yml
26-
when: pg_role != 'primary' and need_restart_at_replica == true
15+
- name: patroni restart replica of {{ pg_cluster }}
16+
include_tasks: patroni_restart.yml
17+
when: pg_role != 'primary'
2718

2819
...

0 commit comments

Comments
 (0)