123456test_schema
usertest_schematrue
server.xml 中的标签本就不多,这个标签主要用于定义登录 mycat 的用户和权限。
例如上面的例子中,我定义了一个用户,用户名为 root 、密码也为 123456,可访问的 schema 也只有 test_schema 一个 逻辑库。
官方完整的默认配置 server.xml
Mycat 系统配置
01002false
809600000
8066906638000000.0.0.04096320164k1k0384mfalse
schema.xml
schema 标签用于定义 My Cat 实例中的逻辑库,My Cat 可以有多个逻辑库,每个逻辑库都有自己的相关配 置。可以使用 schema 标签来划分这些不同的逻辑库。
vim schema.xml
show slave status如上所示的配置就配置了1个逻辑库,逻辑库的概念和 MYSQL 数据库中 Database 的概念相同,我们在查询这个逻辑库中表的时候需要切换到该逻辑库下才可以查询到所需要的表。
schema 标签
用于定义 My Cat 实例中的逻辑库,My Cat 可以有多个逻辑库,每个逻辑库都有自己的相关配 置。可以使用 schema 标签来划分这些不同的逻辑库。
data Node 属性
该属性用于绑定逻辑库到某个具体的 database 上,1.3 版本如果配置了 data Node,则不可以配置分片表, 1.4 可以配置默认分片,只需要配置需要分片的表即可
data Host 标签
作为 Schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。现在我们就解析下这个标签。
name 属性
唯一标识 data Host 标签,供上层的标签使用。
max Con 属性
指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 write Host、read Host 标签都会使用这个属性的值来实例化出连接池的最大连接数。
min Con 属性
指定每个读写实例连接池的最小连接,初始化连接池的大小。
balance 属性
负载均衡类型,目前的取值有 3 种:
1.balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 write Host 上。
2.balance="1",全部的 read Host 与 stand by write Host 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载 均衡。
3.balance="2",所有读操作都随机的在 write Host、readhost 上分发。 4.balance="3",所有读请求随机的分发到 wiriter Host 对应的 readhost 执行,writer Host 不负担读压 力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
write Type 属性
负载均衡类型,目前的取值有 3 种:
-
write Type="0", 所有写操作发送到配置的第一个 write Host,第一个挂了切到还生存的第二个write Host,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
-
write Type="1",所有写操作都随机的发送到配置的 write Host,1.5 以后废弃不推荐。
**switch Type 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于 My SQL 主从同步的状态决定是否切换
db Type 属性
指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等。
db Driver 属性
指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
从 1.6 版本开始支持 postgresql 的 native 原始协议。
如果使用 JDBC 的话需要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:com.mysql.jdbc.Driver。
switch Type 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于 My SQL 主从同步的状态决定是否切换 心跳语句为 show slave status
3 基于 My SQL galary cluster 的切换机制(适合集群)(1.4.1) 心跳语句为 show status like ‘wsrep%’.
temp Read Host Available 属性
如果配置了这个属性 write Host 下面的 read Host 仍旧可用,默认 0 可配置(0、1)
rule.xml
rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有 table Rule 和 function 这两个标签。在具体使用过程中可以按照需求添加 table Rule 和 function。
vim rule.xml
create_timesharding-by-date-dayyyyy-MM-dd2017-11-152017-11-171
这个标签定义表规则。 定义的表规则,在 schema.xml:
tableRule name="sharding-by-date"
启动 Mycat
/usr/local/mycat/bin
./mycat start
查看日志
启动 mycat 的日志
less /usr/local/mycat/logs/wrapper.log
访问 mycat 的日志
less /usr/local/mycat/logs/mycat.log
使用 Mycat
登录 Mycat 切换到 test_schema 逻辑库
mysql -uroot -p123456 -h192.168.252.123 -P 8066
创建库/表
mysql> use test_schema;
Database changed
mysql> show tables;
+-----------------------+
| Tables in test_schema |
+-----------------------+
| test_one |
+-----------------------+
1 row in set
mysql>
只需要在 Mycat 服务器执行以下脚本,就会自动同步到 MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122
mysql> CREATE TABLE `test_one` (
`id` BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` VARCHAR (50) DEFAULT NULL COMMENT '名称',
`remark` VARCHAR (500) DEFAULT NULL COMMENT '备注',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COMMENT = '测试';
Query OK, 0 rows affected
登录 Mycat 管理端
mysql -uroot -p123456 -h192.168.252.123 -P 9066
RS_CODE 为 1 表示心跳正常,--查看读写分离的机器配置情况
mysql> show @@datanode;
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | dh_test/db_1 | 0 | mysql | 0 | 3 | 1000 | 11 | 0 | 0 | 0 | -1 |
| dn2 | dh_test/db_2 | 0 | mysql | 0 | 3 | 1000 | 7 | 0 | 0 | 0 | -1 |
| dn3 | dh_test/db_3 | 0 | mysql | 0 | 4 | 1000 | 26 | 0 | 0 | 0 | -1 |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 rows in setmysql> show @@heartbeat;
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql | 192.168.252.121 | 3306 | 1 | 0 | idle | 0 | 2,3,3 | 2017-11-17 16:54:26 | false |
| hostS2 | mysql | 192.168.252.122 | 3306 | 1 | 0 | idle | 0 | 2,2,2 | 2017-11-17 16:54:26 | false |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in setmysql>
测试分片
按日期(天)分片
登录 Mycat 管理端
mysql -uroot -p123456 -h192.168.252.123 -P 9066
RS_CODE 为 1 表示心跳正常,--查看读写分离的机器配置情况
mysql> show @@datanode;
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | dh_test/db_1 | 0 | mysql | 0 | 3 | 1000 | 11 | 0 | 0 | 0 | -1 |
| dn2 | dh_test/db_2 | 0 | mysql | 0 | 3 | 1000 | 7 | 0 | 0 | 0 | -1 |
| dn3 | dh_test/db_3 | 0 | mysql | 0 | 4 | 1000 | 26 | 0 | 0 | 0 | -1 |
+------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 rows in set
配置按日期(天)分片,2017-11-15,2017-11-16,2017-11-17 ,一天一个分片,执行完一下的 sql 可以发现数据 ,会按照分片规则进入不同的,分片,数据库
rule.xml
create_timesharding-by-date-dayyyyy-MM-dd2017-11-152017-11-171
name 属性指定唯一的名字,用于标识不同的表规则。
内嵌的 rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。
columns 内指定要拆分的列名字。
algorithm 使用 function 标签中的 name 属性。连接表规则和具体路由算法。当然,多个表规则可以连接到同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。
配置说明:
-
columns :标识将要分片的表字段
-
algorithm :分片函数
-
dateFormat :日期格式
-
sBeginDate :开始日期
-
sEndDate:结束日期
-
sPartionDay :分区天数,即默认从开始日期算起,分隔 5 天一个分区
schema.xml
show slave status 登录 Mycat 服务端
mysql -uroot -p123456 -h192.168.252.123 -P 8066
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_1', '2017-11-15 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_2', '2017-11-16 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_3', '2017-11-17 00:00:00');
在 MySql-Master 执行 ,查看分片是否均匀
mysql -uroot -p123456 -h192.168.252.121 -P 3306
mysql> select min(create_time),max(create_time) from db_1.test_one;
+---------------------+---------------------+
| min(create_time) | max(create_time) |
+---------------------+---------------------+
| 2017-11-15 00:00:00 | 2017-11-15 00:00:00 |
+---------------------+---------------------+
1 row in set
mysql> select min(create_time),max(create_time) from db_2.test_one;
+---------------------+---------------------+
| min(create_time) | max(create_time) |
+---------------------+---------------------+
| 2017-11-16 00:00:00 | 2017-11-16 00:00:00 |
+---------------------+---------------------+
1 row in set
mysql> select min(create_time),max(create_time) from db_3.test_one;
+---------------------+---------------------+
| min(create_time) | max(create_time) |
+---------------------+---------------------+
| 2017-11-17 00:00:00 | 2017-11-17 00:00:00 |
+---------------------+---------------------+
1 row in set
mysql>
自然月分片
在 MySql-Master:192.168.252.121 建库,测试主从复制是否可用
CREATE DATABASE `db_1`;CREATE DATABASE `db_2`;CREATE DATABASE `db_3`;CREATE DATABASE `db_4`;CREATE DATABASE `db_5`;CREATE DATABASE `db_6`;CREATE DATABASE `db_7`;CREATE DATABASE `db_8`;CREATE DATABASE `db_9`;CREATE DATABASE `db_10`;CREATE DATABASE `db_11`;CREATE DATABASE `db_12`;
登录 Mycat 管理端
mysql -uroot -p123456 -h192.168.252.123 -P 9066
查看分片情况
mysql> show @@datanode;
+------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | dh_test/db_1 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn10 | dh_test/db_10 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn11 | dh_test/db_11 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn12 | dh_test/db_12 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn2 | dh_test/db_2 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn3 | dh_test/db_3 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn4 | dh_test/db_4 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn5 | dh_test/db_5 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn6 | dh_test/db_6 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn7 | dh_test/db_7 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn8 | dh_test/db_8 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
| dn9 | dh_test/db_9 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 |
+------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
12 rows in setmysql>
rule.xml
按月份列分区 ,每个自然月一个分片
create_timepartbymonthyyyy-MM-dd2017-01-01
配置说明:
-
columns 分片字段,字符串类型
-
dateFormat : 日期字符串格式
-
sBeginDate : 开始日期
schema.xml
show slave status 登录 Mycat 服务端
mysql -uroot -p123456 -h192.168.252.123 -P 8066
只需要在 Mycat 服务器执行以下脚本,就会自动同步到 MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122
mysql> CREATE TABLE `test_one` (
`id` BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` VARCHAR (50) DEFAULT NULL COMMENT '名称',
`remark` VARCHAR (500) DEFAULT NULL COMMENT '备注',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COMMENT = '测试';
Query OK, 0 rows affected
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_1', '2017-01-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_2', '2017-02-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_3', '2017-03-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_4', '2017-04-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_5', '2017-05-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_6', '2017-06-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_7', '2017-07-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_8', '2017-08-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_9', '2017-09-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_10', '2017-10-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_11', '2017-11-10 00:00:00');
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_12', '2017-12-10 00:00:00');
在 MySql-Master 执行 ,查看分片是否均匀
mysql -uroot -p123456 -h192.168.252.121 -P 3306
select min(create_time),max(create_time) from db_1.test_one;
select min(create_time),max(create_time) from db_2.test_one;
select min(create_time),max(create_time) from db_3.test_one;
select min(create_time),max(create_time) from db_4.test_one;
select min(create_time),max(create_time) from db_5.test_one;
select min(create_time),max(create_time) from db_6.test_one;
select min(create_time),max(create_time) from db_7.test_one;
select min(create_time),max(create_time) from db_8.test_one;
select min(create_time),max(create_time) from db_9.test_one;
select min(create_time),max(create_time) from db_10.test_one;
select min(create_time),max(create_time) from db_11.test_one;
select min(create_time),max(create_time) from db_12.test_one;
注意
启动MyCAT之前,需要先检查一些配置:
Mysql的主从复制是否正常,这个检查我在文章开头,搭建 MySQL 5.7.19 主从复制,文章链接里面有介绍
java的版本需要是1.7或以上;
Mysql的配置文件需要加一行lower_case_table_names = 1在[mysqld]栏目中,这个设置为Mysql大小写不敏感,否则可能会发生表找不到的问题;
在示例的2个数据 MySql-Master 和 MySql-Slave 上,新建3个数据库 test_one,test_two,test_three, 如不新建,可能提示找不到数据库ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0(这个提示不够友好,是在运行很长一段时间后才提示);
添加 MYCAT_HOME 环境变量指向解压的mycat目录,主要是为了一些bin目录下的脚本的使用。
Contact