千家信息网

mycat配置文件的详细介绍

发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,这篇文章主要为大家分享mycat的配置文件。文中还介绍了mycat常用的几个分片算法的计算过程和使用方法,希望大家通过这篇文章能有所收获。常用配置文件间的关系由上图可以看到 Mycat 的核心配置文件
千家信息网最后更新 2024年11月29日mycat配置文件的详细介绍

这篇文章主要为大家分享mycat的配置文件。文中还介绍了mycat常用的几个分片算法的计算过程和使用方法,希望大家通过这篇文章能有所收获。


常用配置文件间的关系

由上图可以看到 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时,表示拥有updateselect权限,不具有insertdelete权限。所以权限位为1时代表拥有对应的操作权限,为0时代表没有该操作权限。

在该示例中,mall用户对:

  • user_table表不具有任何操作权限
  • order_table表拥有所有操作权限
  • 其他表只拥有updateselect权限
加密明文密码

以上配置用户的示例中,密码都是以明文的形式写在配置文件中。但用户的密码是安全敏感的,一般不会直接在配置文件中写明文密码,而是写一个加密过后的密码。否则只要拥有查看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节点
  • readHostwriteHost的子标签,与writeHost有绑定关系

在一个dataHost内可以定义多个writeHostreadHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

配置示例:

    select user()                    

dataHost 标签属性
  • name 属性用于定义主机名称,必须唯一
  • maxCon 属性指定每个读/写实例连接池的最大连接数。也就是说,标签内嵌套的writeHostreadHost 标签都会使用这个属性的值来实例化出连接池的最大连接数
  • minCon 属性指定每个读写实例连接池的最小连接数,即初始化连接池的大小
  • dbType 属性指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库
  • dbDriver 属性指定连接后端数据库使用的驱动,目前可选的值有nativeJDBC
  • slaveThreshold 属性用于定义主从复制延时阈值,当Seconds_Behind_Master > slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据
  • balance 属性指定读写分离的负载均衡类型,目前的取值有4 种:
    • 0:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost
    • 1:全部的readHost与stand by writeHost参与select语句的负载均衡
    • 2:所有读操作都随机在writeHostreadhost 上分发
    • 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 statusdataHost 上定义两个新属性: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),并且readHostwriteHost 的子标签。通过这两个标签可以组合读/写实例以满足系统的要求。

在一个dataHost内可以定义多个writeHostreadHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,当一个writeHost宕机时系统会自动检测到,并切换到备用的writeHost 上去。


writehost 标签及readHost标签的属性

这两个标签的属性相同,这里就一起介绍:

  • host 属性用于标识不同实例名称,一般writeHost名称使用M1作为后缀,readHost则使用S1作为后缀
  • url 属性用于配置数据库的连接地址,如果是使用nativedbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。例如,当使用JDBC 时则可以这么写:jdbc:mysql://localhost:3306/
  • user 属性配置数据库用户名
  • password 属性配置数据库密码
  • weight 属性配置某个数据库在 readhost 中作为读节点的权重
  • usingDecrypt 属性指定是否对密码加密,默认为0, 若需要开启则配置为1

schema.xml 配置文件示例


            
select user()

看完上述内容,你们对mycat的配置文件有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读。


配置 数据 属性 标签 数据库 节点 示例 算法 文件 切换 主从 权限 逻辑 日志 用户 密码 位置 字符 名称 字符串 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2019网络安全知识周 委托软件开发怎么记成本 服务器误删文件恢复 数据库模糊匹配方法 sql数据库语句在哪里输入 南昌立得软件开发有限公司 某警种负责网络安全管理 数据库创建视图的语法结构 数据库损坏如何打开里面的表 电力监控系统网络安全告警类型 软件开发全程实战 深圳十大网络安全上市公司 网络技术与网络安全法 正式环境数据库怎么迁移 发布问答数据库错误是什么原因 深圳谦川网络技术有限公司 宁波网络安全高峰论坛 网络安全有必要学前端吗 腾讯校招软件开发面试问题 基础标准化农产品数据库 最像hypixel的手机服务器 沈阳收钱吧互联网科技有限公司 苹果重签名软件开发 数传网络技术有限公司 温州凡畅软件开发有限公司 轩南科技软件开发有限公司 收费站系统网络安全主要包括 成都信息化项目软件开发费用 choice金融数据库 乡镇网络安全安全管理制度
0