分库方式
垂直分库
垂直分库根据业务进行划分,将同一类业务相关的数据表划分在同一个库中
水平分库
按照一定的规则对数据库进行划分,每个数据库总各个表结构相同, 数据存储在不同的数据库, 如根据年份划分不同的数据库
配置
配置server.xml
配置Mycat服务的端口和Mycat服务的用户
<!-- Mycat 服务端口8066 -->
<property name="serverPort">8066</property>
<!-- root用户 -->
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
/user>
<!-- 只读用户 -->
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
配置schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<!--<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<!-- <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> -->
<!-- <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> -->
<!-- random sharding using mod sharind rule -->
<!-- <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> -->
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
<!-- customer表不分库不分表 -->
<table name="customer" dataNode="dn1" />
<!-- item 进行分库操作, 分库规则为mod-long -->
<table name="item" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long" />
<!-- customer_order 使用Mycat进行分表操作, 分表规则为mod-long, customer_order 分表为customer_order1, customer_order2, customer_order3 -->
<table name="customer_order" primaryKey="ID" subTables="customer_order$1-3" dataNode="dn3" rule="mod-long"/>
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="localhost" database="mycat01" />
<dataNode name="dn2" dataHost="localhost" database="mycat02" />
<dataNode name="dn3" dataHost="localhost" database="mycat03" />
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<!-- 配置数据库连接 -->
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="sheep1993">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="localhost:3306" user="root" password="sheep1993" />
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<!--
<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" password="jifeng"></writeHost>
</dataHost>
<dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" password="123456" > </writeHost> </dataHost>
<dataHost name="jdbchost" maxCon="1000" minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>
<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
<heartbeat> </heartbeat>
<writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" password="jifeng"></writeHost> </dataHost> -->
<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
</dataHost> -->
</mycat:schema>
配置rule.xml
除mod-long规则以外,还可以配置其他规则
<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>
启动
./mycat start