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