开发者学堂课程【全面讲解开源数据库中间件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/, 代码运行如下图:
找到核心配置文件 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,打开编码,然后去修改其中配置。
对于上图所示的配置,关于逻辑库逻辑表的配置直接删除。然后将如下配置, 直接粘贴过来。
<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。效果如下图。
现在已经连接 mycat。执行指令 show databases
。mycat 当中逻辑库 LOG_DB, 在 mysql1> 后输入 use LOG_DB; 执行如下图。
现在已经切换到 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。
执行 select*from tb_log
。六条数据都已经插入。id 分别是 123456,六条数据可以全部查询出。
这六条数据在 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 上的。当前的架构如下:
在操作 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。
以上就是分片规则 mod-long 按照取模的分析。水平拆分使原来存储在一张表的数据,现在可以分散存储在三个数据库当中,并且完成扩容,利用这三台数据库、服务器对应的磁盘以及 cpu 的相关资源。