原生C /C++(libpq)和 C# (npgsql) 的接口設定高可用和讀寫分離範例

如果來源從PostgreSQL官方安裝(https://www.postgresql.org/download/linux/redhat/

則依照指示安裝完後,使用 postgresql<對應版本號碼>-devel 來安裝,

ex: sudo dnf install postgresql16-devel

若遇到錯誤需要安裝 perl(IPC::Run) 的情況則依照各OS所提供repo來安裝這依賴套件,

EX1: Rokcy 8 則補上 --enablerepo=powertools

EX2: GCP上的RHEL9 則是補上 --enablerepo=rhui-codeready-builder-for-rhel-9-x86_64-rhui-rpms

如果是自己編譯的PostgreSQL則要自己去匹配對應相關函式庫,這邊我就不展開說明了

在設置連線字串那邊設定參數 target_session_attrs ,在寫入的連線設置primary或read-write,

而讀取部分可設 prefer-standby ,優點是可以優先選擇standby來讀取,比之前的any不需要去改IP順序,比standby/read-only來說就算只剩一台Master也不會報錯中止

// 這是Master連線
  PGconn* connMaster = PQconnectdb("host=192.168.56.11,192.168.56.12 dbname=jamesdb user=admin password=adminpwd target_session_attrs=primary connect_timeout=10");
// 這是Slave連線
  PGconn* connSlave = PQconnectdb("host=192.168.56.11,192.168.56.12 dbname=jamesdb user=admin password=adminpwd target_session_attrs=prefer-standby  connect_timeout=10");

然後編譯執行測試,我這邊是簡易測試,編譯方式依照各自公司的規定或習慣,如果用IDE就依照IDE的設置去設定

編譯後執行測試結果讀寫分離成功,接下來就可以依照業務需求方面來設計

注意: 當然上面只是測試範例用來方便理解,正式寫要記得把連線資訊跟code分開,可別直接hard code進去!!!

以下我用Container image常用的環境變數方式設定來做呼叫環境變數的範例

當然也有其他方式可以設置例如xml, ini, json ...等方式設定,這就不展開說明了

其實還有很多豐富的功能沒有在這邊說明,可以參考PostgreSQL官方文件

C++部分的話,也跟上述差不多,只是注意C++的語法,我這邊是用Windows的Visual C++來進行編譯,設置IDE時記得要把相關函式庫給匯入

至於C#使用npgsql部分,因為調用的是Npgsql.dll而不是libpq,所以要依照npgsql的官方手冊API來查看,npgsql 7.0的前後使用方式有異,注意它的規則用法

Last updated