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 一主两备节点(两备节点为同步节点)故障恢复的更多相关文章

  1. MyBatis中主键回填的两种实现方式

    主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大 ...

  2. 【转载】mysql主键的缺少导致备库hang

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

  3. Python selenium 一个节点两个关联input

    HTML代码: 一个节点两个关联input  多出现于密码框 先需要模拟点击进入第一个input,才能激活第二个input. 代码: driver.find_element_by_name('Text ...

  4. mysql主键的缺少导致备库hang

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

  5. 剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。

    1 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用 ...

  6. LeetCode 二叉树,两个子节点的最近的公共父节点

    LeetCode 二叉树,两个子节点的最近的公共父节点 二叉树 Lowest Common Ancestor of a Binary Tree 二叉树的最近公共父亲节点 https://leetcod ...

  7. PostgreSQL 一主多从(多副本,强同步)简明手册 - 配置、压测、监控、切换、防脑裂、修复、0丢失 - 珍藏级

    参考来源: https://github.com/digoal/blog/blob/master/201803/20180326_01.md#postgresql-一主多从多副本强同步简明手册---配 ...

  8. 跟我一起读postgresql源码(十五)——Executor(查询执行模块之——control节点(上))

    控制节点 控制节点用于完成一些特殊的流程执行方式.由于PostgreSQL为査询语句生成二叉树状的査询计划,其中大部分节点的执行过程需要两个以内的输入和一个输出.但有一些特殊的功能为了优化的需要,会含 ...

  9. MySQL主从、主主、半同步节点架构的的原理及实验总结

    一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...

随机推荐

  1. The "get" method should be used when the form is idempotent---正交的两个概念---

    https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.1 17.13.1 Form submission method The me ...

  2. 线性表集合A=A B

    大话数据结构 void union(List *a, List Lb) { int La_len, Lb_len, i; ElemType e; La_len = ListLength(La); Lb ...

  3. arcgis server site 快速恢复与重建

    背景 在实际的工作中,会遇到如下的情形: arcgis server服务能够启动,但是由于未知的操作原因导致site里面的某个功能出现故障. 要想在短时间内,使得server能够恢复正常功能.且: 不 ...

  4. Delphi 记录类型- 结构指针

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. mysql查询昨天本周上周上月

    昨天 $yestoday = date("Y-m-d 00:00:00",strtotime('-1day'));$today = date("Y-m-d 00:00:0 ...

  6. apex-utility-ai-unity-survival-shooter

    The AI has the following actions available: Action Function Shoot Fires the Kalashnikov Reload Reloa ...

  7. MetaWeblog 同时管理51cto,csdn,sina,163,oschina,cnblogs等博客

    我们技术人一般都会有自己的一个博客,用于记录一些技术笔记,也期望自己的笔记文章可以让更多人知道. 如何让更多人知道自己的博客? 搜索引擎收录,用户通过关键词搜索可能会进入 内容运营,但是一般技术人为了 ...

  8. (IOS)Swift Music 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得. 项目地址:https://github.com/xujiyao123/SwiftMu ...

  9. GZip压缩的js文件IE6下面不能包含<script>标签

    IE6下面,GZip压缩的js文件,如果js中包含<script>标签,一遇到这样的标签,后面的内容居然都截断了,狂晕! 花了我一个晚上来找原因.. 需要将字符串'<script&g ...

  10. 通过宏定义判断是否引入的是framework,反之则使用双引号,实用!

    例: #if __has_include(<TestHead/TestHead.h>) #import <TestHead/TestHead.h>#else#import &q ...