【K-DB干貨】淺談KRAC內(nèi)存融合技術(shù)
數(shù)據(jù)庫的橫向擴(kuò)展已經(jīng)成為各個(gè)企業(yè)用戶的基本需求,一方面隨著企業(yè)前端業(yè)務(wù)系統(tǒng)的膨脹,后端數(shù)據(jù)庫系統(tǒng)的負(fù)載也在不斷增長(zhǎng),企業(yè)進(jìn)行縱向擴(kuò)展技術(shù)難度較大,另一方面,數(shù)據(jù)庫系統(tǒng)的關(guān)鍵性不斷提高,橫向擴(kuò)展不僅提高處理性能,也極大的提高了數(shù)據(jù)庫系統(tǒng)的容錯(cuò)能力。
目前,數(shù)據(jù)庫橫向擴(kuò)展有多種實(shí)現(xiàn)方式,較為主流的是共享存儲(chǔ)(Shared Disk)技術(shù),不久前,浪潮發(fā)布的K-DB數(shù)據(jù)庫,這款產(chǎn)品就基于共享存儲(chǔ)技術(shù),實(shí)現(xiàn)了雙機(jī)高可用(HA)、多機(jī)集群(KRAC)等數(shù)據(jù)庫橫向擴(kuò)展。
浪潮K-DB采用基于共享存儲(chǔ)(SharedDisk)的雙機(jī)或多機(jī)集群(KRAC)架構(gòu)。
KRAC具有兩大特點(diǎn):故障轉(zhuǎn)移和負(fù)載均衡。一方面,KRAC集群技術(shù)提供高可用解決方案,為用戶提供統(tǒng)一數(shù)據(jù)服務(wù)的同時(shí)提供故障切換與恢復(fù)能力(Fail Over集群功能),避免單點(diǎn)故障,減少停機(jī)時(shí)間,確保系統(tǒng)全年7*24穩(wěn)定運(yùn)行。另一方面,后端數(shù)據(jù)庫系統(tǒng)的負(fù)荷隨著應(yīng)用系統(tǒng)壓力的上升也在不斷的增加,集群技術(shù)能夠?qū)崿F(xiàn)數(shù)據(jù)庫系統(tǒng)的橫向擴(kuò)展,將數(shù)據(jù)庫的壓力平均分配在多臺(tái)數(shù)據(jù)庫服務(wù)器上。
【KRAC演示視頻】
http://v.qq.com/boke/page/x/k/1/x0174dycbk1.html
而在介紹這兩大特點(diǎn)前,我們先通過下圖了解KRAC的體系結(jié)構(gòu)。
KRAC體系結(jié)構(gòu)
KRAC由多個(gè)節(jié)點(diǎn)的數(shù)據(jù)庫服務(wù)器和共享存儲(chǔ)組成。共享存儲(chǔ)上主要存放的是數(shù)據(jù)庫必需的文件,包括數(shù)據(jù)文件、日志文件及控制文件等。數(shù)據(jù)庫服務(wù)器上運(yùn)行著數(shù)據(jù)庫對(duì)應(yīng)的實(shí)例,多實(shí)例之間通過內(nèi)網(wǎng)進(jìn)行數(shù)據(jù)的傳輸。KRAC的各個(gè)節(jié)點(diǎn)可以同時(shí)對(duì)磁盤進(jìn)行讀寫,實(shí)現(xiàn)了多讀多寫的真正集群技術(shù)。
KRAC具有兩大特點(diǎn):故障轉(zhuǎn)移和負(fù)載均衡。
特點(diǎn)一:故障轉(zhuǎn)移
KRAC數(shù)據(jù)庫可以對(duì)數(shù)據(jù)庫系統(tǒng)中出現(xiàn)的任何單點(diǎn)故障節(jié)點(diǎn)的session 轉(zhuǎn)移到其他正常的節(jié)點(diǎn)上,如磁盤、網(wǎng)絡(luò)、服務(wù)器等,保障應(yīng)用系統(tǒng)的不間斷,最大程度的減少用戶的損失。
KRAC故障轉(zhuǎn)移
特點(diǎn)二:負(fù)載均衡
KRAC會(huì)將所有的用戶session平均分配到各個(gè)節(jié)點(diǎn)上,集群中的各個(gè)節(jié)點(diǎn)均能對(duì)磁盤進(jìn)行讀寫,達(dá)到應(yīng)用系統(tǒng)的線性擴(kuò)展,從整體上提高數(shù)據(jù)庫的吞吐量。
數(shù)據(jù)庫各個(gè)節(jié)點(diǎn)的實(shí)例之間通過高速的內(nèi)網(wǎng)傳送數(shù)據(jù),避免了節(jié)點(diǎn)間訪問數(shù)據(jù)而產(chǎn)生的不必要的IO,而影響到性能。而在KRAC集群中,由于有多個(gè)節(jié)點(diǎn)都具有block buffer,這就需要節(jié)點(diǎn)間的blockbuffer可以互相傳輸訪問,才能達(dá)到一致性的狀態(tài)。
要具備以上2大特點(diǎn),就不得不提內(nèi)存融合技術(shù),他是實(shí)現(xiàn)KRAC功能的核心。
KRAC核心技術(shù):內(nèi)存融合
KRAC集群內(nèi)部組件
KRAC的集群中由CCC(Cluster CacheControl)模塊和GCA(Global CacheAdapter)模塊實(shí)現(xiàn)集群間數(shù)據(jù)庫的融合。傳輸?shù)臄?shù)據(jù)塊類型根據(jù)不同場(chǎng)景的需要而不一樣,主要包括CR block、Global dirty block、current block。節(jié)點(diǎn)間數(shù)據(jù)傳輸?shù)墓δ苡赡KINC(Inter-NodeCommunication)服務(wù)。在節(jié)點(diǎn)間請(qǐng)求的block buffer由 CCC 和CGA 構(gòu)造完畢后,INC 負(fù)責(zé)將對(duì)應(yīng)的數(shù)據(jù)塊傳輸?shù)侥康墓?jié)點(diǎn)。
KRAC內(nèi)存融合主要體現(xiàn)在4大核心技術(shù)上:鎖機(jī)制、角色、PIBLOCK和GLOBAL LOCK DIRETROY。
下面,我們將為大家詳細(xì)介紹這4個(gè)核心技術(shù)點(diǎn)的運(yùn)行機(jī)制。
鎖機(jī)制
在數(shù)據(jù)庫中,對(duì)于數(shù)據(jù)塊的block buffer的并發(fā)讀寫使用鎖機(jī)制進(jìn)行保護(hù)。每一個(gè)數(shù)據(jù)塊的鎖包括三種模式,分別為NULL、SHARED和EXCLUSIVE 。三種模式的兼容列表如下:
當(dāng)某一個(gè)用戶持有block buffer的鎖時(shí),如果其他用戶以兼容模式的鎖方式進(jìn)行訪問,那么這2個(gè)用戶可以同時(shí)訪問該數(shù)據(jù)塊。
而一旦2個(gè)用戶以不兼容方式訪問同一個(gè)數(shù)據(jù)塊時(shí),后面的用戶必須等到前一用戶釋放鎖之后才能開始操作。這種解決方案是單實(shí)例K-DB數(shù)據(jù)庫的解決方案。而在KRAC中,K-DB數(shù)據(jù)庫在此基礎(chǔ)上,增加了額外了管理方式-角色和Past image Block數(shù)據(jù)塊。
角色
K-DB 對(duì)于數(shù)據(jù)塊的分配了2種角色,分別是LOCAL 和GLOBAL,當(dāng)數(shù)據(jù)blockbuffer只在一個(gè)節(jié)點(diǎn)與磁盤上的數(shù)據(jù)不一樣(臟數(shù)據(jù)),該block buffer的角色為L(zhǎng)OCAL狀態(tài)。當(dāng)在多個(gè)節(jié)點(diǎn)上存在“臟數(shù)據(jù)”時(shí),block buffer的角色為GLOBAL.
PI BLOCK
如果一個(gè)block 在某一個(gè)節(jié)點(diǎn)中被修改后,然后該block傳輸?shù)搅似渌?jié)點(diǎn),那么本節(jié)點(diǎn)存儲(chǔ)的block塊為PI(Past Image)block。PI BLOCK 塊在以下2個(gè)方面具有一定的優(yōu)化作用:
- 提升CR 塊構(gòu)建的速度。當(dāng)本地構(gòu)建的CR塊的SCN 小于PI BLOCK 的SCN時(shí),無需從其他節(jié)點(diǎn)傳輸最新的current數(shù)據(jù)庫,直接在本地使用PI BLOCK可以構(gòu)造。
- 節(jié)點(diǎn)宕機(jī)后,提升系統(tǒng)恢復(fù)的性能。當(dāng)某一個(gè)節(jié)點(diǎn)宕機(jī)后,整個(gè)集群會(huì)暫時(shí)停止服務(wù),進(jìn)行內(nèi)部恢復(fù)?;謴?fù)的原理就是將宕掉節(jié)點(diǎn)的redo日志在其他節(jié)點(diǎn)進(jìn)行恢復(fù)。在恢復(fù)時(shí),對(duì)于redo日志中小于PI BLOCK的SCN無需重做,從大于等于PI BLOCK的SCN處開始恢復(fù),從整體上減少了恢復(fù)的工作量。
GLOBAL LOCKDIRETROY
在K-DB數(shù)據(jù)庫中,所有各個(gè)節(jié)點(diǎn)對(duì)于bufferblock的鎖信息,都會(huì)記錄在GlobalLock Directory(GLD)。各個(gè)節(jié)點(diǎn)在share pool 內(nèi)存中分配出一部分內(nèi)存,共同組成整個(gè)的GLD。那么一個(gè)節(jié)點(diǎn)會(huì)記錄哪一個(gè)數(shù)據(jù)塊的鎖和角色的相關(guān)信息呢?
在這里,KRAC又提出了一個(gè)新的機(jī)制,就是master機(jī)制。
所有的buffer block在當(dāng)前的正在運(yùn)行狀態(tài)的集群中,只會(huì)對(duì)應(yīng)到一個(gè)master節(jié)點(diǎn),該master節(jié)點(diǎn)會(huì)記錄相對(duì)應(yīng)的buffer block在各個(gè)節(jié)點(diǎn)中鎖狀態(tài)和角色的相關(guān)信息。任何節(jié)點(diǎn)在訪問某一個(gè)buffer block時(shí),都需要向他的master節(jié)點(diǎn)進(jìn)行申請(qǐng)。Master節(jié)點(diǎn)在收到buffer block訪問的請(qǐng)求后,會(huì)確定該buffer block塊的當(dāng)前位置,然后將該buffer block塊傳送給請(qǐng)求用戶。所有的master中的信息,共同組成了GLR(Global Lock Directory)。
數(shù)據(jù)塊訪問流程
為了便于大家更直觀理解內(nèi)存融合,下面通過三個(gè)場(chǎng)景舉例說明:
場(chǎng)景示例——內(nèi)存融合
測(cè)試參數(shù)說明:測(cè)試Block 的master 節(jié)點(diǎn)是C。Master節(jié)點(diǎn)中關(guān)于bufferblock一共記錄了4個(gè)參數(shù),第一個(gè)代表的鎖模式,如S(Shared),E(Exclusive),N(Null)。第二個(gè)參數(shù)是定義的是角色,如L(Local),G(Global)。第三個(gè)參數(shù)定義的是是否為PI, 0代表否,1代表是。第四個(gè)參數(shù)是該鎖對(duì)應(yīng)的instance 節(jié)點(diǎn)。
場(chǎng)景一節(jié)點(diǎn)B讀取磁盤中的BLOCK塊
(1)B節(jié)點(diǎn)向master C節(jié)點(diǎn)申請(qǐng)讀取block(2,203),BLOCK 中的數(shù)據(jù)為21
(2)主節(jié)點(diǎn)master C 向B節(jié)點(diǎn)賦予block(2,203)的 local 角色shared 模式lock
(3)B節(jié)點(diǎn)從磁盤讀取block塊(2,203)
場(chǎng)景二節(jié)點(diǎn)A更新節(jié)點(diǎn)B中緩存的buffer block
(1) A節(jié)點(diǎn)向Master Node C申請(qǐng)寫B(tài)L(2,203),將21修改為22.
(2) Master節(jié)發(fā)現(xiàn)B節(jié)點(diǎn)以Shared 模式持有BL(2,203).master主節(jié)點(diǎn)要求B節(jié)點(diǎn)將當(dāng)前的鎖由Shared降為Null模式。
(3) 節(jié)點(diǎn)B將本地的鎖降為Null模式后,將BL(2,203)發(fā)送給A節(jié)點(diǎn)。A節(jié)點(diǎn)獲取local 角色的exclusive 模式的鎖,修改BL(2,2003)中的數(shù)據(jù)為22.
場(chǎng)景三B節(jié)點(diǎn)再次更新同一個(gè)Block
- B節(jié)點(diǎn)向Master 申請(qǐng)X鎖,寫B(tài)lockBL(2,203).將數(shù)據(jù)修改為23
- Master 節(jié)點(diǎn)發(fā)現(xiàn)最新版本的數(shù)據(jù)塊在A節(jié)點(diǎn)上,并且A 以X鎖占有該數(shù)據(jù)塊。Master節(jié)點(diǎn)要求A節(jié)點(diǎn)的鎖降為NULL模式,同時(shí)由于此后2個(gè)節(jié)點(diǎn)中都存在與磁盤中的數(shù)據(jù)不一致的數(shù)據(jù),A節(jié)點(diǎn)的角色升級(jí)為GLOBAL,A中當(dāng)前的數(shù)據(jù)庫記為PI塊。
- A節(jié)點(diǎn)鎖降級(jí)后,將數(shù)據(jù)塊BL(2,203)傳送到B 節(jié)點(diǎn),節(jié)點(diǎn)B將數(shù)據(jù)修改為23.
好了,通過上文介紹,想必大家對(duì)浪潮K-DB數(shù)據(jù)庫的KRAC功能和運(yùn)行原理有了全面認(rèn)識(shí)。
總結(jié)來講,浪潮K-DB數(shù)據(jù)庫是除了Oracle以外,第二個(gè)能夠?qū)崿F(xiàn)共享存儲(chǔ)的集群技術(shù)的產(chǎn)品,采用KRAC多機(jī)集群架構(gòu),具有故障自動(dòng)轉(zhuǎn)移、高伸縮能力和自動(dòng)負(fù)載均衡特性,保障系統(tǒng)可用性的同時(shí),大幅提升可用性和性能,還能實(shí)現(xiàn)系統(tǒng)性能平滑升級(jí)且接近線性的擴(kuò)展。