0%

Mycat配置文件

Mycat配置文件

Mycat简介中有提到Mycat有三个重要的配置文件schema.xmlserver.xmlrule.xml ,还有一些其他的依赖配置文件,接下来就分别介绍一下

server.xml配置文件

定义Mycat用户以及系统相关变量,如用户名、密码、端口等

两个重要的标签为user标签和system标签

user标签

主要用于定义登录Mycat的用户和权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- 用户 name表示用户名-->
<user name="mycat" defaultAccount="true">

<property name="password">123456</property>
<!-- 该用户可以访问的schema -->
<property name="schemas">TESTDB,db1,db2</property>
<property name="defaultSchema">TESTDB</property>
<!-- 是否只读 -->
<property name="readOnly">true</property>
<!-- benchmark用于现在整体连接数量,如果为0或不设置则表示不限制 -->
<property name="benchmark">1000</property>
<!-- 是否使用密码加密功能,默认为0
加密命令为java -cp Mycat-server-1.6.7.4-release.jar org.opencloudb.util.DecryptUtil 0:user:password
-->
<property name="usingDecrypt">1000</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>

system标签

配置的为系统配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<system>
<!-- 字符集,在index_to_charset.properties中配置特殊字符集,如utf8mb4,格式为ID=字符集 要保证和数据库配置的字符集一致 `show variables like 'collation_%';show variables like 'character_set_%'` -->
<property name="charset">utf8</property>
<!-- 默认的sql解析器 -->
<property name="defaultSqlParser">druidparser</property>
<!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="nonePasswordLogin">0</property>
<!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
<property name="ignoreUnknownCommand">0</property>
<property name="useHandshakeV10">1</property>
<property name="removeGraveAccent">1</property>
<!-- 1为开启实时统计、0为关闭 -->
<property name="useSqlStat">0</property>
<!-- 会在全局表中增加_MYCAT_OP_TIME字段来进行一致性检测 1为开启全局表一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<!-- SQL 执行超时,超过该时间,会直接关闭连接 单位:秒-->
<property name="sqlExecuteTimeout">300</property>
<!-- 全局序列的类型 0.本地文件 1.数据库 2.时间戳序列 -->
<property name="sequnceHandlerType">1</property>
<!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
-->
<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
<!--1为开启mysql压缩协议-->
<!-- <property name="useCompression">1</property>-->
<!--设置模拟的MySQL版本号-->
<property name="fakeMySQLVersion">5.6.20</property>
<!-- <property name="processorBufferChunk">40960</property> -->
<!-- 指定系统可用线程数量 -->
<property name="processors">1</property>
<!-- 每次分配给Socket Diect Buffer的字节数,默认4096,如果一次性获取的字节过多会导致Buffer不够用,此时会出现警告,可以适当调大该值 -->
<property name="processorBufferChunk">4096</property>
<!-- 指定BufferPool的计算比例,计算逻辑为 processorBufferChunk*processors*1000-->
<property name="processorBufferPool">4096000</property>
<!-- 用来控制ThreadLocalPool分配Pool的比例大小,默认100-->
<property name="processorBufferLocalPercent">100</property>
<!-- 指定NIOProcessor上共享businessExecutor固定线程池的大小 -->
<property name="processorExecutor">32</property>

<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->

<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->

<!-- Mycat的使用端口 -->
<property name="serverPort">8066</property>
<!-- Mycat的管理端口 -->
<property name="managerPort">9066</property>
<!-- 连接空闲时间的超时时间,超过将会回收,单位毫秒 -->
<property name="idleTimeout">300000</property>
<!-- 服务监听的IP地址 -->
<property name="bindIp">0.0.0.0</property>
<!-- 5 * 60 * 1000L; 连接空闲检查 -->
<property name="dataNodeIdleCheckPeriod">300000</property>
<property name="frontWriteQueueSize">4096</property>

<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>

<!-- 是否启用非堆内存处理跨分片结果集
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">0</property>

<!--
单位为m
-->
<property name="memoryPageSize">64k</property>

<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>

<property name="useStreamOutput">0</property>

<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</property>


<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">false</property>

<!-- XA Recovery Log日志路径 -->
<!--<property name="XARecoveryLogBaseDir">./</property>-->

<!-- XA Recovery Log日志名称 -->
<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
<property name="strictTxIsolation">false</property>

<property name="useZKSwitch">true</property>
<!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
<property name="parallExecute">0</property>


</system>

schema.xml配置文件

定义逻辑库,表、分片节点等内容

schema标签

定义逻辑库,可以有多个逻辑库

1
2
3
4
5
6
7
8
9
10
11
<!-- dataNode 用于绑定逻辑库到具体的数据库上
checkSQLschema 设置为true时,mycat会自动去掉sql语句中对应的schema字符。如select * from TESTDB.order 会变为 select * from order
sqlMaxLimit 对于执行的sql语句,如果没有limit的话,会自动加上limit
-->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
<!-- auto sharding by id (long) -->
<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
<table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
table标签

table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要在table标签中定义

1
2
3
4
5
6
7
8
9
10
11
<!-- name 定义逻辑表的名称
dataNode 逻辑表所属的dataNode
rule 规则的名字,是在rule.xml中定义的
ruleRequired 指定表是否绑定分片规则,如果为ture,但是没有配置分片规则,会报错
primaryKey 主键
type 逻辑表类型 global表示全局表,不指定的话为非全局表
autoIncrement 自增,mysql对于非自增的使用last_insert_id()只会返回0,只有设置了自增才会返回主键的值
subTables 分表,使用subTables="t_order$1-2,t_order3"方式
needAddLimit 指定表是否需要自动加上limit
-->
<table name="t_order" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
childTable标签

用来配置ER分片的子表,通过标签上的属性与父表相连

1
2
3
4
5
<!-- 
joinKey 插入子表时会使用这个值查找父表存储的数据节点
parentKey 与父表建立关联关系的列名
-->
<childTable name-"order_detail" primaryKey="id" joinKey="order_id" parentKey="id">

dataNode标签

定义了Mycat中的数据节点,每一个dataNode标签就是一个独立的数据分片

1
2
3
4
<!-- dataHost 使用的是dataHost标签的name,定义该分片所属的数据库实例
database 定义该分片所属数据库实例上的具体的库
-->
<dataNode name="dn1" dataHost="host1" database="mybatis" />

如果对应的dataNode比较多的话,可以使用

1
2
3
<!-- 这里配置database="db$0-99" 表示的是mysql中的dn0~dn99的数据库 -->
<dataNode name="multipleDn" dataHost="host1" database="db$0-99" />
<dataNode name="multipleDn2" dataHost="host2" database="db$100-199" />

dataHost标签

定义了具体的数据库实例、读写分离以及心跳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!-- maxCon 每个读写实例连接池的最大连接数
minCon 每个读写实例连接池的最小连接数,初始化连接池的大小
balance是用来配置读写分离的
0:不开启读写分离,所有的读请求都发送到当前可用的writeHost写主机上
1:全部的readHost与writeHost(备主写)参与select语句的负载均衡,双主双从,且双主互为主备
2:所有的读操作随机在writeHost和readHost上分发
3:所有的读请求随机分发到readHost,writeHost不负担读压力

writeType 多主配置使用
0:所有写操作都发送到第一个writeHost,第一个挂了切换到第二个writeHost,当第一个恢复过来也不会切换,切换记录在dnindex.properties中
1:所有写操作都随机发送到配置的writeHost,1.5后废弃不推荐使用
dbType 指定连接的数据库类型,如mysql
dbDriver 连接数据库所使用的Driver,可选native和JDBC。native执行的是二进制的MySQL协议,可使用的有MySQL和MariaDB;其他类型数据库都需要使用JDBC驱动来支持
switchType 写主机切换方式
1:默认值,自动切换
-1:不自动切换
2:基于Mysql主从同步的状态决定是否切换,`show slave status`
3. 基于mysql galary cluster的切换机制,适用于集群 `show status like 'wsrep%'`
-->
<dataHost name="host1" 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 -->
<!-- 写主机
url 如果dbDriver为native,形式为address:port;如果dbDriver为JDBC,则形式为jdbc:MySQL://localhost:3306
weight 在readHost中作为度节点的权重
usingDecrypt 是否加密
-->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
<writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/>

<!-- 读主机 -->
<readHost host="hostS1" url="localhost:3307" user="root"
password="123456"></readHost>

</dataHost>

sequence配置文件

Mycat使用sequence配置文件来实现全局的分布式sequence,根据不同的配置方式来使用不同的配置文件

在server.xml中配置的system标签中的sequnceHandlerType 0.本地文件 1.数据库 2.时间戳序列

详细的使用见分布式全局序列

本地文件方式

配置在sequence_conf.properties配置文件中,格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#default global sequence
# HISIDS表示使用过的历史分段
GLOBAL.HISIDS=
# MINID表示最小ID
GLOBAL.MINID=10001
# MAXID表示最大ID
GLOBAL.MAXID=20000
# CURID表示当前ID
GLOBAL.CURID=10000

# self define sequence
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000

数据库方式

配置在sequence_db_conf.properties配置文件中,格式如下

1
2
3
4
5
6
#sequence stored in datanode
# 配置所在的dataNode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1

时间戳序列方式

配置在sequence_distributed_conf.properties配置文件中

1
2
3
4
#sequence depend on TIME
# 多个节点配置不同的WORKID、DATAACENTERID,这样使得生成的id不会重复
WORKID=01
DATAACENTERID=01

rule.xml配置文件

定义了拆分表的所有规则,包含了tableRule标签和function标签

tableRule标签

定义规则

1
2
3
4
5
6
7
8
9
<tableRule name="sharding-by-date">
<rule>
<!-- columns 指定对应的表用于分片的列名
algorithm 对应function中指定的算法的名称
-->
<columns>createTime</columns>
<algorithm>partbyday</algorithm>
</rule>
</tableRule>

function标签

定义规则使用的算法

1
2
3
4
5
6
7
8
<function name="partbyday"
class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sNaturalDay">0</property>
<property name="sBeginDate">2014-01-01</property>
<property name="sEndDate">2014-01-31</property>
<property name="sPartionDay">10</property>
</function>

欢迎关注我的其它发布渠道