本文主要是介紹PostgreSQL數(shù)據(jù)庫的熱備技術(shù),PostgreSQL數(shù)據(jù)庫提供了類似Oracle的standby數(shù)據(jù)庫的功能。PostgreSQL日志傳送的方法有兩種,一種是基于文件(base-file)的傳送方式,一種是流復(fù)制(streamingreplication)的方式。基于文件(base-file)的傳送方式,這種方式是PostgreSQL9.0之前就提供的方法。也就是服務(wù)器寫完一個WAL日志文件后,才把WAL日志文件拷貝到standby數(shù)據(jù)庫上去應(yīng)用。流復(fù)制的方式是PostgreSQL提供的一種服務(wù)器間的數(shù)據(jù)復(fù)制方式。這是PostgreSQL9.0才提供的新方法。這個方法就是事務(wù)提交后,主服務(wù)器則在WAL記錄產(chǎn)生時即將它們以流式傳送給后備服務(wù)器而不必等到WAL文件被填充。就是把生成的日志異步的傳送到standby數(shù)據(jù)庫上應(yīng)用,這比基本文件的日志傳送方法有更低的數(shù)據(jù)延遲。
1. 服務(wù)器兩臺:
服務(wù)器 | IP |
主數(shù)據(jù)庫服務(wù)器 | 192.168.88.191 |
備數(shù)據(jù)庫服務(wù)器 | 192.168.88.192 |
操作系統(tǒng)版本:CentOS-7-x86_64
軟件:PostgreSQL10.10
安裝目錄是:/db/pgsql/
數(shù)據(jù)目錄是:/db/pgsql_data/
注意:實施之前兩臺機器上都安裝好了postgresql數(shù)據(jù)庫
2. 確保操作系統(tǒng)防火墻已關(guān)閉
systemctl stopfirewalld
systemctl disablefirewalld
切換用戶,并執(zhí)行啟動服務(wù)命令:
su – postgres pg_ctl start -D $PGDATA 啟動服務(wù)。 |
創(chuàng)建用于流復(fù)制的用戶。執(zhí)行命令:
psql -h 127.0.0.1 -p 5432 -U postgres 進入PostgreSQL數(shù)據(jù)庫,并執(zhí)行如下語句創(chuàng)建用戶: create user repuser with login replication password 123456; |
修改pg_hba.conf文件,添加如下內(nèi)容,允許兩臺計算機上的復(fù)制用戶和超級用戶登錄:
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 |
在主節(jié)點的postgresql.conf 中設(shè)置這些參數(shù):
max_wal_senders = 10 wal_level = replica wal_log_hints = on wal_keep_segments = 10 wal_receiver_status_interval = 5s hot_standby_feedback = on |
參數(shù)含義:
max_wal_senders表示來自后備服務(wù)器或流式基礎(chǔ)備份客戶端的并發(fā)連接的最大數(shù)量;
wal_level表示日志級別,對于流復(fù)制,它的值應(yīng)設(shè)置為replica;
wal_log_hints =on表示,在PostgreSQL服務(wù)器一個檢查點之后頁面被第一次修改期間,把該磁盤頁面的整個內(nèi)容都寫入WAL,即使對所謂的提示位做非關(guān)鍵修改也會這樣做;
wal_keep_segments指定在后備服務(wù)器需要為流復(fù)制獲取日志段文件的情況下,pg_wal(PostgreSQL9.6 以下版本的是pg_xlog)目錄下所能保留的過去日志文件段的最小數(shù)目;
log_connections表示是否在日志中記錄客戶端對服務(wù)器的連接;
wal_receiver_status_interval指定在后備機上的 WAL接收者進程向主服務(wù)器或上游后備機發(fā)送有關(guān)復(fù)制進度的信息的最小周期;
hot_standby_feedback指定一個熱后備機是否將會向主服務(wù)器或上游后備機發(fā)送有關(guān)于后備機上當前正被執(zhí)行的查詢的反饋,這里設(shè)置為on。
關(guān)于詳細內(nèi)容,可以參考postgresql官方文檔。
重啟主節(jié)點:
pg_ctl restart -D $PGDATA |
重啟之后,為主服務(wù)器和后備服務(wù)器創(chuàng)建復(fù)制槽(該步非必做項):
select * frompg_create_physical_replication_slot(postgresql_node191); select * frompg_create_physical_replication_slot(postgresql_node192); 創(chuàng)建后查詢復(fù)制槽 select * from pg_replication_slots; |
復(fù)制槽(replicationslot)的作用是:
1.在流復(fù)制中,當一個備節(jié)點斷開連接時,備節(jié)點通過hot_standby_feedback提供反饋數(shù)據(jù)數(shù)據(jù)會丟失。當備節(jié)點重新連接時,它可能因為被主節(jié)點發(fā)送清理記錄而引發(fā)查詢沖突。復(fù)制槽即使在備節(jié)點斷開時仍然會記錄下備節(jié)點的xmin(復(fù)制槽要需要數(shù)據(jù)庫保留的最舊事務(wù)ID)值,從而確保不會有清理沖突。
2.當一個備節(jié)點斷開連接時,備節(jié)點需要的WAL文件信息也丟失了。如果沒有復(fù)制槽,當備節(jié)點重連時,可能已經(jīng)丟棄了所需要的WAL文件,因此需要完全重建備節(jié)點。而復(fù)制槽確保這個節(jié)點保留所有下游節(jié)點需要的WAL文件。
要配置slave使用這個槽,在后備機的recovery.conf中應(yīng)該配置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 ---刪除復(fù)制槽 slave在使用primary_slot_name 參數(shù)時是無法刪除replication slots postgres=# SELECT * FROM pg_drop_replication_slot(postgresql_node191); postgres=# SELECT * FROM pg_drop_replication_slot(postgresql_node192); |
確保服務(wù)是停止的:
su - postgres 切換用戶,并執(zhí)行: pg_ctl stop -D $PGDATA 關(guān)閉服務(wù)。 |
首先刪除備節(jié)點中的數(shù)據(jù)目錄$PGDATA 中的文件:
cd $PGDATA rm –rf * 然后執(zhí)行: pg_basebackup -Xs -d "hostaddr=192.168.88.191 port=5432user=repuser password=123456" -D $PGDATA -v -Fp |
這里,-Xs表示復(fù)制方式是流式的(stream),這種方式不會復(fù)制在此次備份開始前,已經(jīng)歸檔完成的WAL文件;-d后面是一個連接字符串,其中“hostaddr=192.168.88.191”表示主服務(wù)器的ip地址是192.168.88.191,“port=5432”表示數(shù)據(jù)庫的端口是5432,“user=repuser”表示用于流復(fù)制的用戶是repuser,“password=123456”表示密碼是123456;“-D$PGDATA”表示將備份內(nèi)容輸入到本地的$PGDATA 目錄;“-v”表示打印詳細信息,–Fp表示復(fù)制結(jié)果輸出位普通(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 |
基礎(chǔ)備份完成后,修改備節(jié)點的postgresql.conf 文件設(shè)置:
hot_standby = on |
將/db/pgsql/share/ 中的recovery.conf.sample 拷貝到$PGDATA 下,重命名為recovery.conf:
cp /db/pgsql/share/recovery.conf.sample $PGDATA/recovery.conf 并設(shè)置如下參數(shù): 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 |
上述參數(shù)含義如下:
recovery_target_timeline表示恢復(fù)到數(shù)據(jù)庫時間線的上的什么時間點,這里設(shè)置為latest,即最新;
standby_mode表示是否將PostgreSQL服務(wù)器作為一個后備服務(wù)器啟動,這里設(shè)置為on,即后備模式;
primary_conninfo指定后備服務(wù)器用來連接主服務(wù)器的連接字符串,其中“host=192.168.88.191”表示主服務(wù)器的ip地址是192.168.88.191,“port=5432”表示數(shù)據(jù)庫的端口是5432,“user=repuser”表示用于流復(fù)制的用戶是repuser,“password=123456”表示密碼是123456;
primary_slot_name指定通過流復(fù)制連接到主服務(wù)器時使用一個現(xiàn)有的復(fù)制槽來控制上游節(jié)點上的資源移除。這里我們指定之前創(chuàng)建的postgresql_node122。如果沒有在主服務(wù)器上創(chuàng)建復(fù)制槽,則不配置此參數(shù);
trigger_file指定一個觸發(fā)器文件,該文件的存在會結(jié)束后備機中的恢復(fù),使它成為主機。
啟動備節(jié)點服務(wù):
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 |
在主節(jié)點上創(chuàng)建一個表,并插入數(shù)據(jù):
postgres=# create table demo1 (id int, name varchar(20)); CREATE TABLE postgres=# insert into demo1 (id, name) values (1,zhangsan); INSERT 0 1 |
在備節(jié)點上檢測:
postgres=# select * from demo1; id | name ----+------ 1 | zhangsan 主節(jié)點數(shù)據(jù)同步到了備機。 同時,在備節(jié)點上寫數(shù)據(jù)會失敗: postgres=# insert into demo1 (id, name) values (2,wangwu); ERROR: cannot execute INSERT in a read-only transaction |
啟動備節(jié)點,使之成為新的主節(jié)點:
pg_ctl promote -D $PGDATA 結(jié)果是: waiting for server to promote........ done server promoted |
查看新主節(jié)點的狀態(tài):
postgres=# pg_controldata | grep cluster Database cluster state: in production 插入數(shù)據(jù)后無報錯: postgres=# insert into demo1 (id, name) values (2,wangwu); INSERT 0 1 |
停止舊的主節(jié)點:
pg_ctl stop -m fast -D $PGDATA 結(jié)果: waiting for server to shut down.... done server stopped |
在停止的舊主節(jié)點上執(zhí)行恢復(fù)數(shù)據(jù)的操作:
pg_rewind --target-pgdata $PGDATA--source-server=host=192.168.88.192 port=5432 user=postgresdbname=postgres -P 結(jié)果如下: 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! 表示從新主節(jié)點上成功獲取WAL日志。 |
重新配置新備節(jié)點的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 |
在新備節(jié)點上執(zhí)行下面的命令,重新啟動該節(jié)點:
pg_ctl start -D $PGDATA |
在新備節(jié)點上驗證:insertinto提示為read-only
postgres=# insert into demo1 (id, name) values (3,lisi); ERROR: cannot execute INSERT in a read-only transaction |
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/130180.html
摘要:雙機熱備和備份的區(qū)別熱備份指的是即高可用,而備份指的是即數(shù)據(jù)備份的一種,這是兩種不同的概念,應(yīng)對的產(chǎn)品也是兩種功能上完全不同的產(chǎn)品。雙機熱備分類按工作中的切換方式分為主備方式方式和雙主機方式方式。 歡迎關(guān)注公眾號:【愛編碼】如果有需要后臺回復(fù)2019贈送1T的學(xué)習(xí)資料哦!! showImg(https://segmentfault.com/img/remote/146000001900...
摘要:以集群部署的方式提供服務(wù),確保高可用。無狀態(tài)服務(wù),一樣可以通過負載均衡加心跳檢測等手段去部署集群,確保故障轉(zhuǎn)移來做到高可用。初步原理的一致性可用性分區(qū)容錯性。高可用開發(fā)流程服務(wù)發(fā)布通過切流量的方式一臺臺灰度發(fā)布。用于預(yù)發(fā)布驗證。 架構(gòu)和架構(gòu)師,可以說是大部分技術(shù)人的目標或追求吧。 但架構(gòu)類比于內(nèi)功或修為,它不是一門武功,不能學(xué)一招走天下。 同一個架構(gòu)方案在不同公司甚至不同團隊都不一定能...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1902·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20