一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

億級別大表拆分——記一次分表工作的心路歷程

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-05-18 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


前言

筆者是在兩年前接手公司的財(cái)務(wù)系統(tǒng)的開發(fā)和維護(hù)工作。在系統(tǒng)移交的初期,筆者和團(tuán)隊(duì)就發(fā)現(xiàn),系統(tǒng)內(nèi)有一張5000W+的大表。

跟蹤代碼發(fā)現(xiàn),該表是用于存儲資金流水的表格,關(guān)聯(lián)著眾多功能點(diǎn),同時(shí)也有眾多的下游系統(tǒng)在使用這張表的數(shù)據(jù)。

進(jìn)一步的觀察發(fā)現(xiàn),這張表還在以每月600W+的數(shù)據(jù)持續(xù)增長,也就是說,不超過半年,這張表會增長到1個(gè)億!

這個(gè)數(shù)據(jù)量,對于mysql數(shù)據(jù)庫來說是絕對無法繼續(xù)維護(hù)的了,因此在接手系統(tǒng)兩個(gè)月后,我們便開起了大表拆分的專項(xiàng)工作。(兩個(gè)月時(shí)間實(shí)際上主要用來熟悉系統(tǒng)、消化堆積需求了)

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

拆表前系統(tǒng)狀態(tài)

  • 涉及到流水表流水的接口超時(shí)頻發(fā),部分接口基本不可用
  • 每日新增流水緩慢,主要是插入數(shù)據(jù)庫的時(shí)候非常慢
  • 單表占用空間過大,DBA的數(shù)據(jù)庫監(jiān)控經(jīng)常報(bào)警
  • 無法對表進(jìn)行變更,任何alter操作都會引起主從的高延遲和長時(shí)間鎖表

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

拆表的目標(biāo)

  • 將流水大表數(shù)據(jù)拆分至各個(gè)分表,保證每張分表數(shù)據(jù)在1000W左右(經(jīng)驗(yàn)上看單表1000W的量對mysql來說沒啥壓力)
  • 在拆表的前提下,針對不同接口的查詢條件進(jìn)行優(yōu)化,保證各個(gè)對外、對內(nèi)接口的可用性。徹底殺死m(xù)ysql慢查詢。

難點(diǎn)分析

  • 該表的數(shù)據(jù)可以說是整個(gè)財(cái)務(wù)系統(tǒng)最基礎(chǔ)的數(shù)據(jù),相關(guān)功能和下游系統(tǒng)非常多。這要求開發(fā)、測試和上線流程必須極其嚴(yán)密,任何小失誤都會引起大問題。
  • 涉及的場景非常多。統(tǒng)計(jì)下來,一共有26個(gè)場景,需要改造32個(gè)mapper方法,具體需要改造的方法就更加無計(jì)其數(shù)了。
  • 數(shù)據(jù)量非常大,遷移數(shù)據(jù)的過程必須保證系統(tǒng)穩(wěn)定。
  • 用戶較多且功能重要。分表功能上線時(shí),必須盡量壓縮系統(tǒng)無法使用時(shí)長,同時(shí)需要保證系統(tǒng)可用性。這要求團(tuán)隊(duì)必須設(shè)計(jì)完整可靠的上線流程、數(shù)據(jù)遷移方案、回滾方案、降級策略。
  • 上文提到,表的拆分勢必帶來部分接口的變化,接口的變化又會帶來其他系統(tǒng)的改造。如何推動其他系統(tǒng)進(jìn)行改造,如何協(xié)調(diào)多方合作的開發(fā)、測試和上線是另一個(gè)難點(diǎn)。

整體過程

35ac08f6-f526-11ed-90ce-dac502259ad0.jpg

具體細(xì)節(jié)

分表中間件調(diào)研

分表插件:采用sharding-jdbc作為分表插件。

其優(yōu)勢如下:

1、支持多種分片策略,自動識別=或in判斷具體在哪張分表里。

2、輕量級,作為maven依賴引入即可,對業(yè)務(wù)的侵入性極低。

為提升查詢速度,在整個(gè)項(xiàng)目的初期,團(tuán)隊(duì)成員考慮引入ES存儲流水以提升查詢速度。

經(jīng)過與ES維護(hù)團(tuán)隊(duì)的兩輪討論,發(fā)現(xiàn)公司提供的ES服務(wù)對于我們的業(yè)務(wù)場景并不匹配(見表),經(jīng)過反復(fù)考量,最終我們放棄了引入ES的計(jì)劃,直接從數(shù)據(jù)庫查詢數(shù)據(jù),采用每張表設(shè)置一個(gè)查詢線程的方式提升查詢效率。

35c91ce8-f526-11ed-90ce-dac502259ad0.png

分表依據(jù)的選擇

分表的方式有很多種,有縱向分表,有橫向分表,有分為固定的幾個(gè)表存儲然后取模進(jìn)行表拆分等等。總的來說,適合我們具體業(yè)務(wù)的分表方式只有橫向分表。

因?yàn)閷τ谫Y金流水這種特殊數(shù)據(jù)來說,是不能清理數(shù)據(jù)的,那么縱向分表和拆成固定的幾個(gè)表都不能解決單表數(shù)據(jù)無限膨脹的問題。而橫向分表,可以把每張表的數(shù)據(jù)量恒定,到一定時(shí)間后可以進(jìn)行財(cái)務(wù)數(shù)據(jù)歸檔。

分表的依據(jù)一般都是根據(jù)表的某個(gè)或者某幾個(gè)字段進(jìn)行拆分,最終其實(shí)是對數(shù)據(jù)和業(yè)務(wù)分析綜合出來的結(jié)果??偟膩碚f,原則有這幾個(gè):

  • 盡可能選擇查詢條件里最常出現(xiàn)的字段,這樣能夠減少方法改造的工程
  • 需要考慮根據(jù)某個(gè)字段拆分?jǐn)?shù)據(jù)是否能夠均勻分布,是否能夠滿足單表1000W左右的要求
  • 該字段必須是必現(xiàn)字段,不允許出現(xiàn)空值

綜合分析我們的數(shù)據(jù)以及業(yè)務(wù)需要,“交易時(shí)間”這個(gè)分表依據(jù)就呼之欲出了。

首先,這個(gè)字段作為流水最重要的字段之一一定會出現(xiàn);

第二,如果按照交易月份進(jìn)行拆表,每張表大概也就是600W-700W的數(shù)據(jù);

最后,有70%的查詢都附帶“交易時(shí)間”作為查詢條件。

技術(shù)難點(diǎn)

多數(shù)據(jù)源事務(wù)問題

sharding-jdbc在使用的時(shí)候是需要用自己的獨(dú)立數(shù)據(jù)源的,那么就難免出現(xiàn)多數(shù)據(jù)源事務(wù)問題。

這個(gè)我們通過自定義注解,自定義切面開啟事務(wù),通過方法棧逐層回滾or提交的方式解決的。出于保密原則,具體代碼細(xì)節(jié)不再展開。

多表的分頁問題

拆表一定會引起分頁查詢的難度增加。由于各個(gè)表查出來的數(shù)據(jù)量不等,原始的sql語句limit不再適用,需要設(shè)計(jì)一個(gè)新方法便捷的獲取分頁信息。

在此介紹一個(gè)分頁的思路供大家參考(團(tuán)隊(duì)共同的成果,筆者不敢私自占有):

綜合考慮業(yè)務(wù)實(shí)際與開發(fā)的復(fù)雜程度,項(xiàng)目團(tuán)隊(duì)決定在出現(xiàn)跨表查詢的情況下,每一張表采用一個(gè)線程進(jìn)行查詢,以提高查詢效率。

這個(gè)方案的難點(diǎn)在于分頁規(guī)則的轉(zhuǎn)換。例如,頁面?zhèn)魅氲膐ffset和pageSize分別為8和20。各分表中符合條件的數(shù)量分別為10,10,50。那么我們需要將總的分頁條件轉(zhuǎn)化為三個(gè)分表各自的分頁條件,如圖

35f87132-f526-11ed-90ce-dac502259ad0.jpg

通過上圖可以看到,大分頁條件(offset=8,pageSize=20),轉(zhuǎn)換為(offset=8,pageSize=2),(offset=0.pageSize=10),(offset=0,pageSize=8)三個(gè)條件。

整個(gè)計(jì)算過程如下:

  1. 多線程查詢各個(gè)分表中滿足條件的數(shù)據(jù)數(shù)量

  2. 將各個(gè)表數(shù)量按照分表的先后順序累加,形成圖 8的數(shù)軸

  3. 判斷第一條數(shù)據(jù)和最后一條數(shù)據(jù)所在的表

  4. 除第一條和最后一條數(shù)據(jù)所在表外,其他表offset=0,pageSize=總數(shù)量

  5. 計(jì)算第一條數(shù)據(jù)的offset,pageSize

計(jì)算最后一條數(shù)據(jù)的pageSize,同時(shí)將該表查詢條件的offset設(shè)置為0

數(shù)據(jù)遷移方案

在數(shù)據(jù)遷移前,團(tuán)隊(duì)討論過兩套遷移方案:

1)請DBA遷移數(shù)據(jù);

2)手寫代碼遷移數(shù)據(jù),他們各有自己的優(yōu)缺點(diǎn):

3611b80e-f526-11ed-90ce-dac502259ad0.png

綜合考慮時(shí)間成本和對線上數(shù)據(jù)庫的影響,團(tuán)隊(duì)決定采用兩種方案結(jié)合的方式:

  • 交易時(shí)間為三個(gè)月前的冷數(shù)據(jù),由于更新幾率不大,采用代碼的方式遷移,人為控制每次遷移數(shù)量,少量多次,螞蟻搬家;
  • 交易時(shí)間為三個(gè)月內(nèi)的熱數(shù)據(jù),由于會在上線前頻繁出現(xiàn)更新操作,則在上線前停止寫操作,而后由DBA整體遷移。這樣將時(shí)間成本平攤到平時(shí),上線前只有約2個(gè)小時(shí)左右遷移數(shù)據(jù)時(shí)系統(tǒng)無法使用。
  • 同時(shí),除了最后一次DBA遷移數(shù)據(jù)外,能夠人為控制每次遷移的數(shù)據(jù)量,整體避免數(shù)據(jù)庫實(shí)例級別的高延遲。

整體上線流程

為保證新表拆分功能的穩(wěn)定性和大表下線的穩(wěn)定,團(tuán)隊(duì)將整個(gè)項(xiàng)目分為三個(gè)階段:

  • 第一階段: 建立分表,大表數(shù)據(jù)遷移分表,線上數(shù)據(jù)新表老表雙寫,所有查詢走分表(驗(yàn)證觀察)
  • 第二階段: 停止寫老數(shù)據(jù)表,其他業(yè)務(wù)直連數(shù)據(jù)庫改為資金提供對外接口(驗(yàn)證觀察)
  • 第三階段:大表下線

總結(jié)

  • 應(yīng)再進(jìn)一步調(diào)研分表相關(guān)中間件。由于項(xiàng)目分表依據(jù)的特殊性,導(dǎo)致sharding-jdbc的很多功能無法利用,其對于簡化查詢邏輯的幫助低于預(yù)期。并且sharding-jdbc獨(dú)立數(shù)據(jù)源的特性,引發(fā)了多數(shù)據(jù)源事務(wù)問題,反而增加了開發(fā)的工作量。
  • 多線程需要仔細(xì)分析線程池核心線程的大小,同時(shí)分析多線程池同時(shí)存在的時(shí)候是否會引起核心線程數(shù)過多,避免機(jī)器線程打滿。
  • 如果是一個(gè)已有的項(xiàng)目,在進(jìn)行分表改造時(shí),一定要將各種場景都羅列清楚,將各個(gè)場景細(xì)化到程序中的每個(gè)類、每個(gè)方法中,將所有業(yè)務(wù)場景都覆蓋到。
  • 在遷移歷史數(shù)據(jù)時(shí),一定要做好遷移數(shù)據(jù)方案,以及應(yīng)對出現(xiàn)數(shù)據(jù)不一致時(shí)的處理方案。要綜合考慮時(shí)間成本、數(shù)據(jù)準(zhǔn)確性、對線上功能的影響等諸多因素。
  • 在上線一個(gè)比較復(fù)雜的方案時(shí),一定要提前設(shè)計(jì)好回滾方案和降級措施,能夠極大保證穩(wěn)定性。

說點(diǎn)兒題外話

為啥說想說點(diǎn)兒題外話呢,主要是對這次延續(xù)了5個(gè)多月的項(xiàng)目有感而發(fā)。項(xiàng)目進(jìn)行過程中,難免會與其他系統(tǒng)的維護(hù)團(tuán)隊(duì)有工作上的交集,有需要其他團(tuán)隊(duì)配合的地方。

這個(gè)時(shí)候非常考驗(yàn)程序員的溝通能力,最優(yōu)秀的程序員能夠通過話術(shù)把對方拉到自己的陣線當(dāng)中,讓對方感到這項(xiàng)工作對自己也是有好處的。這樣能夠讓對方心甘情愿的配合你的工作,達(dá)到雙贏的目的。

如果程序設(shè)計(jì)和學(xué)習(xí)能力是程序員的硬實(shí)力,那溝通技巧就是程序員的軟實(shí)力,硬實(shí)力能夠保障你的下線,而決定上線的恰恰是軟實(shí)力。

因此很多程序員不注重溝通技巧的培養(yǎng),其實(shí)是相當(dāng)于瘸腿的,畢竟現(xiàn)在憑單打獨(dú)斗是不大可能做出事情的。

另外,至少對于我們單位來說,對后端程序員的綜合素質(zhì)其實(shí)要求最高。后端程序員集業(yè)務(wù)、技術(shù)于一身。需要有比較強(qiáng)的業(yè)務(wù)把控能力,還要有過硬的技術(shù)素質(zhì)。

同時(shí),大多數(shù)工作的主owner是后端,一般都是后端程序員把控前端、后端、QA的開發(fā)節(jié)奏,協(xié)調(diào)好各個(gè)時(shí)間點(diǎn),做好風(fēng)險(xiǎn)反饋。

這就要求后端程序員既要懂業(yè)務(wù),還要懂技術(shù),還需要有一定的管理能力。這其實(shí)對人的鍛煉還是很可觀的。


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7256

    瀏覽量

    91861
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3926

    瀏覽量

    66218
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    860

    瀏覽量

    27932

原文標(biāo)題:億級別大表拆分 —— 記一次分表工作的心路歷程

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    【freeRTOS開發(fā)筆記】一次坑爹的freeTOS升級

    【freeRTOS開發(fā)筆記】一次坑爹的freeTOS-v9.0.0升到freeRTOS-v10.4.4
    的頭像 發(fā)表于 07-11 09:15 ?5271次閱讀
    【freeRTOS開發(fā)筆記】<b class='flag-5'>記</b><b class='flag-5'>一次</b>坑爹的freeTOS升級

    哪里可以找到按時(shí)間表工作的例子?

    你好!我找不到按時(shí)間表工作的例子。我說我的設(shè)備接收,并在這個(gè)中按時(shí)間切換。例如這張桌子:在十一點(diǎn)15.2510天的時(shí)間。怎么辦?我
    發(fā)表于 09-25 13:01

    一次網(wǎng)站設(shè)計(jì)稿的方法

    一次網(wǎng)站設(shè)計(jì)稿
    發(fā)表于 06-16 09:43

    解決Labview報(bào)表問題的般思路

    執(zhí)行創(chuàng)建excel時(shí)軟件會卡死。心路歷程1:軟件報(bào)表工具壞了?遂用 NIPackage Manager 修復(fù)了報(bào)表工具包。但是無效問題依然存在。心路歷程2:經(jīng)過查詢懷疑是注冊
    發(fā)表于 04-07 11:18

    【睿賽德 RW007 WiFi 模塊試用連載】RW007模塊調(diào)試心路歷程

    ,雖然是個(gè)對網(wǎng)絡(luò)無所知的小白,卻能輕松的連接到騰訊云上,RT-Thread已經(jīng)完成了很多工作,比如lwip的移植,正是因?yàn)镽T-Thread已經(jīng)完成了很多工作,才能讓我們使用者非常方便的使用。這是第
    發(fā)表于 07-12 22:20

    個(gè)AVR新手藍(lán)牙模塊調(diào)試的心路歷程簡介遇到的問題

    個(gè)AVR新手藍(lán)牙模塊調(diào)試的心路歷程簡介遇到的問題1——網(wǎng)上的例程不好用遇到的問題2——燒錄串口與藍(lán)牙通信串口共用導(dǎo)致亂碼遇到的問題3——波特率導(dǎo)致亂碼調(diào)試成功代碼簡介我在最近做了個(gè)藍(lán)牙小車,選用
    發(fā)表于 11-23 08:25

    學(xué)習(xí)單片機(jī)的心路歷程分享

    本人是單片機(jī)學(xué)習(xí)的萌新枚,學(xué)習(xí)單片機(jī)等知識目的就是提升自己專業(yè)方面的綜合的素質(zhì)修養(yǎng),我將會把自己的每次的學(xué)習(xí)的內(nèi)容和心理歷程記錄下來,分享給大家的同時(shí)也加深自己的理解。眾所周知,單片機(jī)的入門51
    發(fā)表于 01-17 06:31

    手機(jī)界最防水機(jī)型:蘋果8防水達(dá)IP68級別

    1月16日消息,去年推出的蘋果7在防水性能上達(dá)到了IP67級別防水功能,蘋果為此在蘋果7廣告上大力宣傳防水功能,據(jù)蘋果8最新消息稱,蘋果8在防水性能上得到升級,蘋果8配置將達(dá)到IP68級別防水。
    發(fā)表于 01-17 09:01 ?4961次閱讀

    3DMark的可變著色率測試加入Tier 2級別

    今年8月底,3DMark新增了項(xiàng)VRS可變速率著色功能測試,可比較使用Tier 1級別VRS時(shí)的性能、畫質(zhì)差異,現(xiàn)在又更新加入了Tier 2級別。
    的頭像 發(fā)表于 12-06 09:41 ?2704次閱讀

    能源從分布式光伏業(yè)務(wù)到綜合能源業(yè)務(wù)的心路歷程

    、產(chǎn)業(yè)和技術(shù)進(jìn)步態(tài)勢等焦點(diǎn)話題,共迎分布式光伏發(fā)展的新契機(jī)。 在模式創(chuàng)新及業(yè)務(wù)探索論壇上,元能源副總裁陸少聰發(fā)表了《從1到N,元能源從分布式光伏業(yè)務(wù)到綜合能源業(yè)務(wù)的心路歷程》演講
    的頭像 發(fā)表于 11-28 09:41 ?2153次閱讀

    黃仁勛分享作為工程師的心路歷程

    獲得者、宇航員和臺積電創(chuàng)始人張忠謀等大型企業(yè)高管。 黃仁勛憑借“在加速人工智能計(jì)算實(shí)現(xiàn)的并行計(jì)算技術(shù)領(lǐng)域所具有的遠(yuǎn)見卓識和創(chuàng)新精神”而榮獲該獎。黃仁勛在線上的頒獎儀式上,回顧了他路作為工程師的心路歷程。 從熱愛到深度
    的頭像 發(fā)表于 08-02 11:36 ?3991次閱讀

    個(gè)AVR新手藍(lán)牙模塊調(diào)試的心路歷程

    個(gè)AVR新手藍(lán)牙模塊調(diào)試的心路歷程簡介遇到的問題1——網(wǎng)上的例程不好用遇到的問題2——燒錄串口與藍(lán)牙通信串口共用導(dǎo)致亂碼遇到的問題3——波特率導(dǎo)致亂碼調(diào)試成功代碼簡介我在最近做了個(gè)藍(lán)牙小車,選用
    發(fā)表于 11-15 09:51 ?36次下載
    <b class='flag-5'>一</b>個(gè)AVR新手藍(lán)牙模塊調(diào)試的<b class='flag-5'>心路歷程</b>

    一次內(nèi)網(wǎng)中反彈shell的艱難歷程

    最近在客戶現(xiàn)場對內(nèi)網(wǎng)服務(wù)器進(jìn)行滲透測試,發(fā)現(xiàn)了大量的弱口令,本次歷程就是從這里開始。
    的頭像 發(fā)表于 03-07 09:30 ?1426次閱讀

    級別拆分心路歷程

    這個(gè)數(shù)據(jù)量,對于mysql數(shù)據(jù)庫來說是絕對無法繼續(xù)維護(hù)的了,因此在接手系統(tǒng)兩個(gè)月后,我們便開起了大拆分的專項(xiàng)工作。(兩個(gè)月時(shí)間實(shí)際上主要用來熟悉系統(tǒng)、消化堆積需求了)
    的頭像 發(fā)表于 05-17 10:17 ?640次閱讀
    <b class='flag-5'>億</b><b class='flag-5'>級別</b>大<b class='flag-5'>表</b><b class='flag-5'>拆分心路歷程</b>

    達(dá)實(shí)智能成立30周年成長創(chuàng)新的心路歷程

    近日,是達(dá)實(shí)智能成立30周年的重要紀(jì)念日。在達(dá)實(shí)智能30周年生日慶典上,劉磅董事長分享了公司成長創(chuàng)新的心路歷程。
    的頭像 發(fā)表于 03-26 16:40 ?527次閱讀