一 背景
2020年,笔者负责的一个高德打车弹外订单系统进行了一次扩分库分表和数据库迁移。该订单系统整体部署在阿里云上,服务使用阿里云ECS部署,数据库采用阿里云RDS,配置中心基于阿里云ACM自研,数据同步基于阿里云DTS自研以及自研分库分表组件、分布式ID组件等等。
此次进行扩分库分表的背景是,原4实例4库、每个库64张表一共256张表,部分单表已超千万量级,按当前每日单量量级,一年内单表会达到上亿条记录,单表数据量过大会带来数据库性能问题。
注:【弹内弹外】弹是指弹性计算,弹内与弹外其实是指两套独立的弹性计算网络环境。弹内主要是指部署在阿里生产网的弹性计算环境,最早是基于原有淘宝技术构建的,主要用于支撑淘宝业务。弹外主要是指部署在阿里公有云的弹性计算环境,支撑了阿里云计算业务。
二 容量规划
1 当前分库分表情况
4实例(16C/64G/3T SSD),4库(每个实例一个库),每库64张表,共256张表。
通过RDS后台一键诊断功能,来计算表空间使用情况(这里拿测试环境数据库举例)。
2 容量计算
实例数
数据库的瓶颈主要体现在:磁盘、CPU、内存、网络、连接数,而连接数主要是受CPU和内存影响。CPU和内存可以通过动态升配来提升,但是SSD磁盘容量最大支持到6T(32C以下最大3T、32C及以上最大6T)。
但是现阶段兼顾成本,可先将实例扩容一倍,采用8个实例(16C/64G/3T SSD),每个实例建4个库(database)、每个库128张表(这里实际上是一个成本取舍的过程,理论上应该采取"多库少表"的原则,单库128张表其实太多了,单库建议32或64张表为宜)。
后续如果实例压力提升可进行实例配置升级(16C/128G、32C/128G、32C/256G等);未来如出现单实例升配无法解决,在考虑扩容实例,只需要将database迁移至新实例,迁移成本较小。
表数
按单表最多1000w条数据评估,4096张表可支持日5000w单3年(10.1压测标准)、日2000w单5年的架构。(因业务表比较多,此处忽略掉单条数据大小的计算过程)
库数
32个库,每个库128张表。未来可最大扩容到32个实例,无需rehash,只需要迁移数据。
阿里云RDS规格和价格一览
三 数据迁移
因扩分库分表涉及到reha