mycat中间件配置
mycat概述
mycat是开源的数据库中间件,支持大量数据的读写操作,服务在微服务和数据库之间,将数据库的读写分离,分片计算存储的配置管理中心。
执行原理
拦截微服务端需要执行的sql语句,通过分片计算,读写分离,最终开启一个后端数据库连接发送执行,获取执行的结果(连接过程使用的是非阻塞线程)
部署测试
将mycat安装吧解压安装即可。
非分片表格的配置
1.首先准备一个后端数据库表格:mytest.user
2.在安装包的conf目录下编辑server.xml。修改user标签如下:
<user name="root"> #用户的账号也就是登录mysql的账号
<property name="password">root</property> #密码
<property name="schemas">mytest</property> #要管理的数据库
</user>
3.在conf目录下编辑schema.xml
在这个文件中才真正的配置mycat的读写分离和分片。
读写分离:
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
<schema name="mstest" checkSQLschema="true" sqlMaxLimit="100">
<table name="user" primaryKey="ID" dataNode="dn1"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="mstest" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="ip+端口" user="root" password="root">
</writeHost>
<writeHost host="hostM2" url="ip+端口" user="root" password="root">
</writeHost>
</dataHost>
</mycat:schema>
默认情况下,读和写都是在第一个writeHost中执行的.读写分离的控制是dataHost标签的2个属性决定的
writeType取值决定写/读写逻辑
0:表示当前dataHost接收到分片的读写操作中,写操作,只在第一个writeHost
1:表示随机的读写在所有的writeHost和readHost中实现,覆盖balance的逻辑(老版本1.4之前的遗留功能,1.5之后不建议使用,balance独立控制读逻辑)
balance:控制着一个dataHost中所有的读逻辑,一旦writeType=1,就无效了
0:读逻辑不分离的,只在第一个writeHost执行,其他任意readHost writeHost都不进行读操作;
1:除了第一个writeHost以外的所有writeHost和readHost进行随机读取.高并发时,如果其他节点都高负荷的运转进行读操作,也有一部分读取分配到第一个writeHost
2:随机的在所有的节点读取(writeHost readHost);
3:到所有的readHost读取数据,如果分片中不存在readHost,只会到第一个writeHost(备用,第二个,不在参加读分离)
高可用的故障转移
在一个分片中,如果想实现故障转移,有dataHost的属性switchType决定
-1:不开启故障转移
1:开启故障转移(在2个writeHost之间切换)
计算转移时,初始化对2个writeHost分别给了下标 0到1,当0一旦宕机,1将会顶替(下标从1变成0),恢复的writeHost下标自动变成1
分片计算(需要在数据库中再定义一张表)
所以需要在schema中在添加一条table标签
<table name="order" primaryKey="ID" dataNode="dn1,dn2" rule="auto-sharding-long"/>
1.其中dataNode是分片需要的两个数据库分片name属性值
2.rule是表计算分片操作的计算方法;auto-sharding-long:是将表id列值按照0-500w、500w-1000w、1000w-1500w化成三个部分进行存储。(这个计算规则可以在rule.xml文件中可以自定义更改)。
3.另外一种计算规则sharding-by-murmur:这个是根据id的hash一致性进行分片。
全局表
这种表是一种工具字典表,存储数据量不大,而且数据的内容变化不大,一般配置为全局表
配置全局表需要在table标签中加入一个属性type=“global”,并且不需要设置rule。因为这张表会进行复制一份在每个分片中。
er分片表
它是为了解决分片之间不能跨分片查询,但在实际应用中需要关联查询的解决方式。
需要将两个表进行如下配置:
<table name="test_order" primaryKey="ID" dataNode="dn1,dn2" rule="auto-sharding-long">
<childTable name="test_o_item" primaryKey="ID" joinKey="oid" parentKey="id"/>
</table>
将两个表按照逻辑关系建立父子关系。
joinKey:子表的外键字段名称
parentKey:子表外键字段对应父表的字段名称