文章目录
前言
本文将对 Mycat 配置文件进行详细介绍,搞清楚配置文件的信息,才是正确使用 Mycat 的前提。
【图片来源网络】
应用连接Mycat服务时,Mycat首先会通过server.xml
中的配置信息进行用户认证。用户通过验证后,所看到的逻辑库、逻辑表都是schema.xml
中所配置的。当使用了水平切分时,Mycat会通过rule.xml
里配置的规则来定位具体的物理数据库位置,从而完成写入/读取数据。
server.xml 配置
server.xml
保存了 mycat 需要的所有的系统级配置信息。
system 标签
用于配置 Mycat 的系统参数,其格式如下:
<system>
<!-- ${key}表示配置属性的名称,${value}表示该配置属性的值 -->
<property name="${key}">${value}</property>
</system>
常见的系统参数举例:
<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>
<!-- 1表示发送握手数据包-->
<property name="useHandshakeV10">1</property>
<!-- 禁止移除SQL中对关键字转义的 `` 符号-->
<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>
<!-- 是否采用zookeeper协调切换 -->
<property name="useZKSwitch">true</property>
<!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
<property name="parallExecute">0</property>
</system>
user 标签
用于配置Mycat的访问用户及权限,其格式如下:
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</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>
-
name
指定用户名 -
defaultAccount
设置当前账号是否为默认账号
property 标签
-
password
指定账号密码 -
schemas
给当前账户设置可访问的 schema,可指定多个,用逗号隔开 -
readOnly
true 代表为只读,false 代表可读写 -
banchmark
限制前端整体连接数量,如果值为0或不设置,则表示不限制连接数量 -
usingDecrypt
0 代表不对密码加密,1 代表对密码进行加密
privileges 标签
对用户的 schema以及表进行精细化的DML权限控制。
check
属性表示是否开启DML权限检查,默认是关闭。
dml
顺序说明:insert,update,select,delete
schema
标签中属性:
-
name
指定逻辑库名称 -
dml
当前用户对此逻辑库的权限控制
table
标签中属性:
-
name
指定逻辑表名称 -
dml
当前用户对此逻辑表的权限控制,其中,逻辑表tb01
没有权限,tb02
有四种权限
firewall 标签
全局防火墙设置,从安全角度保证 Mycat 不被匿名 IP 访问。
<firewall>
<whitehost>
<host host="127.0.0.1" user="root"/>
<host host="127.0.0.2" user="root"/>
</whitehost>
<blacklist check="false"></blacklist>
</firewall>
-
writehost
设置白名单,可以使用通配符%
进行设置,白名单代表可以访问的IP -
blacklist
标签的check
属性为 false 代表不开启黑名单检查,如设置为 true,可以指定 DML权限。
schema.xml 配置
- 配置逻辑库及逻辑表
- 配置逻辑表所存储的数据节点
- 配置数据节点所对应的物理数据库服务器信息
schema 标签
schema
标签用于定义逻辑库,示例:
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
...
</schema>
-
name
:指定 schema 名称 -
checkSQLschema
:是否检查SQL中的schema名称,例如:执行select * from TESTDB.db1
,若此属性设置为 true,Mycat 会把语句修改为select * from db1
-
sqlMaxLimit
:当设置该值时,每条执行的 SQL语句,如果没有加上limit
,Mycat 会自动加上对应的值;如果不设置,默认会把查询的信息全部展示出来。 -
dataNode
:用于绑定逻辑库到某个具体的数据库上,如果定义此属性,那么这个逻辑库就不能工作在分库分表模式下了(schema标签内部不得配置任何逻辑表信息),也就是说对这个逻辑库的所有操作会直接作用到绑定的 dataNode 上,这个 schema 就可以用作读写分离和主从切换。
table 标签
使用了schema
标签定义逻辑库之后,还需要使用table
标签定义逻辑表。示例:
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<!-- 多表定义 -->
<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>
-
name
属性定义逻辑表的名字,必须唯一不能重复且需要与数据库中的物理表名一致。使用逗号分割配置多个表,即多个表使用这个配置 -
primaryKey
属性指定逻辑表中的主键,也是需要与物理表的主键一致 -
dataNode
属性指定物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔,或指定一个索引范围:dn1$0-743
。注意数据节点定义之后,顺序不能再发生改变,否则会导致数据混乱 -
rule
属性用于指定分片规则名称,对应rule.xml
中的<tableRule>
标签的name
属性,如无需分片可以不指定 -
splitTableNames
属性定义是否允许多个表的定义
dataNode 标签
dataNode
标签用于定义数据节点,数据节点指向的是存储逻辑表的物理数据库。示例:
<dataNode name="dn1" dataHost="host1" database="test" />
dataNode
也就是通常说的数据分片。一个 dataNode
是一个独立的数据分片。用 数据库实例+具体库
来定义一个数据分片。
-
name
:定义数据节点名称,名称是唯一的 -
dataHost
:定义该分片属于哪个数据库实例,属性值是引用在dataHost
标签上的name
属性 -
database
:定义该分片属于哪个具体数据库实例上的具体库,
dataHost 标签
dataHost
标签用于定义后端物理数据库主机信息,该标签内有两个子标签,可以定义一组数据库主机信息。例如,定义一组主从集群结构的数据库主机信息:
【图片来自网络】
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.96.187:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.96.187:3306" user="root" password="123456" />
</writeHost>
</dataHost>
dataHost
标签定义了具体的数据库实例,读写分离配置和心跳语句。
-
name
:定义 dataHost 唯一标识,与dataNode
的dataHost
属性一致 -
maxCon
:指定每个读写实例连接池的最大连接数,标签内嵌套的writeHost
,readHost
标签都会使用此属性值实例化出连接池的最大连接数 -
minCon
:指定每个读写实例连接池的最小连接,初始化连接池的大小 -
balance
:负载均衡类型。0:所有读操作发送到当前可用的writeHost
上;1:所有读操作随机发送到readHost
上;2:所有读操作随机在writeHost
和readHost
上分发 -
writeType
:负载均衡类型。0:所有写操作发送到当前可用的writeHost
上;1:所有写操作随机发送到readHost
上;2:所有写操作随机在writeHost
和readHost
上分发 -
dbType
:指定后端连接的数据库类型,目前支持二进制的Mysql协议,还有其他使用JDBC
连接的数据库,例如:mongodb
,oracle
,spark
等 -
dbDriver
:指定连接后端数据库使用的Driver,目前可选的值有native
和JDBC
;使用native
执行的是二进制的mysql协议,所以可以使用 Mysql 和 maridb ;其他类型数据库则需要使用jdbc
驱动来支持 -
switchType
:当MySQL服务器宕机时,转换主从关系的类型,如配置一台master
,一台slave
,如果主节点宕机时,-1:不自动切换,从节点不会自动切换为主节点;1:(默认值)自动切换,从节点切换为主节点,2:基于 MySQL 主从同步的状态决定是否切换,心跳检测语句为:show slave status
3:基于 MySQL galary cluster 的切换机制(适合集群),心跳检测语句为show status like 'wsrep%'
-
slaveThreshold
:定义主从复制延时阈值,当Seconds_Behind_Master > slaveThreshold
时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据
heartbeat 标签
<heartbeat>select user()</heartbeat>
heartbeat
标签内指明用于和后端数据库进行心跳检查的语句。例如,MySQL可以使用select user()
,Oracle可以使用select 1 from dual
等。
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
小结
本文对 Mycat 两个重要的配置文件 server.xml
和 schema.xml
进行了详细描述,如果 Mycat 感兴趣请关注本专栏其他文章。