postgresql 13主从流复制配置
一. 概要
原先有个项目用的是mongodb数据库,这东西太费资源,如果数量不是特别大还是不太建议用。
目前已迁移至postgresql。数据从mongodb导入到postgresql后,想着还是要再上线一个从库比较安全,因此折腾了一番。
这次折腾的主要原因是,线上找的资料版本不一致造成的。实际上pgsql1.3点主副配置很简单。下面分步介绍。
二. 配置步骤
主库配置
1、 新增用于同步的用户repl(名称可以自行修改)
create role repl login replication encrypted password 'you password';
2、 主库修改pg_hba.conf文件,允许备库IP通过复制用户访问数据库vi pg_hba.conf
,在尾部添加:
host replication repl 0.0.0.0/0 md5
最后一行,添加了repl用户可以从备库IP 局域网ip访问主库。这个地方折腾的比较久,刚开始用的是192.168.1.1/32
类似的局域网ip始终访问不了,后来索性改成0.0.0.0/0
就可以了。
如果没有防火墙设置,那么配置上面规则后,从任何地方都可以访问主库。因此主库这里需要特别注意防火墙设置,别把5432端口给放开了(除非本身就有这个需求)。
如果是云服务器,则防火墙的公网规则不要放开5432。自己托管的机器可以添加下防火墙规则:
sudo iptables -A INPUT -t tcp -m tcp -s 192.168.1.1/24 --dport 21 -j ACCEPT
sudo service iptables save
192.168.1.1/24 改成自己局域网的ip
3、 设置完重启主库
从库设置
1、 在从库上对主库做基础备份
pg_basebackup -h 192.168.1.100 -p 5432 -U repl --password -X stream -Fp --progress -D /var/lib/postgresql/data -R
注意,备份完从库的数据库目录下应该有standby.signal
这个文件,并且这个文件postgresql.auto.conf
会自动生成流复制的相关配置,类似于primary_conninfo = 'user=repl password=xxx channel_binding=disable host=192.168.1.100 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
当然了,如果我们没有使用-R
来备份主库的话。我们完全可以在备库上手工创建standby.signal
文件,然后手工编辑postgresql.auto.conf
,并在其内容中配置主库的信息。
2、启动从库pg_ctl start
本文配置参考: https://www.modb.pro/db/468978
docker中pgsql主从配置
docker中安装postgresql与直接安装配置无异,这里总结下从docker中设置从库的流程:
1、先用从服务器的临时docker中执行pg_basebackup生成一份备份数据:
docker run -it --rm
--network host
-v /data/pgsql:/var/lib/postgresql/data
postgres:13-alpine
pg_basebackup -h 192.168.1.100 -p 5432 -U repl --password -X stream -Fp --progress -D /var/lib/postgresql/data -R
注意修改命令中的数据目录、局域网ip、端口、用户名等为自己的
2、将备份目录挂载到从库的data目录:
version: '3.5'
services:
pgsql:
image: postgres:13.3-alpine
container_name: pgsql
restart: always
shm_size: 1g
volumes:
- '${PGSQL_DATA_DIR}:/var/lib/postgresql/data'
- './postgresql.conf:/var/lib/postgresql/data/postgresql.conf'
- './postgres-passwd:/run/secrets/passwd'
environment:
- PGID=${PGID}
- PUID=${PUID}
- POSTGRES_PASSWORD_FILE=/run/secrets/passwd
network_mode: host
3、拉起从服务器的docker: docker-compose up -d
博主