2019年10月30日 星期三

【PostgreSQL】PostgreSQL10.10主從復制步驟

測試用機器資訊如下
主192.168.1.1 CentOS release 6.9 (Final)
從192.168.1.2 CentOS release 6.10 (Final)

紅色是指令
主服務器先創一個資料夾
[root@rosalie-mysql01 opt]# mkdir -p /opt/pgsql/pg_archive

切換使用者並登入,接著建立一個使用者reporting
[root@rosalie-mysql01 pg_archive]# su - postgres
-bash-4.1$ psql
psql (10.10)
Type "help" for help.

創一個使用者
postgres=# CREATE ROLE reporting login replication encrypted password '1234';
CREATE ROLE
離開
postgres=# \q

修改用戶端身份驗證由組態檔案pg_hba.conf的位置,看原本服務是安裝在哪
-bash-4.1$ vi /var/lib/pgsql/10/data/pg_hba.conf

內容很多,但只要加入兩行
-------------------------------------------------------
host       all                     all                 192.168.1.2/32 trust #允許從IP連接到主服務器
host       replication        reporting      192.168.1.2/32 md5 #允許從IP使用reporting用戶來複製

修改參數配置
-bash-4.1$ vi /var/lib/pgsql/10/data/postgresql.conf

-------------------------------------------------------
listen_addresses = '*'
# 監控所有IP

archive_mode = on
# 設置自動歸檔

wal_level = replica
# 預寫日誌模式,增加wal歸檔資訊,包括唯讀伺服器需要的資訊。

archive_command = 'cp %p /opt/pgsql/pg_archive/%f'
# 用此命令進行歸檔logfile segment

max_wal_senders = 3
# 默認是0,設置指最多有幾個複製連接,如幾個從就設幾個,但pg_basebackup會使用到一個

wal_keep_segments = 256
# 默認是0,設置複製保留的最多的xlog數目

wal_sender_timeout = 60s
# 設置複製主機發送數據的超過時間

max_connections = 100
# 這個設置要留意,主庫必需要比從庫大

hot_standby = on
full_page_writes = on
# 開啟全頁寫入pg_rewind前提條件,如果不將整個page寫入wal中,在介質恢復的時候WAL中記錄的數據不足以實現完整的恢復

wal_log_hints = on
# pg_rewind 前提條件

min_wal_size = 512MB
# 最小的wal空間

max_wal_size = 2GB
# max_wal_size = (3 * checkpoint_segments) * 16MB CheckPointSegments得到的值范圍是 max_wal_size 的 1/3 ~ 1/2,最小為1

設置完成後重啟服務
[root@rosalie-mysql01 ~]# service postgresql-10 restart
Stopping postgresql-10 service: [ OK ]
Starting postgresql-10 service: [ OK ]

從伺服器配置
刪除數據庫下的文件,然後從主伺服器同步複製數據至從伺服器
[root@rosalie-mysql02 opt]# service postgresql-10 stop
Stopping postgresql-10 service: [ OK ]

[root@rosalie-mysql02 opt]# rm -rf /var/lib/pgsql/10/data/
[root@rosalie-mysql02 opt]# pg_basebackup -h 192.168.1.1 -U reporting -D /var/lib/pgsql/10/data -X stream -P
Password: (會要求輸入密碼)
24010/24010 kB (100%), 1/1 tablespace

[root@rosalie-mysql02 pg_archive]# chown -R postgres:postgres /var/lib/pgsql/10/data/

pg_basebackup參數說明如下:
選項說明
-h指定連接的數據庫的主機名或IP地址
-U指定連接的用戶名
-F指定了輸出的格式,支持p(原樣輸出)或者t(tar格式輸出)
-X表示備份開始後,啟動另一個流複製連接從主庫接收WAL日誌
-P表示允許在備份過程中實時的打印備份的進度
-R表示會在備份結束後自動生成recovery.conf文件
-D指定備份寫入的數據目錄,需要與數據庫配置的數據庫目錄一致,初次備份之前從庫的數據目錄需要手動清空
-l表示指定一個備份的標識


修改recovery.conf參數
[root@rosalie-mysql02 opt]# vi /var/lib/pgsql/10/data/recovery.conf

standby_mode = on 
 # 表示此節點為從服務器

primary_conninfo = 'host=192.168.1.1 port=5432 user=reporting password=1234 sslmode=disable sslcompression=1 target_session_attrs=any' 
# 主服服務的信息以及連接的用戶

restore_command = '/usr/bin/rsync -a %f /opt/pgsql/pg_archive/%p'
#表示日誌文件名 %p表示目標路徑和文件名

archive_cleanup_command = 'pg_archivecleanup /opt/pgsql/pg_archive %r'

recovery_target_timeline = 'latest'

重啟從服務器
[root@rosalie-mysql02 pgsql]# service postgresql-10 restart
Stopping postgresql-10 service: [ OK ]
Starting postgresql-10 service: [ OK ]

接著主伺服器查詢
[root@rosalie-mysql01 ~]# ps -ef |grep postgres
postgres 9188 1 0 11:12 ? 00:00:00 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data
postgres 9190 9188 0 11:12 ? 00:00:00 postgres: logger process
postgres 9192 9188 0 11:12 ? 00:00:00 postgres: checkpointer process
postgres 9193 9188 0 11:12 ? 00:00:00 postgres: writer process
postgres 9194 9188 0 11:12 ? 00:00:00 postgres: wal writer process
postgres 9195 9188 0 11:12 ? 00:00:00 postgres: autovacuum launcher process
postgres 9197 9188 0 11:12 ? 00:00:00 postgres: stats collector process
postgres 9198 9188 0 11:12 ? 00:00:00 postgres: bgworker: logical replication launcher
postgres 9204 9188 0 11:12 ? 00:00:00 postgres: wal sender process reporting 192.168.1.2(48262) streaming 0/B000098
root 9206 7033 0 11:12 pts/0 00:00:00 grep postgres

或登入postgres用指令查詢
[root@rosalie-mysql01 ~]# su - postgres
-bash-4.1$ psql
psql (10.10)
Type "help" for help.

postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
pid | state | client_addr | sync_priority | sync_state
------+-----------+---------------+---------------+------------
9204 | streaming | 192.168.1.2 | 0 | async
(1 row)

從伺服器查詢
[root@rosalie-mysql02 data]# su - postgres
-bash-4.1$ psql
psql (10.10)
Type "help" for help.

postgres=# select * from pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | back
end_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_prior
ity | sync_state
------+----------+-----------+------------------+---------------+-----------------+-------------+-------------------------------+-----
---------+-----------+-----------+-----------+-----------+------------+-----------------+---------------+-----------------+-----------
----+------------
9204 | 16384 | reporting | walreceiver | 192.168.1.2 | | 48262 | 2019-10-30 11:12:41.816703+08 |
| streaming | 0/B0000D0 | 0/B0000D0 | 0/B0000D0 | 0/B0000D0 | 00:00:00.000136 | 00:00:00.0003 | 00:00:00.000426 |
0 | async
(1 row)

postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)

沒有留言:

張貼留言