cd mycat/conf
修改第82、97行的数据库名称为test-db;文件中的用户为连接mycat的账号和密码
vi server.xml
vi schema.xml
vi rule.xml
修改rule1的内容,把name="rule1"修改为name=“auto-sharding-test-id”;
<algorithm>func1algorithm>
改为
<algorithm>func-test-idalgorithm>
134 <!--分片算法函数
135 name 为分片规则的名称,需要与tableRule中匹配
136 class 是切分规则对应的切分类(表达式切分类)
137 property 标签是切分规则对应的不同属性,不同的切分规则配置不同
138 -->
139 <function name="func-test-id" class="io.mycat.route.function.PartitionByPattern">
140 <!--表达式的值:切分字段id%512=0-511-->
141 <property name="patternValue">512</property>
142 <property name="mapFile">partition-test-id.txt</property>
143 </function>
vi partition-test-id.txt
文件内容
0-127=0
128-255=1
256-511=2
CREATE DATABASE test_db1 CHARACTER SET utf8 COLLATE utf8_general_ci;
USE test_db1;
CREATE TABLE `tb_test` (
`test_id` BIGINT(20) NOT NULL ,
`title` VARCHAR(100) NOT NULL COMMENT '商品标题',
`num` INT(10) NOT NULL COMMENT '库存数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`test_id`),
KEY `updated` (`update_time`)
) ENGINE=INNODB AUTO_INCREMENT=1369462 DEFAULT CHARSET=utf8 COMMENT='测试表';
CREATE DATABASE test_db2 CHARACTER SET utf8 COLLATE utf8_general_ci;
USE test_db2;
CREATE TABLE `tb_test` (
`test_id` BIGINT(20) NOT NULL ,
`title` VARCHAR(100) NOT NULL COMMENT '商品标题',
`num` INT(10) NOT NULL COMMENT '库存数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`test_id`),
KEY `updated` (`update_time`)
) ENGINE=INNODB AUTO_INCREMENT=1369462 DEFAULT CHARSET=utf8 COMMENT='测试表';
CREATE DATABASE test_db3 CHARACTER SET utf8 COLLATE utf8_general_ci;
USE test_db3;
CREATE TABLE `tb_test` (
`test_id` BIGINT(20) NOT NULL ,
`title` VARCHAR(100) NOT NULL COMMENT '商品标题',
`num` INT(10) NOT NULL COMMENT '库存数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`test_id`),
KEY `updated` (`update_time`)
) ENGINE=INNODB AUTO_INCREMENT=1369462 DEFAULT CHARSET=utf8 COMMENT='测试表';
连接Mycat和连接MySQL是一样的,区别是,MyCat的端口号是8066,MyCat的账号密码在server.xml中进行配置
-- 在mycat中插入数据
INSERT INTO `tb_test`(`test_id`,`title`,`num`,`create_time`,`update_time`) VALUES (1369089,'测试',1,'2018-03-17 22:43:04','2018-03-17 22:43:04');
再查看数据库
二进制sql执行文件
从服务器有一个长连接和主服务器连接在一起,我们往主服务器写入数据的时候,就会产生一个二进制sql执行文件(该文件已经记录了在主服务器执行的insert、update等写的操作)同步到从服务器,在从服务器执行一遍就可以
(主从数据之间的同步会存在延迟,但这种延迟可以忽略不计,如果从服务器没有拿到执行文件也会有重试机制确保同步一致情况)
因为我们还是使用刚才分库分表的那三个数据库所以先把数据库的表先清空
vi /etc/my.cnf
service mysqld start
-- 执行sql查看服务器idserver_id=130配置是否成功
SHOW VARIABLES LIKE 'server_id';
-- 查询服务器状态
SHOW MASTER STATUS;
下图是服务器状态 File字段代表的是二进制sql执行文件的文件名
vi /etc/my.cnf
这里修改和主服务器基本一样就是需要配置同步的数据库,我们现在就用刚才做分库分表的那三个数据库每个数据库之间有逗号隔开
service mysqld start
在主服务器mysql中执行
-- 主服务器给从服务器账号授权
-- 综合2.2主从复制原理图来看,因为从服务器连接主服务器使用的是jdbc连接,所以要给从服务器设置账号权限,然后该账户拿到主服务器的二进制sql执行文件
GRANT REPLICATION SLAVE ON *.* to 'test_mycat'@'%' identified by 'mycat';
-- 1、关闭同步
stop slave;
--2、设置主服务器地址
-- MASTER_HOST='主服务器地址'
-- MASERT_USER=上面sql创建的用户名
-- MASERT_PASSWORD=上面sql用户的密码
-- MASTER_LOG_FILE=二进制sql执行文件的文件名
-- MASTER_LOG_POS文件行数 就是SHOW MASTER STATUS;语句查询出来Position字段
CHANGE MASTER TO MASTER_HOST='192.168.211.130',MASTER_USER='test_mycat',MASTER_PASSWORD='mycat',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=3116;
-- 3、启动同步
start slave;
-- 执行从服务器sql
SHOW SLAVE STATUS;
在主服务器执行sql
USE test_db1;
CREATE TABLE `tb_test` (
`test_id` BIGINT(20) NOT NULL ,
`title` VARCHAR(100) NOT NULL COMMENT '商品标题',
`num` INT(10) NOT NULL COMMENT '库存数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`test_id`),
KEY `updated` (`update_time`)
) ENGINE=INNODB AUTO_INCREMENT=1369462 DEFAULT CHARSET=utf8 COMMENT='测试表';
USE test_db2;
CREATE TABLE `tb_test` (
`test_id` BIGINT(20) NOT NULL ,
`title` VARCHAR(100) NOT NULL COMMENT '商品标题',
`num` INT(10) NOT NULL COMMENT '库存数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`test_id`),
KEY `updated` (`update_time`)
) ENGINE=INNODB AUTO_INCREMENT=1369462 DEFAULT CHARSET=utf8 COMMENT='测试表';
USE test_db3;
CREATE TABLE `tb_test` (
`test_id` BIGINT(20) NOT NULL ,
`title` VARCHAR(100) NOT NULL COMMENT '商品标题',
`num` INT(10) NOT NULL COMMENT '库存数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`test_id`),
KEY `updated` (`update_time`)
) ENGINE=INNODB AUTO_INCREMENT=1369462 DEFAULT CHARSET=utf8 COMMENT='测试表';
这时可以发现在主服务器创建的三个表会同步到从服务器
但这时候还有一个问题,从前面说的原理从服务器通过jdbc连接主服务获取到二进制sql执行文件,进行同步所以这时如果我们在从服务器进行写操作时不能同步到主服务器,我们可以通过设置账号权限不能写解决这个问题,但我们现在使用mycat实现读写分离来解决这个问题
注意mysql本身没有自带读写分离,如果要做读写分离就要使用第三方的中间件或者自己做
配置server.xml文件的主账号和从账号的权限,权限在上面的分库分表已经配好,这里可以不用配
vi server.xml
./mycat start
INSERT INTO `tb_test`(`test_id`,`title`,`num`,`create_time`,`update_time`) VALUES (256,'测试',1,'2018-03-17 22:43:04','2018-03-17 22:43:04');
执行上面的sql,因为分片的原因数据会写入主服务器的tb_test3数据库然后同步到从服务器的tb_test3数据库