在前面《Mycat数据库中间件系列(七)Mycat2实战单数据源分库分表之多库多表》我们介绍了在一个mysql实例上面做数据库的分库分表,这篇文章我们介绍下在多个mysql实例上做数据库的分库分表。
最后得到的效果图如下:
由上图我们可以看到我们会创建2个school库,分别会分布在不同的mysql实例上。同时在每一个mysql实例上都会有2个studetns表。下面我们直接开始演示:
一、准备两个单独的mysql实例及一个mycat实例
这里的mysql实例是单独的,不是主从结构,这里为了演示,我已经准备好了。
二、在mycat上添加数据源
这里我们需要在mycat上添加下每一个mysql实例的数据源。使用的注解如下:
/*+ mycat:createDataSource{ "name":"dw0", "url":"jdbc:mysql://192.168.31.10:33307/mysql", "user":"root", "password":"123456" } */; /*+ mycat:createDataSource{ "name":"dr0", "url":"jdbc:mysql://192.168.31.10:33307/mysql", "user":"root", "password":"123456" } */; /*+ mycat:createDataSource{ "name":"dw1", "url":"jdbc:mysql://192.168.31.10:33308/mysql", "user":"root", "password":"123456" } */; /*+ mycat:createDataSource{ "name":"dr1", "url":"jdbc:mysql://192.168.31.10:33308/mysql", "user":"root", "password":"123456" } */;
这里我们可以看到,每一个实例做了两遍,这确实是需要的,因为在配置集群的时候需要配置两个,所以我们的做法是把每一个数据源单独创建2份,这两份对应的就是读与写这块。所以这里切记:2个mysql实例,就要就要4个数据源,3个mysql实例,就要创建6个数据源。
三、把添加的数据源添加到cluster里面去
上面我们已经创建好了数据源,那么接下来我们就需要在mycat上创建2个集群,使用的注解如下:
/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */; /*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */;
备注:
1、这里每一个读与写分别作为一个cluster集群。
2、集群这里的name只能是以c+数字开头,如果配置为其他规则的名称,mycat识别不了。
四、使用mycat创建school数据库
这里使用mycat客户端,登陆上去后,创建一个school的数据库
create database school DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
创建成功之后,我们再mycat下可以看到一个school的数据库,在mysql实例1里面也可以看到一个school的数据库,但是在mysql实例2上却看不到school的数据库,这主要是因为mysql实例1是我们默认配置的mycat的datasource,所以在这一点上他可以看到一个school的数据库。
五、在school数据库下创建一个students的表
和之前一样,在school库下创建students表,使用的sql语句如下:
CREATE TABLE IF NOT EXISTS `school`.`students` ( `student_id` bigint(11) NOT NULL COMMENT '学生id', `school_id` bigint(11) NOT NULL COMMENT '学校id', `class_id` bigint(11) DEFAULT NULL COMMENT '班级id', `student_name` varchar(20) DEFAULT NULL COMMENT '学生姓名', PRIMARY KEY (`student_id`) ) ENGINE = InnoDB CHARSET = utf8 DBPARTITION BY mod_hash(school_id) DBPARTITIONS 2 TBPARTITION BY mod_hash(student_id) TBPARTITIONS 2;
此时我们可以看到school_0库分布到了mysql1这个实例上,school_1库分布到了mysql2这个实例上。
六、插入数据测试
使用如下的sql,插入4条数据到students表里面去
INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (1, 1,1,"张三"); INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (2, 1,1,"李四"); INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (3, 2,1,"王五"); INSERT INTO `school`.`students`(`student_id`, `school_id`, `class_id`, `student_name`) VALUES (4, 2,1,"赵六");
此时我们先查看school_0库下面的students_0表的数据
再看看schoo_0库下面的students_1表的数据
再看看shcool_1库下面的students_0表的数据
再看看school_1库下的students_1表的数据
可以看到数据被存储到不同的mysql实例上的不同表里面去了。
七、查询测试
最后我们使用mycat查询下这些分不到不同实例上的students数据:
select * from students;
可以看到通过mycat查询这些分库分表的数据没有任何问题。
还没有评论,来说两句吧...