PostgreSQL 一主两备节点(两备节点为同步节点)故障恢复
PostgreSQL 同步复制及故障恢复
10.2.208.10:node1:master
10.2.208.11:node2:standby1 同步
10.2.208.12:node3:standby2 同步
10.2.208.13:node4:备用机
node1,node2,node3,node4均安装PostgreSQL数据库,master初始化数据库,standby1与standby2从master pg_basebackup。
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica -d postgres
psql (9.5.1)
Type "help" for help.
postgres=# LOG: standby "node2" is now the synchronous standby with priority 1
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 9.5.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
(1 row)
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 14818
usesysid | 10
usename | replica
application_name | node2
client_addr | 10.2.208.11
client_hostname |
client_port | 44530
backend_start | 2016-03-10 11:16:10.850257+08
backend_xmin |
state | streaming
sent_location | 0/4000220
write_location | 0/4000220
flush_location | 0/4000220
replay_location | 0/4000220
sync_priority | 1
sync_state | sync
-[ RECORD 2 ]----+------------------------------
pid | 14820
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 32839
backend_start | 2016-03-10 11:16:28.010007+08
backend_xmin |
state | streaming
sent_location | 0/4000220
write_location | 0/4000220
flush_location | 0/4000220
replay_location | 0/4000220
sync_priority | 2
sync_state | potential
[replica@node2 bin]$ ./psql -h localhost -p 6432 -U replica -d postgres
psql (9.5.1)
Type "help" for help.
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 9.5.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
(1 row)
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication ;
(0 rows)
[replica@node3 bin]$ ./psql -h localhost -p 6432 -U replica -d postgres
psql (9.5.1)
Type "help" for help.
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 9.5.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
(1 row)
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication ;
(0 rows)
[replica@node1 ~]$ ps -ef|grep postgres
replica 14731 1 0 11:10 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 14733 14731 0 11:10 ? 00:00:00 postgres: checkpointer process
replica 14734 14731 0 11:10 ? 00:00:00 postgres: writer process
replica 14735 14731 0 11:10 ? 00:00:00 postgres: wal writer process
replica 14736 14731 0 11:10 ? 00:00:00 postgres: autovacuum launcher process
replica 14737 14731 0 11:10 ? 00:00:00 postgres: archiver process last was 000000010000000000000003.00000028.backup
replica 14738 14731 0 11:10 ? 00:00:00 postgres: stats collector process
replica 14749 13945 0 11:10 pts/2 00:00:00 ./psql -h localhost -p 6432 -U replica -d postgres
replica 14750 14731 0 11:10 ? 00:00:00 postgres: replica postgres ::1(43486) idle
replica 14818 14731 0 11:16 ? 00:00:00 postgres: wal sender process replica 10.2.208.11(44530) streaming 0/4000300
replica 14820 14731 0 11:16 ? 00:00:00 postgres: wal sender process replica 10.2.208.12(32839) streaming 0/4000300
replica 15020 14302 0 11:29 pts/0 00:00:00 grep --color=auto postgres
[replica@node2 ~]$ ps -ef|grep postgres
replica 27194 1 0 11:16 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 27195 27194 0 11:16 ? 00:00:00 postgres: startup process recovering 000000010000000000000004
replica 27196 27194 0 11:16 ? 00:00:00 postgres: checkpointer process
replica 27197 27194 0 11:16 ? 00:00:00 postgres: writer process
replica 27198 27194 0 11:16 ? 00:00:00 postgres: stats collector process
replica 27199 27194 0 11:16 ? 00:00:00 postgres: wal receiver process streaming 0/4000300
replica 27216 26525 0 11:18 pts/2 00:00:00 ./psql -h localhost -p 6432 -U replica -d postgres
replica 27217 27194 0 11:18 ? 00:00:00 postgres: replica postgres ::1(43081) idle
replica 27417 27091 0 11:30 pts/0 00:00:00 grep --color=auto postgres
[replica@node3 ~]$ ps -ef|grep postgres
replica 20747 1 0 11:16 pts/1 00:00:00 /home/replica/bin/postgres -D ../data
replica 20748 20747 0 11:16 ? 00:00:00 postgres: startup process recovering 000000010000000000000004
replica 20749 20747 0 11:16 ? 00:00:00 postgres: checkpointer process
replica 20750 20747 0 11:16 ? 00:00:00 postgres: writer process
replica 20751 20747 0 11:16 ? 00:00:00 postgres: stats collector process
replica 20752 20747 0 11:16 ? 00:00:00 postgres: wal receiver process streaming 0/4000300
replica 20769 20161 0 11:18 pts/1 00:00:00 ./psql -h localhost -p 6432 -U replica -d postgres
replica 20770 20747 0 11:18 ? 00:00:00 postgres: replica postgres ::1(58250) idle
replica 20936 20653 0 11:31 pts/2 00:00:00 grep --color=auto postgres
模拟同步节点Standby1 (node2)故障
1 停止Standby1的数据库服务
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# \d+
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------------------+-------+---------+---------+-------------
public | pgbench_accounts | table | replica | 3651 MB |
public | pgbench_branches | table | replica | 48 kB |
public | pgbench_history | table | replica | 0 bytes |
public | pgbench_tellers | table | replica | 160 kB |
(4 rows)
replica=# LOG: standby "node3" is now the synchronous standby with priority 2
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 14820
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 32839
backend_start | 2016-03-10 11:16:28.010007+08
backend_xmin |
state | streaming
sent_location | 0/DEF730B8
write_location | 0/DEF730B8
flush_location | 0/DEF730B8
replay_location | 0/DEF730B8
sync_priority | 2
sync_state | sync
[replica@node1 ~]$ ps -ef|grep postgres
replica 14731 1 0 11:10 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 14733 14731 0 11:10 ? 00:00:00 postgres: checkpointer process
replica 14734 14731 0 11:10 ? 00:00:00 postgres: writer process
replica 14735 14731 0 11:10 ? 00:00:01 postgres: wal writer process
replica 14736 14731 0 11:10 ? 00:00:00 postgres: autovacuum launcher process
replica 14737 14731 0 11:10 ? 00:00:00 postgres: archiver process last was 0000000100000000000000DD
replica 14738 14731 0 11:10 ? 00:00:00 postgres: stats collector process
replica 14820 14731 0 11:16 ? 00:00:02 postgres: wal sender process replica 10.2.208.12(32839) streaming 0/DEF73198
replica 15378 14731 0 11:36 ? 00:00:00 postgres: replica replica ::1(43489) idle
replica 15541 14302 0 11:47 pts/0 00:00:00 grep --color=auto postgres
[replica@node3 bin]$ ./psql -h localhost -p 6432 -U replica -d postgres
psql (9.5.1)
Type "help" for help.
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication ;
(0 rows)
[replica@node3 ~]$ ps -ef|grep postgres
replica 20747 1 0 11:16 pts/1 00:00:00 /home/replica/bin/postgres -D ../data
replica 20748 20747 0 11:16 ? 00:00:16 postgres: startup process recovering 0000000100000000000000DE
replica 20749 20747 0 11:16 ? 00:00:03 postgres: checkpointer process
replica 20750 20747 0 11:16 ? 00:00:00 postgres: writer process
replica 20751 20747 0 11:16 ? 00:00:00 postgres: stats collector process
replica 20752 20747 0 11:16 ? 00:00:10 postgres: wal receiver process streaming 0/DEF73198
replica 21127 20161 0 11:48 pts/1 00:00:00 ./psql -h localhost -p 6432 -U replica -d postgres
replica 21128 20747 0 11:48 ? 00:00:00 postgres: replica postgres ::1(58252) idle
replica 21196 20653 0 11:50 pts/2 00:00:00 grep --color=auto postgres
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# create table test_tb(id int);
CREATE TABLE
replica=# insert into test_tb values (1),(2),(3);
INSERT 0 3
replica=# select * from test_tb ;
id
----
1
2
3
(3 rows)
[replica@node3 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# select * from test_tb ;
id
----
1
2
3
(3 rows)
重新启动Standby1
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# select * from test_tb ;
id
----
1
2
3
(3 rows)
replica=# LOG: standby "node2" is now the synchronous standby with priority 1
replica=#
查看复制状态
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 15705
usesysid | 10
usename | replica
application_name | node2
client_addr | 10.2.208.11
client_hostname |
client_port | 44533
backend_start | 2016-03-10 11:56:10.103849+08
backend_xmin |
state | streaming
sent_location | 0/DEF89618
write_location | 0/DEF89618
flush_location | 0/DEF89618
replay_location | 0/DEF89618
sync_priority | 1
sync_state | sync
-[ RECORD 2 ]----+------------------------------
pid | 14820
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 32839
backend_start | 2016-03-10 11:16:28.010007+08
backend_xmin |
state | streaming
sent_location | 0/DEF89618
write_location | 0/DEF89618
flush_location | 0/DEF89618
replay_location | 0/DEF89618
sync_priority | 2
sync_state | potential
[replica@node1 ~]$ ps -ef|grep postgres
replica 14731 1 0 11:10 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 14733 14731 0 11:10 ? 00:00:00 postgres: checkpointer process
replica 14734 14731 0 11:10 ? 00:00:00 postgres: writer process
replica 14735 14731 0 11:10 ? 00:00:01 postgres: wal writer process
replica 14736 14731 0 11:10 ? 00:00:00 postgres: autovacuum launcher process
replica 14737 14731 0 11:10 ? 00:00:00 postgres: archiver process last was 0000000100000000000000DD
replica 14738 14731 0 11:10 ? 00:00:00 postgres: stats collector process
replica 14820 14731 0 11:16 ? 00:00:02 postgres: wal sender process replica 10.2.208.12(32839) streaming 0/DEF896F8
replica 15705 14731 0 11:56 ? 00:00:00 postgres: wal sender process replica 10.2.208.11(44533) streaming 0/DEF896F8
replica 15861 14731 0 12:01 ? 00:00:00 postgres: replica replica ::1(43491) idle
replica 15946 14302 0 12:07 pts/0 00:00:00 grep --color=auto postgres
[replica@node2 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
(0 rows)
[replica@node2 ~]$ ps -ef|grep postgres
replica 27714 1 0 11:56 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 27715 27714 0 11:56 ? 00:00:00 postgres: startup process recovering 0000000100000000000000DE
replica 27716 27714 0 11:56 ? 00:00:00 postgres: checkpointer process
replica 27717 27714 0 11:56 ? 00:00:00 postgres: writer process
replica 27718 27714 0 11:56 ? 00:00:00 postgres: stats collector process
replica 27719 27714 0 11:56 ? 00:00:00 postgres: wal receiver process streaming 0/DEF896F8
replica 27908 27714 0 12:05 ? 00:00:00 postgres: replica replica ::1(43084) idle
replica 27942 27091 0 12:08 pts/0 00:00:00 grep --color=auto postgres
[replica@node3 bin]$ ./psql -h localhost -p 6432 -U replica -d replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
(0 rows)
[replica@node3 ~]$ ps -ef|grep postgres
replica 20747 1 0 11:16 pts/1 00:00:00 /home/replica/bin/postgres -D ../data
replica 20748 20747 0 11:16 ? 00:00:16 postgres: startup process recovering 0000000100000000000000DE
replica 20749 20747 0 11:16 ? 00:00:03 postgres: checkpointer process
replica 20750 20747 0 11:16 ? 00:00:00 postgres: writer process
replica 20751 20747 0 11:16 ? 00:00:00 postgres: stats collector process
replica 20752 20747 0 11:16 ? 00:00:11 postgres: wal receiver process streaming 0/DEF896F8
replica 21444 20747 0 12:06 ? 00:00:00 postgres: replica replica ::1(58254) idle
replica 21507 20653 0 12:10 pts/2 00:00:00 grep --color=auto postgres
模拟Standby2(node3)故障
[replica@node3 bin]$ ./pg_ctl -D ../data/ stop
查看状态
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 15705
usesysid | 10
usename | replica
application_name | node2
client_addr | 10.2.208.11
client_hostname |
client_port | 44533
backend_start | 2016-03-10 11:56:10.103849+08
backend_xmin |
state | streaming
sent_location | 0/DEF89A78
write_location | 0/DEF89A78
flush_location | 0/DEF89A78
replay_location | 0/DEF89A78
sync_priority | 1
sync_state | sync
[replica@node1 ~]$ ps -ef|grep postgres
replica 14731 1 0 11:10 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 14733 14731 0 11:10 ? 00:00:00 postgres: checkpointer process
replica 14734 14731 0 11:10 ? 00:00:00 postgres: writer process
replica 14735 14731 0 11:10 ? 00:00:01 postgres: wal writer process
replica 14736 14731 0 11:10 ? 00:00:00 postgres: autovacuum launcher process
replica 14737 14731 0 11:10 ? 00:00:00 postgres: archiver process last was 0000000100000000000000DD
replica 14738 14731 0 11:10 ? 00:00:00 postgres: stats collector process
replica 15705 14731 0 11:56 ? 00:00:00 postgres: wal sender process replica 10.2.208.11(44533) streaming 0/DEF8A5F0
replica 16112 14731 0 12:17 ? 00:00:00 postgres: replica replica ::1(43492) idle
replica 16329 14731 0 12:22 ? 00:00:00 postgres: replica replica ::1(43493) idle
replica 16493 14731 0 12:27 ? 00:00:00 postgres: replica replica ::1(43494) idle
replica 17772 17733 0 13:34 pts/5 00:00:00 grep --color=auto postgres
[replica@node2 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
(0 rows)
[replica@node2 ~]$ ps -ef|grep postgres
replica 27714 1 0 11:56 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 27715 27714 0 11:56 ? 00:00:00 postgres: startup process recovering 0000000100000000000000DE
replica 27716 27714 0 11:56 ? 00:00:00 postgres: checkpointer process
replica 27717 27714 0 11:56 ? 00:00:00 postgres: writer process
replica 27718 27714 0 11:56 ? 00:00:00 postgres: stats collector process
replica 27719 27714 0 11:56 ? 00:00:01 postgres: wal receiver process streaming 0/DEF8A5F0
replica 27908 27714 0 12:05 ? 00:00:00 postgres: replica replica ::1(43084) idle
replica 28311 27714 0 12:28 ? 00:00:00 postgres: replica replica ::1(43085) idle
replica 29330 29291 0 13:36 pts/3 00:00:00 grep --color=auto postgres
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# create table test_tb2(id int);
CREATE TABLE
replica=# insert into test_tb2 values (1),(2),(3);
INSERT 0 3
[replica@node2 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select * from test_tb2;
id
----
1
2
3
(3 rows)
重新启动Standby2(node3)
[replica@node3 bin]$ ./pg_ctl -D ../data/ start
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 15705
usesysid | 10
usename | replica
application_name | node2
client_addr | 10.2.208.11
client_hostname |
client_port | 44533
backend_start | 2016-03-10 11:56:10.103849+08
backend_xmin |
state | streaming
sent_location | 0/DEFA14B0
write_location | 0/DEFA14B0
flush_location | 0/DEFA14B0
replay_location | 0/DEFA14B0
sync_priority | 1
sync_state | sync
-[ RECORD 2 ]----+------------------------------
pid | 17908
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 32845
backend_start | 2016-03-10 13:40:58.96505+08
backend_xmin |
state | streaming
sent_location | 0/DEFA14B0
write_location | 0/DEFA14B0
flush_location | 0/DEFA14B0
replay_location | 0/DEFA14B0
sync_priority | 2
sync_state | potential
[replica@node1 ~]$ ps -ef|grep postgres
replica 14731 1 0 11:10 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 14733 14731 0 11:10 ? 00:00:00 postgres: checkpointer process
replica 14734 14731 0 11:10 ? 00:00:00 postgres: writer process
replica 14735 14731 0 11:10 ? 00:00:01 postgres: wal writer process
replica 14736 14731 0 11:10 ? 00:00:00 postgres: autovacuum launcher process
replica 14737 14731 0 11:10 ? 00:00:00 postgres: archiver process last was 0000000100000000000000DD
replica 14738 14731 0 11:10 ? 00:00:00 postgres: stats collector process
replica 15705 14731 0 11:56 ? 00:00:00 postgres: wal sender process replica 10.2.208.11(44533) streaming 0/DEFA14B0
replica 16112 14731 0 12:17 ? 00:00:00 postgres: replica replica ::1(43492) idle
replica 16329 14731 0 12:22 ? 00:00:00 postgres: replica replica ::1(43493) idle
replica 17908 14731 0 13:40 ? 00:00:00 postgres: wal sender process replica 10.2.208.12(32845) streaming 0/DEFA14B0
replica 17913 14731 0 13:41 ? 00:00:00 postgres: replica replica ::1(43496) idle
replica 17967 17733 0 13:45 pts/5 00:00:00 grep --color=auto postgres
[replica@node2 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
(0 rows)
[replica@node2 ~]$ ps -ef|grep postgres
replica 27714 1 0 11:56 pts/2 00:00:00 /home/replica/bin/postgres -D ../data
replica 27715 27714 0 11:56 ? 00:00:00 postgres: startup process recovering 0000000100000000000000DE
replica 27716 27714 0 11:56 ? 00:00:00 postgres: checkpointer process
replica 27717 27714 0 11:56 ? 00:00:00 postgres: writer process
replica 27718 27714 0 11:56 ? 00:00:00 postgres: stats collector process
replica 27719 27714 0 11:56 ? 00:00:01 postgres: wal receiver process streaming 0/DEFA1590
replica 27908 27714 0 12:05 ? 00:00:00 postgres: replica replica ::1(43084) idle
replica 29467 27714 0 13:46 ? 00:00:00 postgres: replica replica ::1(43087) idle
replica 29478 29291 0 13:47 pts/3 00:00:00 grep --color=auto postgres
[replica@node3 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
(0 rows)
[replica@node3 ~]$ ps -ef|grep postgres
replica 22845 1 0 13:40 pts/1 00:00:00 /home/replica/bin/postgres -D ../data
replica 22846 22845 0 13:40 ? 00:00:00 postgres: startup process recovering 0000000100000000000000DE
replica 22847 22845 0 13:40 ? 00:00:00 postgres: checkpointer process
replica 22848 22845 0 13:40 ? 00:00:00 postgres: writer process
replica 22849 22845 0 13:40 ? 00:00:00 postgres: stats collector process
replica 22850 22845 0 13:40 ? 00:00:00 postgres: wal receiver process streaming 0/DEFA1590
replica 22919 22845 0 13:48 ? 00:00:00 postgres: replica replica ::1(58256) idle
replica 23029 22982 0 13:49 pts/2 00:00:00 grep --color=auto postgres
故障恢复处理
模拟Standby2故障
1 停止node3[10.2.208.12]数据库的服务
pg_ctl –D ../data stop –m fast
2 更改master[node1][10.2.208.10]postgresql.conf文件
synchronous_standby_names = ' node2,node4'
pg_ctl –D ../data reload
3 node4[10.2.208.13]从master pg_basebackup
mv recovery.done recovery.conf
primary_conninfo = 'host=10.2.208.10 port=6432 user=replica password=replica application_name=node4'
4 启动node4
pg_ctl –D ../data start
[replica@node1 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 15705
usesysid | 10
usename | replica
application_name | node2
client_addr | 10.2.208.11
client_hostname |
client_port | 44533
backend_start | 2016-03-10 11:56:10.103849+08
backend_xmin |
state | streaming
sent_location | 0/E0000060
write_location | 0/E0000060
flush_location | 0/E0000060
replay_location | 0/E0000060
sync_priority | 1
sync_state | sync
-[ RECORD 2 ]----+------------------------------
pid | 19907
usesysid | 10
usename | replica
application_name | node4
client_addr | 10.2.208.13
client_hostname |
client_port | 34767
backend_start | 2016-03-10 15:08:29.425353+08
backend_xmin |
state | streaming
sent_location | 0/E0000060
write_location | 0/E0000060
flush_location | 0/E0000060
replay_location | 0/E0000060
sync_priority | 2
sync_state | potential
模拟Standby1故障
1 停止Standby1 的数据库服务
pg_ctl –D ../data stop –m fast
2更改master[10.2.208.10]的postgresql.conf
synchronous_standby_names = ' node3,node4'
pg_ctl –D ../data reload
3在node4[10.2.208.13] 从master pg_basebackup
mv recovery.done recovery.conf
primary_conninfo = 'host=10.2.208.10 port=6432 user=replica password=replica application_name=node4'
4 启动node4
pg_ctl –D ../data start
master
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 20668
usesysid | 10
usename | replica
application_name | node4
client_addr | 10.2.208.13
client_hostname |
client_port | 34770
backend_start | 2016-03-10 15:45:49.027116+08
backend_xmin |
state | streaming
sent_location | 0/E4000060
write_location | 0/E4000060
flush_location | 0/E4000060
replay_location | 0/E4000000
sync_priority | 2
sync_state | potential
-[ RECORD 2 ]----+------------------------------
pid | 20210
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 32856
backend_start | 2016-03-10 15:18:01.507366+08
backend_xmin |
state | streaming
sent_location | 0/E4000060
write_location | 0/E4000060
flush_location | 0/E4000060
replay_location | 0/E4000060
sync_priority | 1
sync_state | sync
模拟主库故障
1 停止master[node1]的数据库服务
pg_ctl –D ../data stop –m fast
2更改Standby1[node2]的postgresql.conf文件
synchronous_standby_names = 'node3,node4'
pg_ctl –D ../data reload
pg_ctl –D ../data promote
3更改Standby2[node3]的recovery.conf文件
primary_conninfo = 'host=10.2.208.11 port=6432 user=replica password=replica application_name=node3'
pg_ctl –D ../data restart
在node2上查看复制状态
select * from pg_stat_replication;
[replica@node2 bin]$ ./psql -h localhost -p 6432 -U replica
psql (9.5.1)
Type "help" for help.
replica=# LOG: standby "node3" is now the synchronous standby with priority 1
replica=# \x
Expanded display is on.
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+-----------------------------
pid | 31996
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 38750
backend_start | 2016-03-10 16:21:42.23142+08
backend_xmin |
state | streaming
sent_location | 0/E7000060
write_location | 0/E7000060
flush_location | 0/E7000060
replay_location | 0/E7000060
sync_priority | 1
sync_state | sync
4在node4[10.2.208.13] 从node2[10.2.208.11] pg_basebackup
mv recovery.done recovery.conf
primary_conninfo = 'host=10.2.208.11 port=6432 user=replica password=replica application_name=node4'
4 启动node4
pg_ctl –D ../data start
replica=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 31996
usesysid | 10
usename | replica
application_name | node3
client_addr | 10.2.208.12
client_hostname |
client_port | 38750
backend_start | 2016-03-10 16:21:42.23142+08
backend_xmin |
state | streaming
sent_location | 0/E7000060
write_location | 0/E7000060
flush_location | 0/E7000060
replay_location | 0/E7000060
sync_priority | 1
sync_state | sync
-[ RECORD 2 ]----+------------------------------
pid | 32031
usesysid | 10
usename | replica
application_name | node4
client_addr | 10.2.208.13
client_hostname |
client_port | 53133
backend_start | 2016-03-10 16:25:27.541883+08
backend_xmin |
state | streaming
sent_location | 0/E7000060
write_location | 0/E7000060
flush_location | 0/E7000060
replay_location | 0/E7000000
sync_priority | 2
sync_state | potential
1主节点+1同步节点+1异步节点:缺点,同步节点故障,主节点将不提供写操作(insert,update)
三节点级联复制:1主节点+1上游节点(同步)+1下游节点:上游节点故障,主节点将不提供写操作(insert ,update)
同步复制中的recovery.conf 中的application_name与postgresql.conf中的synchronous_standby_names可以使用IP地址代替hostname
PostgreSQL 一主两备节点(两备节点为同步节点)故障恢复的更多相关文章
- MyBatis中主键回填的两种实现方式
主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大 ...
- 【转载】mysql主键的缺少导致备库hang
最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...
- Python selenium 一个节点两个关联input
HTML代码: 一个节点两个关联input 多出现于密码框 先需要模拟点击进入第一个input,才能激活第二个input. 代码: driver.find_element_by_name('Text ...
- mysql主键的缺少导致备库hang
最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...
- 剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
1 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用 ...
- LeetCode 二叉树,两个子节点的最近的公共父节点
LeetCode 二叉树,两个子节点的最近的公共父节点 二叉树 Lowest Common Ancestor of a Binary Tree 二叉树的最近公共父亲节点 https://leetcod ...
- PostgreSQL 一主多从(多副本,强同步)简明手册 - 配置、压测、监控、切换、防脑裂、修复、0丢失 - 珍藏级
参考来源: https://github.com/digoal/blog/blob/master/201803/20180326_01.md#postgresql-一主多从多副本强同步简明手册---配 ...
- 跟我一起读postgresql源码(十五)——Executor(查询执行模块之——control节点(上))
控制节点 控制节点用于完成一些特殊的流程执行方式.由于PostgreSQL为査询语句生成二叉树状的査询计划,其中大部分节点的执行过程需要两个以内的输入和一个输出.但有一些特殊的功能为了优化的需要,会含 ...
- MySQL主从、主主、半同步节点架构的的原理及实验总结
一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...
随机推荐
- convert from base 10 to base 2
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION Hence, we convert fro ...
- Delphi出现“borland license information was found,but it is not valid for delphi”的错误,无法运行的解决方法
1) 删除文件: C:\documents and settings\<username>\.borland\registry.slm,如果在win8或在win7下,即C:\Users\H ...
- 小米2/2S 手机由 Smartisan OS ROM 刷回 MIUI 教程
刷机所需文件1.请前往 MIUI 官网下载小米 2/2S 标准版 MIUI ROM 包.下载地址:http://www.miui.com/getrom.php?r=2:下载后请将原文件名修改为“upd ...
- freemarker 自定义标签
1.编写标签类 package com.pccw.business.fnd.common.filegen; import java.io.IOException; import java.io.Wri ...
- BLE-NRF51822教程-RSSI获取
当手机和设备连接上后,设备端可以通过获取RSSI,在一定程度上判断手机离设备的相对距离的远近. 获取函数很简单直接调用sd_ble_gap_rssi_get 接口函数就行了,传入连接句柄和buff就能 ...
- Qt 窗口属性简介之Qt::WA_DeleteOnClose
一.简述 今天介绍一个简单的窗口属性——Qt::WA_DeleteOnClose. 在正常创建窗口后,我们一般会调用close()方法来关闭窗口,这里我们看一下Q助手中关于close()方法的介绍. ...
- angularJS自定义指令scope代替link
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- java编程技巧
欢迎提出建议指出错误互相交流. 1.统计对象数量,比如统计一共发射了多少颗子弹. public class Bullet { public static int count = 0; public B ...
- github添加SSH Key
1.背景介绍 缘由:在github上下载goagent时出现错误. 在终端使用命令:git clone git@github.com:phuslu/goagent.git 会报权限错误如下: Clon ...
- ArcGIS Engine开发之旅01---产品组成、逻辑体系结构
原文:ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成: 面向开发人员的软件开发包(ArcGIS Engine Developer k ...