成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PostgreSQL 12 的同步流復(fù)制搭建及主庫Hang問題處理與分析

運(yùn)維 數(shù)據(jù)庫運(yùn)維 PostgreSQL
主備流復(fù)制,是PostgreSQL最常用、最簡單的一種高可用、讀寫分離的形式,類似于Oracle的ADG,主庫用于讀寫,備庫可以只讀。

 [[411315]]

本文轉(zhuǎn)載自微信公眾號「數(shù)據(jù)和云」,作者王鑫。轉(zhuǎn)載本文請聯(lián)系數(shù)據(jù)和云公眾號。

前言

主備流復(fù)制,是PostgreSQL最常用、最簡單的一種高可用、讀寫分離的形式,類似于Oracle的ADG,主庫用于讀寫,備庫可以只讀。

PostgreSQL流復(fù)制,有兩種方式,分別是異步流復(fù)制和同步流復(fù)制。

  • 異步流復(fù)制模式中,當(dāng)備庫出現(xiàn)異常,主庫可以正常的進(jìn)行讀寫;
  • 同步流復(fù)制模式中,當(dāng)備庫出現(xiàn)異常,主庫則可能會hang住(DML、DDL)。

這兩天根據(jù)需求,我需要搭建一套同步流復(fù)制庫,但是在過程中遇到了一些小問題,所以記錄下來,作為備忘以及指導(dǎo),幫助大家避坑。

一、基本環(huán)境

本次搭建,我的PostgreSQL基本環(huán)境如下:

  • PostgreSQL版本為12.5;
  • 操作系統(tǒng)為CentOS 7.6;
  • Server: 192.168.18.181:18801
  • Slave: 192.168.18.182:18802

二、同步流復(fù)制搭建

我們知道,搭建PostgreSQL的流復(fù)制核心步驟非常簡單,只需要2-3步:

1. 對源端數(shù)據(jù)庫進(jìn)行基礎(chǔ)備份;

2. 將基礎(chǔ)備份拷貝到目標(biāo)端;

3. 配置備庫參數(shù),并啟動備庫

那么在基礎(chǔ)備份中,我們直接在目標(biāo)端,通過pg_basebackup工具對源端數(shù)據(jù)庫進(jìn)行基礎(chǔ)備份并將數(shù)據(jù)目錄直接放在目標(biāo)端的/pgdata中:

  1. pg_basebackup -h 192.168.18.181 -p 18801 -U repl -l pg_basebackup_`date +%Y%m%d%H%M%S` -Fp -X fetch -P -v -R -D /pgdata 

在PostgreSQL 12中,已經(jīng)沒有recovery.conf文件了,而是用standby.signal文件所代替,且原來需要在recovery.conf文件中配置的primary_conninfo參數(shù),已經(jīng)融合在postgresql.conf中。

所以,此時(shí)我們只需要配置主庫和備庫的postgresql.conf,以及備庫的standby.signal即可,具體如下:

備庫的standby.signal中:

  1. standby_mode = 'on' 

主庫的postgresql.conf中:

  1. #同步流復(fù)制 
  2. synchronous_standby_names = 'standbydb1' #同步流復(fù)制才配置該值 
  3. synchronous_commit = 'remote_write' 

備庫的postgresql.conf中:

  1. hot_standby = 'on' 
  2. primary_conninfo = 'application_name=standbydb1 user=repl password=repl123 host=192.168.18.181 port=18801 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any' 

配置完成后,直接啟動備庫即可。

  1. pg_ctl -D /pgdata start 

三、發(fā)現(xiàn)問題

通過ps -ef|grep postgres,已經(jīng)可以看到主庫和備庫的walsender和walreciver進(jìn)程都已經(jīng)啟動,流復(fù)制已經(jīng)搭建好。

但是,通過pg_stat_replication進(jìn)行查看,發(fā)現(xiàn)當(dāng)前數(shù)據(jù)庫狀態(tài)仍然還是異步流復(fù)制狀態(tài):

  1. postgres=# select * from pg_stat_replication; 
  2.  
  3. -[ RECORD 2 ]----+------------------------------ 
  4. pid              | 11767 
  5. usesysid         | 24746 
  6. usename          | repl 
  7. application_name | walreceiver 
  8. client_addr      | 192.168.18.182 
  9. client_hostname  |  
  10. client_port      | 29946 
  11. backend_start    | 2021-01-17 22:48:36.529698+08 
  12. backend_xmin     |  
  13. state            | streaming 
  14. sent_lsn         | 0/91000148 
  15. write_lsn        | 0/91000148 
  16. flush_lsn        | 0/91000148 
  17. replay_lsn       | 0/91000148 
  18. write_lag        |  
  19. flush_lag        |  
  20. replay_lag       |  
  21. sync_priority    | 0 
  22. sync_state       | async 
  23. reply_time       | 2021-01-17 22:48:46.545856+08 

且此時(shí),在進(jìn)行DML或者DDL操作的時(shí)候,主庫會hang住。

  1. postgres=# insert into wangxin1 values (1,'aaa'); 
  2. ^CCancel request sent 
  3. WARNING:  canceling wait for synchronous replication due to user request 
  4. DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby. 

但是,通過pg_stat_replication及數(shù)據(jù)比對,發(fā)現(xiàn)主庫的wal已經(jīng)全部都寫入到備庫中。

所以,起初我一直以為是因?yàn)閭鋷熘械膚al或者disk的相關(guān)寫配置參數(shù)有一些問題,并且進(jìn)行了多次修改。

但是始終無法改變備庫的狀態(tài)為同步流復(fù)制(也嘗試多次設(shè)置synchronous_commit參數(shù),但是只有當(dāng)該參數(shù)為local的時(shí)候,主庫才不會hang住)。

四、原因分析

經(jīng)過近一天的資料的查詢和官方文檔的搭建標(biāo)準(zhǔn)參數(shù)設(shè)置方法查詢,發(fā)現(xiàn)在網(wǎng)上一些帖子中,需要修改postgresql.auto.conf參數(shù)文件。我們知道,postgresql.auto.conf參數(shù)文件是一個(gè)動態(tài)參數(shù)文件,一般我們不會手動去修改它,而是通過數(shù)據(jù)庫中alter system set parameter_name=values的方式來修改該文件中的參數(shù)。

但是,另外一個(gè)需要知道的點(diǎn)就是,postgresql.auto.conf的優(yōu)先級要高于postgresql.conf,當(dāng)我們啟動數(shù)據(jù)庫的時(shí)候,postgresql會先去postgresql.auto.conf中加載參數(shù),當(dāng)該文件中沒有相應(yīng)的參數(shù)時(shí),則會加載postgresql.conf中的參數(shù)。

所以,此時(shí)我進(jìn)入數(shù)據(jù)庫對primary_conninfo參數(shù)進(jìn)行查看:

  1. show primary_conninfo 
  2.  
  3. primary_conninfo | 'user=repl password=repl123 host=192.168.18.181 port=18801 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any' 

從數(shù)據(jù)庫中的參數(shù)可以看到,此時(shí)primary_conninfo加載的參數(shù),是異步流復(fù)制的參數(shù),而不是我們在postgresql.conf中配置的同步流復(fù)制的參數(shù)。

此時(shí),我們到postgresql.auto.conf中查看:

  1. cat postgresql.auto.conf 
  2.  
  3. # Do not edit this file manually! 
  4. # It will be overwritten by the ALTER SYSTEM command. 
  5. primary_conninfo = 'user=repl password=repl123 host=192.168.18.181 port=18801 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any' 

可以看到,在postgresql.auto.conf中有參數(shù)primary_conninfo的設(shè)置,且為異步流復(fù)制的配置參數(shù)。

此時(shí),我們就能理解最開始出現(xiàn)的異常的原因了。

其實(shí),在PostgreSQL中通過pg_basebackup進(jìn)行基礎(chǔ)備份的時(shí)候(由于加了-R參數(shù)),默認(rèn)就會在postgresql.auto.conf文件中加入primary_conninfo參數(shù),且該參數(shù)為異步流復(fù)制的參數(shù)(其實(shí)我們可以不用在postgresql.conf中配置primary_conninfo參數(shù)了)。

但是,該文件中只有primary_conninfo參數(shù),當(dāng)我們想要將流復(fù)制搭建為同步的方式的時(shí)候,必須配置兩個(gè)參數(shù):synchronous_standby_names和synchronous_commit。當(dāng)我們在postgresql.conf中設(shè)置這兩個(gè)參數(shù)后,由于postgresql.auto.conf中沒有,所以只能到這里取。

此時(shí)數(shù)據(jù)庫在進(jìn)行DML和DDL操作的時(shí)候,則會等待備庫的響應(yīng),但備庫又為異步流復(fù)制,所以不會給主庫回復(fù)wal已經(jīng)接收到或者寫入磁盤。因此,主庫會一直hang住。

五、解決方案

解決該問題,則有以下幾個(gè)方式:

1. 在備庫上通過命令:

  1. alter system set primary_conninfo = 'application_name=standbydb1 user=repl password=repl123 host=192.168.18.181 port=18801 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'

設(shè)置postgresql.auto.conf中primary_conninfo參數(shù),并重啟備庫即可。

2. 手動修改postgresql.auto.conf文件,將primary_conninfo參數(shù)手動改為同步流復(fù)制參數(shù),并重啟備庫。

3. 備庫上通過命令:

  1. alter system set primary_conninfo = default

清空postgresql.auto.conf中primary_conninfo參數(shù)的配置,并重啟備庫,讓數(shù)據(jù)庫識別postgresql.conf文件中的參數(shù)。

4. 手動刪除postgresql.auto.conf文件,將primary_conninfo參數(shù)手動刪除或者注釋,并重啟備庫,讓數(shù)據(jù)庫識別postgresql.conf文件中的參數(shù)。

搞定!

 

責(zé)任編輯:武曉燕 來源: 數(shù)據(jù)和云
相關(guān)推薦

2022-01-10 07:59:14

PostgreSQl 主從流復(fù)制歸檔配置

2023-03-19 11:53:27

2021-07-07 21:07:16

PostgreSQL架構(gòu)容災(zāi)庫

2010-06-07 15:25:06

rsync重啟

2019-11-24 19:17:06

MySQL異步復(fù)制全同步復(fù)制

2017-06-23 11:17:24

MySQL搭建配置

2017-06-26 08:28:41

PostgreSQL數(shù)據(jù)庫單機(jī)

2022-01-07 07:53:14

部署用戶管理

2012-12-27 15:44:21

2019-10-17 09:05:21

MySQL數(shù)據(jù)庫高可用

2014-03-26 11:15:26

Hive

2023-03-19 22:38:12

邏輯復(fù)制PostgreSQL

2013-04-02 10:13:35

Git服務(wù)器系統(tǒng)GitHub

2012-07-30 08:31:08

Storm數(shù)據(jù)流

2011-05-17 10:10:15

MySQLmysqld

2015-08-19 14:11:56

SQL Server錯(cuò)誤處理

2010-04-28 11:19:04

Oracle高級復(fù)制

2010-10-20 14:27:09

SQL Server同

2019-01-17 09:04:01

PostgreSQL復(fù)制Redo

2009-07-28 11:32:41

光纖鏈路故障
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧美中文字幕 | 在线观看中文视频 | 国产成人精品久久二区二区91 | 国产成人网 | 午夜精品久久久久久久久久久久 | 国产乱码精品1区2区3区 | 亚洲国产一区视频 | 国产欧美一级二级三级在线视频 | 亚洲国产精品99久久久久久久久 | 91精品一区二区 | 成人深夜小视频 | 国产在线中文 | 久久久久久久一区 | 久久人操 | 91精品国产乱码久久久久久久久 | 二区高清 | 99久久精品国产一区二区三区 | 国产中文字幕在线观看 | 黄色香蕉视频在线观看 | 日韩成人在线免费观看 | 国产精品久久久久久久久免费 | 亚洲精品成人免费 | 日皮视频免费 | 在线观看成人 | 紧缚调教一区二区三区视频 | 视频第一区 | 日韩手机在线视频 | 拍真实国产伦偷精品 | jizz中国日本| 亚洲欧美精 | 欧美综合在线视频 | 亚洲精品福利视频 | 永久看片 | 亚洲国产精品一区二区第一页 | 中文字幕在线网 | 亚洲国产一 | 日韩理论电影在线观看 | 日本在线视频一区二区 | 天天澡天天操 | 国产成视频在线观看 | 一区二区三区亚洲 |