大数据应用方案1-Postgresql集群
加入配置 REPMGR_PRIMARY_HOST=pg-0 (即主服务),则读写都可以了,否则是只读模式, 当通过连接pgpool删减或增加表时,自动同步到pg-0与pg-1。- 停掉pg-1节点, 然后连接pgpool,新增一个t1表,插入一条数据, 重启pg-1节点,观察相应数据库是否有新增t1表及数据完整性,- 两个已安装了docker的Ubuntu22.04虚拟机,其中pg-0为主节点,
1 说明:
在做任何系统之前,选择哪种数据底座做支持很重要,是一栋大厦地基牢不牢固的根本问题,这里用Postgresql基于docker实现了分布式的集群实践,分享之。
2. 基于docker的集群实践
2.1 方案设计
- 两个已安装了docker的Ubuntu22.04虚拟机,其中pg-0为主节点, pg-1为从节点,pgpool为负载均衡节点。
- 使用最新镜像: bitnami/postgresql-repmgr:latest, 当前版本是16.4
Hosts | IP:Port | 备注 |
---|---|---|
pg-0 | 192.168.0.130:5432 | 主节点 |
pg-1 | 192.168.0.131:5432 | 从节点 |
pgpool | 192.168.0.130:9999 | 负载平i衡器,连接池 |
构建成功后如图:
2.2 docker-compose.yml
2.2.1 要点
- 因为Server装的是单独的docker环境, 并非Docker Swarm, 又由于是容器分离的环境,所以Docker的Network Mode需使用host类型 (之前试过映射端口的连接,怎样都加不到集群)
- 将/tmp映射出来,当不正常开关机时,会有错误:"[ERROR] PID file "/tmp/repmgrd.pid" exists and seems to contain a valid PID",可通过删除 该目录下pid文件解决
2.2.2 pg-0
services:
pg-0:
image: bitnami/postgresql-repmgr:latest
container_name: pg-0
network_mode: host
ports:
- 5432
volumes:
- /data0/Server/Db/pq-repmgr:/bitnami/postgresql
- /data0/Server/Temp/pq-repmgr:/tmp
environment:
- POSTGRESQL_POSTGRES_PASSWORD=星星
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=星星
- POSTGRESQL_DATABASE=postgres
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
- REPMGR_PASSWORD=星星
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0:5432,pg-1:5432
- REPMGR_NODE_NAME=pg-0
- REPMGR_NODE_NETWORK_NAME=pg-0
- REPMGR_PORT_NUMBER=5432
restart: always
extra_hosts:
- "pg-0:192.168.0.130"
- "pg-1:192.168.0.131"
2.2.3 pg-1
services:
pg-1:
image: bitnami/postgresql-repmgr:latest
container_name: pg-1
network_mode: host
ports:
- 5432
volumes:
- /data0/Server/Db/pq-repmgr:/bitnami/postgresql
- /data0/Server/Temp/pq-repmgr:/tmp
environment:
- POSTGRESQL_POSTGRES_PASSWORD=星星
- POSTGRESQL_USERNAME=postgres
- POSTGRESQL_PASSWORD=星星
- POSTGRESQL_DATABASE=postgres
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
- REPMGR_PASSWORD=星星
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0:5432,pg-1:5432
- REPMGR_NODE_NAME=pg-1
- REPMGR_NODE_NETWORK_NAME=pg-1
- REPMGR_PORT_NUMBER=5432
restart: always
extra_hosts:
- "pg-0:192.168.0.130"
- "pg-1:192.168.0.131"
2.2.4 pgpool
加入配置 REPMGR_PRIMARY_HOST=pg-0 (即主服务),则读写都可以了,否则是只读模式, 当通过连接pgpool删减或增加表时,自动同步到pg-0与pg-1
services:
pgpool:
image: bitnami/pgpool:latest
container_name: "pgpool"
ports:
- 9999:5432
environment:
- PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5432
- PGPOOL_SR_CHECK_USER=repmgr
- PGPOOL_SR_CHECK_PASSWORD=星星
- PGPOOL_ENABLE_LDAP=no
- PGPOOL_POSTGRES_USERNAME=postgres
- PGPOOL_POSTGRES_PASSWORD=星星
- PGPOOL_ADMIN_USERNAME=admin
- PGPOOL_ADMIN_PASSWORD=星星
- PGPOOL_ENABLE_LOAD_BALANCING=yes
- PGPOOL_POSTGRES_CUSTOM_USERS=customuser
- PGPOOL_POSTGRES_CUSTOM_PASSWORDS=星星
- REPMGR_PRIMARY_HOST=pg-0
restart: always
extra_hosts:
- "pg-0:192.168.0.130"
- "pg-1:192.168.0.131"
healthcheck:
test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]
interval: 10s
timeout: 5s
retries: 5
2.3 测试
2.3.1 节点断掉后重连,数据自动同步
- 停掉pg-1节点, 然后连接pgpool,新增一个t1表,插入一条数据, 重启pg-1节点,观察相应数据库是否有新增t1表及数据完整性,测试通过。
参考 :
- pgpool 参数: containers/bitnami/pgpool at main · bitnami/containers · GitHub
附录:
命令
repmgr管理
# 查看连接的节点
/opt/bitnami/scripts/postgresql-repmgr/entrypoint.sh repmgr -f /opt/bitnami/repmgr/conf/repmgr.conf cluster show
pq 控制台
# 查看版本
select version();
# 查看插件
select * from pg_extension;
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)