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

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

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

    SHOW synchronous_commit;

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

    SET synchronous_commit = off;

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

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

    SET synchronous_commit = on;

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