好久没有写文章了,由于生产需要,将postgres的主从配置研习了一遍。为了方便起见,使用docker来简化操作。物理机上的操作类同。

1、 创建两个postgres的container,一个做主,一个做从。

docker run -d -v /data1:/data -e PGDATA=/data -e POSTGRES_PASSWORD=PASSWORD1 --name db_master postgres postgres
docker run -d -v /data2:/data -e PGDATA=/data -e POSTGRES_PASSWORD=PASSWORD2 --name db_slave postgres postgres

2、 在master节点创建repl用户

docker exec -it db_master psql -U postgres -c "CREATE USER rep REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'PASSWORD_FOR_REP';"

3、 修改master数据库的配置。/data1/pg_hba.conf

host    replication     rep     IP_address_of_slave/32   md5

4、 修改master数据库的配置。/data1/postgresql.conf

listen_addresses = '*'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on

5、 重启数据库备用

docker restart db_master

6、 先停掉从节点slave

docker stop db_slave

7、 修改slave配置。/data2/pg_hba.conf

host    replication     rep     IP_address_of_master/32  md5

8、 修改slave配置。/data2/postgresql.conf

listen_addresses = '*'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on

9、 主数据库初始化

    # 进入备份状态
    docker exec -it db_master psql -U postgres -c "select pg_start_backup('initial_backup');"

    rsync -cva --inplace /data1/ /data2/

    # rsync -cva --inplace /data1/ slave_IP_address:/data2/

    # 退出备份状态
    docker exec -it db_master psql -U postgres -c "select pg_stop_backup();"

10、 从数据库slave恢复策略/data2/recovery.conf

standby_mode = 'on'
primary_conninfo = 'host=master_IP_address port=5432 user=rep password=yourpassword'
trigger_file = '/tmp/postgresql.trigger.5432'

11、 从数据库启动

docker start db_slave

注意:第10步作用是当master挂掉后,可以让slave变身master,且变的可写。但第10步的风险是可能导致master同步失败,比较稳妥的做法是:

1.master 先进入备份状态
2.rsync同步数据
3.slave 启动
4.master退出备份状态