GaussDB技術(shù)解讀系列之應(yīng)用無損透明(ALT)
本文作者?華為云GaussDB研發(fā)高級工程師 ?藏琦
背景
GaussDB作為一款企業(yè)級分布式數(shù)據(jù)庫,提供了“同城跨AZ雙活、兩地三中心、雙集群強一致”等極致的高可用容災(zāi)能力。當(dāng)某個數(shù)據(jù)庫節(jié)點由于故障無法對外提供服務(wù)時,為了繼續(xù)保證數(shù)據(jù)庫服務(wù)的可用性,JDBC驅(qū)動會將業(yè)務(wù)后續(xù)的數(shù)據(jù)庫連接請求發(fā)送到其它可用節(jié)點上。但故障發(fā)生后,已經(jīng)與故障節(jié)點建立會話的連接無法自動切換到可用節(jié)點上,導(dǎo)致使用這些連接的業(yè)務(wù)單元發(fā)生報錯。如果業(yè)務(wù)單元缺少連接重試或業(yè)務(wù)一致性校驗,可能會引起應(yīng)用中斷,甚至業(yè)務(wù)數(shù)據(jù)不一致的問題,造成用戶嚴(yán)重的業(yè)務(wù)損失。
因此,華為云GaussDB數(shù)據(jù)庫提供了一種在數(shù)據(jù)庫故障情況下的客戶端連接轉(zhuǎn)移方案 —— ALT(Application Lossness Transparent,應(yīng)用無損透明)。該方案的原理是,當(dāng)數(shù)據(jù)庫集群的某個節(jié)點由于故障無法對外提供服務(wù),若此時集群內(nèi)還存在其它可用節(jié)點,則將故障節(jié)點上的會話連接自動遷移到目標(biāo)節(jié)點上,客戶端無需再次發(fā)出連接請求,仍然可以繼續(xù)執(zhí)行數(shù)據(jù)庫操作。整個過程中,客戶端應(yīng)用程序是無感知的,就像是經(jīng)歷了一次略有延遲的SQL請求處理,極大地提高了數(shù)據(jù)庫服務(wù)的可用性。
技術(shù)架構(gòu)
我們先來看下ALT的技術(shù)架構(gòu)和運行原理:

從上圖中可以看到,GaussDB集群引入了一個獨立組件GNS(GaussDB Notification Service),用于檢測獲取數(shù)據(jù)庫各節(jié)點的實時狀態(tài)信息。當(dāng)應(yīng)用程序調(diào)用JDBC接口首次向集群中的任意節(jié)點建立連接時,JDBC驅(qū)動會與GNS服務(wù)建立集群狀態(tài)訂閱鏈路。當(dāng)GNS檢測到集群狀態(tài)發(fā)生變化,會通過訂閱鏈路將狀態(tài)變化事件發(fā)送給JDBC驅(qū)動,事件處理線程收到任務(wù)后,再通過集群連接管理器中保存的引用副本對受到影響的連接進行管理和遷移。
GNS組件采用的是多節(jié)點對等多活的部署方式,每個GNS服務(wù)都擁有集群的全量狀態(tài)數(shù)據(jù),JDBC驅(qū)動只需要與其中任意一個GNS建立訂閱服務(wù),就可以管理應(yīng)用程序在該集群所有節(jié)點上的連接。
關(guān)鍵能力
在了解了ALT的整體架構(gòu)和運行原理之后,我們再來看看它具備哪些關(guān)鍵能力,這些能力可以為客戶帶來什么樣的業(yè)務(wù)價值。
快速應(yīng)用通知
ALT提供了一種數(shù)據(jù)庫狀態(tài)變化的主動消息通知機制。JDBC驅(qū)動通過GNS服務(wù)來訂閱業(yè)務(wù)所用數(shù)據(jù)庫集群的狀態(tài),當(dāng)集群中的節(jié)點發(fā)生狀態(tài)變化時,GNS將變化事件推送給JDBC驅(qū)動,后者再根據(jù)集群的最新狀態(tài)對目標(biāo)數(shù)據(jù)庫上的連接進行管理和遷移。
同時,JDBC驅(qū)動也向應(yīng)用程序提供了集群狀態(tài)變化的回調(diào)函數(shù)注冊接口。應(yīng)用程序可以針對某些數(shù)據(jù)庫連接,向JDBC驅(qū)動注冊狀態(tài)變化的回調(diào)函數(shù)。當(dāng)集群狀態(tài)發(fā)生變化時,JDBC驅(qū)動會對注冊的函數(shù)進行調(diào)用,通過注冊回調(diào)函數(shù),可以很方便地在業(yè)務(wù)側(cè)實現(xiàn)數(shù)據(jù)庫狀態(tài)變化的郵件通知、告警平臺上報等運維管理操作。
連接無感遷移
當(dāng)檢測到GaussDB數(shù)據(jù)庫發(fā)生故障或即將進行停機維護時,JDBC驅(qū)動的事件處理線程分析每條受影響的連接,確定是否有滿足連接要求的其它數(shù)據(jù)庫節(jié)點,如果存在,則將連接遷移至可用節(jié)點,并且恢復(fù)連接的會話狀態(tài)信息。在主動停機維護場景下,使用者還可以通過參數(shù)來配置等待可用節(jié)點出現(xiàn)的連接掛起時長,從而提高集群統(tǒng)一維護場景下的服務(wù)可用性。
事務(wù)斷點續(xù)傳
連接開啟ALT后,JDBC驅(qū)動和GaussDB服務(wù)端都會跟蹤記錄當(dāng)前會話的事務(wù)狀態(tài)信息。如果數(shù)據(jù)庫正在處理SQL請求時發(fā)生故障,當(dāng)連接遷移到新節(jié)點后,ALT根據(jù)記錄的事務(wù)狀態(tài)信息將會話恢復(fù)至故障前,事務(wù)則從中斷的位置繼續(xù)執(zhí)行,避免了由于數(shù)據(jù)庫故障導(dǎo)致的業(yè)務(wù)中斷和應(yīng)用層的數(shù)據(jù)不一致現(xiàn)象。
ALT特性給客戶帶來的價值可以總結(jié)為:
(1)避免數(shù)據(jù)庫故障時,無法及時獲取服務(wù)端狀態(tài)而導(dǎo)致RTO過大;
(2)加速JDBC指定節(jié)點類型(targetServerType)的連接建立;
(3)集群停機維護時的業(yè)務(wù)連續(xù)性保證;
(4)數(shù)據(jù)庫故障時的業(yè)務(wù)連續(xù)性保證;
(5)集群容災(zāi)切換時的快速應(yīng)用通知。
ALT特性演示
JDBC開啟ALT方式
樣例如下:
當(dāng)應(yīng)用程序使用JDBC驅(qū)動訪問GaussDB數(shù)據(jù)庫時,只需要在連接URL中添加配置項enableALT和GNS監(jiān)聽地址即可開啟ALT服務(wù)。ALT服務(wù)的最小訂閱粒度是連接級別的,JDBC驅(qū)動支持向同一集群同時建立ALT連接和普通連接。
演示場景
GaussDB集中式集群進行switchover操作時,觀察使用ALT連接的SQL請求執(zhí)行情況。?
演示步驟
應(yīng)用程序與數(shù)據(jù)庫主節(jié)點分別建立普通JDBC連接和啟用ALT特性的連接,使用兩條連接同時執(zhí)行下述SQL命令,觀察集群完成switchover后,數(shù)據(jù)庫連接是否可以正常使用。
1. 客戶端發(fā)送SQL請求:查看當(dāng)前訪問的數(shù)據(jù)庫實例信息
2. 客戶端發(fā)送SQL請求:創(chuàng)建和使用數(shù)據(jù)庫對象
3.?客戶端發(fā)送SQL請求:使用數(shù)據(jù)庫對象
4. 客戶端發(fā)送SQL請求:查看當(dāng)前訪問的數(shù)據(jù)庫實例信息
對比結(jié)果
(1)普通JDBC連接:集群進行switchover后,數(shù)據(jù)庫連接斷開,應(yīng)用程序無法再使用該連接發(fā)送SQL請求。

(2)啟用ALT特性的連接:集群進行switchover后,數(shù)據(jù)庫連接自動遷移到新的主節(jié)點上,應(yīng)用程序可以繼續(xù)使用該連接發(fā)送SQL請求。


GaussDB作為一款企業(yè)級分布式數(shù)據(jù)庫,具備五高兩易(高可用、高安全、高性能、高彈性、高智能,易部署、易遷移)的核心優(yōu)勢。在滿足金融核心業(yè)務(wù)的可靠性要求方面,GaussDB與工行聯(lián)創(chuàng)推出了國內(nèi)首個雙集群強一致方案,實現(xiàn)集群級故障完全隔離RPO=0,而全新的應(yīng)用無損透明方案,又做到了系統(tǒng)故障應(yīng)用無感知,真正實現(xiàn)了業(yè)務(wù)7*24小時不中斷,為企業(yè)帶來更極致的高可用體驗。