MyCat配置文件详解

发布于 2022-07-21  2.68k 次阅读


#1. server.xml配置文件

server.xml配置文件分为三个标签部分:

  1. system标签:系统配置信息
  2. user标签:用户配置信息
  3. firewall标签:防火墙配置信息

##1.1 system标签

属性 取值 含义
charset utf8,gbk等 设置MyCat的字符集,字符集需要与MySQL的字符集保持一致
nonePasswordLogin 0,1 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户
useHandshakeV10 0,1 使用该选项主要为了兼容高版本的jdbc驱动,是否使用HandshakeV10来与client进行通信 1为是 0为否
useSqlStat 0,1 是否开启SQL的实时统计, 1为开启 0为关闭
useGlobleTableCheck 0,1 是否开启全局表的一致性检测。0为开启、1为关闭
sqlExecuteTimeout 默认300秒 SQL语句执行的超时时间,单位 s
sequenceHandlerType 0,1,2 用于指定MyCat全局序列类型,0:本地文件、1:数据库方式、2:时间戳列方式,默认为本地文件方式(主要用于测试)
sequnceHandlerPattern 正则表达式 必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况
subqueryRelationshipCheck true,false 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false
useCompression 0,1 开启MySQL压缩协议,0:关闭、1:关闭
fakeMySQLVersion 5.5,5.6等 设置模拟的MySQL版本号
processors 1,2…… 指定系统的可用线程数,默认值为CPU核心 * 每个核心运行形成数量。processors会影响processorBufferPool,processorExecutor属性,所以在性能调优时可以适当修改processors值
processorBufferChunk 指定每一次分配Socker Direct Buffer默认值为4096字节,也会影响BufferPool长度,如果一次性获取字节过多导致buffer不够用,则会出现警告,可以调大值
processorExecutor 指定NIOProcessor上共享businessExecutor固定线程池的大小;MyCat把异步交给businessExecutor线程池中,在新版本MyCat中这个连接池使用频次不高,可以把值调小
packetHeaderSize 指定MySQL协议中的报文长度,默认4个字节
maxPackerSize 指定MySQL协议可以携带的数据量最大大小,默认值为16M
idleTimeout 30 指定连接的空闲时间的超时长度;如果超时,将关闭资源并回收,默认30分钟
serverPort 8066 定义MyCat的使用端口,默认8066
managerPort 9066 定义MyCat的管理端口,默认9066

SQL实时统计开启后,MyCat会自动统计SQL语句的执行情况 。可以通过mysql -h IP地址 -P 9066 -u 用户名 -p密码命令在非mycat安装节点中查看MyCat的执行SQL的整体情况;命令:show @@sql、show @@sql.slow、show @@sql.sum等

##1.2 user标签

| 属性 |含义 |
| --- | --- |
| password |密码 |
| schemas |逻辑库 |
| readOnly |是否只读(true/false) |
| benchmark |指定前端的整体连接数量,0或不设置表示不限制 |
| usingDecrypt |是否对密码进行加密,0:否(默认) 1:是 |

:name为用户名,defaultAccount是否为默认用户

表级 DML 权限设置:对用户的Schema及下级的table进行精细化的DML权限控制

<privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>
  1. privileges节点中的check属性是用于标识是否开启DML权限检查,默认false不开启
  2. 权限修饰符四位数(0000 - 1111),对应的操作是IUSD(增改查删)。同时配置了库和表的权限,就近原则以表权限为准
    >privileges节点不配置,等同于check=false,由于MyCat一个用户的schema属性可配置多个schema,所以privileges的下级节点schema节点同样可配置多个,对多库多表进行细粒度的DML权限控制

例1:开启密码加密
密码加密必须依赖于./lib/Mycat-server-1.6.7.5-release.jar

java -cp Mycat-server-1.6.7.5-release.jar io.mycat.util.DecryptUtil 加密格式:用户名:密码

加密格式有两种:
1.主机号:用户名:密码
0.用户名:密码


将密文写入配置文件:

<user name="root" defaultAccount="true">
    <property name="password">GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==</property>
        <property name="schemas">WQLDB</property>
        <property name="usingDecrypt">1</property>
    </user>

##1.3 firewall标签

firewall标签用于定义防火墙:

  1. whitehost:定义IP白名单
  2. blocklist:SQL黑名单
<firewall>
        <!--IP白名单配置-->
       <whitehost>
          <host host="1*7.0.0.*" user="root"/>
       </whitehost>
       <!--SQL黑名单配置-->
       <blacklist check="false">
            <property name="selectAllow">flase</property>
       </blacklist>
</firewall>

白名单:
1,host:IP地址(可以使用*作为通配符)
2,user:用户名

SQL黑名单拦截配置项:check为是否开启(true:开启,false:关闭)

配置项 缺省值 含义
selelctAllow true 是否允许执行SELECT语句
selectIntoAllow true SELECT查询语句中是否允许Into子句
deleteAllow true 是否允许执行DELETE语句
insertAllow true 是否允许执行INSERT语句
replaceAllow true 是否允许执行replace语句
…… …… ……

#2. schema.xml配置文件

schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、表、分片规则、分片节点及数据源的配置

##2.1 schema标签

<!--逻辑库-->
<schema name="WQLDB" checkSQLschema="true" sqlMaxLimit="100">
    <!--逻辑表-->
    <table name="WQL_TB" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>

schema标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。MyCat逻辑库的概念等同于MySQL中database的概念。在需要操作某个逻辑库下的表时,也需要切换逻辑库 schema标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。MyCat逻辑库的概念等同于MySQL中database的概念。在需要操作某个逻辑库下的表时,也需要切换逻辑库

schema标签的属性:

属性 含义
name 指定逻辑库的库名
checkSQLschema 是否自动去除逻辑库的库名(true/false),例:如果为true,"select * from ITWQL.TB_TEST"则MyCat会自动把schema字符(ITWQL)去除。如果指定一个不存在的schema就不会自动去除(会报错)
sqlMaxLimit 当改属性设置为某个值时,每次执行SQL语句如果没有自定义加上limit语句,MyCat会自动在SQL语句后面加上limit。这样主要是避免检索全部数据

table标签定义MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义

<table name="WQL_TB" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

table属性

属性名 数量限制
name String {1}
dataNode String {1…*}
rule String {0…1}
ruleRequired boolean {0…1}
primaryKey String {1}
type String {0…1}
autoIncrement boolean {0…1}
subTables String {1}
needAddLimit boolean {0…1}

1)name

定义逻辑表的表名,在逻辑库下必须唯一

2)dataNode

定义逻辑表所属的datanode,该属性与dataNode标签中的name属性的值对应。如果一张表拆分的数据存储在多个数据节点上,使用","分隔

3)rule
该属性用于指定逻辑表的分片规则的名称,规则的名字是在rule.xml文件中定义的,必须与tableRule标签中的name属性对应

4)ruleRequired

该属性用于指定表是否绑定分片规则,如果配置为true,但是没有具体的rule,程序会报错

5)primaryKey

逻辑表对应真实表的主键

注:分片规则是使用主键进行分片,使用主键进行查询时,就会发送查询语句到配置的所有的datanode上;如果使用该属性配置真实表的主键,那么MyCat会缓存主键与具体datanode的信息,再次使用主键查询就不会进行广播查询了,而是直接将SQL发送给具体的datanode

6)type

该属性定义了逻辑表的类型,目前只有全局表和普通表。

  • 全局表:type值为global
  • 普通表:无需值

7)autoIncrement

  • mysql对非自增长主键,使用1ast_insert_id()是不会返回结果的,只会返回0。所以,只有定义了自增长主键的表,才可以用last_insert_id()返回主键值

  • mycat提供了自增长主键功能,但是对应的mysq1节点上数据表,没有auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的

如果使用这个功能,则最好配合数据库模式的全局序列,使用autoIncrement="true"指定该表使用自增长主键,这样Mycat才不会抛出"分片键找不到"的异常。autoIncrement的默认值为false.

8)needAddLimit

指定表是否需要自动在每个语句的后面加上limit限制,默认为true

##2.2 dataNode标签

dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片

<dataNode name="dn1" dataHost="localhost1" database="wqldb" />

具体的属性:

属性 含义 描述
name 数据节点的名称 需要唯一
dataHost 数据库实例主机名称 引用自database标签中name属性
database 定义分片所属的真实数据库

##2.3 dataHost标签

dataHost标签作为MyCat逻辑库配置的底层标签,直接定义了具体的数据库实例、读写分离、心跳语句

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <!--心跳检测-->
        <heartbeat>select user()</heartbeat>
        <!--writeHost数据写入节点,也就是数据源-->
        <writeHost host="hostM1" url="jdbc:mysql://192.168.68.151:3306" user="root"
                   password="123456789">
        </writeHost>
</dataHost>

dataHost的属性:

属性 含义 描述
name 数据节点名称 唯一 标识,供上层标签使用
maxCon 最大连接数 内部的writeHost,readHost都会使用这个属性
minCon 最小连接数 内部的writeHost,readHost初始化连接池的大小
balance 负载均衡类型 取值0,1,2,3
writeType 写操作分发方式 0:读写操作都转发到第1台writeHost1,假如writeHost1挂了会切换到writeHost2 1:所有的写操作都随机的发送到配置的writeHost上
dbType 后端数据库类型 MySQL,MongoDB,Oracle
dbDriver 数据库驱动 指定连接后端数据库的驱动,目前可选值有native和JDBC
switchType 数据库切换策略 取值-1,1,2,3

注:navite执行的是二进制的MySQL协议,可以使用MySQL和MariaDB。其他类型的数据库需要使用JDBC(需要在MyCat/lib目录下加入驱动jar)

子标签:
1. beartbeat
2. writeHost,readHost

1)beartbeat标签
配置MyCat与后端数据库的心跳,用于检测后端数据库的状态。heartbeat用于配置心跳检测语句

2)writeHost,readHost标签
指定后端数据库的相关配置,用于实例化后端连接池。writeHost指定写实例,readHost指定读实例

在一个dataHost中可以定义多个writeHost和readHost。但是如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost也将不可用

属性:

属性名 含义 取值
host 实例主机标识 对于writeHost一般使用M1;对于readHost,一般使用S1
url 后端数据库连接地址 如果数据库驱动是native,使用ip:port 如果是JDBC,使用jdbc:mysql://ip:port/
user 数据库用户名 按数据库用户名自行填写
password 数据库密码 按数据库密码自行填写
weight 权重 在readHost中作为读节点权重
usingDecrypt 密码加密 默认0:否 1:是

#3. rule.xml配置文件

rule.xml中定义所有库和表切片拆分的规则,在使用过程中可以灵活的使用分片算法,或者对同一个算法使用不同的参数,它让分片过程可配置化

##3.1 tableRule标签

<tableRule name="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>
  • nam:指定分片算法的名称
  • rule:定义分片算法的具体内容
  • columns:指定对应的表中用于分片的列名
  • algorithm:对应function中指定的算法

##3.2 Function标签

<function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
    </function>
  • name:指定算法的名称,该文件中唯一
  • class:指定算法的具体类
  • property:属性标签

#4. sequence配置文件

在分库分表的情况下,原有的自增主键已无法满足在集群中全局唯一的主键,因此,MyCat中提高了全局sequence来实现主键唯一性

在MyCat的配置文件中sequence_conf.properties就配置了序列相关配置

sequence主要包含的几种形式:
1. 本地文件方式
2. 数据库方式
3. 本地时间戳方式
4. 其他方式
5. 自增长主键


路漫漫其修远兮,吾将上下而求索