DDM分库分表实践 - 解决单机数据库困境
引导式阅读
Others
DDM分库分表实践 - 解决单机数据库困境
作者
C***
上架时间
2021-11-16 12:28:25

DDM分库分表实践 - 解决单机数据库困境

实践内容

实践过程涉及DDM(云数据库中间件),VPC(虚拟私有云),ECS(弹性云服务器),RDS(云数据库)等几个华为云最常用服务。主要分为以下几个步骤:

  1. 创建并配置DDM和MySQL实例,进行分库分表;
  2. 基本功能验证。通过该实践,用户可以快速掌握DDM分库分表的基本使用,并对所涉及的华为云产品有清晰认识。

实践目标

  1. 熟悉华为云DDM云服务购买及基本配置操作
  2. 掌握DDM分库分表的基本使用

操作步骤

操作前提:登录华为云

1. 分库分表

假设当前业务在自建RDS库上,随着业务量增长,磁盘存储容量已经达到上限, CPU/内存都受限于机器配置,计算能力很快到达上限,而业务处于关键时期,将持续甚至爆发式增长,那么如何解决当前的困局?

答案是通过DDM+MySQL的方式,由DDM承担计算的职责,把数据分别放到挂载的MySQL上,让鸡蛋放在多个篮子里,DDM和MySQL支持线性扩展,既能解决计算能力受限的问题,也可以解决存储受限的问题。

接下来先创建实例:

1.1创建云数据库中间件DDM实例

鼠标移动到云桌面浏览器页面中左侧菜单栏,点击服务列表 ->“数据库”->“云数据库中间件DDM”进入实例管理页面,点击“购买数据库中间件实例”进入参数填写页面配置相关参数:

avatar

  • 计费方式(按需计费)
  • 区域(华北-北京四)
  • 可用区(可用区一)
  • 实例名称(data-demo-ddm)
  • 时区(UTC+08:00 北京,重庆,香港,乌鲁木齐)
  • 节点规格(通用增强型 8C16GB)
  • 节点个数(1)
  • 其他参数默认即可

点击“立即购买”【约等待5分钟】,待运行状态从“创建中”变为“正常”则购买完成,等待DDM购买时,可以进入1.2购买RDS。

avatar

avatar

1.2 创建云数据库MySQL实例

鼠标移动到云桌面浏览器页面中左侧菜单栏,点击服务列表 ->“数据库”->“云数据库RDS”进入实例管理页面,点击“购买数据库实例”进入参数填写页面配置相关参数:

  • 计费方式(按需计费)
  • 区域(华为-北京四),需要和DDM在同一个区域
  • 实例名称(data-demo-rds)
  • 选择MySQL数据库5.7版本
  • 实例类型为“单机”
  • 存储类型:SSD云盘
  • 可用区:选资源的可用区。示例为“可用区二”
  • 时区:UTC+08:00
  • 性能规格:通用型 ,配置为2C4G
  • 存储空间(GB):默认(40GB)
  • 磁盘加密:不加密
  • 虚拟私有云需要和DDM在同一VPC下(注意:如果MySQL实例与DDM不在同一VPC下,网络将不通,无法进行访问
  • 数据库端口:默认(3306)
  • 安全组设置和DDM保持一样
  • 密码设置(注意:密码设置有误将导致后续步骤中测试连接不成功
  • 其他参数默认即可
  • 为了更符合业务场景,购买数量选2,购买两个MySQL实例。

点击“立即购买”【约等5分钟】,待运行状态从“创建中”变为“正常”则购买完成。

avatar

avatar

avatar

1.3 实例创建完成,DDM与MySQL关联

1)在实际业务场景中,首先需要先对业务库和业务表进行规划,根据业务需要,进行库表创建。假设当前已有业务量已达到8000万数据,考虑到未来业务增长,建议单个物理库的数据不超过500万,建议分8个物理库(即下方的逻辑库分片)。 下面先进行创库,返回到DDM的实例管理页面,点击已经创建好的“data-demo-ddm”实例名称,进入实例详情页,找到左侧菜单栏“逻辑库管理”。

avatar

点击“创建逻辑库”,进入逻辑库创建页填写相关参数:

  • 逻辑库模式:拆分库
  • 逻辑库总分片数:8(物理库)
  • 逻辑库名称:db_order_data
  • 选择账号:(选择用于访问库的账号,待库创建完成后进行创建)
  • 选择RDS实例列表(MySQL 5.7),选择列表中已经创建好的“data-demo-rds-0001”和“data- demo -rds-0002”两个实例,点击“下一步”。

avatar

2)进行数据库实例连接验证,保证可以连接上MySQL实例,输入1.2创建mysql实例时设置的密码,点击“测试连接”。

注意:密码一定要和创建MySQL实例时保持一致,若密码输入错误,测试连接不通过,将无法创建逻辑库。

avatar

点击“完成”,“db_order_data”的逻辑库创建完成。点击“db_order_data”库名进入逻辑库管理页,可以看到已经关联的2个MySQL实例,以及实例上分布的物理分片信息,一般也叫做物理库。

avatar

3)点击左侧菜单“账号管理”,点击“创建账号”,创建用于访问库的账号

  • 账号名称:ddmTester
  • 密码:(注意:会于后续1.4章节使用
  • 关联逻辑库:db_order_data
  • 账号权限:全选

avatar

账号关联逻辑库之后,后面可以通过这个账号来对库进行访问。

1.4 创建表和执行相关SQL操作

1)点击DDM实例页面右上方的登录按钮跳转至DAS,登录DDM实例的db_order_data逻辑库

avatar

  • 登录用户名:ddmTester
  • 密码:(注意:1.3章节中创建账号输入的密码
  • 勾选“记录密码”
  • 点击“测试连接”
  • 开启“定时采集”
  • 开启“SQL执行记录”
  • 点击登录

avatar

  • 点击“SQL查询”

avatar

2)创建表

执行以下命令,查看已经创建好的逻辑库:

show databases;

avatar

执行以下命令,创建表partition_table,订单ID(orderid)做分库键,分库使用HASH算法(分库不分表的情况):

CREATE TABLE partition_table ( orderid int NOT NULL AUTO_INCREMENT COMMENT '主键id', productName varchar(128), orderDate date , PRIMARY KEY(orderid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci DBPARTITION BY HASH(orderid);

avatar

执行以下命令查看库的拆分情况,和表的分布情况:

show topology from partition_table;

avatar

可以看到当前逻辑库db_order_data拆分了8个物理库,每个物理库上都有一个同名的物理表,也就是说业务数据将会均分到这8个物理库上,物理表的数据整合起来就是逻辑表partition_table的数据集。

3)执行相关SQL操作

执行以下命令,导入测试数据:

insert into partition_table values (1,'apple',now()),(2,'banner',now()),(3,'blueberry',now()),(4,'cherry',now()),(5,'grape',now()),(6,'grapefruit',now()),(7,'mango',now()),(8,'peach',now()),(9,'pineapple',now()),(10,'Strawberry',now());

avatar

执行以下查询命令,得到结果:

select * from partition_table;

avatar

执行以下命令,修改orderid为10的“Strawberry”为“Persimmon”:

update partition_table set productName = 'Persimmon' where orderid =10;

avatar

执行以下命令,删除orderid为3的数据:

delete from partition_table where orderid = 3;

avatar

完成以上简单的增删改查动作以后,执行以下命令查看查询语句的执行计划:

explain select * from partition_table;

可以看到当前语句没有带where条件,进行了全表扫描,查询了所有分片,如果where条件中带了主键和分片键,将会路由到具体的分片执行命令。

avatar

执行以下命令查看delete语句的执行计划:

explain delete from partition_table where orderid = 3;

avatar

可以看到tables="db_order_data_[2].partition_table"表示在分片2上,带有拆分键作为where条件的语句,路由到具体的分片,也就是DDM路由到db_order_data_0002分片所在的MySQL实例上,下推delete语句到mysql执行。

执行以下命令查看update语句的执行计划:

explain update partition_table set productName = 'Persimmon' where orderid =10;

avatar

可以看到tables="db_order_data_[6].partition_table"表示在分片6上,同样带有拆分键作为where条件的语句,路由到db_order_data_0006分片所在的MySQL实例上,下推update语句执行。

通过以上实践过程可以体验到如何通过DDM进行分库分表的过程,并了解DDM根据条件路由到指定分片的执行过程。

修订记录

发布日期 文档版本 修订说明
2021-11-15 1.0 文档首次发布