Mycat的基本使用
# Mycat的基本使用
下文以Mycat1.6为例,演示基本的使用以及配置。
# 安装
由于Mycat 是用Java语言编写的,所以需要先安装JDK,这里忽略。
根据自己系统下载1.6.7版本 (opens new window),解压:
tar -zxvf Mycat-server-1.6.7.6-release-20220221174943-mac.tar.gz
编辑
conf/server.xml
进行一些基本系统配置,参考server.xml,这里不演示。进入bin目录,启动
./mycat { console | start | stop | restart | status | dump } - start 启动 - stop 停止 - restart 重启 - status 查看状态
访问方式
mysql -h127.0.0.1 -p8066 -uroot -p
# 分库分表
在schema.xml中以依次配置逻辑库、分片表、分片节点、分片主机,例子(分库的配置)如下:
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- tb_booking为逻辑库 -->
<schema name="tb_booking" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<!-- tb_order为分片表,数据在两个分片节点上,分片规则为mod-long,系统默认提供在rule.xml中 -->
<table name="tb_order" primaryKey="id" dataNode="dn1,dn2" rule="mod-long" autoIncrement="true" >
</table>
</schema>
<!-- 分片节点定义,以及物理库名 -->
<dataNode name="dn1" dataHost="localhost1" database="tb_booking1" />
<dataNode name="dn2" dataHost="localhost1" database="tb_booking2" />
<!-- 分片主机的地址 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
在rule.xml中已经默认配置了一些系统提供的分片规则,我们也可以自己配置分库分表规则,如下:
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="tb_order_rule">
<rule>
<columns>id</columns>
<algorithm>partitionByOrderFunc</algorithm>
</rule>
</tableRule>
<!-- 路由函数定义 -->
<function name="partitionByOrderFunc" class="io.mycat.route.function.PartitionByMod"> <
property name="count">2</property>
</function>
</mycat:rule>
Mycat系统提供的常用分片规则如下(在rule.xml都有,自己根据规则名称搜索):
- 时间类:按天分片、自然月分片、单月小时分片
- 哈希类:Hash固定分片、日期范围Hash分片、截取数字Hash求模范围分片、截取数字Hash分片、一致性Hash分片
- 取模类:取模分片、取模范围分片、范围求模分片
- 其他类:枚举分片、范围约定分片、应用指定分片、冷热数据分片
rule-name | 说明 |
---|---|
auto-sharding-long | 自动分片,配置见conf/autopartition-long.txt |
sharding-by-intfile | 把数据分类存储,配置见conf/partition-hash-int.txt |
mod-long | 取模分片,根据分片字段值 % 分片数 。 |
sharding-by-date | 冷热数据分片,根据日期查询日志数据冷热数据分布 ,最近 n 个月的到实时交易库查询,超过 n 个月的按照 m 天 |
sharding-by-murmur | 一致性哈希分片 |
# 全局序列
前面提到Mycat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式。修改server.xml配置,以及对应conf/sequence_*
的文件即可,详见全局 sequence,这里不赘述:
<system>
<property name="sequnceHandlerType">0</property>
</system>
# 读写分离
在schema.xml文件中配置Mycat读写分离。需要搭建MySQL主从架构,并实现主从复制,Mycat负责主从同步问题。
示例如下:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="M1" url="localhost:3306" user="root" password="123456">
<readHost host="S1" url="localhost:3307" user="root" password="123456" weight="1" />
</writeHost>
</dataHost>
或
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="M1" url="localhost:3306" user="root" password="123456"> </writeHost>
<writeHost host="S1" url="localhost:3307" user="root" password="123456"> </writeHost>
</dataHost>
两者区别:第一种当写(主库)挂了读不可用,第二种则可以继续使用(建议使用)。此外,事务内部的一切操作都会走写节点,所以建议读操作不要加事务,如果读延时较大,使用根据主从延时切换的读写分离(switchType参数),或者强制走写节点。
balance参数:
值 | 说明 |
---|---|
0 | 所有读操作都发送到当前可用的writeHost |
1 | 所有读操作都随机发送到readHost和stand by writeHost |
2 | 所有读操作都随机发送到writeHost和readHost |
3 | 所有读操作都随机发送到writeHost对应的readHost上,但是writeHost不负担读压力 |
writeType参数:
值 | 说明 |
---|---|
0 | 所有写操作都发送到可用的writeHost |
1 | 所有写操作都随机发送到readHost |
2 | 所有写操作都随机发送到writeHost,readHost |
# 强制路由
一个查询 SQL 语句以/* !mycat * /
注解来确定其是走读节点还是写节点。
强制走从:
/*!mycat:db_type=slave*/ select * from tb_order
强制走写:
/*!mycat:db_type=master*/ select * from tb_order
1.6 以后Mycat除了支持db_type注解以外,还有其他注解,如下:
/*!mycat:sql=sql */ 指定真正执行的SQL
/*!mycat:schema=schema1 */ 指定走那个schema
/*!mycat:datanode=dn1 */ 指定sql要运行的节点
/*!mycat:catlet=io.mycat.catlets.ShareJoin */ 通过catlet支持跨分片复杂SQL实现以及存 储过程支持等
# 主从延时切换
这里主要是更改dataHost标签的switchType参数:
值 | 说明 |
---|---|
-1 | 表示不自动切换 |
1 | 表示自动切换 |
2 | 基于MySQL主从同步状态决定是否切换 |
3 | 基于MySQL cluster集群切换机制 |
1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠,MyCAT 心跳检查语句配置为 show slave status
,dataHost 上定义两个新属性: switchType="2" 与 slaveThreshold="100",此时意味着开启 MySQL 主从复制状态绑定的读写分离与切换机制,Mycat 心跳机 制通过检测 show slave status
中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延, 当 Seconds_Behind_Master > slaveThreshold 时,读写分离筛选器会过滤掉此 Slave 机器,防止读到很久之 前的旧数据,而当主节点宕机后,切换逻辑会检查 Slave 上的 Seconds_Behind_Master 是否为 0,为 0 时则 表示主从同步,可以安全切换,否则不会切换。配置如下:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat> show slave status </heartbeat>
<writeHost host="M1" url="localhost:3306" user="root" password="123456"> </writeHost>
<writeHost host="S1" url="localhost:3316" user="root"> </writeHost>
</dataHost>
1.4.1 开始支持 MySQL 集群模式,让读更加安全可靠,配置如下: MyCAT 心跳检查语句配置为 show status like ‘wsrep%’
,dataHost 上定义两个新属性: switchType="3",此时意味着开启 MySQL 集群复制状态状态绑定的读写分离与切换机制,Mycat 心跳机制通过检测集群复制时延时,如果延时过大或者集群出现节点问题不会负载改节点。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="3" >
<heartbeat> show status like ‘wsrep%’</heartbeat>
<writeHost host="M1" url="localhost:3306" user="root"password="123456"> </writeHost>
<writeHost host="S1"url="localhost:3316"user="root"password="123456" > </writeHost>
</dataHost>