MyCAT核心配置详解
1.server.xml配置文件
###server.xml文件,几乎保存了所有mycat需要的系统配置(属性)信息,和用户信息和防火墙信息。
###1.system标签(系统属性配置信息)
- charset属性:字符集设置(默认utf8),如果配置特殊字符集请使用index_to_charset.peoperties中配置。
- defalutSqlParser属性:指定mycat的sql解析器
- processors属性:指定系统可用线程数,默认为机器的核心线程数。
- processorBufferChunk属性:指定每次分配Scoket Direct Buffer的大小。默认是4096字节
- processorBufferPool属性:设置bufferPool缓冲池大小
- ....其他一系列属性
###2.user标签
name:指定mycat用户名
password:指定mycat密码
schemas:执行该用户的逻辑库,可以配置多个。
readOnly:是否是只读用户
benchmark:连接服务降级处理
usingDecrypt是否对密码进行加密。
###3.user标签的子节点privileges节点
此节点是:对该用户的schema及下级的table进行精细化的DML权限控制,privileges节点中check属性用于标识是否开启DML权限检查,默认false不开启权限检查。可以配置多个privliges对应schemas中定义的逻辑库。
dml上属性描述
参数 | 说明 | 示例(禁止增删该查)
------- | ------- | -------
dml | insert,update,select,delete | 0000
配置示例:
<user name="zhuam">
<property name="password">111111</property>
<property name="schemas">TESTDB,TESTDB1</property>
<!-- 表级权限: Table 级的 dml(curd)控制,未设置的 Table 继承 schema 的 dml -->
<!-- TODO: 非 CURD SQL 语句, 透明传递至后端 -->
<privileges check="true">
<schema name="TESTDB" dml="0110" >
<table name="table01" dml="0111"></table>
<table name="table02" dml="1111"></table>
</schema>
<schema name="TESTDB1" dml="0110">
<table name="table03" dml="1110"></table>
<table name="table04" dml="1010"></table>
</schema>
</privileges>
</user>
###3.mycat防火墙配置示例:白名单和 SQL 黑名单说明
<firewall>
<whitehost>
<host user="mycat" host="127.0.0.1"></host> ip 白名单 用户对应的可以访问的 ip 地址
</whitehost>
<blacklist check="true">
<property name="selelctAllow">false</property> sql黑名单允许的 权限 后面为默认
</blacklist>
</firewall>
2.log4j2.xml配置文件
log4j2.xml中定义了,日志的输出级别及日志文件的输出格式。
是日志的级别,生成环境下建议将级别调整为 info/ware,如果是研究测试,特别是碰到异常可以通过开启
debug 模式观察日志的信息查找异常原因。
logs文件夹中的warpper日志:mycat启动过程的日志信息,通过查看此文件查看mycat启动失败原因。
3.rule.xml配置文件
rule.xml里面定义了我们对表进行查分所涉及的规则定义。我们可以对表进行灵活的分片算法
示例:
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
name:指定唯一规则名称,用于标识不同的表规则。
rule:指定对物理表中的那一列进行拆分和使用什么路由算法。
columns:指定要拆分的列名称
algorithm:连接表规则和具体的路由方法,多个表可以使用同一个路由算法。
<function name="func1" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
name:指定算法名称
class::指定路由算法具体类的名字
property:执行具体算法需要用到的一些属性。
4.常用分片算法详解
###1.枚举分片:通过在配置文件中配置可能的枚举id,自己配置分片,本规则适用于特定的场景,比如需要按照省份或区县来做保存,而全国省份区县是固定的,这类业务的配置规则如下
<tableRule name="sharding-by-intfile">
<rule>
<columns>user_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
partition-hash-int.txt 配置:
10000=0
121
10010=1
DEFAULT_NODE=1
###2.固定hash分片算法
本条规则类似于十进制的求模运算,区别在于是二进制的操作,是取 id 的二进制低 10 位,即 id 二进制
&1111111111。
此算法的优点在于如果按照 10 进制取模运算,在连续插入 1-10 时候 1-10 会被分到 1-10 个分片,增
大了插入的事务控制难度,而此算法根据二进制则可能会分到连续的分片,减少插入事务事务控制难度。
###3.范围约定分片算法
此分片适用于,提前规划好分片字段某个范围属于哪个分片,
###4.取模分片算法
此规则为对分片字段求摸运算。
###5.按日期(天)分片
此规则为按天分片。
###6.取模范围约束分片算法
此种规则是取模运算与范围约束的结合,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点
分布。
###7.截取数字做 hash 求模范围约束分片算法
###8.应用指定分片算法:此规则是在运行阶段有应用自主决定路由到那个分片。
###9.截取数字 hash 解析分片算法:此规则是截取字符串中的 int 数值 hash 分片。
###10.一致性 hash:
###11.按单月小时拆分:此规则是单月内按照小时拆分,最小粒度是小时,可以一天最多 24 个分片,最少 1 个分片,一个月完后下月
从头开始循环。每个月月尾,需要手工清理数据。
###12.范围求模分片:先进行范围分片计算出分片组,组内再求模
优点可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题
综合了范围分片和求模分片的优点,分片组内使用求模可以保证组内数据比较均匀,分片组之间是范围分片可以
兼顾范围查询。
最好事先规划好分片的数量,数据扩容时按分片组扩容,则原有分片组的数据不需要迁移。由于分片组内数据比
较均匀,所以分片组内可以避免热点数据问题。
###13.日期范围 hash 分片
###14.冷热数据分片:根据日期查询日志数据 冷热数据分布 ,最近 n 个月的到实时交易库查询,超过 n 个月的按照 m 天分片。
###15.自然月分片:按月份列分区 ,每个自然月一个分片,格式 between 操作解析的范例。
##注意:
mycat全局表配置
<table name="t_area" primaryKey="id" type="global" dataNode="dn1,dn2" />
mycaER 分片表配置
<table name="order" dataNode="dn$1-32" rule="mod-long">
<childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id" />
</table>
5.schema.xml配置文件
schema.xml主要配置了,mycat的逻辑库,逻辑表,分片规则,dataNode以及dataSource属性。
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema>
参数说明查看官方说明文档
6.server标签详解
7.table标签详解
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
Table 标签定义了 MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。
table 标签的相关属性:
name 属性:定义逻辑表的表名,这个名字就如同我在数据库中执行 create table 命令指定的名字一样,同个 schema 标
签中定义的名字必须唯一。
dataNode 属性:定义这个逻辑表所属的 dataNode, 该属性的值需要和 dataNode 标签中 name 属性的值相互对应。
rule 属性:该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属
性属性值一一对应。
ruleRequired 属性:该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体 rule 的话 ,程序会报错。
primaryKey 属性:该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就
会发送查询语句到所有配置的 DN 上,如果使用该属性配置真实表的主键。难么 MyCat 会缓存主键与具体 DN 的
信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的 DN,但是尽管
配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的 DN,来获得数据。
type 属性:该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。
autoIncrement 属性:。。。。。。。。。
subTables:使用方式添加 subTables="t_order$1-2,t_order3"。
目前分表 1.6 以后开始支持 并且 dataNode 在分表条件下只能配置一个,分表条件下不支持各种条件的
join 语句。
needAddLimit 属性:指定表是否需要自动的在每个语句后面加上 limit 限制。由于使用了分库分表,数据量有时会特别巨大。这时
候执行查询语句,如果恰巧又忘记了加上数量限制的话。那么查询所有的数据出来,也够等上一小会儿的。
所以,mycat 就自动的为我们加上 LIMIT 100。当然,如果语句中有 limit,就不会在次添加了。
8.dataNode标签详解
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是
一个独立的数据分片。
dataNode 标签的相关属性:
name 属性:定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用这个名字,来建立表与分片对
应的关系。
dataHost 属性:该属性用于定义该分片属于哪个数据库实例的,属性值是引用 dataHost 标签上定义的 name 属性
database 属性:该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实
例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。
9.dataHost标签详解
作为 Schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具
体的数据库实例、读写分离配置和心跳语句。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<!-- <readHost host="hostS1" url="localhost:3306" user="root" password="123456"
/> -->
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
dataHost 标签的相关属性
name 属性:唯一标识 dataHost 标签,供上层的标签使用。
maxCon 属性:指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属
性的值来实例化出连接池的最大连接数。
minCon 属性:指定每个读写实例连接池的最小连接,初始化连接池的大小。
balance 属性:负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双
主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载
均衡。
3. balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
4. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压
力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有
writeType 属性:负载均衡类型,目前的取值有 3 种:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . 2. writeType="1",所有写操作都随机的发 送到配置的 writeHost,1.5 以后废弃不推荐。switchType 属
性
- -1 表示不自动切换。
- 1 默认值,自动切换。
- 2 基于 MySQL 主从同步的状态决定是否切换。
dbType 属性:指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。
dbDriver 属性:指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。
switchType 属性:-1 表示不自动切换
1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换
心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)
心跳语句为 show status like ‘wsrep%’
tempReadHostAvailable 属性:如果配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、1)。