Mycat 配置文件概述
1.server.xml
作用:
配置mycat系统性参数 (<system> 标签)
配置用户以及访问权限 (<user> 标签)
配置sql防火墙以及sql拦截功能
常用完整属性配,常用的mysql系统的完整配置
<system>
<property name="serverPort">8066</property>
<!-- mycat 管理端口 -->
<property name="managerPort">9066</property>
<!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="nonePasswordLogin">0</property>
<property name="bindIp">0.0.0.0</property>
<!--写队列大小-->
<property name="frontWriteQueueSize">4096</property>
<property name="charset">utf8</property>
<!--事务隔离级别 3-可重复读-->
<property name="txIsolation">3</property>
<!--mycat线程数量-->
<property name="processors">8</property>
<!--线程空闲多长时间断开 毫秒-->
<property name="idleTimeout">1800000</property>
<!--秒-->
<property name="sqlExecuteTimeout">300</property>
<!-- 1为开启实时统计、0为关闭 -->
<property name="useSqlStat">0</property>
<!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<!--默认参数-->
<property name="defaultMaxLimit">100</property>
<!--mysql中包的大小-->
<property name="maxPacketSize">104857600</property>
</system>
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB,TESTDB2,TESTDB3</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="user">
<property name="password">user</property>
<property name="password">user</property>
<!--是否对明文进行加密-->
<property name="usingDecrypt">0</property>
<property name="schemas">TESTDB,TESTDB1,TESTDB2</property>
<!--是否是默认账号-->
<property name="readOnly">false</property>
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
</user>
dml 总的数字代表:0110 -> insert,update,select,detele 0代表不具有此权限,1代表有次权限
用户密码加密配置 java -cp Mycat-server-1.6.5-release.jar 0:root:123456 (0:前端加密标志 root:用户名 123456:密码)
配置:对应的user标签 <property name="usingDecrypt">1</property>
2.rule.xml
作用
配置分片规则
分片表的配置规则
<tableRule name="hash-mod-2_id">
<rule>
<columns>id</columns>
<algorithm>hash–mode–2</algorithm>
<rule>
<tableRule>
columns 分片列
algorithm 分片算法
配置表的分片算法
<function name="hash-mode-2" class="io.mycat.route.function.PartitionByHashMod">
<property name="count">2</property>
</function>
常用分片算法
简单取模分片算法 PartitionByMod
场景:分片列是整型,使用这种取模算法
例子
<tableRule name="partition-mod-2-stuent_id">
<rule>
<columns>student_id</columns>
<algorithm>partition-mod-2</algorithm>
</rule>
</tableRule>
<function name="partition-mod-2" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
哈希取模 PartitionByHashMod 场景:分片列适合所有类型
注意:如果hash一致的过多,可能会使某个分片数据库数据过多。
例子
<tableRule name="partition-hash-mod-2-stuent_id">
<rule>
<columns>student_id</columns>
<algorithm>partition-hash-mod-2</algorithm>
</rule>
</tableRule>
<function name="partition-hash-mod-2" class="io.mycat.route.function.PartitionByHashMod">
<property name="count">2</property>
</function>
分片枚举算法 PartitionByFileMap
场景: 根据有限个枚举类型进行分片
<tableRule name="partition-enums-file-mod-2-school_id">
<rule>
<columns>school_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="partition-enums-file-mod-2" class="io.mycat.route.functioin.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
property name="type" 定义枚举值类型,0代表整数类型,非0表示字符串
name="defaultNode" 是否使用默认节点,<0 : 不起用默认节点, >=0 表示启用默认节点
相应的配置文件,需要放在$MYCAT_HOME/conf 目录下
枚举值可以指定数据的存储位置
字符串范围取模分片算法
截取某个字符串的一部分,作为分片的依据
算法:截取字符串的某一段,然后assic码相加,然后和取模基数进行取模计算。
<function name="sharding-by-prefix-patter" class="io.mycat.route.function.PartitionByPrefixPattern">
<property name="patternValue">128</property> <!--配置的取模基数-->
<property name="prefixLength">2</property> <!--取前2两位-->
<property name="mapFile">prefix-partition-pattern.txt</property>
</function>
prefix-partition-pattern.txt 记录了 对应的取模范围和后端节点的对应关系
可以根据指定字符串的前N个字符确定存储位置
3.schema.xml
用途
配置逻辑库和逻辑表
配置逻辑表所存储的数据节点
配置数据节点所对应的数据库服务器信息
逻辑库的定义
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="1000"></schema>
sqlMaxLimit 当前逻辑库默认返回的最大行数 , -1 时表示不限制
checkSQLschema 是否检查sql中含有库名称 ,true :检查并删除库名 , false :不检查
逻辑表定义
<table name="travelrecord" primeryKey="id" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
name 逻辑表名 (逻辑表必须对应着物理表)
primeryKey 主键
dataNode : 存储的实际的物理节点
rule 引用分片规则
dataNode 标签
<dataNode name="dn1" dataHost="localhost1" database="db1" />
name : 定义dataNode 的值
database 物理数据库的名称
dataHost 标签
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root" password="123456" />
</dataHost>
dataHost属性
name 组服务器名称,dataNode 标签引用的依据,mycat中唯一
maxCon , minCon 定义 最大连接数 ,最小连接数
banlance 工作方式,取值
balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双 主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载 均衡。
balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力, 注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 负载均衡类型
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost, 重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
switchType 是否自动切换写数据库
-1 表示不自动切换。
1 默认值,自动切换。
2 基于 MySQL 主从同步的状态决定是否切换。
heartbeat 标签,检测心跳
writeHost 标签,指定写实例
readHost 标签,指定读实例
schema.xml 完整标签示例
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root" password="123456" />
</dataHost>
</mycat:schema>