1. 程式人生 > >同一虛擬機器下docker實現postgresql得主從流複製

同一虛擬機器下docker實現postgresql得主從流複製

1.首先準備好postgresql的映象,並編寫docker-compost.yml:

主:

version: '3.3'
services:
       db:
         image: postgres
         container_name: db
         ports:
                 - 5432:5432
         environment:
                 POSTGRES_PASSWORD: 123456
                 POSTGRES_DB: postgres
         volumes:
                 - ./data:/var/lib/postgresql/data

從:

version: '3.3'
services:
       db:
         image: postgres
         container_name: db2
         ports:
                 - 5433:5432
         environment:
                 POSTGRES_PASSWORD: 123456
                 POSTGRES_DB: postgres
         volumes:
                 - ./data:/var/lib/postgresql/data

2.啟動主映象後,進入容器登陸postgresql後建立複製使用者:

進入啟動的 docker 容器內部,新建用於歸檔日誌的目錄:
docker exec -it db bash
mkdir -p /var/lib/postgresql/data/pg_archive
# 切換到 postgres 使用者
su postgres 
# 進去 postgres 客戶端
psql

CREATE ROLE replica login replication encrypted password 'replica';

   退出到宿主機切換為root,修改pg_hba.conf

最後一行新增:
host   replication      replica       172.25.0.1/32      trust   #允許  14.34 機器使用 replica 使用者來複制

這個172.25.0.1地址是檢視ifconfig後,db映象得gateway,試驗後使用的這個,至於為啥,還沒搞清楚..如果使用得是不同主機不同ip,則新增從伺服器的ip地址;通過docker inspect db檢視資訊:

"Gateway": "172.25.0.1"

修改postgresql.conf:

listen_addresses = '*'   # 監聽所有IP
archive_mode = on  # 允許歸檔
archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f'  # 用該命令來歸檔logfile segment
wal_level = hot_standby #開啟熱備
max_wal_senders = 32 # 這個設定了可以最多有幾個流複製連線,差不多有幾個從,就設定幾個
wal_keep_segments = 64 # 設定流複製保留的最多的xlog數目,一份是 16M,注意機器磁碟 16M*64 = 1G
wal_sender_timeout = 60s # 設定流複製主機發送資料的超時時間
max_connections = 100 # 這個設定要注意下,從庫的max_connections必須要大於主庫的

最後重啟映象;

3.設定從伺服器映象

啟動映象後,進入容器執行命令:

su postgres # 切換 postgres 使用者
rm -rf /var/lib/postgresql/data/* # 需要先清除data下檔案才能進行備份
pg_basebackup -h 172.25.0.1 -U replica -D /var/lib/postgresql/data -X stream -P
mkdir -p /var/lib/postgresql/data/pg_archive

這裡的172.25.0.1代表主伺服器的ip地址,這裡跟主伺服器配置檔案裡的ip一樣,我覺得可能是因為同一虛擬機器下,其實ip一樣,所以走的是主容器相同的閘道器ip;

在宿主機的data中新增檔案recovery.conf:

standby_mode = on    # 說明該節點是從伺服器
primary_conninfo = 'host=172.25.0.1 port=5432 user=replica password=replica'  # 主伺服器的資訊以及連線的使用者
recovery_target_timeline = 'latest'

最後重啟容器.可以看到實現了主從複製;