從TAF到TAC,業(yè)務(wù)連續(xù)性的追求永無(wú)止境
對(duì)于數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō),高可用和業(yè)務(wù)連續(xù)性是用戶最為關(guān)注的問(wèn)題。在我參與的幾次用戶調(diào)研中,業(yè)務(wù)連續(xù)性問(wèn)題都是排名第一的關(guān)注點(diǎn),而且熱度是排名第二的問(wèn)題的2倍以上。對(duì)于企業(yè)級(jí)應(yīng)用或者關(guān)鍵系統(tǒng)來(lái)說(shuō),業(yè)務(wù)連續(xù)性是永恒的話題。券商的數(shù)據(jù)庫(kù)出問(wèn)題了,那么能否在數(shù)秒內(nèi)恢復(fù)業(yè)務(wù)?銀行的數(shù)據(jù)庫(kù)出問(wèn)題了,能否RPO=0,RTO接近于0?對(duì)于絕大多數(shù)中小金融機(jī)構(gòu)的大多數(shù)系統(tǒng),運(yùn)營(yíng)商的大多數(shù)系統(tǒng),政府、醫(yī)療、制造業(yè)的絕大多數(shù)關(guān)鍵系統(tǒng)而言,單機(jī)集中式數(shù)據(jù)庫(kù)的處理能力是足夠的,用戶最需要擔(dān)心的其實(shí)只是高可用的問(wèn)題。
Oracle 在1998年推出Oracle 8i的時(shí)候,推出了一個(gè)叫做透明應(yīng)用故障切換TAF(Transparent Application Failover)的技術(shù)組件。從而讓OPS節(jié)點(diǎn)故障時(shí)實(shí)現(xiàn)連接的自動(dòng)切換。20年后,Oracle 18C中的高可用從透明估值切換演變成了透明應(yīng)用連續(xù)性TAC(Transparent Application Continuity),這個(gè)功能將會(huì)成為Oracle 23C首推的高可用切換方案。今天我們就來(lái)簡(jiǎn)單地了解一下Oracle的數(shù)據(jù)庫(kù)高可用技術(shù)的發(fā)展歷程。國(guó)產(chǎn)數(shù)據(jù)庫(kù)廠商也應(yīng)該能夠從這個(gè)發(fā)展歷程中受到一定的啟發(fā),從而優(yōu)化國(guó)產(chǎn)數(shù)據(jù)庫(kù)的高可用能力。
個(gè)人認(rèn)為Oracle的數(shù)據(jù)庫(kù)高可用大體可以分為T(mén)AF/FCF/TAC(AC)三大階段??赡苡行┡笥褧?huì)有其他的一些分段方法。TAF主打的是OPS/RAC的透明故障切換。這是一種客戶端故障切換技術(shù),當(dāng)客戶端發(fā)現(xiàn)數(shù)據(jù)庫(kù)實(shí)例無(wú)法正常工作的時(shí)候,經(jīng)過(guò)數(shù)次RETRY無(wú)效,則自動(dòng)發(fā)起連接切換。這種切換有兩種模式,一種是SESSION模式,重新創(chuàng)建一個(gè)新的會(huì)話,拋棄以前做的所有任務(wù),重新開(kāi)始新的工作。還有一種是SELECT模式,如果發(fā)生切換的會(huì)話正在做一個(gè)只讀事務(wù),則正在做的SELECT可以繼續(xù)進(jìn)行。這是因?yàn)榕cSELECT相關(guān)的所有數(shù)據(jù)與控制信息在PGA中是完整的,不需要依賴服務(wù)器的SGA和服務(wù)器的狀態(tài)。
TAF功能夠強(qiáng),只不過(guò)切換的時(shí)間會(huì)長(zhǎng)了一點(diǎn),因?yàn)榭蛻舳烁兄收希啻蜶ETRY,都會(huì)浪費(fèi)一定的時(shí)間。而一些關(guān)鍵應(yīng)用需要更快地切換時(shí)間。因此快速連接故障切換(FCF)在Oracle中應(yīng)運(yùn)而生了,這個(gè)技術(shù)在Oracle 11G隨著UCP連接池的推出,變得更加完善了。FCF技術(shù)依賴于Fast Application Notification (FAN)。傳統(tǒng)上,數(shù)據(jù)庫(kù)實(shí)例產(chǎn)生某些變化(服務(wù)、實(shí)例、節(jié)點(diǎn)的DOWN 或 UP)時(shí),應(yīng)用程序會(huì)掛起,直到超時(shí),此時(shí)應(yīng)用程序會(huì)收到相關(guān)的SQL異常。隨 Oracle Database 11g 引入FAN,事件以快速可靠的方式通知給訂閱者。借助Oracle 10g開(kāi)始引入的 Oracle 通知服務(wù) (ONS),數(shù)據(jù)庫(kù)實(shí)例宕機(jī)時(shí),服務(wù)或者節(jié)點(diǎn)50毫秒或更短的時(shí)間內(nèi)啟動(dòng)故障轉(zhuǎn)移。
FCF解決了快速切換的問(wèn)題,如果應(yīng)用程序里捕獲了ONS中的事件產(chǎn)生的客戶端錯(cuò)誤,并且自動(dòng)放棄當(dāng)前的業(yè)務(wù)邏輯,重新完成業(yè)務(wù)邏輯,那么在客戶端幾乎可以對(duì)RAC某個(gè)節(jié)點(diǎn)的故障無(wú)感知。不過(guò)FCF有一點(diǎn)是對(duì)TAF的一個(gè)倒退,那就是FCF要放棄所有的故障前的操作。哪怕有一條SELECT已經(jīng)查了2小時(shí),還有1秒鐘就可以完成。
為了解決這個(gè)問(wèn)題,讓系統(tǒng)的高可用更加完備,Oracle在12C中對(duì)整個(gè)數(shù)據(jù)庫(kù)高可用框架進(jìn)行了重構(gòu)。引入了全局?jǐn)?shù)據(jù)服務(wù)(GDS)、事務(wù)守護(hù)者Transaction Guard (TG)等機(jī)制?;谶@些新的機(jī)制,實(shí)現(xiàn)了應(yīng)用連續(xù)性(AC)和透明應(yīng)用連續(xù)性(TAC)。并且將高可用框架擴(kuò)展到了RAC以外。ADG/OGG復(fù)制環(huán)境中,也可以使用這些高可用解決方案。
Oracle要實(shí)現(xiàn)的目標(biāo)是,當(dāng)系統(tǒng)故障切換的時(shí)候,能不能做到應(yīng)用無(wú)感。也就是說(shuō),如果切換是無(wú)損切換(比如RAC節(jié)點(diǎn)故障,同步ADG的故障切換,ADG的SWITCHOVER等場(chǎng)景)的時(shí)候,是不是可以實(shí)現(xiàn)快速的無(wú)損切換,讓業(yè)務(wù)連續(xù)性得到最大的保護(hù)呢?為了實(shí)現(xiàn)這個(gè)目標(biāo),Oracle引入了TG和故障事務(wù)重播?;诖?,DML/DDL等寫(xiě)操作都可以實(shí)現(xiàn)透明切換。
從Oracle Database 12c開(kāi)始,每個(gè)事務(wù)都與一個(gè)邏輯事務(wù) ID (LTXID) 相關(guān)聯(lián)。其目的是幫助可靠地確定運(yùn)行中 COMMIT 語(yǔ)句的結(jié)果。已分配 LTXID由 RDBMS 在每個(gè)事務(wù)開(kāi)始時(shí)更改(即遞增),僅在以下情況下由 RDBMS 更改:相應(yīng)的事務(wù)要么被提交,要么被回滾。為了更好的實(shí)現(xiàn)TG,Oracle 12c 引入了“數(shù)據(jù)庫(kù)請(qǐng)求”的概念。UCP 在連接檢出時(shí)透明地劃分?jǐn)?shù)據(jù)庫(kù)請(qǐng)求的開(kāi)始和連接的結(jié)束。同時(shí)“可恢復(fù)的錯(cuò)誤”的概念引入也相當(dāng)關(guān)鍵。Oracle 12c 將所有 SQL 異常分為兩大類(lèi):可恢復(fù)錯(cuò)誤和 不可恢復(fù)(即違反約束)。所有錯(cuò)誤消息都有一個(gè)附加的名為 OracleException.IsRecoverable 的屬性。
有了這些基礎(chǔ)技術(shù)以后,TAC的實(shí)現(xiàn)就能牛逼了。當(dāng)RAC的節(jié)點(diǎn)故障時(shí),如果你配置了TAC,那么故障的SESSION能自動(dòng)切換到接管實(shí)例上,未完成的 讀寫(xiě)操作繼續(xù)完成,應(yīng)用端無(wú)需捕獲錯(cuò)誤,也不會(huì)捕獲到錯(cuò)誤。應(yīng)用端的感受僅僅是好像當(dāng)前事務(wù)比以往略微慢了一點(diǎn)點(diǎn)。
TAC不僅可以在RAC中實(shí)現(xiàn),對(duì)于ADG環(huán)境中依然可以實(shí)現(xiàn)。如果ADG采用了同步復(fù)制模式,那么數(shù)據(jù)肯定是無(wú)損的,因此ADG可以在FAILOVER的時(shí)候通過(guò)TAC來(lái)實(shí)現(xiàn)切換。如果ADG不是同步模式的 ,那么為了確保故障回放的一致性,此切換僅僅能在SWITCHOVER這種無(wú)損切換中使用。在ADG上的TAC實(shí)現(xiàn)效果與RAC上并無(wú)太大區(qū)別,只是切換的時(shí)間長(zhǎng)了不少而已。
從上面我對(duì)Oracle高可用技術(shù)發(fā)展的描述上,大家應(yīng)該可以看出Oracle為了提高數(shù)據(jù)庫(kù)的可用性而做的努力。目前國(guó)產(chǎn)數(shù)據(jù)庫(kù)也在推出類(lèi)似Oracle RAC的技術(shù),在這些國(guó)產(chǎn)的“RAC”里,無(wú)一例外地支持了類(lèi)似TAF的技術(shù)。我覺(jué)得在Oracle已經(jīng)演進(jìn)到了TAC的今天,我們的國(guó)產(chǎn)數(shù)據(jù)庫(kù)廠商哪怕不做個(gè)彎道超車(chē),追上Oracle,實(shí)現(xiàn)真正的平替也是很必要的吧。
另外對(duì)于我們親愛(ài)的用戶和應(yīng)用開(kāi)發(fā)商,我也想說(shuō)兩句,二十多年過(guò)去了,你還只會(huì)用TAF做故障切換嗎?TAC難道不是你們更好的選擇嗎?