天天看點

PostgreSQL 10.0 preview 功能增強 - libpq支援多主機連接配接(failover,LB)讓資料庫HA和應用配合更緊密

postgresql , 10.0 , libpq , jdbc , failover , loadbalance , multi host , target_session_attrs

資料庫一主多備,這個詞在網際網路應該不陌生。但是主備切換和應用程式如何配合才能天衣無縫呢?你可能會有這樣的疑問。

1. 什麼類型的query發給主庫,什麼類型的query發給備庫?

2. 主庫和備庫發生了角色切換之後,用戶端連接配接如何配合?

業界有一些做法可以回答這兩個問題。

1. 通常使用叢集軟體,使用vip來表示主備庫的角色,不管怎麼切換,vip1永遠都是主庫,vip2永遠都是備庫。

對于用戶端來說,通過vip來判斷是主庫還是備庫,程式自己控制哪些sql發給主庫,哪些sql發給備庫。

一個典型的例子

<a href="https://github.com/digoal/postgresql_ha_with_primary_standby_2vip">https://github.com/digoal/postgresql_ha_with_primary_standby_2vip</a>

2. 使用vip是讓資料庫和應用程式形成默契的一種方法,還有沒有更好的方法呢?比如資料庫驅動層能不能配合角色的判斷?

oracle做得不錯,oracle的用戶端,可以配合rac,自動識别failover, switchover。

postgresql jdbc驅動,也實作了類似的功能,支援failover, loadbalance。

<a href="https://jdbc.postgresql.org/documentation/94/connect.html">https://jdbc.postgresql.org/documentation/94/connect.html</a>

postgresql jdbc相關參數如下

1.

2.

3.

4.

5.

典型的例子,應用程式可以配置兩個連接配接池,一個配置為master,寫請求發往這個連接配接池。另一個配置為slave優先,同時開啟負載均衡參數,讀請求發往這個連接配接池。

postgresql 10.0 libpq層,也增加了多連接配接功能,設計時引入了target_session_attrs參數,可以設定為read-write或者any。不同的target_session_attrs配置,對應不同的節點檢測機制。

target_session_attrs=read-write,使用show transaction_read_only檢測節點,傳回on,表示這是隻讀節點,off表示這是可讀寫節點。(standby傳回on, 同時通過default_transaction_read_only可以讓master也傳回on)。

target_session_attrs=any,表示不檢測。

兩個patch的commit資訊如下。

uri格式

配置多個目标節點,host:port使用逗号隔開即可。

使用libpq,你同樣可以實作與jdbc一樣的效果(負載均衡,自動找到master)。

ha隻需要負責切換角色,不需要再負責切換ip位址了。可以更省心一些。

這個patch的讨論,詳見郵件組,本文末尾url。

postgresql社群的作風非常嚴謹,一個patch可能在郵件組中讨論幾個月甚至幾年,根據大家的意見反複的修正,patch合并到master已經非常成熟,是以postgresql的穩定性也是遠近聞名的。

<a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=274bb2b3857cc987cfa21d14775cae9b0dababa5">https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=274bb2b3857cc987cfa21d14775cae9b0dababa5</a>

<a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=721f7bd3cbccaf8c07cad2707826b83f84694832">https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=721f7bd3cbccaf8c07cad2707826b83f84694832</a>

<a href="https://www.postgresql.org/docs/devel/static/libpq-connect.html#libpq-connstring">https://www.postgresql.org/docs/devel/static/libpq-connect.html#libpq-connstring</a>