本文主要是介紹PostgreSQL數據庫的熱備技術,PostgreSQL數據庫提供了類似Oracle的standby數據庫的功能。PostgreSQL日志傳送的方法有兩種,一種是基于文件(base-file)的傳送方式,一種是流復制(streamingreplication)的方式。基于文件(base-file)的傳送方式,這種方式是PostgreSQL9.0之前就提供的方法。也就是服務器寫完一個WAL日志文件后,才把WAL日志文件拷貝到standby數據庫上去應用。流復制的方式是PostgreSQL提供的一種服務器間的數據復制方式。這是PostgreSQL9.0才提供的新方法。這個方法就是事務提交后,主服務器則在WAL記錄產生時即將它們以流式傳送給后備服務器而不必等到WAL文件被填充。就是把生成的日志異步的傳送到standby數據庫上應用,這比基本文件的日志傳送方法有更低的數據延遲。
1. 服務器兩臺:
服務器 | IP |
主數據庫服務器 | 192.168.88.191 |
備數據庫服務器 | 192.168.88.192 |
操作系統版本:CentOS-7-x86_64
軟件:PostgreSQL10.10
安裝目錄是:/db/pgsql/
數據目錄是:/db/pgsql_data/
注意:實施之前兩臺機器上都安裝好了postgresql數據庫
2. 確保操作系統防火墻已關閉
systemctl stopfirewalld
systemctl disablefirewalld
切換用戶,并執行啟動服務命令:
su – postgres pg_ctl start -D $PGDATA 啟動服務。 |
創建用于流復制的用戶。執行命令:
psql -h 127.0.0.1 -p 5432 -U postgres 進入PostgreSQL數據庫,并執行如下語句創建用戶: create user repuser with login replication password 123456; |
修改pg_hba.conf文件,添加如下內容,允許兩臺計算機上的復制用戶和超級用戶登錄:
host replication repuser 192.168.88.191/32 md5 host replication repuser 192.168.88.192/32 md5 host all postgres 192.168.88.191/32 trust host all postgres 192.168.88.192/32 trust |
在主節點的postgresql.conf 中設置這些參數:
max_wal_senders = 10 wal_level = replica wal_log_hints = on wal_keep_segments = 10 wal_receiver_status_interval = 5s hot_standby_feedback = on |
參數含義:
max_wal_senders表示來自后備服務器或流式基礎備份客戶端的并發連接的最大數量;
wal_level表示日志級別,對于流復制,它的值應設置為replica;
wal_log_hints =on表示,在PostgreSQL服務器一個檢查點之后頁面被第一次修改期間,把該磁盤頁面的整個內容都寫入WAL,即使對所謂的提示位做非關鍵修改也會這樣做;
wal_keep_segments指定在后備服務器需要為流復制獲取日志段文件的情況下,pg_wal(PostgreSQL9.6 以下版本的是pg_xlog)目錄下所能保留的過去日志文件段的最小數目;
log_connections表示是否在日志中記錄客戶端對服務器的連接;
wal_receiver_status_interval指定在后備機上的 WAL接收者進程向主服務器或上游后備機發送有關復制進度的信息的最小周期;
hot_standby_feedback指定一個熱后備機是否將會向主服務器或上游后備機發送有關于后備機上當前正被執行的查詢的反饋,這里設置為on。
關于詳細內容,可以參考postgresql官方文檔。
重啟主節點:
pg_ctl restart -D $PGDATA |
重啟之后,為主服務器和后備服務器創建復制槽(該步非必做項):
select * frompg_create_physical_replication_slot(postgresql_node191); select * frompg_create_physical_replication_slot(postgresql_node192); 創建后查詢復制槽 select * from pg_replication_slots; |
復制槽(replicationslot)的作用是:
1.在流復制中,當一個備節點斷開連接時,備節點通過hot_standby_feedback提供反饋數據數據會丟失。當備節點重新連接時,它可能因為被主節點發送清理記錄而引發查詢沖突。復制槽即使在備節點斷開時仍然會記錄下備節點的xmin(復制槽要需要數據庫保留的最舊事務ID)值,從而確保不會有清理沖突。
2.當一個備節點斷開連接時,備節點需要的WAL文件信息也丟失了。如果沒有復制槽,當備節點重連時,可能已經丟棄了所需要的WAL文件,因此需要完全重建備節點。而復制槽確保這個節點保留所有下游節點需要的WAL文件。
要配置slave使用這個槽,在后備機的recovery.conf中應該配置primary_slot_name,如下: $ vi $PGDATA/recovery.conf primary_slot_name = postgresql_node191 standby_mode = on recovery_target_timeline = latest primary_conninfo = user=replicator password=1qaz2wsxhost=192.168.88.191 port=5432 application_name= postgresql_node192 trigger_file = /tmp/postgresql.trigger.5432 ---刪除復制槽 slave在使用primary_slot_name 參數時是無法刪除replication slots postgres=# SELECT * FROM pg_drop_replication_slot(postgresql_node191); postgres=# SELECT * FROM pg_drop_replication_slot(postgresql_node192); |
確保服務是停止的:
su - postgres 切換用戶,并執行: pg_ctl stop -D $PGDATA 關閉服務。 |
首先刪除備節點中的數據目錄$PGDATA 中的文件:
cd $PGDATA rm –rf * 然后執行: pg_basebackup -Xs -d "hostaddr=192.168.88.191 port=5432user=repuser password=123456" -D $PGDATA -v -Fp |
這里,-Xs表示復制方式是流式的(stream),這種方式不會復制在此次備份開始前,已經歸檔完成的WAL文件;-d后面是一個連接字符串,其中“hostaddr=192.168.88.191”表示主服務器的ip地址是192.168.88.191,“port=5432”表示數據庫的端口是5432,“user=repuser”表示用于流復制的用戶是repuser,“password=123456”表示密碼是123456;“-D$PGDATA”表示將備份內容輸入到本地的$PGDATA 目錄;“-v”表示打印詳細信息,–Fp表示復制結果輸出位普通(plain)文件。
如果遇到以下報錯: pg_basebackup: could not connect to server: could not connect toserver: No route to host Is the server running on host "192.168.88.191" andaccepting TCP/IP connections on port 5432? pg_basebackup: removing contents of data directory "/db/pgsql_data" 用root清除下防火墻: sudo iptables -F |
基礎備份完成后,修改備節點的postgresql.conf 文件設置:
hot_standby = on |
將/db/pgsql/share/ 中的recovery.conf.sample 拷貝到$PGDATA 下,重命名為recovery.conf:
cp /db/pgsql/share/recovery.conf.sample $PGDATA/recovery.conf 并設置如下參數: recovery_target_timeline = latest standby_mode = on primary_conninfo = host=192.168.88.191 port=5432 user=repuserpassword=repuser123 primary_slot_name = postgresql_node122 trigger_file = tgfile |
上述參數含義如下:
recovery_target_timeline表示恢復到數據庫時間線的上的什么時間點,這里設置為latest,即最新;
standby_mode表示是否將PostgreSQL服務器作為一個后備服務器啟動,這里設置為on,即后備模式;
primary_conninfo指定后備服務器用來連接主服務器的連接字符串,其中“host=192.168.88.191”表示主服務器的ip地址是192.168.88.191,“port=5432”表示數據庫的端口是5432,“user=repuser”表示用于流復制的用戶是repuser,“password=123456”表示密碼是123456;
primary_slot_name指定通過流復制連接到主服務器時使用一個現有的復制槽來控制上游節點上的資源移除。這里我們指定之前創建的postgresql_node122。如果沒有在主服務器上創建復制槽,則不配置此參數;
trigger_file指定一個觸發器文件,該文件的存在會結束后備機中的恢復,使它成為主機。
啟動備節點服務:
pg_ctl start -D $PGDATA pg_ctl stop -D $PGDATA 問題解決: [postgres@postgresql2 pgsql_data]$ pg_ctl start -D $PGDATA waiting for server to start....2020-06-15 18:22:49.203 EDT [2883]FATAL: data directory "/db/pgsql_data" has group or worldaccess 2020-06-15 18:22:49.203 EDT [2883] DETAIL: Permissions should beu=rwx (0700). stopped waiting pg_ctl: could not start server Examine the log output. Chmod 700 /db/pgsql_data |
在主節點上創建一個表,并插入數據:
postgres=# create table demo1 (id int, name varchar(20)); CREATE TABLE postgres=# insert into demo1 (id, name) values (1,zhangsan); INSERT 0 1 |
在備節點上檢測:
postgres=# select * from demo1; id | name ----+------ 1 | zhangsan 主節點數據同步到了備機。 同時,在備節點上寫數據會失?。?/span> postgres=# insert into demo1 (id, name) values (2,wangwu); ERROR: cannot execute INSERT in a read-only transaction |
啟動備節點,使之成為新的主節點:
pg_ctl promote -D $PGDATA 結果是: waiting for server to promote........ done server promoted |
查看新主節點的狀態:
postgres=# pg_controldata | grep cluster Database cluster state: in production 插入數據后無報錯: postgres=# insert into demo1 (id, name) values (2,wangwu); INSERT 0 1 |
停止舊的主節點:
pg_ctl stop -m fast -D $PGDATA 結果: waiting for server to shut down.... done server stopped |
在停止的舊主節點上執行恢復數據的操作:
pg_rewind --target-pgdata $PGDATA--source-server=host=192.168.88.192 port=5432 user=postgresdbname=postgres -P 結果如下: connected to server servers diverged at WAL location 0/2B000230 on timeline 4 rewinding from last common checkpoint at 0/2A000098 on timeline 4 reading source file list reading target file list reading WAL in target need to copy 57 MB (total source directory size is 143 MB) 58749/58749 kB (100%) copied creating backup label and updating control file syncing target data directory Done! 表示從新主節點上成功獲取WAL日志。 |
重新配置新備節點的recovery.conf:
recovery_target_timeline = latest standby_mode = on primary_conninfo = hostaddr=192.168.88.192 port=5432 user=repuserpassword=repuser123 primary_slot_name = postgresql_node121 |
在新備節點上執行下面的命令,重新啟動該節點:
pg_ctl start -D $PGDATA |
在新備節點上驗證:insertinto提示為read-only
postgres=# insert into demo1 (id, name) values (3,lisi); ERROR: cannot execute INSERT in a read-only transaction |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130180.html
摘要:雙機熱備和備份的區別熱備份指的是即高可用,而備份指的是即數據備份的一種,這是兩種不同的概念,應對的產品也是兩種功能上完全不同的產品。雙機熱備分類按工作中的切換方式分為主備方式方式和雙主機方式方式。 歡迎關注公眾號:【愛編碼】如果有需要后臺回復2019贈送1T的學習資料哦?。?showImg(https://segmentfault.com/img/remote/146000001900...
摘要:以集群部署的方式提供服務,確保高可用。無狀態服務,一樣可以通過負載均衡加心跳檢測等手段去部署集群,確保故障轉移來做到高可用。初步原理的一致性可用性分區容錯性。高可用開發流程服務發布通過切流量的方式一臺臺灰度發布。用于預發布驗證。 架構和架構師,可以說是大部分技術人的目標或追求吧。 但架構類比于內功或修為,它不是一門武功,不能學一招走天下。 同一個架構方案在不同公司甚至不同團隊都不一定能...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20