前几篇文章实现了主从备份和读写分离。
如果实际生产中数据规模比较大,就要考虑将同一张表的数据放到不同的数据库中,即实现分库功能。本编主要实现两主两从。
一、数据库准备
- 前面已经有主库
(192.168.209.128)
和从库(192.168.209.129)
两台机器 - 再增加两台机器,主库
(192.168.209.130)
和从库(192.168.209.132)
二、修改mycat配置文件
主要修改schema.xml文件,原配置文件为
<!-- 这种配置是dn1逻辑库下的所有的表 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- cib 为你的数据库的名称 -->
<dataNode name="dn1" dataHost="localhost1" database="cib" />
<dataHost name="localhost1" 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="192.168.209.128:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.209.129:3306" user="root" password="123456" />
</writeHost>
</dataHost>
上面的配置是逻辑库TESTDB中的所有的表,都是读写分离。
至于要对表分库就要在schema标签中增加每张表的table子标签
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1" />
<table name="t_order" dataNode="dn1, dn2" rule="crc32slot"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="cib" />
<dataNode name="dn2" dataHost="localhost2" database="db_test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.209.128:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.209.129:3306" user="root" password="123456" />
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="192.168.209.130:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS3" url="192.168.209.132:3306" user="root" password="123456" />
</writeHost>
</dataHost>
对配置文件的说明:
1、t_user 这张表不分库,而且只存在于 主库192.168.209.128
和从库192.168.209.129
中,
2、t_order这张表要分到两个主库,分库策略是crc32slot,而且要在mycat的配置文件/rule.xml中配置好分片策略。注意 crc32slot分片规则,在使用的时候,要求必须先设置好分片规则,再启动mycat。如果先启动了mycat,再设置分片规则,会导致分片规则失效。需要删除conf目录中的ruledata子目录。ruledata目录中会记录crc32slot的分片节点,日志文件命名规则为crc32slot_表名
<tableRule name="crc32slot">
<rule>
<columns>id</columns>
<algorithm>crc32slot</algorithm>
</rule>
</tableRule>
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>
// 说明,如果再增加一张表t_test要分三个库,
<table name="t_test" dataNode="dn1, dn2, dn3" rule="crc32slot1"/>
// 在rule.xml中增加
<tableRule name="crc32slot1">
<rule>
<columns>id</columns>
<algorithm>crc32slot</algorithm>
</rule>
</tableRule>
<function name="crc32slot1" class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>
3、在各自的主库中先要创建好物理库,和mycat无关
(1)在128主库中创建cib这个数据库,129从库也会创建
(2)在130主库中创建db_test这个数据库,132从库也会创建
4、登录mycat
./mysql -uroot -p -h192.168.209.128 -P8066
mysql> use TESTDB;
mysql> show tables;
再创建 create table 中显示的所有的库表t_user和t_order
看到mycat会自动根据配置的情况把不同的表创建的不同的库中,
分库的表中会自动增加字段_slot用于存放分库策略的一些数据;
往分库的表中多插入几条数据,可以看到这些数据被存放到不空的库表中,证明分库成功
5、示例中物理库和物理表的具体情况