docker部署pgsql主从
docker部署pgsql主从,误打误撞搞出来了。
1、启动主库
1 2 3 4 5 6 7 8
| docker run -d -e POSTGRES_PASSWORD='123456Ein!' \ -e DEFAULT_ENCODING=UTF8 \ -e POSTGRES_DB=root \ -e POSTGRES_USER=root \ -e TZ="Asia/Shanghai" \ --name postgres_master \ -v /data/pgsql:/var/lib/postgresql/data \ -p 5432:5432 corray/postgis-11-mod
|
注意修改postgresql.auto.conf文件中的synchronous_commit = ‘on’,修改为synchronous_commit = ‘off’。
需要先编辑主节点的pg_hba.conf文件,添加以下参数,ip修改为从节点ip:
1 2 3 4 5 6 7 8
| #postgresql.auto.conf
synchronous_commit = 'off'
#pg_hba.conf
host replication replicaczxwfvx 10.103.12.27/16 trust
|
添加后重启主节点容器
2、启动从库
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker run -d -e POSTGRES_PASSWORD='123456Ein!' \ -e DEFAULT_ENCODING=UTF8 \ -e POSTGRES_DB=root \ -e POSTGRES_USER=root \ -e TZ="Asia/Shanghai" \ --name postgres_slave \ --add-host='pgsql-0.pgsql:10.103.12.26' \ -v /data/pgsql:/var/lib/postgresql/data \ -p 5434:5432 corray/postgis-11-mod 注意: 1、-name postgres_slave名字不可更改。 2、--add-host='pgsql-0.pgsql:10.103.12.26' 添加主机节点的hostname。
|
在完成上述操作之后,容器启动,会有如下日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/06.master-slave-pgsql.sh salve_pg... this is slave pod... pulling master data... pg_basebackup: initiating base backup, waiting for checkpoint to complete pg_basebackup: checkpoint completed pg_basebackup: write-ahead log start point: 0/8000028 on timeline 1 pg_basebackup: starting background WAL receiver pg_basebackup: created temporary replication slot "pg_basebackup_39" 0/78717 kB (0%), 0/1 tablespace (/tmp/data_tmp/backup_label ) 78727/78727 kB (100%), 0/1 tablespace (/tmp/data_tmp/global/pg_control ) 78727/78727 kB (100%), 1/1 tablespace pg_basebackup: write-ahead log end point: 0/8000130 pg_basebackup: waiting for background process to finish streaming ... pg_basebackup: base backup completed restart pgsql...
/usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/10_postgis.sh skiping gis-init...
pg_ctl: PID file "/var/lib/postgresql/data/postmaster.pid" does not exist Is server running?
|
此时,从节点已经从主节点同步完了数据,并且此时需要重启pgsql。此时容器处于退出状态。此时手动重启下docker容器。此时从节点启动起来,会自动完成主从配置。可以从以下几方面查看主从是否成功。
1 2 3 4 5
| 1、从节点pgsql数据目录下存在recovery.conf文件 2、从节点pgsql数据目录下slave.logs内容为ok! 3、从节点宿主机上执行 ps -ef |grep post 有 postgres: walreceiver streaming 0/9001778进程 4、主节点宿主机执行 ps -ef |grep send 有postgres: walsender replicaczxwfvx 10.103.12.27(44042) streaming 0/9001778 进程 5、主库创建数据库,能马上同步到从库
|
3、synchronous_commit设置
在 PostgreSQL 中,同步复制模式是通过 synchronous_commit 参数来设置的。默认情况下,该参数的值为 on,表示主节点会等待所有备份节点都成功复制了事务才会提交。如果将该参数设置为 off,则表示主节点不会等待备份节点完成复制就会提交事务,这就是异步复制模式。
您可以通过以下步骤来调整同步复制模式:
查看当前的 synchronous_commit 参数的值:
SHOW synchronous_commit;
如果该参数的值为 on,则表示当前使用的是同步复制模式。如果您想切换到异步复制模式,可以将该参数的值设置为 off:
SET synchronous_commit = off;
这样就可以将同步复制模式切换为异步复制模式了。
如果您想切换回同步复制模式,可以将 synchronous_commit 参数的值再次设置为 on:
SET synchronous_commit = on;
需要注意的是,异步复制模式可能会导致数据不一致或者数据丢失,因此需要谨慎操作。建议在进行操作之前备份数据,并在操作之后检查数据是否一致。