前置准备
创建 Docker 网络
因为只有一台机器,本例中主库和从库都部署在同一个机器中,为了主库和从库之间能通信,需要在同一个网络中固定主库和从库容器的 IP。
主库地址:172.12.0.2
从库地址:172.12.0.3
创建 Docker 网络:
1 | # 创建 |
数据库安装
拉取最新版 pg docker镜像:
1 | docker pull postgres |
启动容器:
1 | # 主库 |
查看容器运行情况:
1 | docker ps -a |
主库配置
因为没有使用默认的5432端口,先修改主库的连接端口为5440。进入主库容器,编辑 /var/lib/postgresql/data/postgresql.conf 文件:
1 | port=5440 |
进入主库创建同步用户:
1 | create role replicate with login password '12345678' replication; |
返回 “CREATE ROLE” 表示创建成功。
修改文件 /var/lib/postgresql/data/pg_hba.conf 文件,修改 IPv4 和 replication 部分:
1 | # IPv4 local connections: |
trust 表示不需要密码即可连接,不可用于生产环境!!
主库开启归档模式,在数据库中执行:
1 | ALTER SYSTEM SET archive_command = ON ; |
完成以上配置,重启主库。
从库配置
进入从库容器先删除 /var/lib/postgresql/data 目录,然后进行首次同步,在终端执行:
1 | pg_basebackup -h 172.12.0.2 -p 5440 -U replicate -w -Fp -Xs -Pv -R -D /var/lib/postgresql/data/ -l postgresqlbackup20240313 |
成功执行完之后,编辑从库 /var/lib/postgresql/data/postgresql.conf 文件,修改启动端口:
1 | port=5441 |
设置从库 primary_conninfo:
1 | ALTER SYSTEM SET primary_conninfo = 'user=replicate host=172.12.0.2 port=5440 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'; |
配置完之后重启从库。
验证
在主库中增删数据,在从库中可以查询到数据变化。
踩坑记录
从库启动报错
报错信息:
1 | 2024-03-13 15:09:52.321 UTC [47] FATAL: could not connect to the primary server: connection to server at "172.12.0.2", port 5400 failed: Connection refused |
配置完从库 primary_conninfo 信息之后,从库重启报错提示无法连接 172.12.0.2:5400 ,后来排查发现是端口写错了,应该是5440才对,可以到 /var/lib/postgresql/data/postgresql.auto.conf 中修改这个配置,修改为正确的端口重启,该错误消失。
主库从库数据版本不一致
从库配置完之后重启报错:
1 | 2024-03-13 15:30:09.331 UTC [31] FATAL: database system identifier differs between the primary and standby |
网上查资料发现是主库数据与从库数据不一致导致,从库初始化时删除 /var/lib/postgresql/data 目录。参考:docker搭建postgresql9.4主从同步复制集群