mycat的切分规则
Posted 家园叮咚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mycat的切分规则相关的知识,希望对你有一定的参考价值。
1 mycat简介
MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 mysql 协议 的服务器,前端用 户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协 议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核核心心功功能能是是分分库库 分分表表。配合数据库的主从模式还可实现读写分离。MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的 稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。MyCat 发展到 目前的版本,已经不是一个单纯的 MySQL 代理了,它的后端可以支持MySQL、SQL Server、Oracle、 DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这种新型NoSQL 方式的存储,未来还会支持更多类型 的存储。而在最终用户看来,无论是那种存储方式,在 MyCat 里,都是一个传统的数据库表,支持标准的 SQL 语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。简 单来说MyCat就是实现数据库集群的,对海海量量数数据据的数据存储的一种解决方案,因为很多数据库不想 Oracle一样自带集群的配置,那么在进行海量数据存储的时候就要使用到MyCat进行数据库的管理了。
2 mycat的切分规则
mycat的配置总结 就是 通过schema配置数据库,而table则是配置需要连接的数据库, 其中table标签会指 定dataNode中的name;dataNode则指向dataHost;最后由dataHost配置好连接的服务器,但是注意在 table镖旗中的travelrecord需要留着,因为它的作用是来记录我们的操作的;在127的服务中有存在着test的 数据库其中就有一个t表;我们可以以它作为目标来接;
然后重启mycat的服务,再尝试着连接mycat 来看一下效果
然后再去127的服务器测试 发现也存在与数据;
比如我们以它配置的 company的信息来作操作演示,
重启mycat, 然后连接mycat操作
ERROR 1105 (HY000): backend connect: ConnectionException [code=1049, msg=Unknown database 'db2'] 这个错误主要是因为在127服务器中没有db2.db3的数据库产生的 ;因此我们需要去创建这两个数据 库,但是test是有的因此在127中的test数据库中是存在着创建成功的company表
当我们重新创建好了db2,db3之后就可以先在mycat删除原来创建表的操作;再执行创建就ok ,然后我们 开去 127的MySQL服服务务器器 中查看:
解释:我们可以看到在每一个库中都会存在这个company这表,那也就是company的数据就来这三个库 中。我们可以尝试给三个库添加一条数据看追加在那个数据库的表中;注意一定是要在 mycat的的服务 中 执行
这是因为当前的company表设置是一个全局的,没有根据规则去分配;而是会选择所有的库都会去执行这 样的操作,那么如果我们查询呢?会不会出现三条这样的数据?
可以看到只有一条数据
3.1 全局表
我们可以先做个演示;以配置文件中的
重启mycat
在执行的时候可以看到存在着这样的异常;这个异常产生的原因主要是因为分区表需要有指定的字段去进 行分区表没有指定分区的字段;也就是说当前的employee表实际上就是一个分区表,根据了某一个字段进 行分区;而目前在当前的表中是没有这个字段产生的问题, 而这个分区的设置很显然是通过添加了 rule="sharding-by-intfile" 这个属性产生的;rule属性的作用就是定义分区的规则 -》 而“sharding-by-intfile” 则是分区的规则, 那么这个分区定义在哪 里?通过查看配置文件我们可以看导rule.xml;而这个配置文件则就是分片规则定义所在;
打开配置文件可以看到是存在这么一个信息的, 而tableRule就是定义一个规则, name属性就是规则名;rule标签就是规则内容,columns标签则就是规则的字段,而algorithm是规则方式
因此实际上我们需要在employee表中添加sharding_id这个字段,数据类型int
alter table employee add column sharding_id int not null;
在添加完了字段之后我们可以来试试添加数据
如上操作演示之后我们可以看到employee在数据新增的时候根据sharding_id进行了数据的分区,而分区主 要是根据value 10000与10010;并且字段列是必须要在insert 中指明的负责就无法实行;
对于数据进行查询
mycat中查询
127中的MySQL 进行查询
那么这个规则如何定义的呢?在rule.xml中有如下的配置信息
其中制定了一个文件partition-hash-int.txt文件,我们可以看一下conf目录下的这个文件内容
10000=0
10010=1
可以看到有如上的配置;那么也就是说实际mycat的执行就是通过与根据sharding_id的值进行了if的判断选 择了对应的数据源节点;我们可以看看源码;在github中下载好源码 https://github.com/MyCATApache/Mycat-Server/releases
以上是关于mycat的切分规则的主要内容,如果未能解决你的问题,请参考以下文章