PostgreSQL源碼定製:線上global read only
基於某雲上功能需求,最近實現了類似於MySQL global read only的功能。PG的read only功能,也不再需要通過重起PG實現來實現。直接可以online更改PG執行個體層級
global read only 和 global read write功能, 以達到快速實現主備切換的功能。大大縮短了主備切換時間,提高了PG的高可性。彌補了PG在這一功能上的不足。
此次通過源碼定製更改實現的PG版本global read only有許多明顯的優勢:
1.在設定global read only時,新的查詢不會被堵
新進來session,read only直接生效,不需要重起PG執行個體。並用在設定global read only時,不會堵住新會話。因此避免了串連擁堵現象。
2.正在跑的事務,分層級對待
a.如果是事務塊,也就是使用者發起的”BEGIN”語句,那麼已經執行完畢的語句不受影響。對於此事務中後面執行的語句,會受read only約束,不能執行DML操作。本事務會被終止。
b.如果是正在跑的語句,比如說有一個大的insert或者update。那麼此操作不會受影響,設定 global read only需要等待此操作完成後,才返回。
global read only操作會等待所有running 的DML操作完成,並且做完”Immediate Checkpoint”後,再返迴響應。這樣做的理由是為了確保資料庫狀態的一致性。
尤其是在主備切換的情況下,更為關鍵和重要。
3.中斷處理
如果在設定 global read only時失敗,那麼會被復原,會被重新置為read write狀態。
下面展示下源碼patch實現結果:
session 1:查看當前資料庫read only狀態,顯示當前為”Read Write”狀態,即PG執行個體層級可以讀寫。
session 2:起事務,事務中為兩個insert語句。我們先執行一個insert語句,但是不提交事務。
表建立語句:
create table grl_test (id int);
begin;
insert into grl_test values(1);
session 1:嘗試將PG執行個體設定為global read only。此時可以看到,不能設定為”Read Only“狀態,設定”Read Only”操作沒有返回。
原因為 session 2並沒有提交。這個符合我們的設計初衷,就是read only設定成功返回時,資料庫為一致狀態,此後沒有user 層級寫事務。
session 2:嘗試發起第二條insert語句。可以看到insert失敗了。原因為session 1嘗試設定為 global read only時,雖然操作沒有返回,
但是新的任何DML操作以及新的事務已經被約束為read only狀態。不允許新的寫事務容易理解,但是為什麼不允許之前已經發起的事務中,不能DML操作呢?
這樣做的原因是:
我們不想讓先於設定read only之前的事務塊,無限制的跑下去。這會讓設定global read only的操作一直進行下去。如果read only設定不成功,
直接影響到主備的快速切換。細心的同學可能會發現,這隻限於事務塊。的確如此,事務塊與一般事務的區別,請見我另外一篇文章”PostgreSQL 事務模型介紹“。
因為一般事務,只在command層級,跑完就結束了。我們可以等待,一般使用者也容易理解,如果我們強行終止此類操作,會對應用影響比較大。一般command
層級的事務總是非常快的結束,尤其在OLTP系統中,基本上都是簡單的command層級事務。事務塊一般邏輯比較複雜,有這一限制,也是為了資料一致性考慮,
失敗了,頂多重新跑就行了。總體上來講,這也是基於目前市面上OLTP類應用系統的現實需求而定製的。
insert into grl_test values(2);
session 1:此時我們再來看session 1時,設定global read only已經成功了。session 2因為第二個命令違背了read only,導致事務被終止了。因此,也就再沒有
running transaction了。global read only設定完成後,checkpoint向前推。我們就可以以此checkpoint為準,進行主備一致性切換。
上面完全實現了線上更改PG執行個體read only狀態。我們再將執行個體線上改回到read write。是不是非常方便呢?
------------------------------------華麗麗的分割線------------------------------------
CentOS 6.3環境下yum安裝PostgreSQL 9.3
PostgreSQL緩衝詳述
Windows平台編譯 PostgreSQL
Ubuntu下LAPP(Linux+Apache+PostgreSQL+PHP)環境的配置與安裝
Ubuntu上的phppgAdmin安裝及配置
CentOS平台下安裝PostgreSQL9.3
PostgreSQL配置Streaming Replication叢集
如何在CentOS 7/6.5/6.4 下安裝PostgreSQL 9.3 與 phpPgAdmin
------------------------------------華麗麗的分割線------------------------------------
PostgreSQL 的詳細介紹:請點這裡
PostgreSQL 的:請點這裡
本文永久更新連結地址: