不积跬步,无以至千里;不积小流,无以成江海。

Mycat主从同步、读写分离、分库分表(4)-Mycat数据分片测试

数据库 康康 1412℃ 0评论

本篇实验仍然是基于上篇的主从同步环境,在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主从同步、读写分离、分库分表(4)-Mycat数据分片测试

喜欢 (1)or分享 (0)
发表我的评论
取消评论

 

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址