主機 | 操作系統 | IP | 數據庫 | 角色 | 同步方式 |
pg01 | CentOS7.7 | 192.168.137.200 | PostgreSQL10.10 | 主 | - |
pg02 | CentOS7.7 | 192.168.137.201 | PostgreSQL10.10 | 從 | 同步 |
pg03 | CentOS7.7 | 192.168.137.202 | PostgreSQL10.10 | 從 | 異步 |
所有主機已安裝好PostgreSQL數據庫軟件。
初始化數據庫
initdb -D $PGDATA -E UTF8 --locale=C -U postgres –W |
日志:
The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "C". The default text search configuration will be set to "english". Data page checksums are disabled. Enter new superuser password: Enter it again: creating directory /pgsql/pgsql/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default timezone ... Asia/Shanghai selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: pg_ctl -D /pgsql/pgsql/data -l logfile start |
vi $PGDATA/postgresql.conf listen_addresses = * # 監聽所有ip port = 5432 # 監聽端口 wal_level = replica # 該級別支持wal歸檔和復制 max_wal_senders = 10 # 并發的從庫數量, 發送 wal 進程數 wal_keep_segments = 256 # 默認是0,代表主庫wal日志文件保存的個數, # 可以防止主庫生成日志太快而被覆蓋的情況發生 wal_sender_timeout = 60s # 流復制超時時間, 發送 wal 日志超時時間 max_connections = 100 # 最大連接數 hot_standby = on # 設置為備庫時是否支持可讀 archive_mode = on # 開啟歸檔模式 archive_command = cp %p $PGDATA/pg_archive/%f # 歸檔動作 synchronous_standby_names = pg02 # 指定備庫 pg02 為同步流復制 vi $PGDATA/pg_hba.conf host replication repl 192.168.137.0/24 md5 |
創建歸檔目錄
mkdir$PGDATA/pg_archive
pg_ctl -D $PGDATA -l $PGDATA/logfile start waiting for server to start.... done server started |
查看日志
cat$PGDATA/logfile
查看進程
ps-ef | grep postgres
psql CREATE ROLE repl LOGIN REPLICATION PASSWORD Yike_repl; |
發現命令hang住
Ctrl+C
取消后發現報錯如下
因為配置文件里指定了pg02為同步流復制,但是pg02還不可用,所以報錯。
雖然取消了,但是用戶已經創建成功。
vi ~/.pgpass 192.168.137.200:5432:replication:repl:Yike_repl 192.168.137.201:5432:replication:repl:Yike_repl 192.168.137.202:5432:replication:repl:Yike_repl chmod 600 ~/.pgpass |
復制主庫
pg_basebackup -h 192.168.137.200 -p 5432 -U repl -F p -P -X s -R -D $PGDATA Password: |
配置recovery.conf
vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.200 port=5432 user=repl application_name=pg02 recovery_target_timeline = latest |
配置postgresql.conf
vi $PGDATA/postgresql.conf #synchronous_standby_names = pg02 |
配置密碼文件
vi ~/.pgpass 192.168.137.200:5432:replication:repl:Yike_repl 192.168.137.201:5432:replication:repl:Yike_repl 192.168.137.202:5432:replication:repl:Yike_repl chmod 600 ~/.pgpass |
啟動pg02備庫
pg_ctl -D $PGDATA -l $PGDATA/logfile start |
主庫查詢:
select pid, usename, client_addr, client_port, sync_state from pg_stat_replication; |
從庫已經成功連接到主庫,同步方式為sync
主庫創建測試表,發現不會再hang住了
從庫查看t1表
步驟同3.1相同
pg_basebackup -h 192.168.137.200 -p 5432 -U repl -F p -P -X s -R -D $PGDATA Password: 122783/122783 kB (100%), 1/1 tablespace vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.200 port=5432 user=repl application_name=pg03 recovery_target_timeline = latest vi $PGDATA/postgresql.conf #synchronous_standby_names = pg02 vi ~/.pgpass 192.168.137.200:5432:replication:repl:Yike_repl 192.168.137.201:5432:replication:repl:Yike_repl 192.168.137.202:5432:replication:repl:Yike_repl chmod 600 ~/.pgpass pg_ctl -D $PGDATA -l $PGDATA/logfile start psql dt t1 |
主庫查詢發現兩個從庫都已連接到主庫
PostgreSQL是通過PGDATA目錄下的recovery.conf文件確定主從角色的,啟動時如果存在該文件,則會以從庫角色啟動,不存在則以主庫角色啟動。主從切換后,新從庫的recovery.conf文件會自動重命名為recovery.done。
pg_controldata $PGDATA | grep state |
pg01:
pg02:
pg03:
當前pg01 為主庫,pg02、pg03為從庫
pg01執行
pg_ctl -D $PGDATA stop waiting for server to shut down..... done server stopped |
此時從庫日志報錯
pg02執行
pg_ctl -D $PGDATA promote pg_controldata $PGDATA | grep state |
角色已切換從主庫
recovery文件已自動重命名
修改recovery文件
vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.201 port=5432 user=repl application_name=pg03 recovery_target_timeline = latest |
重啟數據庫
pg_ctl -D $PGDATA -l $PGDATA/logfile restart |
日志不再報錯
pg02執行:
select pid, usename, client_addr, client_port, sync_state from pg_stat_replication; |
pg03已經連接到新主庫
修改原主庫參數
vi $PGDATA/postgresql.conf #synchronous_standby_names = pg02 |
編輯recover文件
vi $PGDATA/recovery.conf standby_mode = on primary_conninfo = host=192.168.137.201 port=5432 user=repl application_name=pg01 recovery_target_timeline = latest |
修改新庫參數
vi $PGDATA/postgresql.conf synchronous_standby_names = pg01 pg_ctl –D $PGDATA reload |
select pid, usename, client_addr, client_port, sync_state from pg_stat_replication; |
主庫查詢發現兩個從庫都已連接到主庫
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/130106.html
摘要:編輯器編輯器背景編輯器前段時間遇到一個線上問題,后來排查好久發現是因為主從同步延遲導致的,所以今天寫一篇文章總結一下這個問題希望對你有用。編輯器幾句嘮叨編輯器大家好,我是小飯,一枚后端工程師。背景前段時間遇到一個線上問題,后來排查好久發現是因為主從同步延遲導致的,所以今天寫一篇文章總結一下這個問題希望對你有用。如果覺得還不錯,記得加個關注點個贊哦思維導圖思維導圖常見的主從架構隨著日益增長的訪...
摘要:收到后則會調用指令一個子進程來持久化存儲的數據,在的持久化的這個短短期間內,的指令則存儲到內存中。經過官網的測試性能結果達到的。 HotFrameLearning Redis_01_簡介 - 一、大致介紹 1、介紹Redis之前,我有一堆的疑問,Redis是什么?有什么用?它能干什么?有什么特性?能解決我們日常的哪些問題? 為什么要用Redis?Redis好在哪里?除了Redis...
摘要:前言許多數據庫支持數據庫復制來獲得更好的數據庫可用性,以及更快的服務器響應時間,減少數據庫的壓力。通過數據庫復制功能,數據從所謂的主服務器被復制到從服務器。 前言 許多數據庫支持數據庫復制來獲得更好的數據庫可用性,以及更快的服務器響應時間,減少數據庫的壓力。通過數據庫復制功能,數據從所謂的主服務器被復制到從服務器。主服務器做增刪改,而從服務器做查詢。 讀寫分離前提條件:linux數據庫...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1901·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2744·2023-01-11 13:20
閱讀 1394·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20