Postgresql通過docker進行高可用部署 在postgresql官網看了pgpool-II的文檔,發現部署比較麻煩 pgpool-II官方文檔:https://www.pgpool.net/mediawiki/index.php/Documentation 為了方便快捷還是使用docker ...
Postgresql通過docker進行高可用部署
在postgresql官網看了pgpool-II的文檔,發現部署比較麻煩
pgpool-II官方文檔:https://www.pgpool.net/mediawiki/index.php/Documentation
為了方便快捷還是使用docker部署,然後在dockerhub上找到了相關的鏡像:
bitnami/postgresql-repmgr
和bitnami/pgpool
從如下截圖中可以看到下載量還是很高的:
簡單介紹就是:
bitnami/postgresql-repmgr
是PostgreSQL HA
對應的docker鏡像,PostgreSQL HA
是 PostgreSQL 集群解決方案,其中包括 PostgreSQL 複製管理器,這是一個用於管理 PostgreSQL 集群上的複製和故障轉移的開源工具。
bitnami/pgpool
是Pgpool-II
對應的docker鏡像,是 PostgreSQL 代理。它位於 PostgreSQL 伺服器和它們的客戶端之間,提供連接池、負載平衡、自動故障轉移和複製。
試驗環境
兩台機器:server-0:192.168.30.141、server-1:192.168.30.134
pg-0、pg-1代表postgresql-repmgr容器
pg-0做主庫,pg-1做從庫
系統:ubuntu20.04
docker版本20.10.12
docker-compose版本1.25.0
需要準備的鏡像
bitnami/postgresql-repmgr:14
對應著postgresql14
bitnami/pgpool:4
修改hosts文件
分別修改server-0、server-1上的hosts文件
sudo vim /etc/hosts
添加下麵的內容
192.168.30.141 pg-0
192.168.30.134 pg-1
部署資料庫伺服器
在server-0的創建文件:touch ~/pgdb/docker-compose.yml
version: '2'
services:
pg-0:
image: bitnami/postgresql-repmgr:14
network_mode: "host"
container_name: "pgrepmgr0"
ports:
- 5432
volumes:
- ./data:/bitnami/postgresql
environment:
- POSTGRESQL_POSTGRES_PASSWORD=adminpassword
- POSTGRESQL_USERNAME=customuser
- POSTGRESQL_PASSWORD=custompassword
- POSTGRESQL_DATABASE=customdatabase
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
- REPMGR_USERNAME=repmgr
- REPMGR_PASSWORD=repmgrpassword
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0,pg-1:5432
- REPMGR_NODE_NAME=pg-0
- REPMGR_NODE_NETWORK_NAME=pg-0
- REPMGR_PORT_NUMBER=5432
restart: always
在server-1的創建文件:touch ~/pgdb/docker-compose.yml
version: '2'
services:
pg-1:
image: bitnami/postgresql-repmgr:14
network_mode: "host"
container_name: "pgrepmgr1"
volumes:
- ./data:/bitnami/postgresql
environment:
- POSTGRESQL_POSTGRES_PASSWORD=adminpassword
- POSTGRESQL_USERNAME=customuser
- POSTGRESQL_PASSWORD=custompassword
- POSTGRESQL_DATABASE=customdatabase
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
- REPMGR_USERNAME=repmgr
- REPMGR_PASSWORD=repmgrpassword
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_PRIMARY_PORT=5432
- REPMGR_PARTNER_NODES=pg-0,pg-1:5432
- REPMGR_NODE_NAME=pg-1
- REPMGR_NODE_NETWORK_NAME=pg-1
- REPMGR_PORT_NUMBER=5432
restart: always
為了數據持久化,我們把/bitnami/postgresql目錄掛載到當前的data目錄中
docker-compose up
的時候應該會出現許可權問題,這個時候我們給新建的data目錄相應許可權就行了,執行如下命令:
sudo chgrp -R root data
sudo chmod -R g+rwX data
再次docker-compose up -d
應該就好了
部署pgpool
server-0中
為了後續方便修改配置文件,我們把配置文件掛載出來
首先在創建配置文件./conf/myconf.conf
然後在創建文件touch ~/pgpool/docker-compose.yml
:
version: '2.1'
services:
pgpool:
image: bitnami/pgpool:4
container_name: "pgpool"
network_mode: "bridge"
ports:
- 9999:5432
volumes:
- ./conf/myconf.conf:/config/myconf.conf
environment:
- PGPOOL_USER_CONF_FILE=/config/myconf.conf
- PGPOOL_BACKEND_NODES=0:pg-0:5432,1:pg-1:5432
- PGPOOL_SR_CHECK_USER=repmgr
- PGPOOL_SR_CHECK_PASSWORD=repmgrpassword
- PGPOOL_ENABLE_LDAP=no
- PGPOOL_POSTGRES_USERNAME=postgres
- PGPOOL_POSTGRES_PASSWORD=adminpassword
- PGPOOL_ADMIN_USERNAME=admin
- PGPOOL_ADMIN_PASSWORD=adminpassword
- PGPOOL_ENABLE_LOAD_BALANCING=yes
- PGPOOL_POSTGRES_CUSTOM_USERS=customuser
- PGPOOL_POSTGRES_CUSTOM_PASSWORDS=custompassword
restart: always
extra_hosts:
- "pg-0:192.168.30.141"
- "pg-1:192.168.30.134"
healthcheck:
test: ["CMD", "/opt/bitnami/scripts/pgpool/healthcheck.sh"]
interval: 10s
timeout: 5s
retries: 5
docker-compose up後看沒有報錯就好了,通過pgpool可以實現資料庫的負載均衡和讀寫分離
測試
測試數據能否共用
用navicat連接pgpoll
創建一個表插入數據後看pg-0和pg-1是否一致
創建users表然後插入兩條數據:
而且pg-1從庫只能讀不能寫,在pg-1中直接修改數據會報如下錯誤:
測試能否故障轉移
我們停掉主庫pg-0後查看pgpool服務日誌
從日誌中可以看到當pg-0掛掉後會再重試5次,如果還訪問不了會執行find_primary_node方法查找可以作為主節點的節點,然後把找到節點設置為新的主節點,所以現在pg-1是主節點,這個時候我們訪問pgpoll還是能訪問的,現在在users表裡面再添加一行數據:
然後去pg-1中查看一下,數據是同步的
我們在把pg-0啟動起來。然後看pgpool日誌如下,pg-1是可以成功鏈接到pgpool的
看pg-1的日誌如下:
會發現就算pg-0重新啟動器來了,但是pg-1還是主節點不變,pg-0又會成為副節點。
去pg-0中查看,剛剛新插入的數據也能同步的。
本文來自博客園,作者:qgdtq,轉載請註明原文鏈接:https://www.cnblogs.com/qgdtq/p/17106567.html