万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • Mycat介绍
  • Mycat 核心概念
  • server.xml配置
  • schema.xml配置
  • rule.xml配置
  • Mycat的基本使用
    • 安装
    • 分库分表
    • 全局序列
    • 读写分离
    • 强制路由
    • 主从延时切换
  • Mycat事物
  • MyCat
2022-03-26
目录

Mycat的基本使用

# Mycat的基本使用

下文以Mycat1.6为例,演示基本的使用以及配置。

# 安装

由于Mycat 是用Java语言编写的,所以需要先安装JDK,这里忽略。

  1. 根据自己系统下载1.6.7版本 (opens new window),解压:

    tar -zxvf Mycat-server-1.6.7.6-release-20220221174943-mac.tar.gz
    
  2. 编辑conf/server.xml进行一些基本系统配置,参考server.xml,这里不演示。

  3. 进入bin目录,启动

    ./mycat { console | start | stop | restart | status | dump }
    - start 启动
    - stop 停止
    - restart 重启
    - status 查看状态
    
  4. 访问方式

    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>
上次更新: 5/30/2023, 11:42:20 PM
Mycat事物

Mycat事物→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式