docker compose 部署 pgsql高可用搭建
介绍
Repmgr是一个用于管理和监控基于流复制的pg集群的工具。其本质上是一个运行在pg库上的进程。它在每个pg库上都需要运行一个repmgrd进程来管理和监控库的状态、复制关系以及执行故障检测和切换等操作。 Repmgr 主要提供了 repmgr 和 repmgrd 两个工具。
- repmgr:是一个执行管理任务的命令行工具,方便进行 pg服务器集群的管理。具有设置备用服务器、promote 备库、主从切换、显示复制集群中服务器的状态等功能。
- repmgrd:是一个守护进程,它主动监控数据库状态并支持以下任务:监控和记录复制集群信息、故障检测、故障转移、集群中事件的通知(需要自定义脚本接受通知)。
注意:新版本已停止开源。最新支持版本17,支持14版本
架构图
原理
在主库宕机时,备库在尝试多次连接主库失败后,repmgrd 会在所有备库中选举一个候选备库提升为新主库,其他备库去对接到该新主上,形成一个新的集群。
Repmgr 选举候选备库按照以下顺序选举:LSN > Priority > Node_ID
系统将优先选举一个 LSN 较大的库;
若 LSN 一样,会根据 Priority 优先级进行比较(该优先级是在配置文件中进行参数配置,如果 Priority 为 0,则代表该库被禁止提升为主库);
若优先级也一样,会比较库的 Node ID,小者会优先选举。
客户端连接的pgpool,可以加个keepalived作为vip
部署
一、环境配置
1.1 绑定hosts
192.168.1.10 pg-0 192.168.1.20 pg-1 192.168.1.30 pg-2
1.2 创建工作目录
mkdir -p /opt/pg chown -R 1001:1001 /opt/pg
二、启动pg repmgr
postgresql-repmgr:latest 可指定版本 postgresql-repmgr:14
2.1 节点1操作
version: '3.8' services: pg-0: image: bitnami/postgresql-repmgr:14 container_name: pg-0 restart: always network_mode: host environment: - REPMGR_PARTNER_NODES=192.168.1.10,192.168.1.20,192.168.1.30 - REPMGR_NODE_NAME=pg-0 - REPMGR_NODE_NETWORK_NAME=192.168.1.10 #当前节点 - REPMGR_PRIMARY_HOST=192.168.1.10 #指定主节点 - REPMGR_PASSWORD=123456 - POSTGRESQL_PASSWORD=123456 - PGPASSWORD=123456 volumes: - ./data/:/bitnami/postgresql/
2.2 节点2操作
version: '3.8' services: pg-1: image: bitnami/postgresql-repmgr:14 container_name: pg-1 restart: always network_mode: host environment: - REPMGR_PARTNER_NODES=192.168.1.10,192.168.1.20,192.168.1.30 - REPMGR_NODE_NAME=pg-1 - REPMGR_NODE_NETWORK_NAME=192.168.1.20 #当前节点 - REPMGR_PRIMARY_HOST=192.168.1.10 #指定主节点 - REPMGR_PASSWORD=123456 - POSTGRESQL_PASSWORD=123456 - PGPASSWORD=123456 volumes: - ./data/:/bitnami/postgresql/
2.3 节点3操作
version: '3.8' services: pg-2: image: bitnami/postgresql-repmgr:14 container_name: pg-2 restart: always network_mode: host environment: - REPMGR_PARTNER_NODES=192.168.1.10,192.168.1.20,192.168.1.30 - REPMGR_NODE_NAME=pg-2 - REPMGR_NODE_NETWORK_NAME=192.168.1.30 #当前节点 - REPMGR_PRIMARY_HOST=192.168.1.10 #指定主节点 - REPMGR_PASSWORD=123456 - POSTGRESQL_PASSWORD=123456 - PGPASSWORD=123456 volumes: - ./data/:/bitnami/postgresql/
2.4 每台机器都启动
docker compose -f pgsql.yml up -d
2.5 检查集群状态
docker exec -it pg-0 bash #进入容器 psql -U postgres -h localhost -p 5432 #进入数据库 SELECT pg_is_in_recovery(); #查询集群状态
- 如果返回
t(true):当前节点是从节点,处于只读模式 - 如果返回
f(false):当前节点是主节点,可以读写
2.6 主节点创建检查用户
CREATE USER checkuser WITH PASSWORD '123456';
可以发现 主节点创建后。 两个从节点也跟着自动创建了用户
三、所有节点创建pgpool
version: '3.8' services: pgpool: image: bitnami/pgpool:latest container_name: pgpool restart: always environment: - PGPOOL_BACKEND_NODES=0:192.168.219.130:5432,1:192.168.219.132:5432,2:192.168.219.133:5432 - PGPOOL_SR_CHECK_USER=checkuser - PGPOOL_SR_CHECK_PASSWORD=1213456 - PGPOOL_ENABLE_LDAP=no - PGPOOL_POSTGRES_USERNAME=postgres - PGPOOL_POSTGRES_PASSWORD=123456 - PGPOOL_ADMIN_USERNAME=admin - PGPOOL_ADMIN_PASSWORD=123456 - PGPASSWORD=123456 - PGPOOL_MAX_POOL=30 - PGPOOL_NUM_INIT_CHILDREN=200 - PGPOOL_CHILD_MAX_CONNECTIONS=2000 ports: - "9999:5432"
docker compose -f pgpool.yml up -d docker logs -f pgpool
通过日志可以看到 节点成功
四、创建数据库测试
docker exec -it pg-0 bash #进入容器 psql -U postgres -h localhost -p 5432 #进入数据库
节点一 5432端口 执行 (正常其他库有数据)
create database t1; #创建数据库
\c t1; #进入数据库 所有节点执行。 证明已经同步到其他节点
节点一 9999端口 执行
create database t2; #创建数据库
\c t2; #进入数据库 所有节点执行。 证明已经同步到其他节点
节点二 5432端口 执行
postgres=# create database t5; ERROR: cannot execute CREATE DATABASE in a read-only transaction #能看到从节点无法创建数据库
节点二 9999端口 执行
create database t5;
五、验证高可用
验证停主节点。看从节点是否为新主
停服务
查看从节点日志可以看到 第二个从节点变成了新主。并且上面创建的数据库也还在
接着我们启动原来的主节点
可以发现原先的主节点变成了从节点

浙公网安备 33010602011771号