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,则表示主节点不会等待备份节点完成复制就会提交事务,这就是异步复制模式。

您可以通过以下步骤来调整同步复制模式:

  1. 查看当前的 synchronous_commit 参数的值:

    SHOW synchronous_commit;

  2. 如果该参数的值为 on,则表示当前使用的是同步复制模式。如果您想切换到异步复制模式,可以将该参数的值设置为 off

    SET synchronous_commit = off;

    这样就可以将同步复制模式切换为异步复制模式了。

  3. 如果您想切换回同步复制模式,可以将 synchronous_commit 参数的值再次设置为 on

    SET synchronous_commit = on;

需要注意的是,异步复制模式可能会导致数据不一致或者数据丢失,因此需要谨慎操作。建议在进行操作之前备份数据,并在操作之后检查数据是否一致。