需求:
用户实例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分片算法学习(纯转)