MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 快速学习 MyCat - 分片 - 水平拆分 - 分片配置及测试

开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 水平拆分 - 分片配置及测试】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/756/detail/13263


MyCat - 分片 - 水平拆分 - 分片配置及测试

内容介绍:

一、分片配置

二、测试

 

一、分片配置

准备工作已经完成,接下来完成 gd_log 这张表的水平分片。首先需要去配置MyCat中的核心配置文件 schema.xml 。打开远程连接工具,找到 MyCat 的核心配置文件,输入 cd /usr/local/mycat ,输入ll,输入 cd conf/,  代码运行如下图:

image.png

找到核心配置文件 schema.xml,文件里面配置了逻辑库、逻辑表等信息。接着需要把垂直拆分时的配置文件的信息备份,重新命名为 mv schema.xml schema_v.xml,配置文件的名字修改完成。因此,my cat 不会找 schema.xml 配置文件,相当于把 schema.xml 文件备份。my cat 需要 schema.xml,所以需要把这一份配置文件拷贝一份来,输入:cp schema_v.xml schema.xml。接下来在进行操作的时候,操作的是 schema.xml, 在 schema.xml 中来进行修改。

此时要修改这个配置文件,通过 Nodepad++ 中的远程工具来进行修改。把当前页面关闭,接着刷新页面,找到 schema.xml,打开编码,然后去修改其中配置。

image.png

对于上图所示的配置,关于逻辑库逻辑表的配置直接删除。然后将如下配置, 直接粘贴过来。

<schema name=”LOG_DB” checkSQLschema=”false”>

<tablename=”tb_log”dataNode=”dn1,dn2,dn3”primaryKey=”id” rule=”mod-long”/></schema>

出现<schema name=”LOG_DB”checkSQLschema=”false sqlMaxLimit=“100”>

<tablename=”tb_log”dataNode=”dn1,dn2,dn3”primaryKey=”id” rule=”mod-long”/></schema>

schema 配置文件出现,LOG_DB 为逻辑库,后面是检测 mysql 语句中的逻辑库的共鸣以及关于查询语句分页的限制,这些都是默认参数,不用改动。

然后在逻辑库下有 tb_log 这张逻辑表。并且这张逻辑表的数据将会在三个数据节点当中存储:dn1,dn2,dn3,而 dn1,dn2,dn3 分别指向的是下面的数据节点:在dataNode 当中的 dn1,dn2,dn3。并且指定主键是 id,后面 rule 指的是分片规则。mod-long 是取模分片。

<dataNode name =”dn1” dataHos=“host1”database=”user_db”/>

<dataNode name =”dn2” dataHos=“host2”database=”goods_db”/>

<dataNode name =”dn3” dataHos=“host3”database=”order_db”/>

rule 关联的是 rule.xml 中,<tableRule name=”mod-long”> 的分片规则。<algorithm>mod-long</algorithm 引用了分割算法 mod-long。

<function name=”mod-long”class=”io.mycat.route.function.PartitionByMod‘’>

<!-- how many data nodes-->

<property name=”count”>3</property>

</function>

mod-long 是取模分片。下面配置有 count,how many data nodes 是数据节点的大小,有多少个数据节点。对于当前来说,是三个数据节点。所以默认为三,不用修改。

<dataNode name =”dn1” dataHos=“host1”database=”user_db”/>

<dataNode name =”dn2” dataHos=“host2”database=”goods_db”/>

<dataNode name =”dn3” dataHos=“host3”database=”order_db”/>

数据主题分别是 host1、 host2 、host3。这三台服务器对应的是 157、158、159。要连接的是 157、158,159 上的数据库。log_db 数据库已经建立出来。。所以在这一块关联的数据库都是 log_db。

<dataNode name =”dn1” dataHos=“host1”database=”log_db”/>

<dataNode name =”dn2” dataHos=“host2”database=”log_db”/>

<dataNode name =”dn3” dataHos=“host3”database=”log_db”/>

这份配置已经完成。

简单回顾一下:配置了逻辑库 LOG_DB, 配置逻辑表 tb_log 。tb_log 将会分散存储在三个节点当中。这三个节点分别对应的是 157、158、159 分别关联的是这三个数据库上面的 log_db 数据库。所采用的分片规则是 mod-long 取模分片。

schema 配置完毕,rule.xml 配置不用改动,接下来需要 server.xml 修改,需要把<user name=”root”dafaultAccount=”true”>中的逻辑库换为 LOG_DB ,代表root 用户以 123456 密码来访问逻辑库 LOG_DB。访问可读可写。而对于 user 用户来说,可以访问 LOG_DB,访问只读。访问密码都是 123456。

 

二、测试

配置完成后,可以启动 mycat 进行测试。启动 mycat, 需要再退一层,要执行 bin目录下的 mycat。

然后重启一下 mycat,重启完成之后,在左侧这块来连接 mysql-h127.0.0.1- P 8066-u root-p。密码 123456。效果如下图。

image.png

现在已经连接 mycat。执行指令 show databases。mycat 当中逻辑库 LOG_DB, 在 mysql1> 后输入 use LOG_DB;  执行如下图。

image.png

现在已经切换到 LOG_DB 中。接着执行 show tables ,可以看到 LOG_DB 当中有一张逻辑表 tb_log。在底层三排数据库是否出现这张表,切换数据库来验证:在mysql1> 后分别输入 use log_db 和 show tables,执行后 157、158、159 上并没有这张表。因为只是在 schema.xml 中定义了逻辑库逻辑表。这张逻辑表没有对应的表结构。所以连接 mycat 可以看到逻辑库以及逻辑表之后,定义 tb_log 的表结构。在 mycat 当中来定义,不需要操作 mysql 。

CREATE TABLE ‘tb_log’(

‘id’ bigint (20)NOT NULL COMMENT ‘ID’,

‘model_name’ var char(200) DEFAULT NULL COMMENT ‘模块名’,

‘model_value’ var char(200) DEFAULT NULL COMMENT ‘,模块值’,

‘return_value’ var char(200) DEFAULT NULL COMMENT ‘返回值’,

‘return_class’ var char(200) DEFAULT NULL COMMENT ‘返回值类型’,

‘operate_user’ var char(20) DEFAULT NULL COMMENT ‘操作用户’,

‘operate_time’ var char(20) DEFAULT NULL COMMENT ‘操作时间’,

‘param_and_value’ var char(500) DEFAULT NULL COMMENT ‘请求参数名及参数值’,

‘operate_class’ var char(200) DEFAULT NULL COMMENT ‘操作类’,

‘operate_method’ var char(200) DEFAULT NULL COMMENT ‘操作方法’,

‘cost_time’ bigint(20) DEFAULT NULL COMMENT ‘执行方法耗时,单位ms’,

‘source’int(1) DEFAULT NULL COMMENT ‘来源:1 PC,2 Android,3 IOS’,

PRIMARY KEY(‘id’)

)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

找到 tb_log 表结构,里面的字段第一个是 id,第二个是模块名,第三个是模块值。日志表当中记录的是当前什么时间什么模块被哪个用户访问,以及访问的是哪个类哪个方法访问的请求参数、返回值、访问的耗时当前执行请求来源是 pc 端还是移动端。所以对应的字段是模块名、模块值、返回值、返回值类型、操作用户、操作时间、请求参数名与参数值以及操作的类、操作方法、操作方法执行耗时以及当前日志的来源是安卓、IOS 还是 PC 端。

把这一条 mysql 语句复制,在 mycat 当中创建 tb_log 表结构,执行后表结构创建完成。

接下来通过 show tables 查看。输入 123456 密码重新连接,在 mysql1> 后分别输入 use log_db 和 show tables,发现 tb_log 表存在,关键点是在 mysql 当中这张表是否存在。发现 157、158、159 这三张表都存在。

接下来需要在 mycat 当中插入数据,执行下面的数据。一共插入了六条数据,id 分别是 123456。

image.png

执行 select*from tb_log 。六条数据都已经插入。id 分别是 123456,六条数据可以全部查询出。

image.png

这六条数据在 mycat 中全部可以查询出。但是需要思考六条数据存储到哪个节点。此时在 157 上,执行 select*from tb_log,发现存储了 3、6 两条数据。

在 158 上,执行select*from tb_log,存储了 1、4 两条数据。在 159 上,执行select*from tb_log3 ,存储的两条数据分别为 2 和 5。

接着分析往 mycat 中插入六条数据时,是怎么分散存储到 157、158、159 上的。当前的架构如下:

image.png

在操作 mysql 语句时,直接操作 mycat,mycat 将请求往下分发,最终将数据存储在 mysql 中。mycat 怎么去判定当前插入的数据落在哪个节点取决于 rule。rule 叫做分片规则。这个分片规则选择的是 mod-long。mod-long 叫做取模分片。在配置 rule=mod-long 时,引用的是 rule.xml 中的分片规则:<columns>id</ columns>

<algorithm>mod-long</algorithm

按照指定的 id 字段(主键)进行取模分片。

在这一块插入 1、2、3、4、5、6 六个主键,利用取模进行分配。果是什么样的?由于配置了当前的节点数量是 3。此时来 id1 后,1%3=1, 如果等于一对应的节点是第二个节点。因为索引值从零开始的,1 是第一个节点。接着 2%3=2 这个是第三个节点,因为索引是从零开始的。2 是第三个节点。然后接下来 3%3=0 0 是第一个节点。

依次罗列: 4%3=1 第二个节点;5%3=2 第三个节点;6%3=0 第一个节点。

第一个节点的 ip 地址是 157,然后第二个节点的 ip 地址是 158。第三个节点的 ip地址是 159。

推算出在第一个节点 157 上存储的主键分别是 3 和 6,在第二个节点上存储的主键分别是 1 和 4,在第三个节点 159 上对应的主键分别是 2 和 5。

image.png

以上就是分片规则 mod-long 按照取模的分析。水平拆分使原来存储在一张表的数据,现在可以分散存储在三个数据库当中,并且完成扩容,利用这三台数据库、服务器对应的磁盘以及 cpu 的相关资源。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
20天前
|
监控 负载均衡 容灾
slb测试配置
slb测试配置
28 5
|
29天前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
52 3
|
2月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
267 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
1月前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
66 1
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
51 2
|
2月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
161 0
|
4天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
30 11
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
60 3
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
76 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
262 7
Jmeter实现WebSocket协议的接口测试方法
下一篇
DataWorks