操作步骤
操作前提:登录华为云
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]()
![avatar]()
2)创建表
执行以下命令,查看已经创建好的逻辑库:
Copied!
show databases;
![avatar]()
执行以下命令,创建表partition_table,订单ID(orderid)做分库键,分库使用HASH算法(分库不分表的情况):
Copied!
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]()
执行以下命令查看库的拆分情况,和表的分布情况:
Copied!
show topology from partition_table;
![avatar]()
可以看到当前逻辑库db_order_data拆分了8个物理库,每个物理库上都有一个同名的物理表,也就是说业务数据将会均分到这8个物理库上,物理表的数据整合起来就是逻辑表partition_table的数据集。
3)执行相关SQL操作
执行以下命令,导入测试数据:
Copied!
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]()
执行以下查询命令,得到结果:
Copied!
select * from partition_table;
![avatar]()
执行以下命令,修改orderid为10的“Strawberry”为“Persimmon”:
Copied!
update partition_table set productName = 'Persimmon' where orderid =10;
![avatar]()
执行以下命令,删除orderid为3的数据:
Copied!
delete from partition_table where orderid = 3;
![avatar]()
完成以上简单的增删改查动作以后,执行以下命令查看查询语句的执行计划:
Copied!
explain select * from partition_table;
可以看到当前语句没有带where条件,进行了全表扫描,查询了所有分片,如果where条件中带了主键和分片键,将会路由到具体的分片执行命令。
![avatar]()
执行以下命令查看delete语句的执行计划:
Copied!
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语句的执行计划:
Copied!
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根据条件路由到指定分片的执行过程。
DDM分库分表实践 - 解决单机数据库困境
实践内容
实践过程涉及DDM(云数据库中间件),VPC(虚拟私有云),ECS(弹性云服务器),RDS(云数据库)等几个华为云最常用服务。主要分为以下几个步骤:
实践目标
操作步骤
操作前提:登录华为云
1. 分库分表
假设当前业务在自建RDS库上,随着业务量增长,磁盘存储容量已经达到上限, CPU/内存都受限于机器配置,计算能力很快到达上限,而业务处于关键时期,将持续甚至爆发式增长,那么如何解决当前的困局?
答案是通过DDM+MySQL的方式,由DDM承担计算的职责,把数据分别放到挂载的MySQL上,让鸡蛋放在多个篮子里,DDM和MySQL支持线性扩展,既能解决计算能力受限的问题,也可以解决存储受限的问题。
接下来先创建实例:
1.1创建云数据库中间件DDM实例
鼠标移动到云桌面浏览器页面中左侧菜单栏,点击服务列表 ->“数据库”->“云数据库中间件DDM”进入实例管理页面,点击“购买数据库中间件实例”进入参数填写页面配置相关参数:
点击“立即购买”【约等待5分钟】,待运行状态从“创建中”变为“正常”则购买完成,等待DDM购买时,可以进入1.2购买RDS。
1.2 创建云数据库MySQL实例
鼠标移动到云桌面浏览器页面中左侧菜单栏,点击服务列表 ->“数据库”->“云数据库RDS”进入实例管理页面,点击“购买数据库实例”进入参数填写页面配置相关参数:
点击“立即购买”【约等5分钟】,待运行状态从“创建中”变为“正常”则购买完成。
1.3 实例创建完成,DDM与MySQL关联
1)在实际业务场景中,首先需要先对业务库和业务表进行规划,根据业务需要,进行库表创建。假设当前已有业务量已达到8000万数据,考虑到未来业务增长,建议单个物理库的数据不超过500万,建议分8个物理库(即下方的逻辑库分片)。 下面先进行创库,返回到DDM的实例管理页面,点击已经创建好的“data-demo-ddm”实例名称,进入实例详情页,找到左侧菜单栏“逻辑库管理”。
点击“创建逻辑库”,进入逻辑库创建页填写相关参数:
2)进行数据库实例连接验证,保证可以连接上MySQL实例,输入1.2创建mysql实例时设置的密码,点击“测试连接”。
注意:密码一定要和创建MySQL实例时保持一致,若密码输入错误,测试连接不通过,将无法创建逻辑库。
点击“完成”,“db_order_data”的逻辑库创建完成。点击“db_order_data”库名进入逻辑库管理页,可以看到已经关联的2个MySQL实例,以及实例上分布的物理分片信息,一般也叫做物理库。
3)点击左侧菜单“账号管理”,点击“创建账号”,创建用于访问库的账号
账号关联逻辑库之后,后面可以通过这个账号来对库进行访问。
1.4 创建表和执行相关SQL操作
1)点击DDM实例页面右上方的登录按钮跳转至DAS,登录DDM实例的db_order_data逻辑库
2)创建表
执行以下命令,查看已经创建好的逻辑库:
执行以下命令,创建表partition_table,订单ID(orderid)做分库键,分库使用HASH算法(分库不分表的情况):
执行以下命令查看库的拆分情况,和表的分布情况:
可以看到当前逻辑库db_order_data拆分了8个物理库,每个物理库上都有一个同名的物理表,也就是说业务数据将会均分到这8个物理库上,物理表的数据整合起来就是逻辑表partition_table的数据集。
3)执行相关SQL操作
执行以下命令,导入测试数据:
执行以下查询命令,得到结果:
执行以下命令,修改orderid为10的“Strawberry”为“Persimmon”:
执行以下命令,删除orderid为3的数据:
完成以上简单的增删改查动作以后,执行以下命令查看查询语句的执行计划:
可以看到当前语句没有带where条件,进行了全表扫描,查询了所有分片,如果where条件中带了主键和分片键,将会路由到具体的分片执行命令。
执行以下命令查看delete语句的执行计划:
可以看到tables="db_order_data_[2].partition_table"表示在分片2上,带有拆分键作为where条件的语句,路由到具体的分片,也就是DDM路由到db_order_data_0002分片所在的MySQL实例上,下推delete语句到mysql执行。
执行以下命令查看update语句的执行计划:
可以看到tables="db_order_data_[6].partition_table"表示在分片6上,同样带有拆分键作为where条件的语句,路由到db_order_data_0006分片所在的MySQL实例上,下推update语句执行。
通过以上实践过程可以体验到如何通过DDM进行分库分表的过程,并了解DDM根据条件路由到指定分片的执行过程。
修订记录