docker部署pgsql主从
docker部署pgsql主从,误打误撞搞出来了。
1、启动主库
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:
#postgresql.auto.conf
synchronous_commit = 'off'
#pg_hba.conf
host replication replicaczxwfvx 10.103.12.27/16 trust
添加后重启主节点容器
2、启动从库
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。
在完成上述操作之后,容器启动,会有如下日志
/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、从节点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;
需要注意的是,异步复制模式可能会导致数据不一致或者数据丢失,因此需要谨慎操作。建议在进行操作之前备份数据,并在操作之后检查数据是否一致。