日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理

發布時間:2024/9/19 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[簡介]

本文主要是介紹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

[搭建PostgreSQL 主備環境]

1)在主節點上的操作

切換用戶,并執行啟動服務命令:

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');

2)在備節點上的操作

確保服務是停止的:

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

主節點數據同步到了備機。

同時,在備節點上寫數據會失敗:

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

總結

以上是生活随笔為你收集整理的环境复制_PostgreSQL热备之流复制环境搭建以及常见问题处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。