在现实的技术开发之中,对于数据表中的主键肯定不可能交由数据库独立生成,也就是说所有的主键都应该通过程序控制的形式来完成定义,那么这样一来所有的主键基本上都是以字符串的形式出现居多,如果现在使用的是字符串则必须根据字符串的内容实现水平分库,而如果使用的是数字,那么就可以采用之前的做法进行求模分库 。
1. 使用一张新的数据库,而这张表之中的id使用字符串存储:
DROP DATABASE IF EXISTS yootk ; CREATE DATABASE yootk CHARACTER SET UTF8 ; use yootk ; CREATE TABLE member( mid VARCHAR(50) , name VARCHAR(50), CONSTRAINT pk_mid PRIMARY KEY(mid) ) ;
2. 如果要想按照字符串的方式进行水平分库的话,这个时候就需要设置一个处理算法,修改rule.xml文件:
》打开rule.xml配置文件:vim /usr/local/mycat/conf/rule.xml
》定义规则:
<tableRule name="member-mid-murmur"> <rule> <columns>mid</columns> <algorithm>member-murmur</algorithm> </rule> </tableRule>
》定义算法:
<function name="member-murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<property name="count">3</property>
<property name="virtualBucketTimes">160</property>
</function>
3. 修改schema.xml配置文件:vim /usr/local/mycat/conf/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"> <table name="member" primaryKey="mid" dataNode="dna,dnb,dnc" rule="member-mid-murmur"/> </schema> <dataNode name="dna" dataHost="localhost1" database="yootk" /> <dataNode name="dnb" dataHost="localhost2" database="yootk" /> <dataNode name="dnc" dataHost="localhost3" database="yootk" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.195.148:3306" user="root" password="mysqladmin"> <readHost host="hostS2" url="192.168.195.149:3306" user="root" password="mysqladmin" /> </writeHost> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.195.150:3306" user="root" password="mysqladmin"/> </dataHost> <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.195.151:3306" user="root" password="mysqladmin"/> </dataHost> </mycat:schema>
4. 重新启动MyCat进程:/usr/local/mycat/bin/mycat restart
5. 登录数据库操作端口实现数据增加:
mysql -uroot -p123456 -P8066 -DTESTDB -h127.0.0.1
》增加数据:
INSERT INTO member(mid,name) VALUES ('lee-a',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-b',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-c',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-d',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-e',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-f',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-g',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-h',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-i',@@hostname) ; INSERT INTO member(mid,name) VALUES ('lee-j',@@hostname) ;
那么此时的数据是根据字符串的ID形式进行了分配处理;