MyCAT安装及配置说明[精华一]

序言

在之前搭建好mysql环境,正式开始mycat环境搭建以及配置说明,帮助大家更快了解mycat是什么,能做什么,后面会分别介绍实际运用的搭建:

  • MyCAT搭建读写分离,主从切换
  • MyCAT对数据库进行垂直切分
  • MyCAT对数据库进行水平切分

MySQL安装:
Linux安装MySQL详细教程

MyCat简单介绍

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

MyCat特点

1、一个彻底开源的,面向企业应用开发的大数据库集群
2、支持事务、ACID、可以替代MySQL的加强版数据库
3、一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
4、一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
5、结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
6、一个新颖的数据库中间件产品

简单的说,MyCAT就是:
一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
在这里插入图片描述
Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

Mycat工作原理

Mycat的原理并不复杂,复杂的是代码。Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分
片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

在这里插入图片描述

上述图片里,Orders表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一台到N台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里的分片字段为prov而分片函数为字符串枚举方式。

当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。

如果上述SQL改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就会发给MySQL1与MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有Order By 以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理,这部分的代码也比较复杂,而最复杂的则属两个表的Jion问题,为此,Mycat提出了创新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及结合Storm/Spark引擎等十八般武艺的解决办法,从而成为目前业界最强大的方案,这就是开源的力量!

Mycat应用场景

Mycat发展到现在,适用的场景已经很丰富,而且不断有新用户给出新的创新性的方案,以下是几个典型的应用场景:

  • 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
  • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
  • 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
  • 报表系统,借助于Mycat的分表能力,处理大规模报表的统计;
  • 替代Hbase,分析大数据;
  • 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;
  • Mycat长期路线图;
  • 强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能;
  • 进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能。
  • 不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache
    基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升。

Mycat不适合的应用场景

  • 设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
  • 设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
  • 设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
  • 设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!

需要注意: 在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障. 可以使用的高可用集群方式有: Keepalived+Mycat+Mysql, Keepalived+LVS+Mycat+Mysql, Keepalived+Haproxy+Mycat+Mysql

MyCAT安装

两台虚拟机:
itcast-01:192.168.79.130
itcast-02:192.168.79.131
系统环境说明:系统为centos7,环境为jdk1.8x版本,mysql版本为5.7x版本,mycat版本为1.4

步骤1:上传mycat安装包到linux,目录为/usr/local/

Mycat-server-1.4-release-20151019230038-linux.tar.gz

步骤2:解压mycat安装包,生成mycat文件夹

tar -xvf Mycat-server-1.4-release-20151019230038-linux.tar.gz

mycat文件目录说明:

  • bin : 二进制文件,用于管理mycat,如启动start、重启restart、停止stop、查看状态status等

  • conf : 配置文件

                    server.xml 用于配置Mycat的用户名、密码、逻辑数据库名、服务端口、读写权限等
                    schema.xml 最常用的配置文件,用于配置物理数据库信息(ip、port、username、password、database)、表的配置(表所在的数据节点、表的分片规则、主键是否自增等)、读写分离配置等
                     rule.xml 分片规则配置,mycat提供了十多种分片规则,也可以自定义分片规则
                     log4j2.xml 配置mycat的日志信息,开发的时候建议设置成debug级别
    
  • lib : Mycat是Java语言开发的,这是引用的jar包

  • logs: Mycat打印的日志文件

                   console.log mycat启动时的日志,启动成功一般会有有日志记录,如果没有日志记录可以通过mycat status命令来查看是否启动成功,如果启动失败可以去mycat.log中查看错误日志
                    mycat.log	mycat执行sql对应的日志,可以通过该日志知道mycat是怎么样执行sql的,一些错误日志会输出到该文件中,是一个很重要的日志文件
                    wrapper.log 错误日志也可能在这个日志文件中
                    switch.log
    

mycat命令

[root@itcast-01 bin]# ./mycat --help
Usage: ./mycat { console | start | stop | restart | status | dump }

console:显示启动,输出运行日志
start:隐式启动,启动成功提示
stop:停止mycat运行
restart:重新启动
status:查看启动状态
dump:导出


MyCAT配置说明

  • mycat/conf/schema.xml中定义逻辑库,表、分片节点等内容;
  • mycat/conf/rule.xml中定义分片规则;
  • mycat/conf/server.xml中定义用户以及系统相关变量,如端口等。
scheam.xml配置解析:

Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
  schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包含的Table,一个mycat可以配置多个schema,如果schema中没有配置table直接定义了dataNode,那么这个逻辑库就不能分库分表,可以用做独写分离和主从切换。
  table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode,这是通过表格的分片规则定义来实现的,table可以定义其所属的“子表(childTable)”,子表的分片依赖于与“父表”的具体分片地址,简单的说,就是属于父表里某一条记录A的子表的所有记录都与A存储在同一个分片上。
分片规则:是一个字段与函数的捆绑定义,根据这个字段的取值来返回所在存储的分片(DataNode)的序号,每个表格可以定义一个分片规则,分片规则可以灵活扩展,默认提供了基于数字的分片规则,字符串的分片规则等。
  dataNode: MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上,一般来说,为了高可用性,每个DataNode都设置两个DataSource,一主一从,当主节点宕机,系统自动切换到从节点。
  dataHost:定义某个物理库的访问地址,用于捆绑到dataNode上。

schema.xml实例配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

<!-- schema 逻辑库(可以定义水平拆分表,也可以定义垂直拆分表) name="mycat逻辑库名" -->
	<schema name="MYCATDB" checkSQLschema="false" sqlMaxLimit="100">
		<!-- auto sharding by id (long) -->
		<!-- table 逻辑表  name=逻辑表名(mycat表名) dataNode=逻辑节点(物理分片) rule=分片规则 auto-sharding-long(按照id值划分) 默认每500万为一个分片-->
		<table name="cat_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
		<!-- table 逻辑表 name=逻辑表名 dataNode=逻辑节点(物理分片) rule=分片规则 sharding-by-murmur-order_id 自定义一致hash算法 针对表主键不是id -->
		<table name="cat_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order_id" />
		
		<!--垂直同步 没有分片规则rule-->
		<table name="ver_01" dataNode="dn1" />
		<table name="ver_02" dataNode="dn2"/>
		<table name="ver_03" dataNode="dn3"/>
		<table name="ver_04" dataNode="dn3"/>
	</schema>
	
	<!--定义主从同步数据库,mycat做读写分离,只能绑定一个dataNota-->
	<schema name="KEVINDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sync1">
	</schema>
	
	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" 
		/> -->
		<!--逻辑节点配置 name节点名称  dataHost节点主机(物理节点) database 节点数据库(物理数据库名) -->
	<dataNode name="dn1" dataHost="itcast01" database="db1" />
	<dataNode name="dn2" dataHost="itcast02" database="db2" />
	<dataNode name="dn3" dataHost="itcast02" database="db3" />
	
	<!--独写分离的dataNode database为mysql配置主从同步指定的数据库 kevin-->
	<dataNode name="sync1" dataHost="sync01" database="kevin" />

	<!--
	Balance参数设置:
		1. balance=0, 所有读操作都发送到当前可用的writeHost上。
		2. balance=1”,所有读操作都随机的发送到readHost。
		3. balance=2”,所有读操作都随机的在writeHost、readhost上分发
	WriteType参数设置:
		1. writeType=0, 所有写操作都发送到可用的writeHost上。
		2. writeType=1”,所有写操作都随机的发送到readHost。
		3. writeType=2”,所有写操作都随机的在writeHost、readhost分上发。
	switchType 目前有三种选择:
		-1:表示不自动切换
		1 :默认值,自动切换
		2 :基于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主从复制时延。“
-->
<!--配置独写分离的 数据库配置 -->
	<dataHost name="sync01" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
		<heartbeat>show slave status</heartbeat>
		<!-- can have multi write hosts -->
		<!-- itcast-01 -->
		<writeHost host="hostM1" url="192.168.79.130:3306" user="root"
			password="root123">
			<!-- can have multi read hosts -->
			<readHost  host="hostS1" url="192.168.79.131:3306" user="root" password="root123"/>
		</writeHost>
	</dataHost> 
	
	<dataHost name="itcast01" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<!-- itcast-01 -->
		<writeHost host="hostM1" url="localhost:3306" user="root"
			password="root123">
			<!-- can have multi read hosts -->
		</writeHost>
	</dataHost> 
	<dataHost name="itcast02" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<!-- itcast-01 -->
		<writeHost host="hostM1" url="192.168.79.131:3306" user="root"
			password="root123">
			<!-- can have multi read hosts -->
		</writeHost>
	</dataHost>
</mycat:schema>
标签解析
  • schema标签用于定义MyCat实例中的逻辑库,MyCat可以有多个逻辑库(即可以配置多个schema标签),每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库
属性名 解析
name 逻辑数据库名称,业务操作只知道逻辑数据库,一个mycat可以配置多个schema,使用schema来划分不同的逻辑库
checkSQLschema 是否要检查sql语句中是否包含schema值,schema的值就是schema节点中的name属性,如当执行select * from TESTDB.table;是否要将逻辑数据库“TESTDB.”去掉,一般情况下写SQL也不带“TESTDB.”,所以一般情况下也不需要检查,所以一般情况下都会设置为false
sqlMaxLimit 当sql语句中没有使用limit子句mycat会自动加上,防止返回数据过多影响性能,如果显式使用limit子句了mycat就不会再自动加了,需要注意的是,如果运行的schema为非拆分库的,那么该属性不会生效。需要手动添加limit语句。
  • table 标签定义了MyCat中的逻辑表,所有需要拆分的表都需要在这个标签中定义。
属性名 解析
name 逻辑表名,同一个schema中表名是唯一的,需要注意物理节点创建数据库的表名和逻辑库定义的表名一致,并且自动大写
primaryKey 表主键字段
autoIncrement 表主键是否自增,默认是false,如果要使用这个功能最好配合使用数据库模式的全局序列
dataNode 定义这个逻辑表所属的dataNode, 该属性的值需要和dataNode标签中name属性的值相互对应。如果需要定义的dn过多可以使用逗号分隔
rule 该属性用于指定逻辑表要使用的规则名字,规则名字在rule.xml中定义,代表不通的分片规则
ruleRequired 该属性用于指定表是否绑定分片规则,如果配置为true,但没有配置具体rule的话 ,程序会报错。
type 该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。对应的配置:global表示全局表,全局表的意思是每个物理数据库都会存在这个表,而且每个物理数据库上的这个物理表的数据都完全一致,这样当关联全局表时就不需要跨库关联普通表:不指定该值默认为普通。
  • childTable 配置子表,具有E-R关系的表,即具有父子关系的表或者是一对多关系的表,通过标签和父表关联
属性 解析
name 子表名称
joinkey 子表外键字段,插入子表的时候会使用这个列的值查找父表存储的数据节点。
parentKey 指向与父表关联的字段,程序首先获取joinkey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。
  • dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。一个dataNode标签就是一个独立的数据分片,数据(逻辑)节点关联物理数据库信息并定义物理数据库名
属性 解析
name 标签定义了MyCat中的逻辑节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片
dataHost 该属性用于定义该分片属于哪个数据库实例的,属性值是引用dataHost标签上定义的name属性。
database 真实的物理数据库名称
  • dataHost作为Schema.xml中最后的一个标签,该标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。
属性 解析
name 名称,可以在dataNode节点中的dataHost中引用该名称,唯一标识dataHost标签,供上层的标签使用
maxCon 指定每个读写实例连接池的最大连接,也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数
minCon 指定每个读写实例连接池的最小连接,初始化连接池的大小
balance 负载均衡类型,目前的取值有3种:1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。2. balance=“1”,所有读操作都随机的发送到readHost。3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发。
writeType 负载均衡类型,目前的取值有3种:1. writeType=“0”, 所有写操作都发送到可用的writeHost上。2. writeType=“1”,所有写操作都随机的发送到readHost。3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
dbType 数据库的类型,有mysql、oracle、mongodb、spark等
dbDriver 指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。
switchType 主从切换类型 1:默认值,表示自动切换2: 基于MySQL主从同步的状态决定是否切换(心跳语句为 show slave status) ,一般用于读写分离3:基于 MySQL galary cluster 的切换机制(适合集群) 心跳语句为 show status like ‘wsrep%’

heartbeat 心跳语句

  • select user()
  • show slave status
  • show status like ‘wsrep%’

writeHost和readHost
writeHost:写节点
readHost:读节点,读写分离时一般写走writeHost读走readHost
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

属性 解析
host 用于标识不同实例,一般writeHost我们使用M1,readHost我们用S1。
url 后端实例连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/
user host数据库用户名
password host数据库密码

Server.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
	<system>
	<property name="defaultSqlParser">druidparser</property>
	<property name="charset">utf8</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> 
	 -->
		<!--默认是65535 64K 用于sql解析时最大文本长度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		<!--<property name="sequnceHandlerType">0</property>-->
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		<!--<property name="processorExecutor">16</property>-->
		<!-- 
			<property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
	    	<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
			<property name="processors">32</property> <property name="processorExecutor">32</property> 
			<property name="serverPort">8066</property> <property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
			<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
	</system>
	<!-- 配置用户 -->
	<user name="root">
		<property name="password">root123</property>
		<property name="schemas">MYCATDB,KEVINDB</property> <!-- 用户对应的逻辑库名,配置的其它schemas是无法访问的-->
	</user>

	<user name="test">
		<property name="password">test</property>
		<property name="schemas">MYCATDB,KEVINDB</property>
		<property name="readOnly">true</property><!--只读 -->
	</user>
	<!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property> 
		<property name="weight">1</property> </node> </cluster> -->
	<!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property> 
		</host> </quarantine> -->

</mycat:server>

server.xml用于配置mycat的服务参数,如mycat的服务端口号8066,mycat的管理端口号9066,连接mycat的用户名user.name、密码user.pasword、要连接的数据库user.schemas(多个数据库用逗号分隔,如db1,db2), user节点可以配置多个
注: 一定要注意区分server.xml中配置的mycat用户信息和权限标签,如果用户要对应多个schema,需要通过逗号分隔配置,未配置的无法访问

rule.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
	<tableRule name="rule1">
		<rule>
			<columns>id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="rule2">
		<rule>
			<columns>user_id</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>

	<tableRule name="sharding-by-intfile">
		<rule>
			<columns>sharding_id</columns>
			<algorithm>hash-int</algorithm>
		</rule>
	</tableRule>
	<tableRule name="auto-sharding-long">
		<rule>
			<columns>id</columns>
			<algorithm>rang-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-murmur">
		<rule>
			<columns>id</columns>
			<algorithm>murmur</algorithm>
		</rule>
	</tableRule>
	<!--自定义一致哈希算法分片 -->
	<tableRule name="sharding-by-murmur-order_id">
		<rule>
			<columns>order_id</columns>
			<algorithm>murmur</algorithm>
		</rule>
	</tableRule>
	<tableRule name="sharding-by-month">
		<rule>
			<columns>create_date</columns>
			<algorithm>partbymonth</algorithm>
		</rule>
	</tableRule>
	<tableRule name="latest-month-calldate">
		<rule>
			<columns>calldate</columns>
			<algorithm>latestMonth</algorithm>
		</rule>
	</tableRule>
	
	<tableRule name="auto-sharding-rang-mod">
		<rule>
			<columns>id</columns>
			<algorithm>rang-mod</algorithm>
		</rule>
	</tableRule>
	
	<tableRule name="jch">
		<rule>
			<columns>id</columns>
			<algorithm>jump-consistent-hash</algorithm>
		</rule>
	</tableRule>

	<!--自定义hash一致算法-->
	<function name="murmur"
		class="org.opencloudb.route.function.PartitionByMurmurHash">
		<property name="seed">0</property><!-- 默认是0 -->
		<property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
		<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160-->
		<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
		<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
			用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
	</function>
	<function name="hash-int"
		class="org.opencloudb.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
	</function>
	<function name="rang-long"
		class="org.opencloudb.route.function.AutoPartitionByLong">
		<property name="mapFile">autopartition-long.txt</property>
	</function>
	<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">3</property>
	</function>

	<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
		<property name="partitionCount">8</property>
		<property name="partitionLength">128</property>
	</function>
	<function name="latestMonth"
		class="org.opencloudb.route.function.LatestMonthPartion">
		<property name="splitOneDay">24</property>
	</function>
	<function name="partbymonth"
		class="org.opencloudb.route.function.PartitionByMonth">
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sBeginDate">2015-01-01</property>
	</function>
	
	<function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod">
        	<property name="mapFile">partition-range-mod.txt</property>
	</function>
	
	<function name="jump-consistent-hash" class="org.opencloudb.route.function.PartitionByJumpConsistentHash">
		<property name="totalBuckets">3</property>
	</function>
</mycat:rule>

rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function
tableRule:
name 属性指定唯一的名字,用于标识不同的表规则。
内嵌的rule标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。
columns 内指定要拆分的列名字。
algorithm 使用function标签中的name属性。连接表规则和具体路由算法。当然,多个表规则可以连接到同一个路由算法上。
function:
name 指定算法的名字。
class 制定路由算法具体的类名字。
property 为具体算法需要用到的一些属性,例如:auto-sharding-long(按照id值划分)算法,引用到autopartition-long.txt配置文件,定义id划分规则.

至此MyCAT环境搭建及配置说明完成,后续开始进行实例运用,书写整理不易,请尊重劳动成功.

发布了32 篇原创文章 · 获赞 53 · 访问量 2465

猜你喜欢

转载自blog.csdn.net/qq_41714882/article/details/104518001