server.xml 几乎保存了所有 mycat 需要的系统配置信息。其在代码内直接的映射类为 SystemConfig 类。
·
user 标签
这个标签主要用于定义登录 mycat 的用户和权限。
如下示例:我定义了一个用户,用户名为 test、密码也为 test,可访问的 TESTDB 逻辑库(同时访问多个 schema 的话使用逗号隔开)。
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property
<property name="benchmark">1000</property>
<property name="usingDecrypt">1</property>
</user>
<!--benchmark:当前端的整体 connection 数达到此值时, 对来自该账户的请求开始拒绝连接。\
#+ 0 或不设置表示不限制。-->
<!--# usingDecrypt:和schema.xml中writeHost 标签和 readHost 标签中的定义相同,\
#+ 即是否对密码加密。默认 0,如需要开启配置 1。-->
·
privileges 子节点
对用户的 schema 及下级的 table 进行精细化的 DML 权限控制。
DML权限 | 写入(insert) | 更新(update) | 查询(select) | 删除(delect) |
---|---|---|---|---|
0000 | 禁止 | 禁止 | 禁止 | 禁止 |
0010 | 禁止 | 禁止 | 可以 | 禁止 |
1110 | 可以 | 禁止 | 禁止 | 禁止 |
1111 | 可以 | 可以 | 可以 | 可以 |
privileges 节点中的 check 属性表示是否开启 DML 权限检查, 默认 false 标识不检查,当然 privileges 节点不配置,等同 check=false。
由于 Mycat 一个用户的 schemas 属性可配置多个 schema ,所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。如下所示:
<user name="zhuam">
<property name="password">test</property>
<property name="schemas">TESTDB</property
<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>
·
system 标签
这个标签内嵌套的所有 property 标签都与系统配置有关。
·
system 标签的相关属性
属性名 | 描述 |
---|---|
bindIp | mycat 服务监听的 IP 地址,默认值为 0.0.0.0。 |
serverPort | 定义 mycat 的使用端口,默认值为 8066。 |
managerPort | 定义 mycat 的管理端口,默认值为 9066。 |
sequnceHandlerType | 指定使用 Mycat 全局序列的类型。0:本地文件方式1:数据库方式2:时间戳序列方式从 1.6 增加两种 ZK 的全局 ID 生成算法:3:分布式 ZK ID 生成器4:zk 递增 id 生成 |
defaultSqlParser | 指定默认的解析器。目前的可用的取值有:druidparser 和 fdbparser。一般都使用 druidparser。1.4 以后 fdbparser 作废。 |
processors | 指定系统可用的线程数,默认值为机器 CPU 核心线程数。主要影响 processorBufferPool、processorBufferLocalPercent、processorExecutor 属性。NIOProcessor 的个数也是由这个属性定义的,所以调优的时候可以适当的调高这个属性。 |
processorBufferChunk | 指定每次分配 Socket Direct Buffer 的大小,默认是 4096 个字节。这个属性也影响 BufferPool 的长度。如果一次性获取的数过大 buffer 不够用经常出现警告,则可以适当调大。 |
processorBufferPool | 指定 bufferPool 计算比例值。由于每次执行 NIO 读、写操作都需要使用到 buffer,所以系统初始化的时候会建立一定长度的 buffer 池来加快读、写的效率,减少建立 buffer 的时间。默认值为:bufferChunkSize(4096) * processors * 1000。BufferPool 的总长度 = bufferPool/bufferChunk。 |
processorBufferLocalPercent | 控制分配 ThreadLocalPool 的大小。但其实并不是一个准确的值,也是一个比例值,默认值为 100。线程缓存百分比 = bufferLocalPercent/processors。 |
processorExecutor | 这个属性主要用于指定 NIOProcessor 上共享的 businessExecutor 固定线程池大小。mycat 在需要处理一些异步逻辑的时候会把任务提交到这个线程池中。新版本中这个连接池的使用频率不是很大了,可以设置一个较小的值。 |
·
Mysql 连接相关属性
属性名 | 描述 |
---|---|
charset | 字符集设置。如果需要配置 utf8mb2 等特殊字符集可以在 index_to_charset.properties 中配置数据库短的字符集 “ID=字符集”(例如:224=utf8mb4)。注意:配置字符集的时候一定要坚持 mycat 的字符集与数据库端的字符集是一致的。 |
packetHeaderSize | 指定 Mysql 协议中的报文头长度。默认 4。 |
maxPacketSize | 指定 Mysql 协议可以携带的数据最大长度。默认 16 M。 |
idleTimeout | 指定连接的空闲超时时间。默认 30 分钟,单位毫秒。 |
txIsolation | 前端连接的初始化事务隔离级别。只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。 |
sqlExecuteTimeout | SQL 执行超时的时间。默认时间为 300 秒,单位秒。 |
·
心跳相关属性
属性名 | 描述 |
---|---|
processorCheckPeriod | 清理 NIOProcessor 上前后端空闲、超时和关闭连接的间隔时间。默认是 1 秒,单位毫秒。 |
dataNodeIdleCheckPeriod | 对后端连接进行空闲、超时检查的时间间隔,默认是 300 秒,单位毫秒。 |
dataNodeHeartbeatPeriod | 对后端所有读、写库发起心跳的间隔时间,默认是 10 秒,单位毫秒。 |
·
1.6 版本开始支持的属性
属性名 | 描述 |
---|---|
fakeMySQLVersion | mycat 模拟的 mysql 版本号。默认为 5.6 版本。如非特需,不要修改这个值,目前支持设置 5.5,5.6 版本,其他版本可能会有问题。 |
useGlobleTableCheck | 是否开启全局表一致性检测。0:关闭,1:开启。通过在全局表增加_MYCAT_OP_TIME 字段来进行一致性检测,类型为 bigint。create 语句通过 mycat 执行会自动加上这个字段,其他情况请自己手工添加。 |
handleDistributedTransactions | 分布式事务开关。主要为了控制是否允许跨库事务。0:不过滤分布式事务1:过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤)2:不过滤分布式事务,但是记录分布式事务日志 |
useOffHeapForMerge | 是否启动堆外内存。0:关闭1:开启 |
·
开启堆外内存的注意事项
支持内存和外存并存的排序方式,结果集排序可以达上亿规模。此时应注意:
- 前端和后端空闲连接超时检测时间应该设置大些,避免空闲检测关闭前端或后端连接,造成 Mysqlclient 连接丢失时结果集无法正确。
- 设置 -Xmn 值尽可能大些,新生代使用 UseParallelGC 垃圾回收器,-Xss 设置 512K 比较合适,物理内存足够时,MaxDirectMemorySize 尽可能设置大些,可以加快结果集处理时间。例如:
-Xmx4G
-Xmn4G
-XX:MaxDirectMemorySize=8G
-Xss512k
-XX:+UseParallelGC
以 16G 可用内存为例配置:
vim conf/wrapper.conf
......
wrapper.java.additional.1=-DMYCAT_HOME=.
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:MaxPermSize=64M
wrapper.java.additional.4=-XX:+AggressiveOpts
wrapper.java.additional.5=-XX:MaxDirectMemorySize=8G #直接(堆外)内存大小
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.10=-Xmx8G #最大堆大小
wrapper.java.additional.11=-Xms8G #初始化堆的大小
wrapper.java.additional.12=-Xmn4G #新生代的内存空间大小
wrapper.java.additional.13=-Xss512k #每个 Java 线程堆栈大小
wrapper.java.additional.14=-XX:+UseParallelGC #定义新生代垃圾回收器
......