同一虚拟机下docker实现postgresql得主从流复制

1.首先准备好postgresql的镜像,并编写docker-compost.yml:

主:

version: '3.3'
services:
       db:
         image: postgres
         container_name: db
         ports:
                 - 5432:5432
         environment:
                 POSTGRES_PASSWORD: 123456
                 POSTGRES_DB: postgres
         volumes:
                 - ./data:/var/lib/postgresql/data

从:

version: '3.3'
services:
       db:
         image: postgres
         container_name: db2
         ports:
                 - 5433:5432
         environment:
                 POSTGRES_PASSWORD: 123456
                 POSTGRES_DB: postgres
         volumes:
                 - ./data:/var/lib/postgresql/data

2.启动主镜像后,进入容器登陆postgresql后创建复制用户:

进入启动的 docker 容器内部,新建用于归档日志的目录:
docker exec -it db bash
mkdir -p /var/lib/postgresql/data/pg_archive
# 切换到 postgres 用户
su postgres 
# 进去 postgres 客户端
psql

CREATE ROLE replica login replication encrypted password 'replica';

   退出到宿主机切换为root,修改pg_hba.conf

最后一行添加:
host   replication      replica       172.25.0.1/32      trust   #允许  14.34 机器使用 replica 用户来复制

这个172.25.0.1地址是查看ifconfig后,db镜像得gateway,试验后使用的这个,至于为啥,还没搞清楚..如果使用得是不同主机不同ip,则添加从服务器的ip地址;通过docker inspect db查看信息:

"Gateway": "172.25.0.1"

修改postgresql.conf:

listen_addresses = '*'   # 监听所有IP
archive_mode = on  # 允许归档
archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f'  # 用该命令来归档logfile segment
wal_level = hot_standby #开启热备
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 64 # 设置流复制保留的最多的xlog数目,一份是 16M,注意机器磁盘 16M*64 = 1G
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的

最后重启镜像;

3.设置从服务器镜像

启动镜像后,进入容器执行命令:

su postgres # 切换 postgres 用户
rm -rf /var/lib/postgresql/data/* # 需要先清除data下文件才能进行备份
pg_basebackup -h 172.25.0.1 -U replica -D /var/lib/postgresql/data -X stream -P
mkdir -p /var/lib/postgresql/data/pg_archive

这里的172.25.0.1代表主服务器的ip地址,这里跟主服务器配置文件里的ip一样,我觉得可能是因为同一虚拟机下,其实ip一样,所以走的是主容器相同的网关ip;

在宿主机的data中添加文件recovery.conf:

standby_mode = on    # 说明该节点是从服务器
primary_conninfo = 'host=172.25.0.1 port=5432 user=replica password=replica'  # 主服务器的信息以及连接的用户
recovery_target_timeline = 'latest'

最后重启容器.可以看到实现了主从复制;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值