MyCAT核心配置详解

  1. 云栖社区>
  2. 博客>
  3. 正文

MyCAT核心配置详解

周彬彬 2019-03-27 15:16:15 浏览1882
展开阅读全文

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)。

其他标签及配置文件,请查看操作手册文档。

网友评论

登录后评论
0/500
评论
周彬彬
+ 关注