server.xml Mycat的配置文件,设置账号、参数等

schema.xml Mycat对应的物理数据库和数据库表的配置

rule.xml Mycat分片(分库分表)规则


server.xml==============================================================================

serverPort 3306服务端口

nanagerPort 9066管理端口

nonePasswordLogin 0需要密码 1不需要密码

bindIp 绑定IP

txIsolation 隔离级别

processors 进程数,通常等于cpu核数



权限设置,user用户对TESTDB中的tb01、tb02表的具体权限

<user name="user">
	<property name="password">123456</property>
	<property name="schemas">TESTDB</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 对应的4个字符含义依次是 insert/update/select/delete


可以查看mycat配置的用户,可以直接看到mysql的密码

<property name="password">123456</property>

我们可以通过java命令来加密

cd /usr/local/Mycat/lib

java -cp Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456

0:表示前端应用

<property name="usingDecrypt">1</property>
<property name="password">加密密码</property>

mysql -uroot -p -P9066 -h127.0.0.1



log4j2.xml==============================================================================

日志输出格式以及输出日志格式

<asyncRoot level="info" includeLocation="true">

ALL < Trace < Debug < Info < Warn < Error < Fatal < OFF


rule.xml==============================================================================

水平分片规则,分片规则所对应的分片函数

<tableRule name="rule1">
	<rule>
		<columns>id</columns> <!--分片列-->
		<algorithm>func1</algorithm> <!--分片函数算法-->
	</rule>
</tableRule>

<function name="func1" class="io.mycat.route.function.PartitionByLong">
	<property name="partitionCount">8</property>
	<property name="partitionLength">128</property>
</function>

常用分片算法

PartitionByMod 简单取模,比如以customer_id为分片,取模分片放入db1和db2中

<tableRule name="customer_login">
		<rule>
			<columns>customer_id</columns> <!--分片列-->
			<algorithm>mod-long</algorithm> <!--分片函数算法-->
		</rule>
	</tableRule>

	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<property name="count">2</property>
	</function>


PartitionByHashMod 哈希取模

<tableRule name="customer_login">
		<rule>
			<columns>login_name</columns> <!--分片列-->
			<algorithm>mod-long</algorithm> <!--分片函数算法-->
		</rule>
	</tableRule>

	<function name="mod-long" class="io.mycat.route.function.PartitionByHashMod">
		<property name="count">2</property>
	</function>


PartitionByFileMap 分片枚举,不如根据areaid按照区域分片

<tableRule name="hash_int">
		<rule>
			<columns>area_id</columns> <!--分片列-->
			<algorithm>mod-long</algorithm> <!--分片函数算法-->
		</rule>
	</tableRule>

	<function name="hash_int" class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
		<property name="type">0</property> <!--0:INT 非0:string-->
		<property name="defaultNode">0</property> <!-->=0:启用默认节点 <0:不启用-->
	</function>


conf目录下创建partition-hash-int.txt

10000=0

10001=1

DEFAULT_NODE=0


PartitionByPrefixPattern 字符串范围取模(如订单号后五位分片等)

<!--mod((ASCII('J') + ASCII(a)), 128) = 43-->
	<tableRule name="sharding-by-prefix-parttern">
		<rule>
			<columns>login_name</columns> <!--分片列-->
			<algorithm>mod-long</algorithm> <!--分片函数算法-->
		</rule>
	</tableRule>

	<function name="sharding-by-prefix-parttern" class="io.mycat.route.function.PartitionByPrefixPattern">
		<property name="patternValue">128</property> <!--取模基数-->
		<property name="prefixLenth">2</property> <!--login_name头两个字符-->
		<property name="mapFile">prefix-partition-pattern.txt</property>
	</function>



prefix-partition-pattern.txt

0-63=0

64-127=1


schema.xml==============================================================================

逻辑库逻辑表配置,逻辑表所存储的数据节点配置以及物理数据库配置


<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

sqlMaxLimit 限制返回结果集的行数,-1表示关闭limit限制

如果没有指定,那么就会使用server.xml中的限制

dataNode 定义逻辑表存储的物理数据库

<dataHost name="mysql0103" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
	<heartbeat>select user()</heartbeat>
	<writeHost host="192.168.1.2" url="192.168.1.2:3306" user="root" password="123456">
		<readHost host="192.168.1.3" url="192.168.1.3:3306" user="root" password="123456" />
	</writeHost>
</dataHost>

balance 0:不开启读写分离

        1:全部的readHost与stand by writeHost参与select语句的负载均衡

        2:所有的readHost与writeHost都参与select语句的负载均衡

        3:所有readHost参与select语句的负载均衡,writeHost不负担读压力


writeType 0:写请求到第一个写主机 

          1:随机写主机


switchType 1:默认值,自动切换

   2:基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

   3:基于MySQL galary cluster的切换机制(适合集群)

  -1:不自动切换


heartbeat 检查后端数据库是否可用


示例

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="customer_login" primaryKey="customer_id" dataNode="logindb01,logindb02" rule="customer_login" />
	</schema>

	<dataNode name="logindb01" dataHost="mysql01" database="login_db01" />
	<dataNode name="logindb02" dataHost="mysql02" database="login_db02" />


	<dataHost name="mysql0103" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
		<heartbeat>select user()</heartbeat>
		<writeHost host="192.168.1.2" url="192.168.1.2:3306" user="root" password="123456">
			<readHost host="192.168.1.3" url="192.168.1.3:3306" user="root" password="123456" />
		</writeHost>
		<writeHost host="192.168.1.3" url="192.168.1.3:3306" user="root" password="123456" />
	</dataHost>
</mycat:schema>