本文作者 :華為云GaussDB研發(fā)高級(jí)工程師 藏琦
1.背景
GaussDB作為一款企業(yè)級(jí)分布式數(shù)據(jù)庫(kù),提供了“同城跨AZ雙活、兩地三中心、雙集群強(qiáng)一致”等極致的高可用容災(zāi)能力。當(dāng)某個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)由于故障無(wú)法對(duì)外提供服務(wù)時(shí),為了繼續(xù)保證數(shù)據(jù)庫(kù)服務(wù)的可用性,JDBC驅(qū)動(dòng)會(huì)將業(yè)務(wù)后續(xù)的數(shù)據(jù)庫(kù)連接請(qǐng)求發(fā)送到其它可用節(jié)點(diǎn)上。但故障發(fā)生后,已經(jīng)與故障節(jié)點(diǎn)建立會(huì)話的連接無(wú)法自動(dòng)切換到可用節(jié)點(diǎn)上,導(dǎo)致使用這些連接的業(yè)務(wù)單元發(fā)生報(bào)錯(cuò)。如果業(yè)務(wù)單元缺少連接重試或業(yè)務(wù)一致性校驗(yàn),可能會(huì)引起應(yīng)用中斷,甚至業(yè)務(wù)數(shù)據(jù)不一致的問(wèn)題,造成用戶(hù)嚴(yán)重的業(yè)務(wù)損失。
因此,華為云GaussDB數(shù)據(jù)庫(kù)提供了一種在數(shù)據(jù)庫(kù)故障情況下的客戶(hù)端連接轉(zhuǎn)移方案 —— ALT(Application Lossness Transparent,應(yīng)用無(wú)損透明)。該方案的原理是,當(dāng)數(shù)據(jù)庫(kù)集群的某個(gè)節(jié)點(diǎn)由于故障無(wú)法對(duì)外提供服務(wù),若此時(shí)集群內(nèi)還存在其它可用節(jié)點(diǎn),則將故障節(jié)點(diǎn)上的會(huì)話連接自動(dòng)遷移到目標(biāo)節(jié)點(diǎn)上,客戶(hù)端無(wú)需再次發(fā)出連接請(qǐng)求,仍然可以繼續(xù)執(zhí)行數(shù)據(jù)庫(kù)操作。整個(gè)過(guò)程中,客戶(hù)端應(yīng)用程序是無(wú)感知的,就像是經(jīng)歷了一次略有延遲的SQL請(qǐng)求處理,極大地提高了數(shù)據(jù)庫(kù)服務(wù)的可用性。
(資料圖片僅供參考)
2.技術(shù)架構(gòu)
我們先來(lái)看下ALT的技術(shù)架構(gòu)和運(yùn)行原理:
圖1 - ALT架構(gòu)示意圖
從上圖中可以看到,GaussDB集群引入了一個(gè)獨(dú)立組件GNS(GaussDB Notification Service),用于檢測(cè)獲取數(shù)據(jù)庫(kù)各節(jié)點(diǎn)的實(shí)時(shí)狀態(tài)信息。當(dāng)應(yīng)用程序調(diào)用JDBC接口首次向集群中的任意節(jié)點(diǎn)建立連接時(shí),JDBC驅(qū)動(dòng)會(huì)與GNS服務(wù)建立集群狀態(tài)訂閱鏈路。當(dāng)GNS檢測(cè)到集群狀態(tài)發(fā)生變化,會(huì)通過(guò)訂閱鏈路將狀態(tài)變化事件發(fā)送給JDBC驅(qū)動(dòng),事件處理線程收到任務(wù)后,再通過(guò)集群連接管理器中保存的引用副本對(duì)受到影響的連接進(jìn)行管理和遷移。
GNS組件采用的是多節(jié)點(diǎn)對(duì)等多活的部署方式,每個(gè)GNS服務(wù)都擁有集群的全量狀態(tài)數(shù)據(jù),JDBC驅(qū)動(dòng)只需要與其中任意一個(gè)GNS建立訂閱服務(wù),就可以管理應(yīng)用程序在該集群所有節(jié)點(diǎn)上的連接。
3.關(guān)鍵能力
在了解了ALT的整體架構(gòu)和運(yùn)行原理之后,我們?cè)賮?lái)看看它具備哪些關(guān)鍵能力,這些能力可以為客戶(hù)帶來(lái)什么樣的業(yè)務(wù)價(jià)值。
- 快速應(yīng)用通知
ALT提供了一種數(shù)據(jù)庫(kù)狀態(tài)變化的主動(dòng)消息通知機(jī)制。JDBC驅(qū)動(dòng)通過(guò)GNS服務(wù)來(lái)訂閱業(yè)務(wù)所用數(shù)據(jù)庫(kù)集群的狀態(tài),當(dāng)集群中的節(jié)點(diǎn)發(fā)生狀態(tài)變化時(shí),GNS將變化事件推送給JDBC驅(qū)動(dòng),后者再根據(jù)集群的最新?tīng)顟B(tài)對(duì)目標(biāo)數(shù)據(jù)庫(kù)上的連接進(jìn)行管理和遷移。
同時(shí),JDBC驅(qū)動(dòng)也向應(yīng)用程序提供了集群狀態(tài)變化的回調(diào)函數(shù)注冊(cè)接口。應(yīng)用程序可以針對(duì)某些數(shù)據(jù)庫(kù)連接,向JDBC驅(qū)動(dòng)注冊(cè)狀態(tài)變化的回調(diào)函數(shù)。當(dāng)集群狀態(tài)發(fā)生變化時(shí),JDBC驅(qū)動(dòng)會(huì)對(duì)注冊(cè)的函數(shù)進(jìn)行調(diào)用,通過(guò)注冊(cè)回調(diào)函數(shù),可以很方便地在業(yè)務(wù)側(cè)實(shí)現(xiàn)數(shù)據(jù)庫(kù)狀態(tài)變化的郵件通知、告警平臺(tái)上報(bào)等運(yùn)維管理操作。
- 連接無(wú)感遷移
當(dāng)檢測(cè)到GaussDB數(shù)據(jù)庫(kù)發(fā)生故障或即將進(jìn)行停機(jī)維護(hù)時(shí),JDBC驅(qū)動(dòng)的事件處理線程分析每條受影響的連接,確定是否有滿(mǎn)足連接要求的其它數(shù)據(jù)庫(kù)節(jié)點(diǎn),如果存在,則將連接遷移至可用節(jié)點(diǎn),并且恢復(fù)連接的會(huì)話狀態(tài)信息。在主動(dòng)停機(jī)維護(hù)場(chǎng)景下,使用者還可以通過(guò)參數(shù)來(lái)配置等待可用節(jié)點(diǎn)出現(xiàn)的連接掛起時(shí)長(zhǎng),從而提高集群統(tǒng)一維護(hù)場(chǎng)景下的服務(wù)可用性。
- 事務(wù)斷點(diǎn)續(xù)傳
連接開(kāi)啟ALT后,JDBC驅(qū)動(dòng)和GaussDB服務(wù)端都會(huì)跟蹤記錄當(dāng)前會(huì)話的事務(wù)狀態(tài)信息。如果數(shù)據(jù)庫(kù)正在處理SQL請(qǐng)求時(shí)發(fā)生故障,當(dāng)連接遷移到新節(jié)點(diǎn)后,ALT根據(jù)記錄的事務(wù)狀態(tài)信息將會(huì)話恢復(fù)至故障前,事務(wù)則從中斷的位置繼續(xù)執(zhí)行,避免了由于數(shù)據(jù)庫(kù)故障導(dǎo)致的業(yè)務(wù)中斷和應(yīng)用層的數(shù)據(jù)不一致現(xiàn)象。
ALT特性給客戶(hù)帶來(lái)的價(jià)值可以總結(jié)為:
(1)避免數(shù)據(jù)庫(kù)故障時(shí),無(wú)法及時(shí)獲取服務(wù)端狀態(tài)而導(dǎo)致RTO過(guò)大;
(2)加速JDBC指定節(jié)點(diǎn)類(lèi)型(targetServerType)的連接建立;
(3)集群停機(jī)維護(hù)時(shí)的業(yè)務(wù)連續(xù)性保證;
(4)數(shù)據(jù)庫(kù)故障時(shí)的業(yè)務(wù)連續(xù)性保證;
(5)集群容災(zāi)切換時(shí)的快速應(yīng)用通知。
4.ALT特性演示
JDBC開(kāi)啟ALT方式
樣例:URL=jdbc:opengauss://host1:port1,host2:port2,host3:port3/database?enableALT=true&gns=gns_host1:gns_port1, gns_host2:gns_port2
當(dāng)應(yīng)用程序使用JDBC驅(qū)動(dòng)訪問(wèn)GaussDB數(shù)據(jù)庫(kù)時(shí),只需要在連接URL中添加配置項(xiàng)enableALT和GNS監(jiān)聽(tīng)地址即可開(kāi)啟ALT服務(wù)。ALT服務(wù)的最小訂閱粒度是連接級(jí)別的,JDBC驅(qū)動(dòng)支持向同一集群同時(shí)建立ALT連接和普通連接。
演示場(chǎng)景:
GaussDB集中式集群進(jìn)行switchover操作時(shí),觀察使用ALT連接的SQL請(qǐng)求執(zhí)行情況。
演示步驟:
應(yīng)用程序與數(shù)據(jù)庫(kù)主節(jié)點(diǎn)分別建立普通JDBC連接和啟用ALT特性的連接,使用兩條連接同時(shí)執(zhí)行下述SQL命令,觀察集群完成switchover后,數(shù)據(jù)庫(kù)連接是否可以正常使用。
1.客戶(hù)端發(fā)送SQL請(qǐng)求:查看當(dāng)前訪問(wèn)的數(shù)據(jù)庫(kù)實(shí)例信息
SQL> show listen_addresses;
2.客戶(hù)端發(fā)送SQL請(qǐng)求:創(chuàng)建和使用數(shù)據(jù)庫(kù)對(duì)象
SQL> create table alt_test_switchover(mes text);SQL> insert into alt_test_switchover values("message before switchover");<-- 集群操作:switchover -->3.客戶(hù)端發(fā)送SQL請(qǐng)求:使用數(shù)據(jù)庫(kù)對(duì)象
SQL> insert into alt_test_switchover values("message after switchover");SQL> select mes from alt_test_switchover;4.客戶(hù)端發(fā)送SQL請(qǐng)求:查看當(dāng)前訪問(wèn)的數(shù)據(jù)庫(kù)實(shí)例信息
SQL> show listen_addresses;
對(duì)比結(jié)果:
(1)普通JDBC連接:集群進(jìn)行switchover后,數(shù)據(jù)庫(kù)連接斷開(kāi),應(yīng)用程序無(wú)法再使用該連接發(fā)送SQL請(qǐng)求。
圖2 – 普通JDBC連接日志
(2)啟用ALT特性的連接:集群進(jìn)行switchover后,數(shù)據(jù)庫(kù)連接自動(dòng)遷移到新的主節(jié)點(diǎn)上,應(yīng)用程序可以繼續(xù)使用該連接發(fā)送SQL請(qǐng)求。
圖3 – ALT連接日志
GaussDB作為一款企業(yè)級(jí)分布式數(shù)據(jù)庫(kù),具備五高兩易(高可用、高安全、高性能、高彈性、高智能,易部署、易遷移)的核心優(yōu)勢(shì)。在滿(mǎn)足金融核心業(yè)務(wù)的可靠性要求方面,GaussDB與工行聯(lián)創(chuàng)推出了國(guó)內(nèi)首個(gè)雙集群強(qiáng)一致方案,實(shí)現(xiàn)集群級(jí)故障完全隔離RPO=0,而全新的應(yīng)用無(wú)損透明方案,又做到了系統(tǒng)故障應(yīng)用無(wú)感知,真正實(shí)現(xiàn)了業(yè)務(wù)7*24小時(shí)不中斷,為企業(yè)帶來(lái)更極致的高可用體驗(yàn)。
點(diǎn)擊關(guān)注,第一時(shí)間了解華為云新鮮技術(shù)~
關(guān)鍵詞:

營(yíng)業(yè)執(zhí)照公示信息