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

本文涉及的产品
云数据库 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 的相关资源。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
DataWorks NoSQL 关系型数据库
DataWorks操作报错合集之在使用 DataWorks 进行 MongoDB 同步时遇到了连通性测试失败,实例配置和 MongoDB 白名单配置均正确,且同 VPC 下 MySQL 可以成功连接并同步,但 MongoDB 却无法完成同样的操作如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
29 1
|
16天前
|
JavaScript API
【vue】分环境构建(开发/测试/生产)配置
【vue】分环境构建(开发/测试/生产)配置
18 1
|
18天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(下)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
49 1
|
18天前
|
Ubuntu Linux 测试技术
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试(上)
Linux(32)Rockchip RK3568 Ubuntu22.04上部署 Docker: 详细配置与功能测试
65 0
|
19天前
|
分布式计算 Hadoop Scala
Spark【环境搭建 01】spark-3.0.0-without 单机版(安装+配置+测试案例)
【4月更文挑战第13天】Spark【环境搭建 01】spark-3.0.0-without 单机版(安装+配置+测试案例)
22 0
|
20天前
|
关系型数据库 Java 测试技术
云效产品使用常见问题之流水线Maven单元测试链接rds要配置白名单如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
26天前
|
jenkins 测试技术 持续交付
Jenkins配置测试报告后无法正常显示或显示空的解决方法(问题集锦)
根据具体情况逐一排查上述问题,往往可以解决Jenkins配置测试报告无法正常显示或显示空的问题。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
24 0
|
20天前
|
网络协议 安全 测试技术
性能工具之emqtt-bench BenchMark 测试示例
【4月更文挑战第19天】在前面两篇文章中介绍了emqtt-bench工具和MQTT的入门压测,本文示例 emqtt_bench 对 MQTT Broker 做 Beachmark 测试,让大家对 MQTT消息中间 BenchMark 测试有个整体了解,方便平常在压测工作查阅。
114 7
性能工具之emqtt-bench BenchMark 测试示例
|
14天前
|
机器学习/深度学习 数据采集 人工智能
【专栏】AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计
【4月更文挑战第27天】本文探讨了AI在软件测试中的应用,如自动执行测试用例、识别缺陷和优化测试设计。AI辅助工具利用机器学习、自然语言处理和图像识别提高效率,但面临数据质量、模型解释性、维护更新及安全性挑战。未来,AI将更注重用户体验,提升透明度,并在保护隐私的同时,通过联邦学习等技术共享知识。AI在软件测试领域的前景广阔,但需解决现有挑战。
|
3天前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
12 0

热门文章

最新文章