Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?( 五 )


文件说明server.xmlMycat的配置文件 。设置账号、参数等schema.xmlMycat对应的物理数据库和数据库表的配置rule.xmlMycat分片(分库分表)规则
Mycat的架构其实很好理解 。Mycat是代理 。Mycat后面就是物理数据库 。和Web服务器的Nginx类似 。对于使用者来说 。访问的都是Mycat 。不会接触到后端的数据库 。
我们现在做一个主从、读写分离 。简单分表的示例 。结构如下图:
服务器IP说明Mycat192.168.0.2mycat服务器 。连接数据库时 。连接此服务器database1192.168.0.3物理数据库1 。真正存储数据的数据库database2192.168.0.4物理数据库2 。真正存储数据的数据库
Mycat作为主数据库中间件 。肯定是与代码弱关联的 。所以代码是不用修改的 。使用Mycat后 。连接数据库是不变的 。默认端口是8066 。连接方式和普通数据库一样 。如:jdbc:mysql://192.168.0.2:8066/
server.xml
示例

Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
重点关注下面这段 。其他默认即可 。
参数说明user用户配置节点--name登录的用户名 。也就是连接Mycat的用户名--password登录的密码 。也就是连接Mycat的密码--schemas数据库名 。这里会和schema.xml中的配置关联 。多个用逗号分开 。例如需要这个用户需要管理两个数据库db1,db2 。则配置db1,dbs--privileges配置用户针对表的增删改查的权限 。具体见文档吧
我这里配置了一个账号test 密码也是test,针对数据库lunch,读写权限都有 。没有针对表做任何特殊的权限 。
schema.xml
schema.xml是最主要的配置项 。首先看我的配置文件 。
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
参数说明schema数据库设置 。此数据库为逻辑数据库 。name与server.xml中schema对应dataNode分片信息 。也就是分库相关配置dataHost物理数据库 。真正存储数据的数据库
每个节点的属性逐一说明:
schema:
属性说明name逻辑数据库名 。与server.xml中的schema对应checkSQLschema数据库前缀相关设置 。建议看文档 。这里暂时设为folsesqlMaxLimitselect 时默认的limit 。避免查询全表
table:
属性说明name表名 。物理数据库中表名dataNode表存储到哪些节点 。多个节点用逗号分隔 。节点为下文dataNode设置的nameprimaryKey主键字段名 。自动生成主键时需要设置autoIncrement是否自增rule分片规则名 。具体规则下文rule详细介绍
dataNode
属性说明name节点名 。与table中dataNode对应datahost物理数据库名 。与datahost中name对应database物理数据库中数据库名
dataHost
属性说明name物理数据库名 。与dataNode中dataHost对应balance均衡负载的方式writeType写入方式dbType数据库类型heartbeat心跳检测语句 。注意语句结尾的分号要加 。
应用场景
数据库分表分库
配置如下:
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
我在192.168.0.2、192.168.0.3均有数据库lunch 。
lunchmenu、restaurant、userlunch、users这些表都只写入节点dn1 。也就是192.168.0.2这个服务 。而dictionary写入了dn1、dn2两个节点 。也就是192.168.0.2、192.168.0.3这两台服务器 。分片的规则为:mod-long 。
主要关注rule属性 。rule属性的内容来源于rule.xml这个文件 。Mycat支持10种分表分库的规则 。基本能满足你所需要的要求 。这个必须赞一个 。其他数据库中间件好像都没有这么多 。
table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现 。建议还是看下文档 。我这里选择的mod-long就是将数据平均拆分 。因为我后端是两台物理库 。所以rule.xml中mod-long对应的function count为2 。见下面部分代码:
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
数据库读写分离
配置如下:
Java开发分库分表需要解决的问题及mycat是怎样实现分库分表的?

文章插图
这样的配置与前一个示例配置改动如下:
删除了table分配的规则,以及datanode只有一个
datahost也只有一台 。但是writehost总添加了readhost,balance改为1 。表示读写分离 。
以上配置达到的效果就是102.168.0.2为主库 。192.168.0.3为从库 。
注意:Mycat主从分离只是在读的时候做了处理 。写入数据的时候 。只会写入到writehost 。需要通过mycat的主从复制将数据复制到readhost 。这个问题当时候我纠结了好久 。数据写入writehost后 。readhost一直没有数据 。以为是自己配置的问题 。后面才发现Mycat就没有实现主从复制的功能 。毕竟数据库本身自带的这个功能才是最高效稳定的 。

推荐阅读