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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 快速学习 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 的相关资源。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
运维 关系型数据库 MySQL
os-copilot安装_配置_功能测试全集
我是一位中级运维工程师,我平时工作会涉及到 各类服务器的 数据库 与 java环境配置 操作。 我顺利使用了OS Copilot的 -t -f | 功能,我的疑惑是不能在自动操作过程中直接给与脚本运行权限,必须需要自己运行一下 chmod 这个既然有了最高的权限,为什么就不能直接给与运行权限呢。 我认为 -t 功能有用,能解决后台运行基础命令操作。 我认为 -f 功能有用,可以通过task文件中撰写连续任务操作。 我认为 | 对文件理解上有很直接的解读,可以在理解新程序上有很大帮助。
164 86
|
29天前
|
人工智能 Ubuntu Linux
os-copilot使用之全面配置与使用测试
作为一名个人开发者,我主要从事云服务器架设工作。近期,我成功使用了OS Copilot的 `-t -f |` 功能,解决了执行语句、连续提问及快速理解文件的问题。我发现这些功能非常实用,特别是在使用Workbench时能快速调用AI助手。此外,建议将AI功能与xShell工具联动,进一步提升效率。文中详细记录了购买服务器、远程连接、安装配置OS Copilot以及具体命令测试的过程,展示了如何通过快捷键和命令行操作实现高效开发。
130 67
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
域名解析 弹性计算 监控
slb测试基本配置检查
slb测试基本配置检查
123 60
|
3月前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
227 60
|
2月前
|
监控 负载均衡 容灾
slb测试配置
slb测试配置
51 5
|
3月前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
237 1
|
1月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
5天前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
43 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
24 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡

热门文章

最新文章