MySQL读写分离+分库分表-Mycat

需求:

    用户实例SERV是按照ORG_ID分到不同的数据库

    约定:

        北京(ORG_ID=101)、上海(ORG_ID=102)、深圳(ORG_ID=103)、重庆(ORG_ID=104)   、四川(ORG_ID=105)

        北京-bjdb、上海-shdb、深圳-szdb、重庆-cqdb  这四个库建在dn10和dn11上

        四川-scdb 库建在dn20和dn21上

架构图:

本篇不介绍高可用,下一步再来弄

功能描述:

1.所有的写都走主数据库

2.所有的读都走从数据库

3.非四川的数据写dn10,非四川的数据读dn11

4.四川的数据写dn20,四川的数据读dn21

Mycat配置文件

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

		<property name="sequnceHandlerType">2</property>
		<!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
		<!--  <property name="processorBufferChunk">40960</property> -->
		<!--  <property name="processors">1</property> -->
		<!--  <property name="processorExecutor">32</property> -->
		<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
		<property name="processorBufferPoolType">0</property>
		<!--默认是65535 64K 用于sql解析时最大文本长度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		<!--<property name="sequnceHandlerType">0</property>-->
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		<!--<property name="processorExecutor">16</property>-->
		
		<!-- 
		mycat监听的端口---程序员一般需要调整它
			serverport:程序需要连接的端口
			managerport:管理控制台的端口
		-->
		<property name="serverPort">8077</property> 
		<property name="managerPort">9077</property> 
		<!--
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
			<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> 
		-->
		<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
		<property name="handleDistributedTransactions">0</property>
		
		<!--
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">1</property>

		<!--
			单位为m
		-->
		<property name="memoryPageSize">1m</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否采用zookeeper协调切换  -->
		<property name="useZKSwitch">true</property>


	</system>
	
	
	<!-- 初学者需要修改的地方,定义了访问mycat的用户名与密码,还指定了mycat可以连接的数据库,如果有多个用","隔开 -->
	
	<user name="acct">
		<property name="password">12340101</property>
		<property name="schemas">acctdb</property>
	</user>
</mycat:server>

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">	
	
	<!-- 根据数据量配置两主两从,但不是高可用的两主两从做备份使用 关于里面标签和属性配置参考上面的读写分离部分-->
	<schema name="acctdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="acctNode">
		<table name="serv" dataNode="dn1,dn2,dn3,dn4,dn5" rule="sharding-by-orgid"/>
	</schema>
	
	<dataNode name="dn1" dataHost="dn1host" database="bjdb" />
	<dataNode name="dn2" dataHost="dn2host" database="shdb" />
	<dataNode name="dn3" dataHost="dn3host" database="szdb" />
	<dataNode name="dn4" dataHost="dn5host" database="cqdb" />
	<dataNode name="dn5" dataHost="dn4host" database="scdb" />
	
	<dataHost name="dn1host" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
		<heartbeat>select user();</heartbeat>
		<writeHost host="hostM1" url="192.168.245.111:3306" user="root" password="12340101">
			<readHost host="hostS101" url="192.168.245.112:3306" user="root" password="12340101" />
		</writeHost>
	</dataHost>	
	<dataHost name="dn2host" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
		<heartbeat>select user();</heartbeat>
		<writeHost host="hostM1" url="192.168.245.111:3306" user="root" password="12340101">
			<readHost host="hostS101" url="192.168.245.112:3306" user="root" password="12340101" />
		</writeHost>
	</dataHost>	
	<dataHost name="dn3host" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
		<heartbeat>select user();</heartbeat>
		<writeHost host="hostM1" url="192.168.245.111:3306" user="root" password="12340101">
			<readHost host="hostS101" url="192.168.245.112:3306" user="root" password="12340101" />
		</writeHost>
	</dataHost>	
	<dataHost name="dn4host" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
		<heartbeat>select user();</heartbeat>
		<writeHost host="hostM1" url="192.168.245.111:3306" user="root" password="12340101">
			<readHost host="hostS101" url="192.168.245.112:3306" user="root" password="12340101" />
		</writeHost>
	</dataHost>	
	
	<dataHost name="dn5host" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
		<heartbeat>select user();</heartbeat>
		<writeHost host="hostM1" url="192.168.245.113:3306" user="root" password="12340101">
			<readHost host="hostS101" url="192.168.245.114:3306" user="root" password="12340101" />
		</writeHost>
	</dataHost
	
</mycat:schema>

rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule  xmlns:mycat="http://org.opencloudb/">
  <tableRule name="sharding-by-hour">
    <rule>
      <columns>org_id</columns>
      <algorithm>sharding-by-orgid</algorithm>
    </rule>
  </tableRule>
  
  <function name="sharding-by-orgid" class="com.jv.ShardingByOrgId">
  </function>
   
</mycat:rule >

自定义分片规则类

import io.mycat.route.function.AbstractPartitionAlgorithm;

public class ShardingByOrgId extends AbstractPartitionAlgorithm {

	private static final long serialVersionUID = 1L;

	@Override
	public Integer calculate(String orgId) {
		switch(orgId) {
			case "101":
				return 1;
			case "102":
				return 2;
			case "103":
				return 3;
			case "104":
				return 4;
			case "105":
				return 5;
			default:
				return 5;
		}
	}
}

自定义分片规则需要继承AbstractPartitionAlgorithm并重写calculate方法,AbstractPartitionAlgorithm在Mycat-server-1.6-RELEASE.jar包中,可以在git中下载到它的源码

原生Mycat的分片规则可以参考 MyCat分片算法学习(纯转)

猜你喜欢

转载自my.oschina.net/u/3049601/blog/1787719