使用阿里云云原生平台对系统进行重构和升级(3)——使用阿里云的PolarDB-X进行分库分表

        上一篇文章讲解了如何使用阿里云的GTS,进行全局分布式事务处理。这篇文章将介绍如何使用阿里云的PolarDB-X中间件进行分库分表的操作。

        系统的重构,尤其是老系统的数据最后要转移到新系统中,而且数据量又是亿万级别的,处理起来真的是很棘手。

        首先,也是最关键的就是要理清新系统的产品需求,其次要把老系统中的数据进行整理和筛选,然后整理出分库分表的思路和方案,最后要制定出新老数据库迁移的方案,这里根据快递驿站系统的把这些步骤具体化,并详细讲述如何使用PolarDB-X中间件进行分库分表。

        一、整理新系统的产品需求

        这是产品经理干的活,我这里就简单描述一下需要开发的新系统的一些要点。新系统大致上就是两大模块的结合,一个就是包裹系统模块,快递驿站接受快递入库,用户在驿站取件出库,驿站将信息同步给快递公司,通知给用户包裹状态,用户还可以在驿站寄件;第二个就是共配系统模块,不同快递在同一个仓库集中放货,这样一来可以节省成本,再者一起配送更加方便,尤其偏远农村,因为快递包裹少,每个快递公司隔三差五才送一次快递,如果有了共配系统,那一起配送的快递包裹就多了,可以实时送达。所以整个新系统是非常庞大的,软件架构详见第一篇文章中的插图。

        二、对老系统中的数据进行筛选和整理

        1、目前系统的情况说明

        包裹订单表按照月份拆分,碰到双十一双十二购物大促期间,单表中存的数据量超大,导致门店、代理商后台查询或统计数据时很慢,造成系统瓶颈甚至宕机,客户要求赔偿损失,后果严重。

        其他大数据量的表都未进行拆分,例如:取件短信通知表,日志表等等,严重影响系统性能,还有大量的慢SQL查询,都是导致系统变慢的原因。

        2、新系统的规划和展望

        根据公司近3-5年规划及展望:

        1)包裹数据量的规划,每天稳定在1000万单,这样一个月就是3个亿数据,3个月就是9个亿,1年就是36亿;

        2)短信、微信和语音通知量将会是订单量的2倍以上(入库、出库各一次),因为会存在多发的情况,这样1个月就是6个亿,3个月18亿,1年100亿;

        3)操作记录根据门店、代理商、快递员、管理员、寄取件用户的每天操作,预估3000万次;

        4)新系统也要记录寄取件用户信息,全国100万家门店,服务5个亿用户寄取件。

        3、设计方案

        根据上面所描述的,将数据分为3类:

        1)热数据——3个月之内的数据,需要实时查询操作;

        热数据存储在PolarDB中,数据量大的表,进行分库分表;

        2)较冷数据——3-12个月的数据,需要存储,进行统计分析;

        热+较冷数据存储在 AnalyticDB中,实时从PolarDB中同步,使用QuickBI进行数据的分析、处理和统计;

        3)冷数据——12个月以上的数据,需要存储已备后查;

        冷数据(基本不查)存储在HBase中,用于节约成本;

        三、使用阿里云的PolarDB数据库进行数据的存储和管理

        PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。100%兼容MySQL 5.6/5.7/8.0,PostgreSQL 11,高度兼容Oracle。

        PolarDB采用存储和计算分离的架构,所有计算节点共享一份数据,提供分钟级的配置升降级、秒级的故障恢复、全局数据一致性和免费的数据备份容灾服务。PolarDB既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、自我迭代的优势,例如PolarDB MySQL引擎作为“超级MySQL”,性能最高可以提升至MySQL的6倍,而成本只有商用数据库的1/10,每小时最低只需1.3元即可体验完整的产品功能。PolarDB MySQL引擎 100%兼容原生MySQL和RDS MySQL,您可以在不修改应用程序任何代码和配置的情况下,将MySQL数据库迁移至PolarDB MySQL引擎。

        而且PolarDB最高100 TB,不再需要因为单机容量的天花板而去购买多个实例做分片,由此简化应用开发,降低运维负担。   

        说了这么多PolarDB的好处,心动不如心动,立马开始使用。

        首先在阿里云进入PolarDB控制台进行购买,我们项目打算购买2个PolarDB,后期也可以根据业务需要变更配置,增加只读节点,进行扩容。

购买PolarDB界面

        兼容性可以选择MySQL5.6,如果用最新MySQL8.0,后续要改配这个是改不了的,所以前期根据项目的情况进行选择;系列建议选择集群版,节点规格也根据自身的需求选择,我们这里选择的是8核64GB,当然有钱可以任性选择独占物理机😂。为了测试和演示,买了2核8GB。

集群列表
PolarDB基本信息界面

        在基本信息界面可以对创建的PolarDB进行白名单设置,添加集群账号,编辑主地址和集群地址,还可以增删节点,变更配置,具体的使用可以参考阿里云PolarDB使用指南,反正我是用了很爽。

        其他再说一下慢SQL的查询功能,这个太好用了,可以查询到每个节点中,查询缓慢的SQL的信息,进行慢日志分析,可以根据时间进行查询,如果有慢SQL,会显示出来,并可查看该次慢SQL的详细信息。

慢SQL界面

        四、使用阿里云的PolarDB-X进行分库分表

        上面我们购买完PolarDB后,接下去就是要创建数据库,然后对数据量大的表,进行分库分表的操作。

        第一步还是先要有分库分表的方案,下面列出了项目中部分分库分表的方案:

        1、包裹订单表

        根据门店ID分库,根据订单包裹ID分表 100张表

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

        根据门店ID分库,根据短信ID分表 200张表

        3、物流记录表

        根据订单包裹ID分库,根据门店ID分表 100张表

        4、寄取件用户表

        根据用户ID分库,根据取件手机号码分表100张表

        5、操作记录表:根据不同用户创建不同操作记录,门店操作记录表、代理商操作记录表、寄取件用户操作记录表、快递员操作记录表、管理员、其他人员操作记录表

        可以选择用户ID与时间字段相结合作为拆分键,并按照一周七天进行分表

        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、其他数据量不大的表,就不进行分表操作了,单库单表是落在0库上。也可以只分库不分表,具体问题具体分析。业务逻辑实体通常与应用场景相关,下面的一些典型应用场景都有明确的业务逻辑实体(以此类推,其它应用场景也能找到合适的业务逻辑实体),其标识型字段可用来做拆分键。

        面向用户的互联网应用,围绕用户维度来做各种操作,那么业务逻辑实体就是用户,可使用用户ID作为拆分键。

        侧重于卖家的电商应用,围绕卖家维度来做各种操作,那么业务逻辑实体就是卖家,可使用卖家ID作为拆分键。

        游戏类在线应用,围绕玩家维度来做各种操作,那么业务逻辑实体就是玩家,可使用玩家ID作为拆分键。

        车联网在线应用,围绕车辆维度来做各种操作,那么业务逻辑实体就是车辆,可使用车辆ID作为拆分键。

        税务类在线应用,围绕纳税人来进行前台业务操作,那么业务逻辑实体就是纳税人,可使用纳税人ID作为拆分键。

        总之一点,先把分库分表方案设计好后,后面就可以使用PolarDB-X的工具来实现。

        1)打开阿里云PolarDB-X控制台,购买产品,产品有1.0和2.0之分,1.0操作性更多,2.0封装的更好,根据自身的需要选择,我们选择的是PolarDB-X1.0。

购买PolarDB-X

        这里要注意的是和PolarDB购买时选择的mysql版本要一致,否则不能使用,所以我们这里选择MySQL5。

PolarDB-X实例列表

        点击实例名称进入后,选择点击“创建数据库”,进入创建数据库界面“填写基本信息”,选择“水平拆分”,输入数据库名称,密码,选择字符集后,点击“下一步”;

创建数据库第一步:填写基本信息

        第二步,在界面中选择可用的PolarDB实例,当然MySQL的版本必须相同,才会显示可用,然后点击左边的PolarDB数据库移动到右边去。然后点击“下一步”;

选择PolarDB

        第三步,预检,如果都显示成功,代表没问题,可以点击“下一步”到“建库预览”界面;

预检结果成功

        第四步,“建库预览”中显示了创建后的数据库列表,默认一个PolarDB数据库实例自动分成8个库,编号从00到07,两个PolarDB数据库实例就会自动分成16个库,以此类推;最后点击“下一步”进入到最后一个界面;

建库预览

        第五步,点击“下一步”按钮后,直接回到了“数据库管理”界面,显示数据库正在创建中,过几分钟后,状态显示正常;

数据库正在创建中
创建成功后,状态显示正常

        这样就完成了数据库的创建,接下去我们用Navicat工具连接PolarDB-X看一下数据库结构

连接PolarDB-X

        公网地址去PolarDB-X控制台去申请,然后配置白名单访问即可。 

        在Navicat中,输入show database,就能看到刚才分库创建成功的数据库了。如下图,一共有8个库。

show database

        接下去就是创建表格了,我们在Navicat中使用DDL语句进行操作,例如:包裹订单表,根据门店ID分库,根据订单包裹ID分100张表,见下图:

分库分表,并查看结果

        这样我们就让PolarDB-X的工具自动分好了800张表,每个库100张,总共8个库。方不方便,比个小心心❤️。不过有朋友可能会问,为什么要分100张表,不是200张,不是50张表呢?这里我想重点说一下如何选择分片数。

        PolarDB-X中的水平拆分包含了分库和分表两个层次。在创建数据库时,选择拆分模式为水平拆分,则PolarDB-X为默认为每个私有定制RDS实例创建8个物理分库,每个物理分库上可以创建一个或多个物理分表,而分表数通常也被称为分片数。

        计算公式:

        一般情况下,建议单个物理分表的总容量范围在500万~5000万行数据(若单行记录超过4KB,建议总容量范围不超过500万),同时控制B+树的深度为3~4层。

        您可以先预估1~2年内的数据增长量,用估算出的总数据量除以总的物理分库数,再除以建议的单个物理分表的最大数据量(本文以500万为例),即可得出每个物理分库上需要创建的物理分表数。

        物理分库上的物理分表数=向上取整(估算的总数据量/(私有定制RDS实例数 x 8)/ 5,000,000)

        因此,若计算出的物理分表数等于1时,当前分库即可满足需求,无需再进一步分表,保持当前每个物理分库上一个物理分表即可。若计算结果大于1,则建议既分库又分表,即每个物理分库上再创建多个物理分表。

        例如我们的包裹订单表,每天稳定在1000万单,这样一个月就是3个亿数据,3个月就是9个亿,1年就是36亿,3年达到100亿,我们就做一个3年的规划,之前说过购买2个PolarDB实例,根据上面的公式我们可以计算:

        物理分库上的物理分表数= CEILING(10,000,000,000 / ( 2 * 8 ) / 5,000,000) = CEILING(125) = 125

结果为125,那么建议既分库又分表,即需要在每个物理分库上再创建125张物理分表,所以我刚才分库分表的时候选择了100张表格。当然如果计算公式结果为1,那么您只需要分库而无需分表,即保持当前每个物理分库上1张物理分表即可。

        例如:假设预估一张表在2年后的总数据量约为1亿行,您已购买了4个私有定制RDS实例,那么按照分片数公式进行如下计算:

        物理分库上的物理分表数= CEILING(100,000,000 / ( 4 * 8 ) / 5,000,000) = CEILING(0.625) = 1

        这种情况下,就只需分库还不用分表。

        好了PolarDB-X的文章介绍差不多了,很多使用的方法和经验,需要大家多实践,多看看阿里云官方帮助文档,如果大家对本文感兴趣,或者碰到什么问题,可以在评论里面联系我,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容