誰說 PostgreSQL 沒有靠譜的高可用(1)

  • 2019 年 12 月 16 日
  • 筆記

最近問postgresql 那個高可用靠譜的人越來越多,其實我也試過幾種postgresql 的高可用方案,而最近聽到的聲音是 PostgreSQL 沒有靠譜的高可用方案。所以就有了這篇文字

——————————————————————————————

今天說的是另一種PG的高可用方案,這種方案的好的地方

1 大廠支援

2 配置簡單靠譜,沒有眾多依賴包安裝後,還出問題讓你有想自殺的意願,或者是相關的技術文字少,解決問題困難的尿點。

這個高可用的方案已經在生產上使用了有一段時間,目前沒有出過問題,之前寫過,但是在這一段時間的使用中也發現了一些問題,所以準備詳細的對這個高可用方案來詳細的說說,也避免某些挑刺的說 PG 沒有靠譜的高可用這樣的笑話,繼續存在。

這個高可用的方式就是repmgr ,2象限公司的產品。(免費的),以下的文字中的PG的版本是 11.2 ,REPMGR 是 4.4 版本。由於功能比較多,所以一次也寫不完,只能分期的寫,今天的文字要做到的是 兩台 POSTGRESQL ,完成手動切換。

首先你需要安裝2台postgresql ,這裡假設你已經安裝完畢了(安裝當然是編譯安裝,如果不是編譯安裝則我不保證不會出其他的問題,之前有一篇是關於編譯安裝的,當然也可以去 「德哥」的github 上去找專業的文字關於POSTGRESQL 的安裝,水不淺)

1 安裝完畢的POSTGRESQL首先能有進行 replication 的條件

2 兩台postgresql 要配置一樣,包含配置文件,以及extension等等

這裡為了便於下面理解兩台機器的

192.168.198.21 主庫

192.168.198.22 備庫

其實我們配置一台機器就可以了,我們在一台機器(主機)

操作以下的命令

create database repmgr;

create user repmgr with password 'repmgr'; (密碼您隨意)

alter user repmgr superuser login;

alter database repmgr owner to repmgr;

對 repmgr 解包進行編譯

在確認已經編譯好repmgr 後,需要對兩台機器進行ssh 免密的工作

這裡的免密建議是基於你操控postgresql 的賬戶,而不是root

(註:免密的工作這裡如是MYSQL的DBA 這將不是很難理解的工作,因為MHA就是這麼乾的)

另外還需要配置repmgr 高可用使用的通訊賬戶,也需要進行免密的工作,需要在你操作postgresql的賬戶中目錄位置設置.pgpass ,內容請參見下圖

其實如果配置過mha ,對這樣的事情也是很容易理解)

另外也需要對 pg_hba.conf 進行配置,配置方法見下圖 (可能懂的會在這裡有疑問,但這裡的確是需要這樣設置,官網的文檔)

https://repmgr.org/docs/4.4/quickstart-authentication.html

在做完這一切後,我們需要配置 repmgr.conf 文件 (其實這還是和MHA 的配置方式類似,所以如果你是MYSQL DBA 則PG的高可用方式的學習成本會很低)

node_id=1 集群中的標識 注意這個一個集群不能有重複,一般用數字來

node_name='192.168.198.21' 需要給節點一個註冊的名字,這裡可以使用IP 也可以使用機器名等等

conninfo='host=192.168.198.21 dbname=repmgr user=repmgr connect_timeout=2'

本地連接資訊,repmgr 操作本地時的連接資訊

data_directory='/pgdata/data' 指定當前主機的數據目錄

replication_user='repmgr' 進行複製的操作的賬戶

replication_type='physical' 複製的方式

repmgr_bindir='/usr/local/postgres/bin' repmgr 的執行文件的目錄

pg_bindir='/usr/local/postgres' 配置PG的執行文件

另一台機器,需要在 node_id , node_name , conninfo 等位置做改變,

我們到目前小結一下當前的兩台機器的狀況

主機,已經註冊repmgr ,伺服器開啟的狀態,可以接受repmgr 的遠程連接免密的方式,備庫關機,備庫的數據目錄是清空的狀態(因為要開始進行主庫拉數據的操作)

下面我們就要使用一下的命令來進行 –dry-run (mysql的DBA 是不是很驚喜 和pt 工具一路貨)

repmgr -h 192.168.198.21 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone –dry-run

可以看到–dry-run 沒有問題直接執行命令進行 clone

repmgr -h 192.168.198.21 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone

然後在clone 成功後,其實就是pg_basebackup ,在這以後需要修改standby 機器中的postgresql,conf 文件中的 listen 地址改為本機的地址

(這些工作其實也是做 primary standby 的工作,和高可用本身是沒有關係的,知識 repmgr 幫助你做了這件事)

啟動伺服器,正常,並開始複製

如果到這裡出了問題,可能的原因

1 pg_hba.conf 設置的有問題

2 postgresql.conf 從庫 沒有改 postgresql,conf 監聽地址

(請補充POSTGRESQL 基礎知識)

下一步我們就需要對複製進行一個驗證(如果有自信就跳過此步驟)

在從庫我們查看目前的複製是否OK ,下圖顯示OK

然後在從庫執行

repmgr -f /etc/repmgr.conf standby register

註冊成功後

目前大部分的高可用(手動切換)的工作已經完成了百分之80%

repmgr -f /etc/repmgr.conf cluster show

通過上面的圖和命令可以很順利查看,兩台機器的主從狀態。

寫到下面,可能有人要吐槽我了,人家都自動,你手動,你腦子進水了。

1 POSTGRESQL 的repmgr 主從切換,是可以自動的,但這期寫不完

2 如果使用mysql 比較順溜的,到這裡馬上就可以反映出一個問題,MHA 我切換我也沒有用 MHA 去偵測,我也是通過其他的方式來檢測,然後使用 MHA 命令切換方式來進行高可用的切換。

話說到這裡已經說的很明了,你要是有MYSQL的高可用MHA的解決方案,到這裡你自己已經有主意了,還有必要看下去的原因就是,怎麼手動切換。然後你就可以放飛自我了。

想說 POSTGRESQL 沒有靠譜高可用方式的,打臉不

下面就開始手動切換

repmgr -f /etc/repmgr.conf standby switchover -U repmgr –verbose

好了在切換命令開始後,主從開始切換,參見下圖

切換後,我們在主機上查看狀態

主機已經變成從庫,從庫已經升級為主庫

在從庫上查看,很清晰的告訴你,主庫已經是 22 ,從庫變成了21

這也是和MHA 不一樣的地方,如果你的失敗的主庫還有挽救的餘地,則還是可以讓他變成從庫,繼續服務的,當然也是有時間限制的,默認一分鐘的嘗試,否則就放棄了。

OK 今天就到這裡,下期的寫寫一些命令,和自動切換的方法