相关配置文件说明
配置文件目录conf说明:
server.xml:mycat的配置文件,设置账号、参数等
schema.xml:mycat对应的物理数据库和数据库表的配置
rule.xml:分库分表规则配置
log4j2.xml
mycat默认端口8066
常见的系统参数配置还有:
1.server.xml配置文件说明:
标签一.system:用于配置mycat系统参数,其中
常见的系统参数有:
<system>
<!-- mycat 服务连接端口 -->
<property name="serverPort">8066</property>
<!-- mycat 服务管理端口 -->
<property name="managerPort">9066</property>
<!-- mycat 服务监听的ip -->
<property name="bindIp">0.0.0.0</property>
<!-- 0为需要密码登陆、1为不需要密码登陆;默认为0,设置为1则需要指定默认账户-->
<property name="nonePasswordLogin">0</property>
<!-- 前端连接的写队列大小 -->
<property name="frontWriteQueueSize">2048</property>
<!-- 设置字符集编码 -->
<property name="charset">utf8</property>
<!-- mycat 的进程数量 -->
<property name="processors">8</property>
<!-- 闲置连接超时时间,单位:毫秒 -->
<property name="idleTimeout">1800000</property>
<!-- 默认最大返回的数据集大小 -->
<property name="defaultMaxLimit">100</property>
<!-- 允许的最大包大小 -->
<property name="maxPacketSize">104857600</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>
<!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<!-- SQL 执行超时 单位:秒-->
<property name="sqlExecuteTimeout">300</property>
<property name="sequnceHandlerType">1</property>
<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
<!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="subqueryRelationshipCheck">false</property>
<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
<property name="processorBufferPoolType">0</property>
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!-- off heap for merge/order/group/limit 1开启;0关闭 -->
<property name="useOffHeapForMerge">0</property>
<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">false</property>
<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
<property name="strictTxIsolation">false</property>
<!-- Mycat连接数据库时使用的隔离级别
1 - 读未提交
2 - 读已提交
3 - 可重复读
4 - 串行化
-->
<property name="txIsolation">2</property>
<property name="useZKSwitch">true</property>
<!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
<property name="parallExecute">0</property>
</system>
重点是
user标签
:
<user name="zabbix">
<property name="password">123456</property>
<property name="schemas">zabbix_db</property>
<property name="readOnly">false</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
参数说明:
user标签:用户配置节点
name:连接mycat的用户名
password:连接mycat的密码
schemas:逻辑数据库名,多个用逗号分开
privileges:配置用户针对表的增删查改权限,默认为false。如果需要对库里的某些表指定权限的话,需要修改:
<privileges check="true">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
dml是权限值,四位对用增(insert)、改(update)、查(select)、删(delete),1111表示拥有四者权限。
table name后面接表的名字。
加密明文密码:
上面的mycat用户密码直接明文写在上面,非常的不安全。一般来说使用加密后的密码复制粘贴上去。myat自带加密工具:
java -cp ../lib/Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 0:zabbix:123456
Ah+F8HyhkYfNTbN0C9v5QGkws+pwpShOEXyt80YIGMqRPLIK/leoSI52xbEgpUvPImE8Bg52aHXWFXCeuKD6xw==
参数说明:
0:表示加密用于mycat用户密码,1则是dataHost密码
zabbix:用户名
123456:明文密码
粘贴到配置文件中去:
<user name="zabbix">
<property name="password">Ah+F8HyhkYfNTbN0C9v5QGkws+pwpShOEXyt80YIGMqRPLIK/leoSI52xbEgpUvPImE8Bg52aHXWFXCeuKD6xw==</property>
2.日志配置文件log4j2.xml说明
日志输出格式默认为:
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
%d{yyyy-MM-dd HH:mm:ss.SSS}:日志的时间格式
%5p:输出的日志的级别,默认为info,<asyncRoot level="info" includeLocation="true">
%t:输出日志的线程名称
%l:日志输出语句所在的代码位置
%m:输出代码中指定的日志内容
%n:输出一个换行符
3.schema.xml配置文件
配置内容主要包括三部分:
配置逻辑库和逻辑表
配置逻辑表所存储的数据节点
配置数据节点所对应的物理数据库服务器信息
定义逻辑库:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
checkSQLschema:判断发送给mycat的sql语句是否包含库名,true则表示会把库名删除。
name:逻辑库名,必修唯一不能重复
sqlMaxLimit="100":用于限制返回结果集的行数,值为-1表示关闭该限制。
randomDataNode属性定义将一些随机语句发送到该数据节点中
定义逻辑表
table
标签
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
rule="mod-long" />
name表示逻辑表的名字,唯一不可重复,并且和数据库表名字一致,多个表用逗号隔开。
primaryKey 属性指定逻辑表中的主键,也是需要与物理表的主键一致
primaryKey 属性指定逻辑表中的主键,也是需要与物理表的主键一致
dataNode 属性指定物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔,或指定一个索引范围:dn1$0-743。注意数据节点定义之后,顺序不能再发生改变,否则会导致数据混乱
rule 属性用于指定分片规则名称,对应rule.xml中的<tableRule>标签的name属性,如无需分片可以不指定
splitTableNames 属性定义是否允许多个表的定义
数据节点dataNode
data定义的是数据节点,数据节点指向的是存储逻辑表的物理数据库。示例:
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
可以配置一个范围:
<dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/>
name:数据节点的名称,必须唯一
dataHost:指定分片所在的物理主机
database:指定物理数据库名称
配置物理数据库主机:
#默认配置内容
<dataHost name="localhost1" 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 -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
writeHost标签配置写实例,即主从中的master节点
readHost标签配置读实例,即主从中的slave节点
readHost是writeHost的子标签,与writeHost有绑定关系
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动**加粗样式**的检测到,并切换到备用的writeHost上去。
dataHost标签属性:
name
属性用于定义主机名称,必须唯一
maxCon
属性指定每个读/写实例连接池的最大连接数。也就是说,标签内嵌套的writeHost、readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数
minCon
属性指定每个读写实例连接池的最小连接数,即初始化连接池的大小
dbType
属性指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库
dbDriver
属性指定连接后端数据库使用的驱动,目前可选的值有native和JDBC
slaveThreshold
属性用于定义主从复制延时阈值,当Seconds_Behind_Master > slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据
balance
属性指定读写分离的负载均衡类型,目前的取值有4 种:
- 0:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
- 1:全部的readHost与stand by writeHost参与select语句的负载均衡
- 2:所有读操作都随机在writeHost、readhost 上分发
-
3:所有读请求随机分发到 wiriterHost 对应的readhost 执行。即 writerHost 不负担读压力,全部读请求由
readhost 执行。注意该取值只在1.4及其以后版本有,1.3没有
writeType
属性指定写实例的负载均衡类型,目前的取值有4 种:
-
-1:表示不自动切换
-
0:所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost。重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties
-
1:所有写操作都随机的发送到配置的writeHost,1.5 以后废弃不推荐使用
-
2:基于MySQL主从同步的状态决定是否切换(1.4 新增)
switchType
属性用于指定主从切换的方式:
-
-1:表示不自动切换
-
1:默认值,自动切换
-
2:基于MySQL主从同步的状态决定是否切换,心跳检测语句为:show slave status
-
3:基于MySQL galary cluster的切换机制(适合集群,1.4.1新增),心跳检测语句为show status like
‘wsrep%’
writehost 标签、readHost标签
这两个标签都用于配置一组主从数据库的相关信息,Mycat用这两个标签配置的连接信息实例化后端连接池。唯一不同的是,writeHost 配置写实例(master)、readHost 配置读实例(salve),并且readHost 为writeHost 的子标签。通过这两个标签可以组合读/写实例以满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,当一个writeHost宕机时系统会自动检测到,并切换到备用的writeHost 上去。
writehost 标签及readHost标签的属性
这两个标签的属性相同,这里就一起介绍:
host 属性用于标识不同实例名称,一般writeHost名称使用M1作为后缀,readHost则使用S1作为后缀
url 属性用于配置数据库的连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。例如,当使用JDBC 时则可以这么写:jdbc:mysql://localhost:3306/
user 属性配置数据库用户名
password 属性配置数据库密码
weight 属性配置某个数据库在 readhost 中作为读节点的权重
usingDecrypt 属性指定是否对密码加密,默认为0, 若需要开启则配置为1