在mycat中,我们基本使用的有四种配置文件,分别是【server.xml】【log4j2.xml】【rule.xml】【schema.xml】
下面分别简述四种配置文件中的配置,掌握mycat最基本的使用
一)server.xml:
作用:配置系统参数;配置用户访问权限;配置SQL防火墙以及SQL拦截功能
下面是详细的配置,主要针对标签【system】和【user】进行简单的配置讲解
1)首先是我们的系统参数配置,主要查看我们的【system】标签,下面是详细的配置(只展示了常用的部分而配置),注释都有详细说明
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="serverPort">3306</property><!-- 设置的默认端口号-->
<property name="managerPort">9066</property> <!-- 设置的管理端口号-->
<property name="idleTimeout">300000</property> <!-- 前端应用多长时间没有对mycat进行访问的话,就会断开 ,单位毫秒---->
<property name="bindIp">0.0.0.0</property> <!-- 监控的网卡地址,设置0.0.0.0就是监听所有IP-->
<property name="frontWriteQueueSize">2048</property> <!-- 前端写队列的大小-->
<property name="processors">4</property> <!-- mycat进程的数量,一般等于我们服务器CPU的核数-->
<property name="txIsolation">2</property> <!-- mysql的隔离级别设置,2代表读已提交-->
<property name="sqlExecuteTimeout">300</property> <!-- sql执行的时间,超过此设置时间断开 单位秒-->
<property name="charset">utf-8</property> <!-- 设置的编码格式,一定要与mysql创建的数据库编码格式保持一致-->
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="defaultMaxLimit">100</property><!-- 对mysqL查询返回的数据集做一个限制 -->
<property name="maxPacketSize">104857600</property><!-- 默认mysqL 返回包的大小-->
<property name="memoryPageSize">64k</property><!-- 单位为m-->
</system>
2)就是我们用户访问权限的设置了,主要配置在【user】标签中
2.1)若是我们现在需要对某一个用户配置只读权限,如何配置?
<user name="user">
<property name="password">user</property> <!--用户的密码-->
<property name="schemas">TESTDB</property><!--允许访问的逻辑库-->
<!--
对于一个用户授权于放翁多个数据库的配置
<property name="schemas">TESTDB,test1,test2</property>
-->
<property name="readOnly">true</property><!--是否是只读用户-->
</user>
上面的配置意思是对【user】用户授权只读权限,允许访问逻辑库TESTDB
2.2)若是对某个用户授权可以访问某个库的某些表的某些权限如何设置?
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!--
表级 DML 权限设置
说明:dml代表权限:insert,update,select,delete
0代表没有此权限;1代表有此权限
-->
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
</user>
上面配置代表root用户可以访问逻辑库【TESTDB】下的tb02表,并且拥有增,删,改,查的所有权限
2.3)一般我们不会将用户的密码以明文的形式配置在文件中,我们回使用加密方式对我们的密码做一个简单的加密,然后配置
进入我们的执行加密的jar包目录下:
/usr/local/mycat/lib
然后执行
java -cp Mycat-server-1.6.7.1-release.jar io.mycat.util.DecryptUtil 0:root:root
可以看到加密的密码已经输出
然后找到我们的配置文件进行修改
<user name="root" defaultAccount="true">
<property name="usingDecrypt">1</property>
<property name="password">CrjpLhvVJkHk0EPW35Y07dUeTimf52zMqClYQkIAN3/dqiG1DVUe9Zr4JLh8Kl+1KH1zd7YTKu5w04QgdyQeDw==</property>
<property name="schemas">miaosha</property>
</user
记得一定要加上【 <property name="usingDecrypt">1</property>】我们的密文才可以生效
二)log4j2.xml
作用:配置日志展示的格式、日志级别等
<RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="250 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<asyncRoot level="info" includeLocation="true">
<AppenderRef ref="RollingFile"/>
</asyncRoot>
简述:
- 【%d{yyyy-MM-dd HH:mm:ss.SSS}】表示日志的时间格式
- 【%5p】表示日志的输出级别
- 【%t】表示日志中记录线程的名称
- 【%m】表示输出代码中指定的消息
- 【%n】表示输出一个换行符
- 【level="info"】:表示输出info级别的日志,共八种日志级别如下:
All<Trace<Debug<Info<Warn<Error<Fatal<OFF
三)rule.xml
作用:配置水平分片的分片规则;配置分片规则对应的分片函数
例如我们需要对我们的数据库表进行水品切分的时候需要用到算法,我们这时候就可以在这里定义好分片函数,然后在我们的【schema.xml】文件中指定逻辑库配置的时候指定我们的分片函数
下面以常用的四种分片算法为例进行简单的讲解:
3.1)简单取模-PartitionByMod
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
3.2)哈希取模-PartitionByHashMod
简单概述:对分片列的值进行hash运算,得出一个整数型的数值,然后对分片数量“count”进行取模,就可以得到分片位置
<tableRule name="hash-mod-2_login_name">
<rule>
<columns>login_name</columns>
<algorithm>hash-mod</algorithm>
</rule>
</tableRule>
<function name="hash-mod"
class="io.mycat.route.function.PartitionByHashMod">
<property name="count">2</property>
</function>
3.3)分片枚举-PartitionByFileMap
<tableRule name="hash-int_qy_id">
<rule>
<columns>qy_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<!-- mapFile 文件名,位于config目录下 -->
<property name="mapFile">partition-hash-int.txt</property>
<!-- 指定mapFile中枚举的数据类型,0为整型;非0则为字符串类型 -->
<property name="type">0</property>
<!-- 是否启用默认节点,大于等于0为启用;小于等于0为不启用 -->
<property name="defaultNode">0</property>
</function>
简单讲述场景:拿区域来划分数据,例如我们有三个地方的数据,北京--001,上海--002,深圳--003。
那么我们三个地区要存储在三个数据库表中。这时候我们会在【name="mapFile"】指定的txt文件中配置我们的规则:
001=0;002=1;003=2;而0,1,2分表代表我们的三个数据节点,这样就可以根据我们指定的规则对数据做一个分片处理
【注:枚举分片的规则文件要放在mycat的conf文件下面】
3.4)字符串范围取模-PartitionByPrefixPattern
如下图:
原理解释:例如我们对默认字符串截取前三个字母,然后分别获取三个字母的ascii码值进行相加的计算;
配置文件中我们会指定求模基数的ascii码值,对应上图的128,然后我们用计算得来的和和基数进行取模计算;
在我们的【prefix-partition-pattern.txt】文件中会指明计算结果的落库规则,例如上图:0-63之间的数据会存储在0数据节点,64-127的会存储在1数据节点
下面是详细的配置
<tableRule name="sharding-by-prefix-pattern_login_name">
<rule>
<columns>login_name</columns>
<algorithm>sharding-by-prefix-pattern</algorithm>
</rule>
</tableRule>
<function name="sharding-by-prefix-pattern"
class="io.mycat.route.function.PartitionByPrefixPattern">
<!-- mapFile 文件名,位于config目录下 -->
<property name="mapFile">prefix-partition-pattern.txt</property>
<!-- 求模基数 -->
<property name="patternValue">128</property>
<!-- 字符串范围,这里为前两位 -->
<property name="prefixLength">2</property>
</function>
四)schema.xml
作用:配置逻辑库及逻辑表;配置逻辑表所存储的数据节点;配置数据节点所对应的物理数据库服务器的信息
这个配置文件可以说是我们获取数据的核心,非常关键,下面先看一个简单版的完整配置:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="MIAOSHA" checkSQLschema="false" sqlMaxLimit="100" >
<table name="order" primaryKey="orderId" dataNode="mycat1,mycat2" rule="auto-sharding-long" splitTableNames="true"/>
</schema>
<dataNode name="mycat1" dataHost="myserver1" database="db1"/>
<dataNode name="mycat2" dataHost="myserver1" database="db2"/>
<dataHost name="myserver1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.124.34" url="192.168.124.34:3306" user="root" password="123456">
<readHost host="192.168.124.35" url="192.168.124.35:3306" user="root" password="123456"/>
</writeHost>
<writeHost host="192.168.124.35" url="192.168.124.35:3306" user="root" password="123456"/>
</dataHost>
</mycat:schema>
下面是简单的讲述:
4.1)【table】
- name 属性定义逻辑表的名字,必须唯一不能重复且需要与数据库中的物理表名一致
- primaryKey 属性指定逻辑表中的主键,也是需要与物理表的主键一致
- dataNode 属性指定物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔
- rule 属性用于指定分片规则名称,对应rule.xml中的<tableRule>标签的name属性,如无需分片可以不指定
- splitTableNames 属性定义是否允许多个表的定义
4.2)【dataNode】
- name 属性定义数据节点的名称,必须唯一
- dataHost 属性指定分片所在的物理主机
- database 属性指定物理数据库的名称,就是我们真实存在的mysql数据库名称
4.3)【dataHost】
- name 属性用于定义主机名称,必须唯一
- maxCon 属性指定每个读/写实例连接池的最大连接数
- minCon 属性指定每个读写实例连接池的最小连接数,即初始化连接池的大小
- dbType 属性指定后端连接的数据库类型,还有其他使用JDBC连接的数据库
- dbDriver 属性指定连接后端数据库使用的驱动,目前可选的值有native和JDBC
- balance 属性指定读写分离的负载均衡类型,目前的取值有4 种:
- 0:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
- 1:全部的readHost与stand by writeHost参与select语句的负载均衡
- 2:所有读操作都随机在writeHost、readhost 上分发
- 3:所有readHost参与select语句的而负载均衡
- writeType 也是设计负载均衡的标签,配置为0,指定是所有writeHost下只允许第一个写主机执行,只有当第一个写主机挂掉,
- 才允许第二个写主机来执行;若是配置为1,那么要是有两个写主机,那么会随机将写请求发布到两个主机来去执行
- switchType 开启自动切换的功能,两个写主机,当地一个写主机挂掉,可以自动切换到第二个;若是配置为-1,则代表关闭了自动这种切换
4.4)【heartbeat】
- 表示如何检查后端数据库是否可用
4.5)【writeHost】【readHost】
- writeHost标签配置写实例,即主从中的master节点;readHost 标签配置读实例,即主从中的salve节点
- host 属性用于标识不同实例名称,一般writeHost名称使用M1作为后缀,readHost则使用S1作为后缀
- url 属性用于配置数据库的连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。例如,当使用JDBC 时则可以这么写:jdbc:mysql://localhost:3306/
- user 属性配置数据库用户名
- password 属性配置数据库密码