mycat主要配置文件有3个,他们各司其职前端
server.xml配置文件主要做用是:
配置系统相关参数java
配置用户访问权限mysql
配置SQL防火墙及SQL拦截功能算法
server.xml中分为两个节点,一个是system 节点,另外一个是user节点sql
system节点主要配置mycat运行相关的属性,经常使用的属性以下:数据库
<!--mycat对外提供服务的端口--> <property name="serverPort">3306</property> <!--mycat管理端口--> <property name="managerPort">9066</property> <!-- 登陆mycat时是否须要密码验证登陆 0为须要密码登录、1为不须要密码登录,默认为0,设置为1则须要指定默认帐户 --> <property name="nonePasswordLogin">0</property> <!--须要监听那些IP地址 0.0.0.0表示所有--> <property name="bindIp">0.0.0.0</bindIp> <!--前端写队列的大小--> <property name="frontWriteQueueSize">2048</property> <!--数据库的字符集--> <property name="charset">utf8</property> <!--数据库隔离级别 2读已提交 3可重复读--> <property name="txIsolation">2</property> <!--等于cpu核心数--> <property name="processors">1</property> <!--前端与mycat链接超时 时间(毫秒)--> <property name="idleTimeout">1800000</property> <!--当一条sql执行超过多长时间后mycat与mysql断开链接 秒--> <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> <property name="maxPacketSize">104857600</property>
user标签配置了能够访问mycat的用户属性以及权限安全
<user name="root" defaultAccount="true"> <property name="password">123456</property> <!--访问那个数据库 多个数据库能够用逗号隔开 user,system--> <property name="schemas">TESTDB</property> <property name="readOnly">false</property> <!-- 表级 DML 权限设置 --> <privileges check="false"> <!-- dml 数字分别表明 insert update select delete 0表明无权限 1表明有权限 schema标签中的 dml为默认权限 --> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> </user>
这样配置文件中密码为明文,存在安全隐患,mycat提供了加密方法,进入mycat安装目录下的lib目录中执行如下命令:bash
java -cp Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456
执行完成后会返回加密后的密码服务器
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
将原来的明文密码改为加密后的密码,并告诉mycat所用的密码为加密后的密码便可,因此加密后的user节点为:oracle
<user name="root" defaultAccount="true"> <!--是否使用加密后的密码--> <property name="usingDecrypt">1</property> <property name="password"> GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA== </property> <!--访问那个数据库 多个数据库能够用逗号隔开 user,system--> <property name="schemas">TESTDB</property> <property name="readOnly">false</property> <!-- 表级 DML 权限设置 --> <privileges check="false"> <!-- dml 数字分别表明 insert update select delete 0表明无权限 1表明有权限 schema标签中的 dml为默认权限 --> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> </user>
配置水平分片表的分片规则
配置分片规则对应的分片函数
rule.xml中分为两部分,一个为tableRule,主要做用是指定分片列和分片函数,一个为function(分片函数),用于指定分片算法
<!--name属性指定分片表规则的名字,这个名字要惟一--> <tableRule name="rule1"> <rule> <!--分片列:mycat会对指定的分片列进行计算,最终肯定数据存放在哪一个分片上,通常选择表的主键--> <columns>id</columns> <!--分片函数 取<function>的name属性--> <algorithm>func1</algorithm> </rule> </tableRule>
<!--name表明函数名 class表明该算法所在的类 property表明函数所需的参数--> <function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot"> <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,不然无法分片 --> </function>
**经常使用的数据分片算法:**
简单取模分片算法
简单取模分片算法是经过对分片列进行取模,取模后将不一样的结果存入对应的数据库节点中:
例如:对下表经过简单取模算法分片,分片列为id,分为2个节点,则对id进行取模,结果为1的存入DB01,结果为0的存入DB02
**简单取模算法配置以下:**
<tableRule name="customer_login"> <rule> <columns>id</columns><!--指定分片列--> <algorithm>mod-long</algorithm><!--简单取模分片函数name--> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!--节点数量 --> <property name="count">2</property> </function>
哈希取模分片算法
哈希取模算法是经过对分片列进行哈希计算获得一个整数值,而后进行取模运算
** 哈希取模算法配置以下:**
<tableRule name="customer_login"> <rule> <columns>login_name</columns><!--指定分片列--> <algorithm>mod-long</algorithm><!--哈希取模分片函数name--> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByHashMod"> <!--节点数量 --> <property name="count">2</property> </function>
枚举分片算法是经过指定特定的枚举值将数据存入特色的节点
例如:以area\_id做为分片列,经过枚举算法将不一样的数据存入不一样的节点,在mapFile中指定area\_id为1000的存入DB01,将area_id为10001的数据存入DB02,而后设置默认其他值存入DB01
** 枚举分片算法配置以下:**
<tableRule name="jch"> <rule> <columns>area_id</columns> <algorithm>hash-int</algorithm> </rule> </tableRule> <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property><!--mapFile配置文件--> <property name="type">0</property><!--枚举值类型 0表明整数类型 1表明字符串类型 默认为0--> <property name="defaultNode">0</property><!-- >=0:启用默认节点 <0:不启用默认节点 --> </function>
字符串范围取模分片算法
字符串取模分片算法是经过取一个字符串前n个字符,经过计算其ASCII码的和,取模后存入对应的节点: 
** 字符串范围取模分片算法配置以下:**
<function name="sharding-by-prefix-pattern" class="io.mycat.route.function.PartitionByPrefixPattern"> <property name="patternValue">128</property><!--取模基数--> <property name="prefixLength">2</property><!--前缀长度--> <property name="mapFile">prefix-partition-pattern.txt</property><!--mapFile配置文件--> </function>
逻辑库逻辑表的配置
逻辑表所存储的数据节点的配置
数据节点所对应的物理数据库服务器信息的配置
schema.xml分为三个节点,schema节点用于定义逻辑库,dataNode,dataHost
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!--name:表示逻辑库库名 sqlMaxLimit:表示每次查询返回的最大行数,若取消限制 设置值为-1 serverx.xml中配置的defaultMaxLimit是mycat系统默认的返回行数, checkSQLschema:是否检查sql中含有数据库名称,便是否是经过库名.代表的方式查询 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <!-- 逻辑表配置 name:逻辑表名称,必须与物理表名称一致 primaryKey:物理表中的主键 dataNode:表数据存在物理节点的名称,用逗号分开 rule:分片规则 --> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" /> <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global" needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3" rule="mod-long" /> --> <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> <childTable name="order_items" joinKey="order_id" parentKey="id" /> </childTable> <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> </table> </schema> <!-- 定义逻辑表存储的物理数据库 name:定义数据节点名称,必须惟一 dataHost:定义分片所在的物理主机 这里是主机名称 这个名称下可能包含多个物理主机 database:定义屋里数据库的名称 --> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <!-- 定义了一组主从复制的集群 writeHost:处理写请求的数据库 readHost:处理读请求的数据库 通常为从服务器 name:数据库集群的名称 惟一 maxCon:最大链接数 minCon:初始化最小链接数 balance:读写分离和读的负载均衡 0表明不开启不写分离 读写所有在主服务器处理 1所有的readHost与stand by writeHost参与select语句的负载均衡 2所有的readHost与writeHost参与select语句的负载均衡 3所有的readHost参与select语句的负载均衡 writeType:写操做类型 0表明所有的写操做在第一个writeHost数据库进行 当第一个宕机后 写操做在第二个writeHost执行 1表明写请求随机发送到writeHost执行 dbType:数据库类型 dbDriver:数据库驱动 native mysql原生驱动 其余数据库用jdbc switchType: slaveThreshold: --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!--心跳检测语句--> <heartbeat>select user()</heartbeat> <!--通常为主次那个数据库中的主数据库--> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <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>