配置過程主要參考以下鏈接:
https://blog.csdn.net/weixin_34198583/article/details/91913586
https://blog.csdn.net/unmobile/article/details/80154330
https://www.cnblogs.com/aegis1019/p/8870251.html
https://www.cnblogs.com/huangcun200816/articles/6767070.html
https://my.oschina.net/Kenyon/blog/98217
Postgresql安裝過程可以參考:https://blog.csdn.net/yidichaxiang/article/details/103727136
機器名稱 | IP地址 | 用途 |
postgres1 | 10.10.10.72 | postgres10 主庫 |
postgres2 | 10.10.10.73 | postgres10 從庫 |
提示:由於使用腳本安裝的postgres10數據庫,postgres2主機上的postgressql也被初始化了;與參考文章中的【實際做主從複製是不需要初始化數據庫】不一致,由於是第一次配置主從複製,具體情況需要再做測試。
postgres1主庫配置
1. 創建Replication用戶
需要su切換到安裝postgresql數據庫自動創建的用戶postgres,然後使用psql cli工具,登錄用戶爲postgres,創建複製用戶replica
[wntime@postgres1 ~]$ su - postgres
Password:
Last login: Sat May 23 15:40:00 CST 2020 on pts/0
-bash-4.2$ psql -U postgres -d postgres
psql (10.13)
Type "help" for help.
postgres=# create user replica superuser password '12345678';
CREATE ROLE
postgres=# \q
-bash-4.2$ exit
logout
2. 修改/var/lib/pgsql/10/data/postgresql.conf
參考的資料有些差異,比對了相同的配置項,主要修改成以下內容:
wal_level = replica #10以後的版本爲replica,10之前的版本爲hot_standby
max_wal_senders= 1 #併發的從庫數量
wal_keep_segments = 128
下面是修改語句,在非postgres用戶下執行,請根據具體情況修改:
sudo cp /var/lib/pgsql/10/data/postgresql.conf /var/lib/pgsql/10/data/postgresql.conf.bak
#修改文件權限
sudo chown postgres:postgres /var/lib/pgsql/10/data/postgresql.conf.bak
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '10.10.10.72'/g" /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'listen_addresses'
sudo sed -i "s/max_connections = 100/max_connections = 500/g" /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'max_connections'
sudo sed -i "s/shared_buffers = 128MB/shared_buffers = 512MB/g" /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'shared_buffers'
sudo sed -i 's/#wal_level = replica/wal_level = replica/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'wal_level'
sudo sed -i 's/#max_wal_senders = 10/max_wal_senders = 10/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'max_wal_senders'
sudo sed -i 's/#wal_keep_segments = 0/wal_keep_segments = 128/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'wal_keep_segments'
3. 修改/var/lib/pgsql/10/data/pg_hba.conf
配置複製用戶的數據庫訪問限制,在pg_hba.conf文件最後追加:
host replication replica 10.10.10.0/24 md5
4. 重啓數據庫
參考的文章上都是使用【 pg_ctl restart -D /PostgreSQL/10/data/ -l /PostgreSQL/10/data/pglog.log】進行重啓的,但是在我安裝配置的主機上沒有發現pg_ctl工具:
[wntime@postgres1 ~]$ su - postgres
Password:
Last login: Sat May 23 18:30:53 CST 2020 on pts/0
-bash-4.2$ pg_controldata
-bash: pg_controldata: command not found
-bash-4.2$ pg_
pg_basebackup pg_dump pg_dumpall pg_restore
-bash-4.2$ pg_
pg_basebackup pg_dump pg_dumpall pg_restore
-bash-4.2$ exit
logout
最終我使用的是 systemctl
sudo systemctl restart postgresql-10
postgres2從庫配置
1. 從主庫做初次基礎備份
需要su切換到安裝postgresql數據庫自動創建的用戶postgres,然後使用psql cli工具,登錄用戶爲postgres
指令參數使用說明:
pg_basebackup -h 172.30.9.118 -U replica -F p -X stream -P -R -D /var/lib/postgresql/10/main/ -l backup20181122
#-h指定連接的數據庫的主機名或IP地址
#-U指定連接的用戶名
#-F指定了輸出的格式,支持p(原樣輸出)或者t(tar格式輸出)
#-X表示備份開始後,啓動另一個流複製連接從主庫接收WAL日誌
#-P表示允許在備份過程中實時的打印備份的進度
#-R表示會在備份結束後自動生成recovery.conf文件
#-D指定備份寫入的數據目錄,需要與數據庫配置的數據庫目錄一致,初次備份之前從庫的數據目錄需要手動清空
#-l表示指定一個備份的標識
由於版本不同,postgresql數據庫實際的安裝路徑與參考資料的路勁都不同,不確定 -D 具體指定路徑
第一次測試:
-bash-4.2$ pg_basebackup -h 10.10.10.72 -U replica -F p -X stream -P -R -D /var/lib/postgresql/10/main/ -l backup20200523
pg_basebackup: could not create directory "/var/lib/postgresql": Permission denied
-bash-4.2$
查看 用戶postgres默認路徑,並修改路徑
第二次測試:
-bash-4.2$ pwd
/var/lib/pgsql
-bash-4.2$ cd 10/
-bash-4.2$ ll
total 8
drwx------. 2 postgres postgres 6 May 14 05:24 backups
drwx------. 20 postgres postgres 4096 May 23 00:00 data
-rw-------. 1 postgres postgres 920 May 22 19:41 initdb.log
-bash-4.2$ mkdir main
-bash-4.2$ ll
total 8
drwx------. 2 postgres postgres 6 May 14 05:24 backups
drwx------. 20 postgres postgres 4096 May 23 00:00 data
-rw-------. 1 postgres postgres 920 May 22 19:41 initdb.log
drwxr-xr-x. 2 postgres postgres 6 May 23 18:36 main
-bash-4.2$ pg_basebackup -h 10.10.10.72 -U replica -F p -X stream -P -R -D /var/lib/pgsql/10/main/ -l backup20200523
pg_basebackup: could not connect to server: FATAL: no pg_hba.conf entry for replication connection from host "10.10.10.72", user "replica", SSL off
pg_basebackup: removing contents of data directory "/var/lib/pgsql/10/main/"
-bash-4.2$ pg_basebackup: could not connect to server: FATAL: no pg_hba.conf entry for replication connection from host "10.10.10.72", user "replica", SSL off
-bash: pg_basebackup:: command not found
-bash-4.2$ ll
total 8
drwx------. 2 postgres postgres 6 May 14 05:24 backups
drwx------. 20 postgres postgres 4096 May 23 00:00 data
-rw-------. 1 postgres postgres 920 May 22 19:41 initdb.log
drwxr-xr-x. 2 postgres postgres 6 May 23 18:36 main
-bash-4.2$
在另外的一篇資料看到:
2.3.1不需要初始化,直接從主庫備份就行,如有DATA直接刪掉或改名掉
postgres@NanoPI-006:~$pg_basebackup -h 主庫地址10.10.10.205 -p 5432 -U 數據庫中創建的同步用的用戶名 -F p -P -D ~/data/
可能得輸入密碼
可以簡單理解 pg_basebackup 就是把主庫data文件 整體複製到 從庫對應文件夾,由於我的從庫也被初始化了,就把從庫本地的 data/ 重命名爲 data1/
第三次測試:注意使用的是數據庫用戶replica的密碼
-bash-4.2$ mv data/ data1/
-bash-4.2$ rm -rf main/
-bash-4.2$ ll
total 8
drwx------. 2 postgres postgres 6 May 14 05:24 backups
drwx------. 20 postgres postgres 4096 May 23 18:41 data1
-rw-------. 1 postgres postgres 920 May 22 19:41 initdb.log
-bash-4.2$ pg_basebackup -h 10.10.10.72 -p 5432 -U replica -F p -X stream -P -R -D /var/lib/pgsql/10/data/ -l backup20200523
Password:
pg_basebackup: could not connect to server: FATAL: number of requested standby connections exceeds max_wal_senders (currently 1)
pg_basebackup: removing data directory "/var/lib/pgsql/10/data"
-bash-4.2$ pg_basebackup: could not connect to server: FATAL: number of requested standby connections exceeds max_wal_senders (currently 1)
-bash: syntax error near unexpected token `('
-bash-4.2$
初次配置max_wal_senders時,由於只有一個從庫,就配置成 max_wal_senders = 1; 然後就報上面的錯誤了,調整成max_wal_senders = 2就可以了,最終上面給出的修改配置都是使用默認值10.
第四次測試:
-bash-4.2$ pg_basebackup -h 10.10.10.72 -p 5432 -U replica -F p -X stream -P -R -D /var/lib/pgsql/10/data/ -l backup20200523
Password:
32094/32151 kB (99%), 1/1 tablespace
pg_basebackup: could not get write-ahead log end position from server: ERROR: could not open file "./postgresql.conf.bak": Permission denied
pg_basebackup: removing data directory "/var/lib/pgsql/10/data"
-bash-4.2$ ll
這裏是由於主庫修改postgresql.conf文件時,做了備份postgresql.conf.bak,使用sudo操作了的,現在使用postgres用戶操作的所以對postgresql.conf.bak沒有權限,使用sudo chown postgres:postgres /var/lib/pgsql/10/data/postgresql.conf.bak修改權限
[wntime@postgres1 ~]$ sudo ls -l /var/lib/pgsql/10/data/
total 96
drwx------. 6 postgres postgres 50 May 22 20:08 base
-rw-------. 1 postgres postgres 30 May 23 18:52 current_logfiles
drwx------. 2 postgres postgres 4096 May 23 18:53 global
drwx------. 2 postgres postgres 56 May 23 00:00 log
drwx------. 2 postgres postgres 6 May 22 19:38 pg_commit_ts
drwx------. 2 postgres postgres 6 May 22 19:38 pg_dynshmem
-rw-------. 1 postgres postgres 4521 May 23 17:38 pg_hba.conf
-rw-------. 1 root root 4269 May 22 19:55 pg_hba.conf.bak
-rw-------. 1 postgres postgres 1636 May 22 19:38 pg_ident.conf
drwx------. 4 postgres postgres 65 May 23 18:57 pg_logical
drwx------. 4 postgres postgres 34 May 22 19:38 pg_multixact
drwx------. 2 postgres postgres 17 May 23 18:52 pg_notify
drwx------. 2 postgres postgres 6 May 23 18:57 pg_replslot
drwx------. 2 postgres postgres 6 May 22 19:38 pg_serial
drwx------. 2 postgres postgres 6 May 22 19:38 pg_snapshots
drwx------. 2 postgres postgres 6 May 23 18:52 pg_stat
drwx------. 2 postgres postgres 80 May 23 19:00 pg_stat_tmp
drwx------. 2 postgres postgres 17 May 22 19:38 pg_subtrans
drwx------. 2 postgres postgres 6 May 22 19:38 pg_tblspc
drwx------. 2 postgres postgres 6 May 22 19:38 pg_twophase
-rw-------. 1 postgres postgres 3 May 22 19:38 PG_VERSION
drwx------. 3 postgres postgres 4096 May 23 18:57 pg_wal
drwx------. 2 postgres postgres 17 May 22 19:38 pg_xact
-rw-------. 1 postgres postgres 88 May 22 19:38 postgresql.auto.conf
-rw-------. 1 postgres postgres 23054 May 23 18:52 postgresql.conf
-rw-------. 1 root root 22986 May 22 19:52 postgresql.conf.bak
-rw-------. 1 postgres postgres 58 May 23 18:52 postmaster.opts
-rw-------. 1 postgres postgres 105 May 23 18:52 postmaster.pid
[wntime@postgres1 ~]$
第五次測試:
-bash-4.2$ pg_basebackup -h 10.10.10.72 -p 5432 -U replica -F p -X stream -P -R -D /var/lib/pgsql/10/data/ -l backup20200523
Password:
pg_basebackup: could not connect to server: FATAL: password authentication failed for user "replica"
pg_basebackup: removing data directory "/var/lib/pgsql/10/data"
-bash-4.2$
與上面問題一樣,也是由於文件權限引起
第六次測試:
-bash-4.2$ pg_basebackup -h 10.10.10.72 -p 5432 -U replica -F p -X stream -P -R -D /var/lib/pgsql/10/data/ -l backup20200523
Password:
32454/32454 kB (100%), 1/1 tablespace
-bash-4.2$ ls -l
total 12
drwx------. 2 postgres postgres 6 May 14 05:24 backups
drwx------. 20 postgres postgres 4096 May 23 19:01 data
drwx------. 20 postgres postgres 4096 May 23 18:41 data1
-rw-------. 1 postgres postgres 920 May 22 19:41 initdb.log
-bash-4.2$
備份主庫到從庫完成
2. 修改/var/lib/pgsql/10/data/postgresql.conf
# 註釋掉以下內容
wal_level,
max_wal_senders
wal_keep_segments等參數
# 打開以下內容
hot_standby = on #在備份的同時允許查詢
max_standby_streaming_delay = 30s #可選,流複製最大延遲
wal_receiver_status_interval = 10s #可選,從向主報告狀態的最大間隔時間
hot_standby_feedback = on #可選,查詢衝突時向主反饋
max_connections = 1000 #默認參數,非主從配置相關參數,表示到數據庫的連接數,一般從庫做主要的讀服務時,設置值需要高於主庫
下面是修改語句,在非postgres用戶下執行,請根據具體情況修改:
sudo sed -i "s/listen_addresses = '10.10.10.72'/listen_addresses = '10.10.10.73'/g" /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'listen_addresses'
sudo sed -i "s/max_connections = 500/max_connections = 1000/g" /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'max_connections'
sudo sed -i 's/wal_level = replica/#wal_level = replica/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'wal_level'
sudo sed -i 's/max_wal_senders = 10/#max_wal_senders = 10/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'max_wal_senders'
sudo sed -i 's/wal_keep_segments = 128/#wal_keep_segments = 128/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'wal_keep_segments'
sudo sed -i 's/#hot_standby = on/hot_standby = on/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'hot_standby'
sudo sed -i 's/#max_standby_streaming_delay = 30s/max_standby_streaming_delay = 30s/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'max_standby_streaming_delay'
sudo sed -i 's/#wal_receiver_status_interval = 10s/wal_receiver_status_interval = 10s/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'wal_receiver_status_interval'
sudo sed -i 's/#hot_standby_feedback = off/hot_standby_feedback = on/g' /var/lib/pgsql/10/data/postgresql.conf
sudo cat /var/lib/pgsql/10/data/postgresql.conf|grep 'hot_standby_feedback'
3. 修改/var/lib/pgsql/10/data/pg_hba.conf
參考文章上說需要配置複製用戶的數據庫訪問限制,在pg_hba.conf文件最後追加:
host replication replica 10.10.10.0/24 md5
由於data/ 文件夾都是複製主庫的,所以 pg_hba.conf 無需修改,主庫配置的上面信息已存在;而用戶會同步過來。
4. 修改/var/lib/pgsql/10/data/recovery.conf
資料上都是創建的,但是我操作的時候是從主庫拷貝過來的,只是缺少recovery_target_timeline = 'latest',手動加上了。
standby_mode = on #指明從庫身份
primary_conninfo = 'host=10.10.10.205 port=5432 user=同步用的用戶名 password=密碼' #連接到主庫信息
recovery_target_timeline = 'latest' #同步到最新數據
recovery_target_timeline = 'latest'
standby_mode = 'on'
primary_conninfo = 'user=replica password=''12345678'' host=10.10.10.72 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any'
5. 重啓數據庫
sudo systemctl restart postgresql-10