|
36 | 36 |
|
37 | 37 | - name: Remove old PostgreSQL primary container
|
38 | 38 | community.docker.docker_container:
|
39 |
| - name: "pdpgsql_pmm_{{ pg_version }}_1" |
| 39 | + name: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
40 | 40 | image: "{{ docker_repo }}:{{ pg_version }}"
|
41 | 41 | restart_policy: always
|
42 | 42 | state: absent
|
43 | 43 | ignore_errors: yes
|
44 | 44 |
|
45 | 45 | - name: Start PostgreSQL primary container
|
46 | 46 | community.docker.docker_container:
|
47 |
| - name: "pdpgsql_pmm_{{ pg_version }}_1" |
| 47 | + name: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
48 | 48 | image: "{{ docker_repo }}:{{ pg_version }}"
|
49 | 49 | restart_policy: always
|
50 | 50 | state: started
|
|
70 | 70 |
|
71 | 71 | - name: Create replication user
|
72 | 72 | community.docker.docker_container_exec:
|
73 |
| - container: "pdpgsql_pmm_{{ pg_version }}_1" |
| 73 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
74 | 74 | user: postgres
|
75 | 75 | command: >
|
76 | 76 | psql -c "
|
|
79 | 79 |
|
80 | 80 | - name: Stop and remove replica if exists
|
81 | 81 | community.docker.docker_container:
|
82 |
| - name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 82 | + name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
83 | 83 | state: absent
|
84 | 84 | loop: "{{ range(2, nodes_count | int + 1) | list }}"
|
85 | 85 | ignore_errors: yes
|
86 | 86 |
|
87 | 87 | - name: Start Percona Distribution PostgreSQL replica container
|
88 | 88 | community.docker.docker_container:
|
89 |
| - name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 89 | + name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
90 | 90 | image: "{{ docker_repo }}:{{ pg_version }}"
|
91 | 91 | restart_policy: "no"
|
92 | 92 | state: started
|
|
104 | 104 |
|
105 | 105 | - name: Wipe replica data directory before basebackup
|
106 | 106 | community.docker.docker_container_exec:
|
107 |
| - container: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 107 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
108 | 108 | user: root
|
109 | 109 | command: rm -rf /data/db/*
|
110 | 110 | loop: "{{ range(2, nodes_count | int + 1) | list }}"
|
111 | 111 |
|
112 | 112 | - name: Create PostgreSQL user 'pmm' with password
|
113 | 113 | community.docker.docker_container_exec:
|
114 |
| - container: "pdpgsql_pmm_{{ pg_version }}_1" |
| 114 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
115 | 115 | user: postgres
|
116 | 116 | command: >
|
117 | 117 | bash -c '
|
|
121 | 121 | "
|
122 | 122 | '
|
123 | 123 |
|
124 |
| -- name: Create custom database for pgbench |
| 124 | +- name: Create custom database |
125 | 125 | community.docker.docker_container_exec:
|
126 |
| - container: "pdpgsql_pmm_{{ pg_version }}_1" |
| 126 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
127 | 127 | user: postgres
|
128 | 128 | command: >
|
129 | 129 | bash -c "
|
130 | 130 | echo \"
|
131 |
| - CREATE DATABASE pgbench; |
132 |
| - \\c pgbench |
133 |
| - GRANT CONNECT ON DATABASE pgbench TO pmm; |
| 131 | + CREATE DATABASE test_database; |
| 132 | + \\c test_database |
| 133 | + GRANT CONNECT ON DATABASE test_database TO pmm; |
134 | 134 | GRANT USAGE ON SCHEMA public TO pmm;
|
135 | 135 | GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO pmm;
|
136 | 136 | ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
|
140 | 140 |
|
141 | 141 | - name: Run pg_basebackup from primary to replica
|
142 | 142 | community.docker.docker_container_exec:
|
143 |
| - container: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 143 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
144 | 144 | user: root
|
145 | 145 | command: >
|
146 | 146 | bash -c "
|
147 | 147 | export PGPASSWORD='{{ replication_password }}' && \
|
148 | 148 | timeout 120s \
|
149 | 149 | pg_basebackup --pgdata=/data/db -R -v -Fp -Xs -P \
|
150 |
| - --host=pdpgsql_pmm_{{ pg_version }}_1 --port=5432 -U {{ replication_user }} > /tmp/pg_basebackup.log 2>&1 |
| 150 | + --host=pdpgsql_pmm_replication_{{ pg_version }}_1 --port=5432 -U {{ replication_user }} > /tmp/pg_basebackup.log 2>&1 |
151 | 151 | "
|
152 | 152 | loop: "{{ range(2, nodes_count | int + 1) | list }}"
|
153 | 153 |
|
154 | 154 | - name: Remove temporary backup container
|
155 | 155 | docker_container:
|
156 |
| - name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 156 | + name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
157 | 157 | state: absent
|
158 | 158 | loop: "{{ range(2, nodes_count | int + 1) | list }}"
|
159 | 159 |
|
|
168 | 168 |
|
169 | 169 | - name: Restart Percona Distribution PostgreSQL container with custom command
|
170 | 170 | community.docker.docker_container:
|
171 |
| - name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 171 | + name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
172 | 172 | image: "{{ docker_repo }}:{{ pg_version }}"
|
173 | 173 | restart: true
|
174 | 174 | state: started
|
|
188 | 188 | - name: Install pg stat monitor.
|
189 | 189 | include_tasks: ./tasks/install_pg_stat-monitor.yml
|
190 | 190 | vars:
|
191 |
| - container_name: "pdpgsql_pmm_{{ pg_version }}" |
| 191 | + container_name: "pdpgsql_pmm_replication_{{ pg_version }}" |
192 | 192 |
|
193 | 193 | - name: Install and add pmm client.
|
194 | 194 | include_tasks: ../tasks/install_pmm_client.yml
|
195 | 195 | vars:
|
196 |
| - container_name: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
| 196 | + container_name: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
197 | 197 | loop: "{{ range(1, nodes_count | int + 1) | list }}"
|
198 | 198 |
|
199 | 199 | - name: Get already connected services to pmm server
|
200 | 200 | community.docker.docker_container_exec:
|
201 |
| - container: "pdpgsql_pmm_{{ pg_version }}_1" |
| 201 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
202 | 202 | command: >
|
203 | 203 | sh -c 'curl --location --insecure -u"admin:{{ admin_password }}" -s --request GET "http://{{ pmm_server_ip }}:{{ '80' if pmm_server_ip is ansible.utils.ipv4 else '8080' }}/v1/management/services" | jq -r ".services[].service_name"'
|
204 | 204 | register: pmm_server_services
|
|
217 | 217 |
|
218 | 218 | - name: Add service to pmm server
|
219 | 219 | community.docker.docker_container_exec:
|
220 |
| - container: "pdpgsql_pmm_{{ pg_version }}_{{ item }}" |
221 |
| - command: pmm-admin add postgresql --username=pmm --password=pmm --query-source=pgstatmonitor pdpgsql_pmm_{{ pg_version }}_{{ item }}{{ random_service_name_value }} --debug 127.0.0.1:5432 |
| 220 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}" |
| 221 | + command: pmm-admin add postgresql --username=pmm --password=pmm --cluster=pdpgsql_replication_cluster --environment=pdpgsql_replication_environment --query-source=pgstatmonitor pdpgsql_pmm_replication_{{ pg_version }}_{{ item }}{{ random_service_name_value }} --debug 127.0.0.1:5432 |
222 | 222 | loop: "{{ range(1, nodes_count | int + 1) | list }}"
|
223 | 223 |
|
224 |
| -- name: Run load on primary node. |
225 |
| - include_tasks: ../postgresql/tasks/run_load_pgsql.yml |
226 |
| - vars: |
227 |
| - node_name: "pdpgsql_pmm_{{ pg_version }}_1" |
228 |
| - pgbench_clients: 10 |
229 |
| - pgbench_time: 120 |
230 |
| - pgbench_scale: 1000 |
| 224 | +- name: Create pg_custom_publication view using psql |
| 225 | + community.docker.docker_container_exec: |
| 226 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
| 227 | + user: postgres |
| 228 | + command: > |
| 229 | + bash -c 'psql -U postgres -d postgres <<SQL |
| 230 | + CREATE OR REPLACE VIEW pg_custom_publication AS |
| 231 | + SELECT |
| 232 | + pubname, |
| 233 | + puballtables, |
| 234 | + pubinsert, |
| 235 | + pubupdate, |
| 236 | + pubdelete |
| 237 | + FROM |
| 238 | + pg_publication; |
| 239 | + SQL' |
| 240 | +
|
| 241 | +- name: Create pg_stat_statements extension |
| 242 | + community.docker.docker_container_exec: |
| 243 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
| 244 | + user: postgres |
| 245 | + command: > |
| 246 | + psql -U postgres -d test_database -c " |
| 247 | + CREATE EXTENSION IF NOT EXISTS pg_stat_monitor; |
| 248 | + SELECT pg_stat_monitor_version(); |
| 249 | + " |
| 250 | +
|
| 251 | +- name: Copy sample load into container |
| 252 | + community.docker.docker_container_copy_into: |
| 253 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
| 254 | + path: ../data/load_pgsql.sql |
| 255 | + container_path: /load_pgsql.sql |
| 256 | + |
| 257 | +- name: Start permanent SQL load in background |
| 258 | + community.docker.docker_container_exec: |
| 259 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
| 260 | + command: > |
| 261 | + sh -c "nohup bash -c 'while true; do echo Starting insert at $(date +\"%Y-%m-%d %H:%M:%S\"); psql -U postgres -d test_database -f /load_pgsql.sql; sleep 30; done' > /tmp/sql_loop.log 2>&1 &" |
| 262 | +
|
| 263 | +- name: Create logical replication slots |
| 264 | + community.docker.docker_container_exec: |
| 265 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
| 266 | + user: postgres |
| 267 | + command: psql -U postgres -d postgres -c "SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding');" |
231 | 268 |
|
232 | 269 | - name: Check replication status on primary
|
233 | 270 | community.docker.docker_container_exec:
|
234 |
| - container: "pdpgsql_pmm_{{ pg_version }}_1" |
| 271 | + container: "pdpgsql_pmm_replication_{{ pg_version }}_1" |
235 | 272 | user: postgres
|
236 | 273 | command: psql -c "SELECT * FROM pg_stat_replication;"
|
0 commit comments