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)。
其他标签及配置文件,请查看操作手册文档。
热门工具 换一换