CentOS7 Postgresql 10 數據庫主備配置

配置過程主要參考以下鏈接:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章