服务器地址: 主节点:d14r1n17 10.4.14.18
从节点:d14r1n18 10.4.14.19
从节点:d14r1n19 10.4.14.20
(1)创建容器
docker run -d -p 54321:5432 --name postgres --restart=always -v /devel/xwq/pgsql_data_dir/d14r1n17:/var/lib/postgresql/data/ 7e309048b14d
容器名称:postgres 端口:54321 账号:postgres 密码:admin
(2)进入容器并创建复制数据库用户
docker exec -it postgres /bin/bash psql -h 10.4.14.18 -p 54321 -U postgres CREATE ROLE replica login replication encrypted password 'admin'
(3)修改配置文件pg_hba.conf,增加replica用户,进行同步
host replication replica 10.4.14.19/32 md5 host replication replica 10.4.14.20/32 md5 注:即使有host all all all md5,也要添加上面两行
(4)修改配置文件postgresql.conf,修改以下几个地方
cd /devel/xwq/pgsql_data_dir/d14r1n17
vi postgresql.conf
Listen_adresses = '*' # 这个是设置主为wal的主机 wal_level = hot_standby # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个 max_wal_senders = 32 # 设置流复制保留的最多的xlog数目 wal_keep_segments = 256 # 设置流复制主机发送数据的超时时间 wal_sender_timeout = 60s # 这个设置要注意下,从库的max_connections必须要大于主库的 max_connections = 100 # (与异步流复制区别!!!) synchronous_standby_names = 'mydb_standby1'
(4)重启docker
docker restart postgres
(1)创建容器
docker run -d -p 54321:5432 --name postgres 7e309048b14d 注:创建从库容器时不能挂载目录到宿主机,挂载的话在执行rm -rf /var/lib/postgresql/data/*时会报错
容器名称:postgres 端口:54321 账号:postgres 密码:admin
(1)登录postgre用户,测试连接主库数据库是否正常
docker exec -it postgres /bin/bash
psql -h 10.4.14.18 -p 54321 -U postgres
(2)通过pg_basebackup命令行在从库上生成基础备份
su postgres rm -rf /var/lib/postgresql/data/* pg_basebackup -D $PGDATA -Fp -Xs -v -P -h 10.4.14.18 -p 54321 -U replica -W -l replbackup20200114 #参数说明: # -h:指定连接的数据库的主机名或IP地址,这里就是主库的ip # -U:指定连接的用户名,此处是我们刚才创建的专门负责流复制的repl用户 # -F:指定了输出的格式,支持p(原样输出)或者t(tar格式输出) # -x:表示备份开始后,启动另一个流复制连接从主库接收WAL日志 # -P:表示允许在备份过程中实时的打印备份的进度 # -R:表示会在备份结束后自动生成recovery.conf文件,这样也就避免了手动创建 # -D:指定把备份写到哪个目录、postgresql配置文件所在的目录$PGDATA # -l:表示指定一个备份的标识,运行命令后看到如下进度提示就说明生成基础备份成功
(3)通过docker inspect命令在宿主机上找到配置文件目录,修改从库数据目录下的postgresql.conf文件,将hot_standby改为启用状态
docker inspect postgres
cd /var/lib/docker/volumes/50961942104a701a2b9220fef196c22d84beeb268ceece9bf533b9b3f5ae613b/_data vi postgresql.conf hot_standby=on
(4)新建recovery.conf,并编辑recovery.conf配置文件(与异步流复制区别)
vi recovery.conf standby_mode = 'on' #在primary_conninfo中加入application_name=mydb_standby1,例如 primary_conninfo = 'host=10.4.14.18 port=54321 user=replica password=admin application_name=mydb_standby1' recovery_target_timeline = 'latest'
(6)重启docker
docker restart postgres
(7)到主库中查看是否配置成功
SELECT usename , application_name , client_addr, sync_state FROM pg_stat_replication;
参考文档列表:
基于docker容器的Postgresql 11主从复制搭建 及切换_chen123479960的专栏-CSDN博客_docker postgres主从
PostgreSQL 主从实现之同步流复制 - 简书