使用阿里云云原生平臺(tái)對系統(tǒng)進(jìn)行重構(gòu)和升級(jí)(3)——使用阿里云的PolarDB-X進(jìn)行分庫分表

????????上一篇文章講解了如何使用阿里云的GTS,進(jìn)行全局分布式事務(wù)處理。這篇文章將介紹如何使用阿里云的PolarDB-X中間件進(jìn)行分庫分表的操作。

? ? ? ? 系統(tǒng)的重構(gòu),尤其是老系統(tǒng)的數(shù)據(jù)最后要轉(zhuǎn)移到新系統(tǒng)中,而且數(shù)據(jù)量又是億萬級(jí)別的,處理起來真的是很棘手。

? ? ? ? 首先,也是最關(guān)鍵的就是要理清新系統(tǒng)的產(chǎn)品需求,其次要把老系統(tǒng)中的數(shù)據(jù)進(jìn)行整理和篩選,然后整理出分庫分表的思路和方案,最后要制定出新老數(shù)據(jù)庫遷移的方案,這里根據(jù)快遞驛站系統(tǒng)的把這些步驟具體化,并詳細(xì)講述如何使用PolarDB-X中間件進(jìn)行分庫分表。

? ? ? ? 一、整理新系統(tǒng)的產(chǎn)品需求

? ? ? ? 這是產(chǎn)品經(jīng)理干的活,我這里就簡單描述一下需要開發(fā)的新系統(tǒng)的一些要點(diǎn)。新系統(tǒng)大致上就是兩大模塊的結(jié)合,一個(gè)就是包裹系統(tǒng)模塊,快遞驛站接受快遞入庫,用戶在驛站取件出庫,驛站將信息同步給快遞公司,通知給用戶包裹狀態(tài),用戶還可以在驛站寄件;第二個(gè)就是共配系統(tǒng)模塊,不同快遞在同一個(gè)倉庫集中放貨,這樣一來可以節(jié)省成本,再者一起配送更加方便,尤其偏遠(yuǎn)農(nóng)村,因?yàn)榭爝f包裹少,每個(gè)快遞公司隔三差五才送一次快遞,如果有了共配系統(tǒng),那一起配送的快遞包裹就多了,可以實(shí)時(shí)送達(dá)。所以整個(gè)新系統(tǒng)是非常龐大的,軟件架構(gòu)詳見第一篇文章中的插圖。

? ? ? ? 二、對老系統(tǒng)中的數(shù)據(jù)進(jìn)行篩選和整理

? ? ? ? 1、目前系統(tǒng)的情況說明

? ? ? ? 包裹訂單表按照月份拆分,碰到雙十一雙十二購物大促期間,單表中存的數(shù)據(jù)量超大,導(dǎo)致門店、代理商后臺(tái)查詢或統(tǒng)計(jì)數(shù)據(jù)時(shí)很慢,造成系統(tǒng)瓶頸甚至宕機(jī),客戶要求賠償損失,后果嚴(yán)重。

? ? ? ? 其他大數(shù)據(jù)量的表都未進(jìn)行拆分,例如:取件短信通知表,日志表等等,嚴(yán)重影響系統(tǒng)性能,還有大量的慢SQL查詢,都是導(dǎo)致系統(tǒng)變慢的原因。

? ? ? ? 2、新系統(tǒng)的規(guī)劃和展望

????????根據(jù)公司近3-5年規(guī)劃及展望:

????????1)包裹數(shù)據(jù)量的規(guī)劃,每天穩(wěn)定在1000萬單,這樣一個(gè)月就是3個(gè)億數(shù)據(jù),3個(gè)月就是9個(gè)億,1年就是36億;

????????2)短信、微信和語音通知量將會(huì)是訂單量的2倍以上(入庫、出庫各一次),因?yàn)闀?huì)存在多發(fā)的情況,這樣1個(gè)月就是6個(gè)億,3個(gè)月18億,1年100億;

????????3)操作記錄根據(jù)門店、代理商、快遞員、管理員、寄取件用戶的每天操作,預(yù)估3000萬次;

????????4)新系統(tǒng)也要記錄寄取件用戶信息,全國100萬家門店,服務(wù)5個(gè)億用戶寄取件。

? ? ? ? 3、設(shè)計(jì)方案

? ? ? ? 根據(jù)上面所描述的,將數(shù)據(jù)分為3類:

????????1)熱數(shù)據(jù)——3個(gè)月之內(nèi)的數(shù)據(jù),需要實(shí)時(shí)查詢操作;

????????熱數(shù)據(jù)存儲(chǔ)在PolarDB中,數(shù)據(jù)量大的表,進(jìn)行分庫分表;

????????2)較冷數(shù)據(jù)——3-12個(gè)月的數(shù)據(jù),需要存儲(chǔ),進(jìn)行統(tǒng)計(jì)分析;

? ??????熱+較冷數(shù)據(jù)存儲(chǔ)在 AnalyticDB中,實(shí)時(shí)從PolarDB中同步,使用QuickBI進(jìn)行數(shù)據(jù)的分析、處理和統(tǒng)計(jì);

????????3)冷數(shù)據(jù)——12個(gè)月以上的數(shù)據(jù),需要存儲(chǔ)已備后查;

????????冷數(shù)據(jù)(基本不查)存儲(chǔ)在HBase中,用于節(jié)約成本;

? ? ? ? 三、使用阿里云的PolarDB數(shù)據(jù)庫進(jìn)行數(shù)據(jù)的存儲(chǔ)和管理

? ??????PolarDB是阿里巴巴自研的新一代云原生關(guān)系型數(shù)據(jù)庫,在存儲(chǔ)計(jì)算分離架構(gòu)下,利用了軟硬件結(jié)合的優(yōu)勢,為用戶提供具備極致彈性、高性能、海量存儲(chǔ)、安全可靠的數(shù)據(jù)庫服務(wù)。100%兼容MySQL 5.6/5.7/8.0,PostgreSQL 11,高度兼容Oracle。

????????PolarDB采用存儲(chǔ)和計(jì)算分離的架構(gòu),所有計(jì)算節(jié)點(diǎn)共享一份數(shù)據(jù),提供分鐘級(jí)的配置升降級(jí)、秒級(jí)的故障恢復(fù)、全局?jǐn)?shù)據(jù)一致性和免費(fèi)的數(shù)據(jù)備份容災(zāi)服務(wù)。PolarDB既融合了商業(yè)數(shù)據(jù)庫穩(wěn)定可靠、高性能、可擴(kuò)展的特征,又具有開源云數(shù)據(jù)庫簡單開放、自我迭代的優(yōu)勢,例如PolarDB MySQL引擎作為“超級(jí)MySQL”,性能最高可以提升至MySQL的6倍,而成本只有商用數(shù)據(jù)庫的1/10,每小時(shí)最低只需1.3元即可體驗(yàn)完整的產(chǎn)品功能。PolarDB MySQL引擎?100%兼容原生MySQL和RDS MySQL,您可以在不修改應(yīng)用程序任何代碼和配置的情況下,將MySQL數(shù)據(jù)庫遷移至PolarDB MySQL引擎。

? ? ? ? 而且PolarDB最高100 TB,不再需要因?yàn)閱螜C(jī)容量的天花板而去購買多個(gè)實(shí)例做分片,由此簡化應(yīng)用開發(fā),降低運(yùn)維負(fù)擔(dān)。???

? ? ? ? 說了這么多PolarDB的好處,心動(dòng)不如心動(dòng),立馬開始使用。

? ? ? ? 首先在阿里云進(jìn)入PolarDB控制臺(tái)進(jìn)行購買,我們項(xiàng)目打算購買2個(gè)PolarDB,后期也可以根據(jù)業(yè)務(wù)需要變更配置,增加只讀節(jié)點(diǎn),進(jìn)行擴(kuò)容。

購買PolarDB界面

? ? ? ? 兼容性可以選擇MySQL5.6,如果用最新MySQL8.0,后續(xù)要改配這個(gè)是改不了的,所以前期根據(jù)項(xiàng)目的情況進(jìn)行選擇;系列建議選擇集群版,節(jié)點(diǎn)規(guī)格也根據(jù)自身的需求選擇,我們這里選擇的是8核64GB,當(dāng)然有錢可以任性選擇獨(dú)占物理機(jī)??。為了測試和演示,買了2核8GB。

集群列表
PolarDB基本信息界面

? ? ? ? 在基本信息界面可以對創(chuàng)建的PolarDB進(jìn)行白名單設(shè)置,添加集群賬號(hào),編輯主地址和集群地址,還可以增刪節(jié)點(diǎn),變更配置,具體的使用可以參考阿里云PolarDB使用指南,反正我是用了很爽。

????????其他再說一下慢SQL的查詢功能,這個(gè)太好用了,可以查詢到每個(gè)節(jié)點(diǎn)中,查詢緩慢的SQL的信息,進(jìn)行慢日志分析,可以根據(jù)時(shí)間進(jìn)行查詢,如果有慢SQL,會(huì)顯示出來,并可查看該次慢SQL的詳細(xì)信息。

慢SQL界面

? ? ? ? 四、使用阿里云的PolarDB-X進(jìn)行分庫分表

????????上面我們購買完P(guān)olarDB后,接下去就是要?jiǎng)?chuàng)建數(shù)據(jù)庫,然后對數(shù)據(jù)量大的表,進(jìn)行分庫分表的操作。

? ? ? ? 第一步還是先要有分庫分表的方案,下面列出了項(xiàng)目中部分分庫分表的方案:

????????1、包裹訂單表

????????根據(jù)門店ID分庫,根據(jù)訂單包裹ID分表 100張表

????????2、短信通知表、微信通知表

????????根據(jù)門店ID分庫,根據(jù)短信ID分表 200張表

????????3、物流記錄表

????????根據(jù)訂單包裹ID分庫,根據(jù)門店ID分表 100張表

????????4、寄取件用戶表

????????根據(jù)用戶ID分庫,根據(jù)取件手機(jī)號(hào)碼分表100張表

????????5、操作記錄表:根據(jù)不同用戶創(chuàng)建不同操作記錄,門店操作記錄表、代理商操作記錄表、寄取件用戶操作記錄表、快遞員操作記錄表、管理員、其他人員操作記錄表

????????可以選擇用戶ID與時(shí)間字段相結(jié)合作為拆分鍵,并按照一周七天進(jìn)行分表

????????CREATE TABLE user_log ( ?userId INT(11) NOT NULL, ?name VARCHAR(64) NOT NULL, ?operation VARCHAR(128) DEFAULT NULL, ?actionDate DATE DEFAULT NULL) DBPARTITION BY HASH(userId) TBPARTITION BY WEEK(actionDate) TBPARTITIONS 7

????????6、其他數(shù)據(jù)量不大的表,就不進(jìn)行分表操作了,單庫單表是落在0庫上。也可以只分庫不分表,具體問題具體分析。業(yè)務(wù)邏輯實(shí)體通常與應(yīng)用場景相關(guān),下面的一些典型應(yīng)用場景都有明確的業(yè)務(wù)邏輯實(shí)體(以此類推,其它應(yīng)用場景也能找到合適的業(yè)務(wù)邏輯實(shí)體),其標(biāo)識(shí)型字段可用來做拆分鍵。

????????面向用戶的互聯(lián)網(wǎng)應(yīng)用,圍繞用戶維度來做各種操作,那么業(yè)務(wù)邏輯實(shí)體就是用戶,可使用用戶ID作為拆分鍵。

????????側(cè)重于賣家的電商應(yīng)用,圍繞賣家維度來做各種操作,那么業(yè)務(wù)邏輯實(shí)體就是賣家,可使用賣家ID作為拆分鍵。

????????游戲類在線應(yīng)用,圍繞玩家維度來做各種操作,那么業(yè)務(wù)邏輯實(shí)體就是玩家,可使用玩家ID作為拆分鍵。

????????車聯(lián)網(wǎng)在線應(yīng)用,圍繞車輛維度來做各種操作,那么業(yè)務(wù)邏輯實(shí)體就是車輛,可使用車輛ID作為拆分鍵。

????????稅務(wù)類在線應(yīng)用,圍繞納稅人來進(jìn)行前臺(tái)業(yè)務(wù)操作,那么業(yè)務(wù)邏輯實(shí)體就是納稅人,可使用納稅人ID作為拆分鍵。

????????總之一點(diǎn),先把分庫分表方案設(shè)計(jì)好后,后面就可以使用PolarDB-X的工具來實(shí)現(xiàn)。

? ? ? ? 1)打開阿里云PolarDB-X控制臺(tái),購買產(chǎn)品,產(chǎn)品有1.0和2.0之分,1.0操作性更多,2.0封裝的更好,根據(jù)自身的需要選擇,我們選擇的是PolarDB-X1.0。

購買PolarDB-X

? ? ? ? 這里要注意的是和PolarDB購買時(shí)選擇的mysql版本要一致,否則不能使用,所以我們這里選擇MySQL5。

PolarDB-X實(shí)例列表

? ? ? ? 點(diǎn)擊實(shí)例名稱進(jìn)入后,選擇點(diǎn)擊“創(chuàng)建數(shù)據(jù)庫”,進(jìn)入創(chuàng)建數(shù)據(jù)庫界面“填寫基本信息”,選擇“水平拆分”,輸入數(shù)據(jù)庫名稱,密碼,選擇字符集后,點(diǎn)擊“下一步”;

創(chuàng)建數(shù)據(jù)庫第一步:填寫基本信息

? ? ? ? 第二步,在界面中選擇可用的PolarDB實(shí)例,當(dāng)然MySQL的版本必須相同,才會(huì)顯示可用,然后點(diǎn)擊左邊的PolarDB數(shù)據(jù)庫移動(dòng)到右邊去。然后點(diǎn)擊“下一步”;

選擇PolarDB

? ? ? ? 第三步,預(yù)檢,如果都顯示成功,代表沒問題,可以點(diǎn)擊“下一步”到“建庫預(yù)覽”界面;

預(yù)檢結(jié)果成功

? ? ? ? 第四步,“建庫預(yù)覽”中顯示了創(chuàng)建后的數(shù)據(jù)庫列表,默認(rèn)一個(gè)PolarDB數(shù)據(jù)庫實(shí)例自動(dòng)分成8個(gè)庫,編號(hào)從00到07,兩個(gè)PolarDB數(shù)據(jù)庫實(shí)例就會(huì)自動(dòng)分成16個(gè)庫,以此類推;最后點(diǎn)擊“下一步”進(jìn)入到最后一個(gè)界面;

建庫預(yù)覽

? ? ? ? 第五步,點(diǎn)擊“下一步”按鈕后,直接回到了“數(shù)據(jù)庫管理”界面,顯示數(shù)據(jù)庫正在創(chuàng)建中,過幾分鐘后,狀態(tài)顯示正常;

數(shù)據(jù)庫正在創(chuàng)建中
創(chuàng)建成功后,狀態(tài)顯示正常

? ? ? ? 這樣就完成了數(shù)據(jù)庫的創(chuàng)建,接下去我們用Navicat工具連接PolarDB-X看一下數(shù)據(jù)庫結(jié)構(gòu)

連接PolarDB-X

? ? ? ? 公網(wǎng)地址去PolarDB-X控制臺(tái)去申請,然后配置白名單訪問即可。?

? ? ? ? 在Navicat中,輸入show database,就能看到剛才分庫創(chuàng)建成功的數(shù)據(jù)庫了。如下圖,一共有8個(gè)庫。

show database

? ? ? ? 接下去就是創(chuàng)建表格了,我們在Navicat中使用DDL語句進(jìn)行操作,例如:包裹訂單表,根據(jù)門店ID分庫,根據(jù)訂單包裹ID分100張表,見下圖:

分庫分表,并查看結(jié)果

? ? ? ? 這樣我們就讓PolarDB-X的工具自動(dòng)分好了800張表,每個(gè)庫100張,總共8個(gè)庫。方不方便,比個(gè)小心心??。不過有朋友可能會(huì)問,為什么要分100張表,不是200張,不是50張表呢?這里我想重點(diǎn)說一下如何選擇分片數(shù)。

????????PolarDB-X中的水平拆分包含了分庫和分表兩個(gè)層次。在創(chuàng)建數(shù)據(jù)庫時(shí),選擇拆分模式為水平拆分,則PolarDB-X為默認(rèn)為每個(gè)私有定制RDS實(shí)例創(chuàng)建8個(gè)物理分庫,每個(gè)物理分庫上可以創(chuàng)建一個(gè)或多個(gè)物理分表,而分表數(shù)通常也被稱為分片數(shù)。

????????計(jì)算公式:

????????一般情況下,建議單個(gè)物理分表的總?cè)萘糠秶?00萬~5000萬行數(shù)據(jù)(若單行記錄超過4KB,建議總?cè)萘糠秶怀^500萬),同時(shí)控制B+樹的深度為3~4層。

????????您可以先預(yù)估1~2年內(nèi)的數(shù)據(jù)增長量,用估算出的總數(shù)據(jù)量除以總的物理分庫數(shù),再除以建議的單個(gè)物理分表的最大數(shù)據(jù)量(本文以500萬為例),即可得出每個(gè)物理分庫上需要?jiǎng)?chuàng)建的物理分表數(shù)。

????????物理分庫上的物理分表數(shù)=向上取整(估算的總數(shù)據(jù)量/(私有定制RDS實(shí)例數(shù) x 8)/ 5,000,000)

????????因此,若計(jì)算出的物理分表數(shù)等于1時(shí),當(dāng)前分庫即可滿足需求,無需再進(jìn)一步分表,保持當(dāng)前每個(gè)物理分庫上一個(gè)物理分表即可。若計(jì)算結(jié)果大于1,則建議既分庫又分表,即每個(gè)物理分庫上再創(chuàng)建多個(gè)物理分表。

? ? ? ? 例如我們的包裹訂單表,每天穩(wěn)定在1000萬單,這樣一個(gè)月就是3個(gè)億數(shù)據(jù),3個(gè)月就是9個(gè)億,1年就是36億,3年達(dá)到100億,我們就做一個(gè)3年的規(guī)劃,之前說過購買2個(gè)PolarDB實(shí)例,根據(jù)上面的公式我們可以計(jì)算:

????????物理分庫上的物理分表數(shù)= CEILING(10,000,000,000 / ( 2 * 8 ) / 5,000,000) = CEILING(125) = 125

結(jié)果為125,那么建議既分庫又分表,即需要在每個(gè)物理分庫上再創(chuàng)建125張物理分表,所以我剛才分庫分表的時(shí)候選擇了100張表格。當(dāng)然如果計(jì)算公式結(jié)果為1,那么您只需要分庫而無需分表,即保持當(dāng)前每個(gè)物理分庫上1張物理分表即可。

? ? ? ? 例如:假設(shè)預(yù)估一張表在2年后的總數(shù)據(jù)量約為1億行,您已購買了4個(gè)私有定制RDS實(shí)例,那么按照分片數(shù)公式進(jìn)行如下計(jì)算:

????????物理分庫上的物理分表數(shù)= CEILING(100,000,000 / ( 4 * 8 ) / 5,000,000) = CEILING(0.625) = 1

? ? ? ? 這種情況下,就只需分庫還不用分表。

? ? ? ? 好了PolarDB-X的文章介紹差不多了,很多使用的方法和經(jīng)驗(yàn),需要大家多實(shí)踐,多看看阿里云官方幫助文檔,如果大家對本文感興趣,或者碰到什么問題,可以在評(píng)論里面聯(lián)系我,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容