背景
现有一需求是将线上postgres从单节点提升到主从结构,网上所说方案大多都是从无到有的配置一个主从的pg数据库,对于运行中的pg扩展没有资料,所以本人在测试环境测通了一种方法,在此记录一下,给有类似需求的大兄弟们提供一些方便,可以结合自己的业务情况进行参考。
环境(阿里云)&配置
- 操作系统:ubuntu 16.4
- 数据库版本:postgres10
- docker版本:18.09.7
- docker-compose版本:1.17.1
postgres的镜像配置
version: '2'
services:
postgres:
restart: always
image: postgres:10
container_name: postgres
privileged: true
ports:
- 6432:5432
environment:
POSTGRES_PASSWORD: postgres
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- /data/pg_data:/var/lib/postgresql/data/pgdata
操作步骤
简要描述
主节点需要操作的步骤
在挂载出来的配置文件pg_hba.conf,增加replica用户,用于同步。下方的ip换成你的服务器
host replication replica <ip>/32 md5
然后在docker容器中给postgres设置密码,登录和备份权限。
docker-compose exec postgres bash # 进入容器内部
su postgres # 切换权限
psql # 进入postgres的sql界面
CREATE ROLE replica login replication encrypted password 'replica' # 创建用户,引号中设置你需要的密码
在挂载出来的配置文件postgresql.conf,添加下面的参数
wal_level = hot_standby
max_wal_senders = 32
wal_keep_segments = 256
wal_sender_timeout = 60s
max_connections = 100
接下来就重启容器,后续只需要动从的机器就能把主从机器给配置好了。
docker-compose restart postgres
从节点需要操作的步骤
重点思路: 从节点主要是如果要替换掉以前这个文件下所有的文件的话,那么docker容器会不断的重启,导致添加从节点的失败,现在的方案就是同步到另外一个文件夹下面,然后把文件配置的路径指向新的路径。
version: '2'
services:
postgres:
restart: always
image: postgres:10
container_name: postgres
privileged: true
ports:
- 6432:5432
environment:
POSTGRES_PASSWORD: postgres
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- /data/pg_data:/var/lib/postgresql/data/pgdata
- /data/pg_bak:/var/lib/postgresql/data/pgbak
启动pg服务,然后备份主库数据的命令如下
pg_basebackup -F p --progress -D /var/lib/postgresql/data/pgbak -h <ip> -p 5432 -U replica --password
接下来就是在pgbak中添加recovery.conf文件
在宿主机中添加recovery.conf可以直接去挂载的目录下添加,如果是容器内添加recovery.conf得先下载vim,下载vim命令如下:
apt-get update
apt install vim
recovery.conf的内容就得按照自己的情况去做调整
standby_mode = on # 这个说明这台机器为从库
primary_conninfo = 'host=<ip> port=6432 user=replica password=postgres'
recovery_target_timeline = 'latest'
在postgresql.conf添加如下参数
max_connections = 1000
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 1s
hot_standby_feedback = on
修改一下docker-compose配置重新启动postgres服务,要删除掉以前的容器。
version: '2'
services:
postgres:
restart: always
image: postgres:10
container_name: postgres
privileged: true
ports:
- 6432:5432
environment:
POSTGRES_PASSWORD: postgres
PGDATA: /var/lib/postgresql/data/pgbak
volumes:
- /data/pg_data:/var/lib/postgresql/data/pgdata
- /data/pg_bak:/var/lib/postgresql/data/pgbak
下面是要运行的命令
docker-compose stop postgres
docker-compose rm postgres
docker-compose up -d postgres
这样按道理来说就已经好了,最后去主节点上面验证一下就好了,验证的sql在下方。去哪查大家应该知道,就不重复展示了。
select * from pg_stat_replication;
这种方案还是有很多弊端,尤其在数据量偏大的时候会有比较多的问题,有什么更好的方案欢迎留言,下次我可以调试一下新的方案。