PostgreSQL源碼定製:線上global read only

來源:互聯網
上載者:User

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 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.