眾誠(chéng)汽車保險(xiǎn)股份有限公司(簡(jiǎn)稱“眾誠(chéng)保險(xiǎn)”,下同)為了實(shí)現(xiàn)業(yè)務(wù)的高質(zhì)量發(fā)展,毅然決定對(duì)核心數(shù)據(jù)庫(kù)進(jìn)行 “換芯” ,從 Oracle 數(shù)據(jù)庫(kù)替換成國(guó)產(chǎn)數(shù)據(jù)庫(kù) OceanBase ,而這場(chǎng)手術(shù)的“主刀團(tuán)隊(duì)”正是中亦科技。
這場(chǎng)“換芯”不僅實(shí)現(xiàn)了40+業(yè)務(wù)系統(tǒng)的平滑過(guò)渡,更以兩地三中心架構(gòu)打造了金融級(jí)容災(zāi)標(biāo)桿。今天,就讓我們一起解碼這場(chǎng)國(guó)產(chǎn)化替代的重要實(shí)踐!
一、測(cè)試環(huán)境壓測(cè)
在正式遷移之前,中亦團(tuán)隊(duì)搭建了模擬真實(shí)業(yè)務(wù)場(chǎng)景的測(cè)試環(huán)境,對(duì) OceanBase 進(jìn)行全面壓測(cè)。
- 高并發(fā)讀寫測(cè)試,模擬大量用戶同時(shí)進(jìn)行保單查詢、理賠申請(qǐng)等操作;
- 大數(shù)據(jù)量存儲(chǔ)測(cè)試,向數(shù)據(jù)庫(kù)中導(dǎo)入歷史積累的海量業(yè)務(wù)數(shù)據(jù),測(cè)試其存儲(chǔ)性能和查詢效率;
- 復(fù)雜事務(wù)處理測(cè)試,模擬涉及多個(gè)業(yè)務(wù)表關(guān)聯(lián)的復(fù)雜業(yè)務(wù)流程,驗(yàn)證事務(wù)的一致性和完整性。
通過(guò)壓測(cè),收集到了 OceanBase 在不同負(fù)載下的性能指標(biāo),如響應(yīng)時(shí)間、吞吐量等,為后續(xù)的參數(shù)調(diào)整和優(yōu)化提供了數(shù)據(jù)依據(jù)。同時(shí),與原 Oracle 數(shù)據(jù)庫(kù)在相同測(cè)試場(chǎng)景下的性能進(jìn)行對(duì)比,進(jìn)一步驗(yàn)證了 OceanBase 在性能上的優(yōu)勢(shì)和潛力。
二、準(zhǔn)生產(chǎn)環(huán)境壓測(cè)
在測(cè)試環(huán)境壓測(cè)取得初步成功后,中亦團(tuán)隊(duì)將 OceanBase 部署到準(zhǔn)生產(chǎn)環(huán)境進(jìn)行更貼近實(shí)際業(yè)務(wù)的壓測(cè)。準(zhǔn)生產(chǎn)環(huán)境盡可能模擬生產(chǎn)環(huán)境的硬件配置、網(wǎng)絡(luò)架構(gòu)和業(yè)務(wù)流量。在這個(gè)階段,不僅對(duì)數(shù)據(jù)庫(kù)本身進(jìn)行壓測(cè),還將相關(guān)應(yīng)用系統(tǒng)接入,進(jìn)行端到端的性能測(cè)試。通過(guò)準(zhǔn)生產(chǎn)環(huán)境壓測(cè),發(fā)現(xiàn)了一些在測(cè)試環(huán)境中未暴露的問(wèn)題,如應(yīng)用與數(shù)據(jù)庫(kù)之間的兼容性問(wèn)題、部分復(fù)雜業(yè)務(wù)邏輯下數(shù)據(jù)庫(kù)資源消耗過(guò)大等。針對(duì)這些問(wèn)題,及時(shí)進(jìn)行了針對(duì)性的優(yōu)化和調(diào)整,包括優(yōu)化數(shù)據(jù)庫(kù)查詢語(yǔ)句、調(diào)整應(yīng)用系統(tǒng)的連接池配置等,確保 OceanBase 在正式上線后能夠穩(wěn)定運(yùn)行。
三、應(yīng)用改造與適配
由于 OceanBase 與 Oracle 在語(yǔ)法、特性等方面存在一定差異,為了確保應(yīng)用系統(tǒng)能夠順利運(yùn)行在新的數(shù)據(jù)庫(kù)上,進(jìn)行了全面的應(yīng)用改造與適配工作。首先,對(duì)應(yīng)用代碼中涉及數(shù)據(jù)庫(kù)操作的部分進(jìn)行梳理和分析,將 Oracle 特有的語(yǔ)法和函數(shù)替換為 OceanBase 支持的語(yǔ)法和函數(shù)。例如,在數(shù)據(jù)查詢語(yǔ)句中,將 Oracle 的 ROWNUM 關(guān)鍵字替換為 OceanBase 的 LIMIT 語(yǔ)法來(lái)實(shí)現(xiàn)分頁(yè)功能;對(duì)于日期處理函數(shù),也根據(jù) OceanBase 的語(yǔ)法進(jìn)行相應(yīng)調(diào)整。其次,對(duì)應(yīng)用系統(tǒng)的配置文件進(jìn)行修改,確保其能夠正確連接到 OceanBase 數(shù)據(jù)庫(kù),并根據(jù)新數(shù)據(jù)庫(kù)的特性進(jìn)行參數(shù)優(yōu)化,如調(diào)整連接池的最大連接數(shù)、最小連接數(shù)等。此外,還對(duì)應(yīng)用系統(tǒng)進(jìn)行了全面的回歸測(cè)試,確保改造后的應(yīng)用系統(tǒng)功能正常,性能不受影響。
OceanBase 采用分布式架構(gòu),數(shù)據(jù)庫(kù)集群的搭建是一項(xiàng)關(guān)鍵工作。在第一階段,采用了單機(jī)房三副本架構(gòu),這種架構(gòu)能夠在單機(jī)房環(huán)境下提供較高的數(shù)據(jù)可靠性和讀寫性能。通過(guò) OceanBase 的集群管理工具,將多個(gè)物理節(jié)點(diǎn)組成一個(gè)集群,每個(gè)數(shù)據(jù)分片在三個(gè)節(jié)點(diǎn)上保存副本,確保在某個(gè)節(jié)點(diǎn)出現(xiàn)故障時(shí),數(shù)據(jù)仍然可用。在搭建過(guò)程中,嚴(yán)格按照 OceanBase 的最佳實(shí)踐進(jìn)行配置,包括節(jié)點(diǎn)的硬件配置、網(wǎng)絡(luò)配置、存儲(chǔ)配置等。同時(shí),對(duì)集群的各個(gè)節(jié)點(diǎn)進(jìn)行監(jiān)控和管理,確保集群的穩(wěn)定性和性能。隨著業(yè)務(wù)的發(fā)展和對(duì)數(shù)據(jù)高可用性要求的進(jìn)一步提高,第二階段完成了兩地三中心的建設(shè)。通過(guò)在不同地理位置的三個(gè)數(shù)據(jù)中心部署 OceanBase 集群,實(shí)現(xiàn)了數(shù)據(jù)的異地多活,極大地提高了系統(tǒng)的容災(zāi)能力和業(yè)務(wù)連續(xù)性。
在兩地三中心架構(gòu)下,通過(guò)智能路由和數(shù)據(jù)同步技術(shù),確保用戶的請(qǐng)求能夠被合理地分配到各個(gè)數(shù)據(jù)中心,同時(shí)保證數(shù)據(jù)在不同數(shù)據(jù)中心之間的一致性。
五、數(shù)據(jù)庫(kù)參數(shù)調(diào)整優(yōu)化
為了充分發(fā)揮 OceanBase 的性能優(yōu)勢(shì),對(duì)數(shù)據(jù)庫(kù)參數(shù)進(jìn)行了細(xì)致的調(diào)整和優(yōu)化。根據(jù)業(yè)務(wù)特點(diǎn)和壓測(cè)結(jié)果,對(duì)內(nèi)存分配參數(shù)進(jìn)行優(yōu)化,合理調(diào)整系統(tǒng)內(nèi)存、緩存內(nèi)存等參數(shù),確保數(shù)據(jù)庫(kù)在處理不同類型的業(yè)務(wù)時(shí),都能夠高效地利用內(nèi)存資源。
例如,對(duì)于讀密集型業(yè)務(wù),適當(dāng)增加緩存內(nèi)存的比例,提高數(shù)據(jù)的讀取速度;對(duì)于寫密集型業(yè)務(wù),優(yōu)化內(nèi)存分配,確保寫入操作的高效執(zhí)行。同時(shí),對(duì) I/O 參數(shù)進(jìn)行調(diào)整,根據(jù)存儲(chǔ)設(shè)備的性能,優(yōu)化磁盤 I/O 調(diào)度策略,減少 I/O 等待時(shí)間。此外,還對(duì)事務(wù)相關(guān)參數(shù)進(jìn)行優(yōu)化,確保事務(wù)的并發(fā)處理能力和一致性。通過(guò)不斷地調(diào)整和優(yōu)化參數(shù),使 OceanBase 在各種業(yè)務(wù)場(chǎng)景下都能夠達(dá)到最佳性能狀態(tài)。
六、數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)
隨著業(yè)務(wù)數(shù)據(jù)的不斷增長(zhǎng),一些核心業(yè)務(wù)表的數(shù)據(jù)量達(dá)到了千萬(wàn)甚至億級(jí),對(duì)這些大表進(jìn)行分區(qū)表改造成為提高性能的關(guān)鍵措施。根據(jù)業(yè)務(wù)特點(diǎn)和查詢需求,選擇合適的分區(qū)鍵,如按時(shí)間、業(yè)務(wù)類型等進(jìn)行分區(qū)。例如,對(duì)于保單表,按照保單生效時(shí)間進(jìn)行分區(qū),將不同時(shí)間段的保單數(shù)據(jù)存儲(chǔ)在不同的分區(qū)中。這樣在進(jìn)行數(shù)據(jù)查詢時(shí),只需要訪問(wèn)相關(guān)的分區(qū),大大減少了數(shù)據(jù)掃描范圍,提高了查詢效率。同時(shí),在進(jìn)行數(shù)據(jù)插入和更新操作時(shí),也能夠避免對(duì)整個(gè)大表的鎖爭(zhēng)用,提高了并發(fā)處理能力。2、采用 TABLEGROUP 方式進(jìn)行優(yōu)化為了進(jìn)一步提高數(shù)據(jù)庫(kù)的性能和管理效率,采用了 TABLEGROUP 方式對(duì)相關(guān)表進(jìn)行組織。將業(yè)務(wù)上緊密相關(guān)的表放在同一個(gè) TABLEGROUP 中,這樣在進(jìn)行數(shù)據(jù)操作時(shí),可以減少磁盤 I/O 的隨機(jī)訪問(wèn),提高數(shù)據(jù)讀寫的效率。例如,將客戶信息表、客戶保單關(guān)系表等放在同一個(gè) TABLEGROUP 中,當(dāng)查詢客戶及其保單信息時(shí),能夠通過(guò)一次 I/O 操作讀取多個(gè)相關(guān)表的數(shù)據(jù),減少了 I/O 開(kāi)銷。3、PRIMARY ZONE 修改為單 ZONE 架構(gòu)在 OceanBase 的架構(gòu)中,PRIMARY ZONE負(fù)責(zé)處理讀寫請(qǐng)求,為了優(yōu)化性能和提高可用性,將 PRIMARY ZONE修改為單 ZONE 架構(gòu)。在單 ZONE 架構(gòu)下,所有的讀寫請(qǐng)求都集中在一個(gè) ZONE 中處理,減少了跨 ZONE 的數(shù)據(jù)傳輸開(kāi)銷,提高了讀寫性能。同時(shí),通過(guò)合理配置副本數(shù)量和分布,確保在單 ZONE 出現(xiàn)故障時(shí),數(shù)據(jù)仍然能夠通過(guò)其他 ZONE 的副本進(jìn)行訪問(wèn),保證了系統(tǒng)的高可用性。
七、執(zhí)行計(jì)劃綁定與復(fù)雜SQL改寫
在應(yīng)用系統(tǒng)運(yùn)行過(guò)程中,數(shù)據(jù)庫(kù)的執(zhí)行計(jì)劃對(duì)于查詢性能至關(guān)重要。為了確保查詢語(yǔ)句始終能夠使用最優(yōu)的執(zhí)行計(jì)劃,采用了執(zhí)行計(jì)劃綁定技術(shù)。通過(guò)對(duì)關(guān)鍵查詢語(yǔ)句進(jìn)行分析和測(cè)試,獲取其最優(yōu)執(zhí)行計(jì)劃,并將其綁定到數(shù)據(jù)庫(kù)中。這樣,無(wú)論數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息如何變化,該查詢語(yǔ)句都將始終使用綁定的執(zhí)行計(jì)劃,避免了因執(zhí)行計(jì)劃變化而導(dǎo)致的性能波動(dòng)。例如,對(duì)于一些涉及多表關(guān)聯(lián)的復(fù)雜查詢,通過(guò)執(zhí)行計(jì)劃綁定,能夠確保在不同的業(yè)務(wù)負(fù)載下,都能夠高效地完成查詢操作。在原 Oracle 數(shù)據(jù)庫(kù)中,存在一些復(fù)雜的 SQL 語(yǔ)句,這些語(yǔ)句在遷移到 OceanBase 后,可能無(wú)法達(dá)到預(yù)期的性能。因此,對(duì)這些復(fù)雜 SQL 語(yǔ)句進(jìn)行了改寫。通過(guò)優(yōu)化查詢邏輯、減少子查詢嵌套、合理使用索引等方法,提高 SQL 語(yǔ)句的執(zhí)行效率。例如,將一些多層嵌套的子查詢改寫成 JOIN 操作,減少了數(shù)據(jù)的重復(fù)掃描;對(duì)于一些頻繁查詢的字段,添加合適的索引,加快了數(shù)據(jù)的檢索速度。同時(shí),在改寫過(guò)程中,充分考慮了 OceanBase 的特性和優(yōu)化策略,確保改寫后的 SQL 語(yǔ)句能夠在新數(shù)據(jù)庫(kù)上高效運(yùn)行。
八、遷移過(guò)程中的數(shù)據(jù)處理
1、同步工具,數(shù)據(jù)比對(duì)修復(fù)在數(shù)據(jù)遷移過(guò)程中,使用同步工具進(jìn)行數(shù)據(jù)遷移,并通過(guò)強(qiáng)大的數(shù)據(jù)比對(duì)功能,確保遷移前后數(shù)據(jù)的一致性。同步工具在遷移完成后,對(duì)源 Oracle 數(shù)據(jù)庫(kù)和目標(biāo) OceanBase 數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行逐行比對(duì),發(fā)現(xiàn)不一致的數(shù)據(jù)后,及時(shí)進(jìn)行修復(fù)。例如,在數(shù)據(jù)比對(duì)過(guò)程中,發(fā)現(xiàn)由于數(shù)據(jù)類型轉(zhuǎn)換問(wèn)題導(dǎo)致部分?jǐn)?shù)值型數(shù)據(jù)在遷移后出現(xiàn)精度丟失的情況,通過(guò)同步工具的數(shù)據(jù)修復(fù)功能,對(duì)這些數(shù)據(jù)進(jìn)行了重新轉(zhuǎn)換和修正,確保了數(shù)據(jù)的準(zhǔn)確性。2、源 Oracle 不規(guī)范數(shù)據(jù)優(yōu)化原 Oracle 數(shù)據(jù)庫(kù)中存在一些不規(guī)范的數(shù)據(jù),如數(shù)據(jù)格式不一致、空值處理不當(dāng)?shù)?,這些數(shù)據(jù)如果直接遷移到 OceanBase ,可能會(huì)影響后續(xù)的業(yè)務(wù)處理和數(shù)據(jù)分析。因此,在遷移之前,對(duì)源 Oracle 數(shù)據(jù)庫(kù)中的不規(guī)范數(shù)據(jù)進(jìn)行了優(yōu)化。通過(guò)編寫數(shù)據(jù)清洗腳本,對(duì)數(shù)據(jù)格式進(jìn)行統(tǒng)一規(guī)范,如將日期格式統(tǒng)一為 “YYYY-MM-DD” ;對(duì)于空值,根據(jù)業(yè)務(wù)規(guī)則進(jìn)行合理的填充或處理。同時(shí),對(duì)一些不合理的索引和約束進(jìn)行調(diào)整,確保數(shù)據(jù)的完整性和一致性。考慮到業(yè)務(wù)數(shù)據(jù)中可能存在生僻字,在遷移過(guò)程中對(duì)生僻字的存儲(chǔ)和處理進(jìn)行了優(yōu)化。確保 OceanBase 數(shù)據(jù)庫(kù)的字符集能夠支持所有可能出現(xiàn)的生僻字,避免因字符集不兼容導(dǎo)致生僻字存儲(chǔ)錯(cuò)誤或顯示亂碼的問(wèn)題。同時(shí),對(duì)應(yīng)用系統(tǒng)中涉及生僻字輸入、查詢和顯示的部分進(jìn)行了測(cè)試和優(yōu)化,確保生僻字在整個(gè)業(yè)務(wù)流程中能夠正確處理。通過(guò)一系列的技術(shù)工作和努力,中亦科技作為眾誠(chéng)保險(xiǎn)數(shù)據(jù)庫(kù) “換芯” 項(xiàng)目的 “主治醫(yī)師”,憑借專業(yè)的技術(shù)能力、豐富的項(xiàng)目經(jīng)驗(yàn)以及高度的責(zé)任心,為眾誠(chéng)保險(xiǎn)核心數(shù)據(jù)庫(kù)的成功替換和 40 多個(gè)系統(tǒng)的順利上線提供了強(qiáng)有力的支持。這次合作不僅實(shí)現(xiàn)了眾誠(chéng)保險(xiǎn)技術(shù)架構(gòu)的升級(jí)和優(yōu)化,也為雙方在未來(lái)的業(yè)務(wù)發(fā)展和技術(shù)創(chuàng)新方面奠定了堅(jiān)實(shí)的基礎(chǔ)。總之,眾誠(chéng)保險(xiǎn)核心數(shù)據(jù)庫(kù)的 “換芯” 工程是一次成功的技術(shù)變革,為企業(yè)的數(shù)字化轉(zhuǎn)型和可持續(xù)發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。