本篇实验仍然是基于上篇的主从同步环境,在3306创建5个数据库 db1,db2,db3,db4,db5、并加入到主从同步,在mycat中将这5个数据库配置为分片数据库,使用范围约定算法来测试数据分片。
mycat的10中数据分片规则:Mycat中的10中分片规则
基于上篇的实验,我们当前的环境为:
角色 服务端口 用户 密码
master 3306 root root@3306
slave 3307 root root@3307
slave 3308 root root@3308
创建分片数据库,配置主从同步
分别登录到3306、3307、3308,创建数据库db1-5 数据库
create database db1; create database db2; create database db3; create database db4; create database db5;
分别编辑/etc/my3306.cnf、/etc/my3307.cnf、/etc/my3308.cnf,
将创建的数据库配置为需要同步
/etc/my3306.cnf:
#需要同步的数据库 binlog-do-db = test_db binlog-do-db = db1 binlog-do-db = db2 binlog-do-db = db3 binlog-do-db = db4 binlog-do-db = db5
/etc/my3307.cnf:
#需要备份的数据库 replicate-do-db=test_db replicate-do-db = db1 replicate-do-db = db2 replicate-do-db = db3 replicate-do-db = db4 replicate-do-db = db5
/etc/my3308.cnf:
#需要备份的数据库 replicate-do-db=test_db replicate-do-db = db1 replicate-do-db = db2 replicate-do-db = db3 replicate-do-db = db4 replicate-do-db = db5
重启3306、3307、3308的mysql服务
配置Mycat数据分片
开启Mycat自增ID
mycat有两种实现方式,一种是配置文件、一种是数据库方式来实现全局自增ID,本例使用配置文件方式实现
编辑配置文件 conf/sequence_conf.properties :
#自带的全局自增配置 GLOBAL.CURID=10052 GLOBAL.MINID=10001 GLOBAL.MAXID=20000 GLOBAL.HISIDS= #我们自定义的: CUSTOMER.HISIDS= CUSTOMER.CURID=100 CUSTOMER.MINID=100 CUSTOMER.MAXID=10000
MINID:表示最小的ID,也就是初始的
MAXID:最大的ID,如果用完了,插入数据时会报错
CURID:当前ID,每次插入数据会将当前ID记录到这个属性,所以这个文件是不停在变化
使用自增时用特定的SQL语句来调用这个方案
例如 : next value for MYCATSEQ_CUSTOMER 即返回CURID+1
选择分片方案
mycat的分片规则配置文件为conf/rule.xml,分片规则可查看 :Mycat中的10中分片规则
我们使用比较简单的一种规则,根据主键的范围进行分片,查看rule.xml:
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>#对应的方法为rang-long,使用时会调用autopartition-long.txt中编辑好的规则,所以我们编辑autopartition-long.txt文件
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
编辑conf/schema.xml:
<!--
定义分片表t_customer 分布在db6-db10 ,
规则用默认的auto-sharding-long
autoIncrement="true" 开启主键自增
-->
<table primaryKey="id" autoIncrement="true" name="t_customer" dataNode="db$6-10" rule="auto-sharding-long" />
<!--定义数据节点,虚拟库名称db6-10 对应我们开始创建的数据库 db1、db2、db3、db4、db5 -->
<dataNode name="db$6-10" dataHost="localhost1" database="db$1-5" />
编辑分片规则:
编辑conf/autopartition-long.txt 配置分片规则:
# range start-end ,data node index #左边为ID范围a-b 右边为配置的数据节点 100-120=0 121-140=1 141-160=2 161-180=3 181-200=4
这段表示 主键id为100-120的数据存到第一个分片,121-140存到第二个分片,以此类推。注意:右边必须从0开始,并不对应dataNode中$6-10,应该是数组index
测试分片方案
使用我们配置的t_customer表进行测试,创建t_customer表,并插入100条数据,主键id为100-200,最后查看是否数据正常进入到各分片
创建测试表t_customer:
#重启mycat :
mycat restart
#登录到mycat:
#注意:虽然我们增加了db1-db5 5个数据库,但是mycat中配置的逻辑数据库仍然是test_db
mysql -uroot -p123456 -h127.0.0.1 -P8066 test_db
#创建表t_customer:
mysql>use test_db;
mysql> create table t_customer(
id int primary key auto_increment,
username varchar(20) not null,
password varchar(50) not null,
createtime datetime ,
port varchar(5)
);
#查看路由情况:
mysql> explain select * from t_customer;
+-----------+------------------------------------+
| DATA_NODE | SQL |
+-----------+------------------------------------+
| db10 | SELECT * FROM t_customer LIMIT 100 |
| db6 | SELECT * FROM t_customer LIMIT 100 |
| db7 | SELECT * FROM t_customer LIMIT 100 |
| db8 | SELECT * FROM t_customer LIMIT 100 |
| db9 | SELECT * FROM t_customer LIMIT 100 |
+-----------+------------------------------------+
5 rows in set (0.01 sec)
可以看到select的数据来源于5个分片
向t_customer表插入100条测试数据
#next value for MYCATSEQ_CUSTOMER 就调用了我们自定义的自增ID方案 mysql>insert into t_customer(id,username,password,createtime,port) values (next value for MYCATSEQ_CUSTOMER,CONCAT('user_',FLOOR((RAND()*1000))),'111111',NOW(),@@PORT); .....执行100次 #查询数据: mysql> select * from t_customer; +-----+----------+----------+---------------------+------+ | id | username | password | createtime | port | +-----+----------+----------+---------------------+------+ | 101 | user_10 | 111111 | 2017-08-16 14:05:48 | 3308 | | 102 | user_389 | 111111 | 2017-08-16 14:05:57 | 3308 | | 103 | user_56 | 111111 | 2017-08-16 14:05:58 | 3308 | | 104 | user_918 | 111111 | 2017-08-16 14:05:59 | 3308 | | 105 | user_252 | 111111 | 2017-08-16 14:06:01 | 3308 | | 106 | user_422 | 111111 | 2017-08-16 14:06:02 | 3308 | | 107 | user_93 | 111111 | 2017-08-16 14:06:03 | 3308 | | 108 | user_356 | 111111 | 2017-08-16 14:06:04 | 3308 | | 109 | user_708 | 111111 | 2017-08-16 14:06:07 | 3308 | | 110 | user_514 | 111111 | 2017-08-16 14:06:08 | 3308 | | 111 | user_264 | 111111 | 2017-08-16 14:06:09 | 3308 | | 112 | user_503 | 111111 | 2017-08-16 14:06:10 | 3308 | | 113 | user_193 | 111111 | 2017-08-16 14:06:11 | 3308 | | 114 | user_972 | 111111 | 2017-08-16 14:06:17 | 3308 | | 115 | user_177 | 111111 | 2017-08-16 14:06:18 | 3308 | | 116 | user_353 | 111111 | 2017-08-16 14:06:19 | 3308 | | 117 | user_305 | 111111 | 2017-08-16 14:06:20 | 3308 | | 118 | user_850 | 111111 | 2017-08-16 14:06:20 | 3308 | | 119 | user_995 | 111111 | 2017-08-16 14:06:21 | 3308 | | 120 | user_190 | 111111 | 2017-08-16 14:06:22 | 3308 | | 121 | user_582 | 111111 | 2017-08-16 14:06:23 | 3307 | | 122 | user_276 | 111111 | 2017-08-16 14:06:24 | 3307 | | 123 | user_606 | 111111 | 2017-08-16 14:06:29 | 3307 | | 124 | user_715 | 111111 | 2017-08-16 14:06:30 | 3307 | | 125 | user_830 | 111111 | 2017-08-16 14:06:36 | 3307 | | 126 | user_202 | 111111 | 2017-08-16 14:06:37 | 3307 | | 127 | user_6 | 111111 | 2017-08-16 14:06:38 | 3307 | | 128 | user_194 | 111111 | 2017-08-16 14:06:38 | 3307 | | 129 | user_539 | 111111 | 2017-08-16 14:06:39 | 3307 | | 130 | user_362 | 111111 | 2017-08-16 14:06:40 | 3307 | | 131 | user_681 | 111111 | 2017-08-16 14:06:41 | 3307 | | 132 | user_230 | 111111 | 2017-08-16 14:06:42 | 3307 | | 133 | user_785 | 111111 | 2017-08-16 14:06:43 | 3307 | | 134 | user_64 | 111111 | 2017-08-16 14:06:43 | 3307 | | 135 | user_885 | 111111 | 2017-08-16 14:06:44 | 3307 | | 136 | user_70 | 111111 | 2017-08-16 14:06:46 | 3307 | | 137 | user_630 | 111111 | 2017-08-16 14:06:46 | 3307 | .... 由于我们已经做了主从同步,读写分离。刚刚插入的数据来源于3307和3308两个库
验证分片是否正常:
登录到3306主库查看数据:
#查看分片数据库,可以看到最开始我们创建的5个分片 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | db4 | | db5 | | mysql | | performance_schema | | test | +--------------------+ 11 rows in set (0.00 sec) #查看第一个分片db1: mysql> use db1; Database changed mysql> show tables; +---------------+ | Tables_in_db1 | +---------------+ | t_customer | +---------------+ 1 row in set (0.00 sec) mysql> select * from t_customer; +-----+----------+----------+---------------------+------+ | id | username | password | createtime | port | +-----+----------+----------+---------------------+------+ | 101 | user_10 | 111111 | 2017-08-16 14:05:48 | 3306 | | 102 | user_389 | 111111 | 2017-08-16 14:05:57 | 3306 | | 103 | user_56 | 111111 | 2017-08-16 14:05:58 | 3306 | | 104 | user_918 | 111111 | 2017-08-16 14:05:59 | 3306 | | 105 | user_252 | 111111 | 2017-08-16 14:06:01 | 3306 | | 106 | user_422 | 111111 | 2017-08-16 14:06:02 | 3306 | | 107 | user_93 | 111111 | 2017-08-16 14:06:03 | 3306 | | 108 | user_356 | 111111 | 2017-08-16 14:06:04 | 3306 | | 109 | user_708 | 111111 | 2017-08-16 14:06:07 | 3306 | | 110 | user_514 | 111111 | 2017-08-16 14:06:08 | 3306 | | 111 | user_264 | 111111 | 2017-08-16 14:06:09 | 3306 | | 112 | user_503 | 111111 | 2017-08-16 14:06:10 | 3306 | | 113 | user_193 | 111111 | 2017-08-16 14:06:11 | 3306 | | 114 | user_972 | 111111 | 2017-08-16 14:06:17 | 3306 | | 115 | user_177 | 111111 | 2017-08-16 14:06:18 | 3306 | | 116 | user_353 | 111111 | 2017-08-16 14:06:19 | 3306 | | 117 | user_305 | 111111 | 2017-08-16 14:06:20 | 3306 | | 118 | user_850 | 111111 | 2017-08-16 14:06:20 | 3306 | | 119 | user_995 | 111111 | 2017-08-16 14:06:21 | 3306 | | 120 | user_190 | 111111 | 2017-08-16 14:06:22 | 3306 | +-----+----------+----------+---------------------+------+ 20 rows in set (0.00 sec) 可以看到ID 为 101-120的数据正确进入到第一个分片db1 查看第二个分片db2: mysql> use db2 Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from t_customer; +-----+----------+----------+---------------------+------+ | id | username | password | createtime | port | +-----+----------+----------+---------------------+------+ | 121 | user_582 | 111111 | 2017-08-16 14:06:23 | 3306 | | 122 | user_276 | 111111 | 2017-08-16 14:06:24 | 3306 | | 123 | user_606 | 111111 | 2017-08-16 14:06:29 | 3306 | | 124 | user_715 | 111111 | 2017-08-16 14:06:30 | 3306 | | 125 | user_830 | 111111 | 2017-08-16 14:06:36 | 3306 | | 126 | user_202 | 111111 | 2017-08-16 14:06:37 | 3306 | | 127 | user_6 | 111111 | 2017-08-16 14:06:38 | 3306 | | 128 | user_194 | 111111 | 2017-08-16 14:06:38 | 3306 | | 129 | user_539 | 111111 | 2017-08-16 14:06:39 | 3306 | | 130 | user_362 | 111111 | 2017-08-16 14:06:40 | 3306 | | 131 | user_681 | 111111 | 2017-08-16 14:06:41 | 3306 | | 132 | user_230 | 111111 | 2017-08-16 14:06:42 | 3306 | | 133 | user_785 | 111111 | 2017-08-16 14:06:43 | 3306 | | 134 | user_64 | 111111 | 2017-08-16 14:06:43 | 3306 | | 135 | user_885 | 111111 | 2017-08-16 14:06:44 | 3306 | | 136 | user_70 | 111111 | 2017-08-16 14:06:46 | 3306 | | 137 | user_630 | 111111 | 2017-08-16 14:06:46 | 3306 | | 138 | user_695 | 111111 | 2017-08-16 14:06:47 | 3306 | | 139 | user_959 | 111111 | 2017-08-16 14:06:48 | 3306 | | 140 | user_264 | 111111 | 2017-08-16 14:06:49 | 3306 | +-----+----------+----------+---------------------+------+ 20 rows in set (0.00 sec)
我们还可以登录到从库3307和3308查看:
附录
- Mycat 捐赠地址 :http://www.mycat.io/donate.html
- Mycat 官方网站:http://www.mycat.io/
- Mycat 源码:https://github.com/MyCATApache/Mycat-Server
- Mycat 下载地址:https://github.com/MyCATApache/Mycat-download
其他实验