成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PostgreSQL熱備之流復(fù)制環(huán)境搭建以及常見問題處理

IT那活兒 / 2082人閱讀
PostgreSQL熱備之流復(fù)制環(huán)境搭建以及常見問題處理
[
簡介
]


本文主要是介紹PostgreSQL數(shù)據(jù)庫的熱備技術(shù),PostgreSQL數(shù)據(jù)庫提供了類似Oracle的standby數(shù)據(jù)庫的功能。PostgreSQL日志傳送的方法有兩種,一種是基于文件(base-file)的傳送方式,一種是流復(fù)制(streamingreplication)的方式。基于文件(base-file)的傳送方式,這種方式是PostgreSQL9.0之前就提供的方法。也就是服務(wù)器寫完一個(gè)WAL日志文件后,才把WAL日志文件拷貝到standby數(shù)據(jù)庫上去應(yīng)用。流復(fù)制的方式是PostgreSQL提供的一種服務(wù)器間的數(shù)據(jù)復(fù)制方式。這是PostgreSQL9.0才提供的新方法。這個(gè)方法就是事務(wù)提交后,主服務(wù)器則在WAL記錄產(chǎn)生時(shí)即將它們以流式傳送給后備服務(wù)器而不必等到WAL文件被填充。就是把生成的日志異步的傳送到standby數(shù)據(jù)庫上應(yīng)用,這比基本文件的日志傳送方法有更低的數(shù)據(jù)延遲。


[
環(huán)境準(zhǔn)備
]


1. 服務(wù)器兩臺(tái):

服務(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/

注意:實(shí)施之前兩臺(tái)機(jī)器上都安裝好了postgresql數(shù)據(jù)庫


2. 確保操作系統(tǒng)防火墻已關(guān)閉

systemctl stopfirewalld

systemctl disablefirewalld


[
搭建PostgreSQL 主備環(huán)境
]


1)在主節(jié)點(diǎn)上的操作


切換用戶,并執(zhí)行啟動(dòng)服務(wù)命令:

su – postgres

pg_ctl start -D $PGDATA 啟動(dòng)服務(wù)。


創(chuàng)建用于流復(fù)制的用戶。執(zhí)行命令:

psql -h 127.0.0.1 -p 5432 -U postgres


進(jìn)入PostgreSQL數(shù)據(jù)庫,并執(zhí)行如下語句創(chuàng)建用戶:

create user repuser with login replication password 123456; 


修改pg_hba.conf文件,添加如下內(nèi)容,允許兩臺(tái)計(jì)算機(jī)上的復(fù)制用戶和超級(jí)用戶登錄:

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é)點(diǎn)的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表示日志級(jí)別,對(duì)于流復(fù)制,它的值應(yīng)設(shè)置為replica;


wal_log_hints =on表示,在PostgreSQL服務(wù)器一個(gè)檢查點(diǎn)之后頁面被第一次修改期間,把該磁盤頁面的整個(gè)內(nèi)容都寫入WAL,即使對(duì)所謂的提示位做非關(guān)鍵修改也會(huì)這樣做;


wal_keep_segments指定在后備服務(wù)器需要為流復(fù)制獲取日志段文件的情況下,pg_wal(PostgreSQL9.6 以下版本的是pg_xlog)目錄下所能保留的過去日志文件段的最小數(shù)目;


log_connections表示是否在日志中記錄客戶端對(duì)服務(wù)器的連接;


wal_receiver_status_interval指定在后備機(jī)上的 WAL接收者進(jìn)程向主服務(wù)器或上游后備機(jī)發(fā)送有關(guān)復(fù)制進(jìn)度的信息的最小周期;


hot_standby_feedback指定一個(gè)熱后備機(jī)是否將會(huì)向主服務(wù)器或上游后備機(jī)發(fā)送有關(guān)于后備機(jī)上當(dāng)前正被執(zhí)行的查詢的反饋,這里設(shè)置為on。


關(guān)于詳細(xì)內(nèi)容,可以參考postgresql官方文檔。 


重啟主節(jié)點(diǎn):

pg_ctl restart -D $PGDATA 


重啟之后,為主服務(wù)器和后備服務(wù)器創(chuàng)建復(fù)制槽(該步非必做項(xiàng)):

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ù)制中,當(dāng)一個(gè)備節(jié)點(diǎn)斷開連接時(shí),備節(jié)點(diǎn)通過hot_standby_feedback提供反饋數(shù)據(jù)數(shù)據(jù)會(huì)丟失。當(dāng)備節(jié)點(diǎn)重新連接時(shí),它可能因?yàn)楸恢鞴?jié)點(diǎn)發(fā)送清理記錄而引發(fā)查詢沖突。復(fù)制槽即使在備節(jié)點(diǎn)斷開時(shí)仍然會(huì)記錄下備節(jié)點(diǎn)的xmin(復(fù)制槽要需要數(shù)據(jù)庫保留的最舊事務(wù)ID)值,從而確保不會(huì)有清理沖突。


2.當(dāng)一個(gè)備節(jié)點(diǎn)斷開連接時(shí),備節(jié)點(diǎn)需要的WAL文件信息也丟失了。如果沒有復(fù)制槽,當(dāng)備節(jié)點(diǎn)重連時(shí),可能已經(jīng)丟棄了所需要的WAL文件,因此需要完全重建備節(jié)點(diǎn)。而復(fù)制槽確保這個(gè)節(jié)點(diǎn)保留所有下游節(jié)點(diǎn)需要的WAL文件。


要配置slave使用這個(gè)槽,在后備機(jī)的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ù)時(shí)是無法刪除replication slots

postgres=# SELECT * FROM pg_drop_replication_slot(postgresql_node191);

postgres=# SELECT * FROM pg_drop_replication_slot(postgresql_node192);


2)在備節(jié)點(diǎn)上的操作


確保服務(wù)是停止的:

su - postgres

切換用戶,并執(zhí)行:

pg_ctl stop -D $PGDATA

關(guān)閉服務(wù)。


首先刪除備節(jié)點(diǎn)中的數(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),這種方式不會(huì)復(fù)制在此次備份開始前,已經(jīng)歸檔完成的WAL文件;-d后面是一個(gè)連接字符串,其中“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”表示打印詳細(xì)信息,–Fp表示復(fù)制結(jié)果輸出位普通(plain)文件。


如果遇到以下報(bào)錯(cuò):

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é)點(diǎn)的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í)間線的上的什么時(shí)間點(diǎn),這里設(shè)置為latest,即最新;


standby_mode表示是否將PostgreSQL服務(wù)器作為一個(gè)后備服務(wù)器啟動(dòng),這里設(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ù)器時(shí)使用一個(gè)現(xiàn)有的復(fù)制槽來控制上游節(jié)點(diǎn)上的資源移除。這里我們指定之前創(chuàng)建的postgresql_node122。如果沒有在主服務(wù)器上創(chuàng)建復(fù)制槽,則不配置此參數(shù);


trigger_file指定一個(gè)觸發(fā)器文件,該文件的存在會(huì)結(jié)束后備機(jī)中的恢復(fù),使它成為主機(jī)。


啟動(dòng)備節(jié)點(diǎn)服務(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



[
主備環(huán)境檢測
]


在主節(jié)點(diǎn)上創(chuàng)建一個(gè)表,并插入數(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é)點(diǎn)上檢測:

postgres=# select * from demo1;


 id | name

----+------

  1 | zhangsan

主節(jié)點(diǎn)數(shù)據(jù)同步到了備機(jī)。


同時(shí),在備節(jié)點(diǎn)上寫數(shù)據(jù)會(huì)失?。?/span>


postgres=# insert into demo1 (id, name)  values (2,wangwu);

ERROR:  cannot execute INSERT in a read-only transaction



[
主備環(huán)境切換
]


啟動(dòng)備節(jié)點(diǎn),使之成為新的主節(jié)點(diǎn):

pg_ctl promote -D $PGDATA


結(jié)果是:

waiting for server to promote........ done


server promoted 


查看新主節(jié)點(diǎn)的狀態(tài):

postgres=#  pg_controldata | grep cluster


Database cluster state:              in production


插入數(shù)據(jù)后無報(bào)錯(cuò):


postgres=#  insert into demo1 (id, name)  values (2,wangwu);


INSERT 0 1


停止舊的主節(jié)點(diǎn):

pg_ctl stop -m fast -D $PGDATA

結(jié)果:

waiting for server to shut down.... done

server stopped


在停止的舊主節(jié)點(diǎn)上執(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é)點(diǎn)上成功獲取WAL日志。


 重新配置新備節(jié)點(diǎn)的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é)點(diǎn)上執(zhí)行下面的命令,重新啟動(dòng)該節(jié)點(diǎn):

pg_ctl start -D $PGDATA 


在新備節(jié)點(diǎn)上驗(yàn)證: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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/130180.html

相關(guān)文章

  • 【數(shù)據(jù)庫】MySQL鎖機(jī)制、熱備、分表

    摘要:雙機(jī)熱備和備份的區(qū)別熱備份指的是即高可用,而備份指的是即數(shù)據(jù)備份的一種,這是兩種不同的概念,應(yīng)對(duì)的產(chǎn)品也是兩種功能上完全不同的產(chǎn)品。雙機(jī)熱備分類按工作中的切換方式分為主備方式方式和雙主機(jī)方式方式。 歡迎關(guān)注公眾號(hào):【愛編碼】如果有需要后臺(tái)回復(fù)2019贈(zèng)送1T的學(xué)習(xí)資料哦!! showImg(https://segmentfault.com/img/remote/146000001900...

    Meils 評(píng)論0 收藏0
  • 初識(shí)架構(gòu)之高可用

    摘要:以集群部署的方式提供服務(wù),確保高可用。無狀態(tài)服務(wù),一樣可以通過負(fù)載均衡加心跳檢測等手段去部署集群,確保故障轉(zhuǎn)移來做到高可用。初步原理的一致性可用性分區(qū)容錯(cuò)性。高可用開發(fā)流程服務(wù)發(fā)布通過切流量的方式一臺(tái)臺(tái)灰度發(fā)布。用于預(yù)發(fā)布驗(yàn)證。 架構(gòu)和架構(gòu)師,可以說是大部分技術(shù)人的目標(biāo)或追求吧。 但架構(gòu)類比于內(nèi)功或修為,它不是一門武功,不能學(xué)一招走天下。 同一個(gè)架構(gòu)方案在不同公司甚至不同團(tuán)隊(duì)都不一定能...

    lk20150415 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<