这篇文章主要为大家分享mycat的配置文件。文中还介绍了mycat常用的几个分片算法的计算过程和使用方法,希望大家通过这篇文章能有所收获。
10年积累的网站建设、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有平南免费网站建设让你可以放心的选择与我们合作。
常用配置文件间的关系
由上图可以看到 Mycat 的核心配置文件均采用xml格式,这几个配置文件的用途如下:
server.xml
:用于配置系统参数、用户信息、访问权限及SQL防火墙和SQL拦截功能等schema.xml
:用于配置逻辑库、逻辑表相关信息rule.xml
:如果使用了水平切分,就需要使用该文件配置切分规则log4j2.xml
:Mycat日志相关的配置,例如日志输出格式、日志级别等
应用连接Mycat服务时,Mycat首先会通过server.xml
中的配置信息进行用户认证。用户通过验证后,所看到的逻辑库、逻辑表都是schema.xml
中所配置的。当使用了水平切分时,Mycat会通过rule.xml
里配置的规则来定位具体的物理数据库位置,从而完成写入/读取数据。
server.xml 配置详解
1、system
标签
用于配置 Mycat 的系统参数,其格式如下:
${value}
配置 Mycat 服务端口示例:
3306
常见的系统参数举例:
8066
9066
0.0.0.0
0
2048
utf8
8
1800000
100
104857600
0
1
1
0
0
300
1
(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+
false
io.mycat.route.sequence.handler.HttpIncrSequenceHandler
0
0
0
false
false
2
true
0
2、user
标签
用于配置Mycat的访问用户及权限,其格式如下:
${value}
...
配置示例:
123456
mall_db
false
除了配置对库的权限可能还不够,有时候我们需要配置用户对某些表的访问权限。如下示例:
123456
mall_db,db1,db2
dml
属性配置的数字是权限位,分别对应着insert,update,select,delete
四种权限。例如,当dml
的值为0110
时,表示拥有update
和select
权限,不具有insert
和delete
权限。所以权限位为1
时代表拥有对应的操作权限,为0
时代表没有该操作权限。
在该示例中,mall
用户对:
user_table
表不具有任何操作权限order_table
表拥有所有操作权限- 其他表只拥有
update
和select
权限
加密明文密码
以上配置用户的示例中,密码都是以明文的形式写在配置文件中。但用户的密码是安全敏感的,一般不会直接在配置文件中写明文密码,而是写一个加密过后的密码。否则只要拥有查看server.xml
文件的权限,就能轻易获取到各个用户的密码,这是非常不安全的。
因此,Mycat 提供了一个工具用于加密明文密码,该工具在一个jar包内,可使用如下命令对密码进行加密:
[root@txy-server /usr/local/mycat]# java -cp lib/Mycat-server-1.6.7.4-release.jar io.mycat.util.DecryptUtil 0:root:123456
参数说明:
0
:代表的是mycat用户登录密码加密(1
则是dataHost
加密)root
:用户名123456
:明文密码
执行成功后,会得到一个加密后的字符串:
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
复制该字符串,替换配置文件中的明文密码,如下示例:
1
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
...
log4j2.xml 配置文件
我们都知道Mycat是使用Java进行开发的,所以其日志框架也是使用Java生态圈内的log4j2
。Mycat日志相关的配置都在 log4j2.xml
文件中,本小节将介绍一些常用的配置项。
1、Pattern
标签
用于配置 Mycat 日志输出格式,默认如下:
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n
%d{yyyy-MM-dd HH:mm:ss.SSS}
:日志的时间格式%5p
:输出的日志的级别%t
:输出日志的线程名称%l
:日志输出语句所在的代码位置%m
:输出代码中指定的日志内容%n
:输出一个换行符
更多Pattern取值详见官方文档
这里截取了一段 Mycat 的日志内容,可以看到与Pattern是一一对应上的:
2020-01-09 15:22:57.960 INFO [Timer1] (io.mycat.backend.datasource.PhysicalDatasource.getConnection(PhysicalDatasource.java:564)) - no ilde connection in pool 1838161857 ,create new connection for hostM1 of schema db3 totalConnectionCount: 0 increamentCount: 1
2、level
属性
用于配置 Mycat 的日志输出级别,默认为info
级别:
关于log4j2的内建日志级别详见官方文档
rule.xml 文件详解
当我们需要通过Mycat实现数据分片时就得用到rule.xml
配置文件,该文件用于配置:
- 水平分片的分片规则
- 分片规则所对应的分片函数
这是一个分片规则的配置示例:
id
hash-mod-4
- Tips:分片规则的名称尽量具有实际意义,命名格式可以参考:
{分片算法名称}-{分片数量}_{分片列}
;上面的示例就是采用的这种命名格式
上面示例中所提到的<function>
标签是用于配置表的分片算法或者说分片函数,如下示例:
4
每个分片算法的所需参数可能不一样,所以property
标签是可以有多个的,其属性也因具体的分片算法而异。如下示例:
yyyy-MM-dd
0
2014-01-01
2014-01-31
10
常用的几个分片算法
Mycat 内置了非常多的分片算法,并且我们也可以针对实际情况自行开发属于自己的分片算法。我们来看看常用分片算法都有哪些:
PartitionByMod
:简单取模,直接通过列值进行取模得出分片位置PartitionByHashMod
:哈希取模,先将列值进行hash运算之后再取模得出分片位置PartitionByFileMap
:分片枚举,根据枚举值对数据进行分片,例如在异地多活的场景中通过地区id进行数据分片的场景PartitionByPrefixPattern
:字符串范围取模,根据长字符串的前面几位进行取模分片
PartitionByMod
简单取模分片算法的工作原理:
- 在图中有两个数据库,每个数据库就是一个分片,所以使用分片列的值对2进行取模,就能得出分片位置
配置示例:
id
mod-long
2
总结:
- 简单,数据分布均匀,适用于整数类型的列,不能用于非整型的列
- 计算方式:
分片列 % 分片基数
- 实现类的全名:
io.mycat.route.function.PartitionByMod
PartitionByHashMod
当需要取模的列为非整型时,就可以使用哈希取模分片算法。其工作原理如下图:
- 对分片列的值进行hash运算,得出一个整数型的数值,然后对分片数量“count”进行取模,就可以得到分片位置
配置示例:
login_name
hash-mod
2
总结:
- 可以用于多种数据类型的分片列,如字符串、日期等
- 分片没有简单取模算法均匀,因为存在hash重复的情况。两个相同的数据进行hash运算后的数值是一样的,那么取模后得出来的分片位置也就一样
- 计算方式:
hash(分片列) % 分片基数
- 实现类的全名:
io.mycat.route.function.PartitionByHashMod
PartitionByFileMap
前两种分片算法都是通过算法本身去计算出分片位置,是无法人工控制的。如果需要人工控制分片位置时,就可以使用到分片枚举算法。该算法使得我们可以指定一些枚举值来对分片位置进行控制,其实也就相当于是人工指定了某些数据应该到哪个分片。
例如,某张表中有个存储用户所在区域id的列,我们希望将区域id与数据库所在的区域进行映射,以实现区域id为1的数据被分片到区域1数据库中,区域id为2的数据被分片到区域2数据库中,以此类推。在这种场景下就可以使用分片枚举算法,其工作原理如下图:
- 通过
mapFile
配置一个分片关系映射,其格式为key-value,key为枚举,value为数据节点的索引。图中的枚举就是area_id
,一个area_id
对应着一个数据节点。没有配置映射关系的area_id
则会被分片到DEFAULT_NODE
所对应的数据节点。
配置示例:
area_id
hash-int
partition-hash-int.txt
0
0
- Tips:数据节点的索引是从0开始的,在编辑
mapFile
时需要注意这一点
总结:
- 可以根据枚举值指定数据存储的位置
- 需要在
$MYCAT_HOME/conf
目录下增加mapFile
来配置枚举值同节点的映射关系 - 计算方式:
hash(分片列) % 分片基数
- 实现类的全名:
io.mycat.route.function.PartitionByFileMap
PartitionByPrefixPattern
以上所介绍到的分片算法都是根据列进行分片的,在实际工作中我们可能会遇到这样一个需求:需要通过字符串的前几位或后几位进行分片。例如,通过订单号的前五位进行分片计算,或按用户的姓氏进行分片。在这种场景下,就可以使用字符串范围取模分片算法。
例如,需要对ABCDEFGHI
这个字符串的前三位进行分片计算,其计算过程如下图:
- 对指定的字符串范围分别进行ascii码计算并求和,然后对配置的求模基数进行取模计算,最后根据
mapFile
里配置的取值范围与数据节点索引的映射关系得出分片的数据节点。因此,mapFile
需要配置所有可能的取值范围,否则找不到对应的数据节点就会报错。
工作原理:
配置示例:
login_name
sharding-by-prefix-pattern
prefix-partition-pattern.txt
128
2
总结:
- 可以根据指定字符串的前N个字符确定存储位置
- 需要在
$MYCAT_HOME/conf
目录下增加mapFile
来配置取模范围同节点的映射关系 - 实现类的全名:
io.mycat.route.function.PartitionByPrefixPattern
schema.xml 文件
用途:
- 配置逻辑库及逻辑表
- 配置逻辑表所存储的数据节点
- 配置数据节点所对应的物理数据库服务器信息
schema 标签
schema
标签用于定义逻辑库,示例:
...
checkSQLschema
属性判断是否检查发给Mycat的SQL是否含有库名,为true
时会将SQL中的库名删除掉name
属性定义逻辑库的名字,必须唯一不能重复sqlMaxLimit
属性用于限制返回结果集的行数,值为-1
时表示关闭该限制。如果没有开启限制则默认取server.xml
里配置的限制randomDataNode
属性定义将一些随机语句发送到该数据节点中
table 标签
使用了schema
标签定义逻辑库之后,还需要使用table
标签定义逻辑表。示例:
name
属性定义逻辑表的名字,必须唯一不能重复且需要与数据库中的物理表名一致。使用逗号分割配置多个表,即多个表使用这个配置primaryKey
属性指定逻辑表中的主键,也是需要与物理表的主键一致dataNode
属性指定物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔,或指定一个索引范围:dn1$0-743
。注意数据节点定义之后,顺序不能再发生改变,否则会导致数据混乱rule
属性用于指定分片规则名称,对应rule.xml
中的<tableRule>
标签的name
属性,如无需分片可以不指定splitTableNames
属性定义是否允许多个表的定义
dataNode 标签
dataNode
标签用于定义数据节点,数据节点指向的是存储逻辑表的物理数据库。示例:
name
属性定义数据节点的名称,必须唯一dataHost
属性指定分片所在的物理主机database
属性指定物理数据库的名称
dataHost 标签
dataHost
标签用于定义后端物理数据库主机信息,该标签内有两个子标签,可以定义一组数据库主机信息。例如,定义一组主从集群结构的数据库主机信息:
writeHost
标签配置写实例,即主从中的master节点readHost
标签配置读实例,即主从中的salve节点readHost
是writeHost
的子标签,与writeHost
有绑定关系
在一个dataHost
内可以定义多个writeHost
和readHost
。但是,如果writeHost
指定的后端数据库宕机,那么这个writeHost
绑定的所有readHost
都将不可用。另一方面,由于这个writeHost
宕机系统会自动的检测到,并切换到备用的writeHost
上去。
配置示例:
select user()
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 bywriteHost
参与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%'
另外,slaveThreshold
属性是用于配合writeType
属性实现根据主从延时来进行主从切换的,其官方文档描述如下:
1.4 开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:MyCAT 心跳检查语句配置为
show slave status
,dataHost
上定义两个新属性:switchType="2"
与slaveThreshold="100"
,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检测show slave status
中的"Seconds_Behind_Master
"、"Slave_IO_Running
"、"Slave_SQL_Running
" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master
主从复制时延,当Seconds_Behind_Master > slaveThreshold
时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master
是否为0
,为0
时则表示主从同步,可以安全切换,否则不会切换。
heartbeat 标签
heartbeat
标签内指明用于和后端数据库进行心跳检查的语句。例如,MySQL可以使用select user()
,Oracle可以使用select 1 from dual
等。
这个标签还有一个connectionInitSql
属性,主要是当使用Oracla数据库时,需要执行的初始化SQL语句就这个放到这里面来。例如:alter session set nls_date_format='yyyy-mm-dd hh34:mi:ss'
注:如果是配置主从切换的语句在1.4之后必须是:show slave status
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
schema.xml 配置文件示例
select user()
看完上述内容,你们对mycat的配置文件有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读。
本文名称:mycat配置文件的详细介绍
网页地址:http://lswzjz.com/article/pgdjdc.html