心澄

命由己造,相由心生,世间万物皆是化相,心不动,万物皆不动,心不变,万物皆不变
Program Languagerusting... going...
Email insunsgmail.com
Country China
LocationHangZhou, ZheJiang

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

  • 分享:
评论

    • 博主

    说点什么