Mycat配置水平垂直拆分

Mycat配置水平垂直拆分

垂直拆分分库

配置schema.xml配置文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- 逻辑库 -->
	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
    <!-- order表在dn2上 -->
		<table name="order" dataNode="dn2"/>
	</schema>
	
		<!-- 数据节点,真实的数据库 -->
	<dataNode name="dn1" dataHost="host1" database="mybatis" />
  <dataNode name="dn2" dataHost="host2" database="mybatis" />
	
	<dataHost name="host1" 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">
		</writeHost>
	</dataHost>
  
  <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<!-- 心跳检测 -->
		<heartbeat>select user()</heartbeat>
		<!-- 写主机 -->
		<writeHost host="hostM2" url="localhost:3307" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>

水平拆分分表

配置schema.xml配置文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<!-- 逻辑库
    checkSQLschema 设置为true时,mycat会自动去掉sql语句中对应的schema字符。如select * from TESTDB.order 会变为  select * from order
   sqlMaxLimit 对于执行的sql语句,如果没有limit的话,会自动加上limit
  -->
	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
    <!-- order表在dn1和dn2上进行水平分表   rule是分片规则,在rule.xml中进行配置 -->
		<table name="order" dataNode="dn1,dn2" rule="mod_rule">
      <!-- 由于join不能跨服务器进行join,所以对于order表的子表也需要与对应的order表数据分到同一个服务器上   
      joinKey:插入子表时会使用该列的值来查找父表存储的数据节点 -->
      <childTable name-"order_detail" primaryKey="id" joinKey="order_id" parentKey="id"></childTable>
    </table>
	</schema>
	
		<!-- 数据节点,真实的数据库 -->
	<dataNode name="dn1" dataHost="host1" database="mybatis" />
  <dataNode name="dn2" dataHost="host2" database="mybatis" />
	
  <!-- 定义了具体的数据库实例 -->
	<dataHost name="host1" 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">
		</writeHost>
	</dataHost>
  
  <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<!-- 心跳检测 -->
		<heartbeat>select user()</heartbeat>
		<!-- 写主机 -->
		<writeHost host="hostM2" url="localhost:3307" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
</mycat:schema>

rule.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="mod_rule">
		<rule>
      <!-- 规则生效的列名 -->
			<columns>user_id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>

	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- 节点数量-->
		<property name="count">2</property>
	</function>
</mycat:rule>

分片规则

常用的分片规则有取模、分片枚举

取模

对分片字段进行取模运算

<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>
分片枚举

在配置文件中配置可能的枚举,自己配置分片,适用于特定的场景,如保险中分省保存数据

<tableRule name="sharding-by-intfile">
		<rule>
			<columns>sharding_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>
  <!-- 类型 0为int型、非0为String -->
  <property name="type">0</property>
  <!-- 默认节点,小于0则表示不设置默认节点,大于等于0表示设置默认节点 -->
  <property name="defaultNode">0</property>
	</function>

partition-hash-int.txt中配置的内容

10000=0
10010=1
范围分片

分片字段某个范围属于某个分片

<tableRule name="auto-sharding-long">
		<rule>
			<columns>id</columns>
			<algorithm>rang-long</algorithm>
		</rule>
	</tableRule>

<function name="rang-long"
			  class="io.mycat.route.function.AutoPartitionByLong">
		<property name="mapFile">autopartition-long.txt</property>
  <!-- 默认节点,小于0则表示不设置默认节点,大于等于0表示设置默认节点 -->
  <property name="defaultNode">0</property>
	</function>

autopartition-long.txt中配置

2000001-4000000=1
0-2000000=0
4000001-8000000=2
日期分片

按照天进行分片

<tableRule name="sharding-by-date">
		<rule>
			<columns>createTime</columns>
			<algorithm>partbyday</algorithm>
		</rule>
	</tableRule>

<function name="partbyday"
			  class="io.mycat.route.function.PartitionByDate">
  <!-- 日期格式 -->
		<property name="dateFormat">yyyy-MM-dd</property>
		<property name="sNaturalDay">0</property>
  <!-- 开始日期 -->
		<property name="sBeginDate">2014-01-01</property>
  <!-- 结束日期,数据如果达到这个日期的分片后,则循环从最开始的分片插入 -->
		<property name="sEndDate">2014-01-31</property>
  <!-- 分区天数,从开始日期算起,几天为一个分区 -->
		<property name="sPartionDay">10</property>
	</function>