一、目标
在Centos7.6上安装mycat部署,并设定mysql水平分表全局表。理解什么叫mysql水平分表全局表。(无坑版)
水平分表:即原来是单独数据库,表也是单独的。由于表太大了影响到性能了。就再弄一台服务器,建一样的数据库,然后把某些表分割成两份放到两台服务器上,这样能减轻服务器压力。但水平分表后是无法使用join的。
水平分表ER表:在水平分表的基础上,增加子表(子表就被称为ER表),让主表能够join子表。
mycat水平分表全局表:即某张表在所有的mysql服务器上都有同样的数据,此种表一般用于数据量较小的,而且每台mysql服务器都会用得到的表
二、平台
[root@kahn.xiao ~]# uname -a
Linux client 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@kahn.xiao ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
Mycat版本:
Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
三、实验拓扑
主机名 ip 所装必须的软件 角色
mycat31 192.168.73.31 java1.8及以上,mycat1.6.7.5,mysql5.7 mycat服务器、mysql库xkahn的部分表存储地
mycat32 192.168.73.32 mysql5.7 mysql库xkahn的部分表存储地
四、准备工作
1.两台主机上均关闭防火墙,禁用防火墙开机自启
2.mycat服务器必须安装java1.8及以上的环境
3.两台主机均已安装好mysql5.7,这有一篇教程《Centos7笔记之Mysql5.7安装》
4.测试两台互通,而且两台mysql都能互相远程登录对方的mysql数据库,必须两台互相做一下mysql互通。
5.如果你做过mysql主从复制,最好把主从复制给停掉(my.cnf中不必要的设置注释掉)
6.数据库使用MySQL8.0需要注意密码问题:
1)密码验证规则设置为mysql_native_password
2)连接mycat时一定要带着mysql_native_password这个参数
五、前言啰嗦
1.mycat官网:http://mycat.org.cn/
2.mycat官网下载地址:http://dl.mycat.org.cn/
3.schema.xml----->定义逻辑库,表,分片节点等内容
4.rule.xml----->定义分片规则
5.server.xml----->定义用户以及系统相关变量、端口等。
6.到mycat/bin目录下做控制台启动mycat-------> ./mycat console
7.到mycat/bin目录下做后台启动mycat-----------> ./mycat start
8.mycat的运行是依赖java的,所以事先需要在主机上安装jdk,关于jdk的安装略过了。使用命令java -version查本机是否安装了java环境,jdk至少需要1.8及以上的版本才可以。
六、下载并安装mycat_for_linux
(mycat31上执行)
下载并安装mycat
mkdir -p /opt/software/mycat
cd /opt/software/mycat
wget -P /opt/software/mycat/ http://dl.mycat.org.cn/1.6.7.1/Mycat-server-1.6.7.1-release-20200209222254-linux.tar.gz
tar -zxvf Mycat-server-1.6.7.1-release-20200209222254-linux.tar.gz
cp -r mycat/ /usr/local/
七、设定mycat配置文件,使其支持本次实验的mycat水平分表全局表
1、(mycat31上执行)修改配置文件/usr/local/mycat/conf/server.xml中的默认启动账号从root改为为mycat
(这里的账号mycat是mycat的管理账号,而非linux系统上的账号。)
cp /usr/local/mycat/conf/server.xml{,.bak}
sed -i 's/name="root"/name="mycat"/g' /usr/local/mycat/conf/server.xml
注释:
<user name="mycat" ----->定义mycat的管理账号叫mycat(即登录mycat管理程序的账号,而非linux系统账号)
<property name="password">123456 ----->定义mycat的管理账号的密码
<property name="schemas">TESTDB ----->定义mycat的逻辑数据库名,这里需要和schema.xml中的<schema name="TESTDB"保持一致。
2、(mycat31上执行)
修改配置文件/usr/local/mycat/conf/schema.xml
cat > /usr/local/mycat/conf/schema.xml <<EOF
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="teacher" dataNode="dn2"></table>
<table name="student" dataNode="dn1,dn2" rule="mod_rule">
<childTable name="student_record" primaryKey="xid" joinKey="student_id" parentKey="xid" />
</table>
<table name="xuser" dataNode="dn1,dn2" type="global"></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="xkahn" />
<dataNode name="dn2" dataHost="host2" database="xkahn" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.100.100.31:3306" user="root"
password="123123">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.100.100.32:3306" user="root"
password="123123">
</writeHost>
</dataHost>
</mycat:schema>
EOF
注释:
绝大部分参数在之前的博客中有介绍《MyCat-03之centos7上使用mycat部署垂直分库》。
基于上一篇帖子《MyCat-05之centos7上使用mycat部署水平分表ER表》,本次不同的是,
#跟上次的mycat水平分表ER表相比,本次又多出一行全局表的配置:
<table name="xuser" dataNode="dn1,dn2" type="global"></table>,xuser指的是全局表的表名,分部在两台mysql上,类型是全局global。 (这里截图中的ip地址是用的另一台电脑做的,你只在乎ip地址的最后一段即可)
3、(mycat31上执行)
修改配置文件rule.xml
cp /usr/local/mycat/conf/rule.xml{,.bak}
vim /usr/local/mycat/conf/rule.xml
3-1、(mycat31上执行)
添加自定义规则
sid代表schema.xml中定义的数据库xkahn中的表student中的column列的名字叫sid。(mycat拿我们自定义的列sid用一定的算法把一张表分割到两台mysql上)
在<mycat:rule xmlns:mycat="http://io.mycat/">的下面添加7行内容(包含最后一行空白行)
<tableRule name="mod_rule">
<rule>
<columns>xid</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
注释:这里的<columns>xid</columns>中的xid上次写的是sid,这次改成xid,为啥要改?因为怕有歧义,什么歧义?因为做er水平分表的话,主表和子表(被join的表)都是用rule.xml中的一个算法去做水平分表,分表的算法都用xid去做mod-long去水平分。所以说主表和子表的主键id必须要保持一致,而且都叫xid。(原来sid意为student的id,现在既然必须一样了,那就搞成xid吧)
3-2、(mycat31上执行)
修改系统预定义的算法mod-long的mysql主机数量
原本mod-long默认的是3台mysql主机,因为我们测试的就两台,所以就写成2。
将
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
改为
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
3-3、如果是照着上一篇做的试验,那么就把之前的两台服务器上的数据库给删掉
mysql -uroot -p123123
drop database xkahn;
4、在两台服务器上都重新创建xkahn数据库和表student
CREATE DATABASE IF NOT EXISTS xkahn DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use xkahn;
create table student(xid int(10) not null unique primary key,name varchar(20) not null);
4-1、在两台服务器上把子表ER表也先创建上
create table student_record(xid int(10) not null unique primary key,student_id int(10),record varchar(500));
4-2、在两台服务器上把全局表xuser也都建好
mysql -uroot -p123123
use xkahn;
create table xuser(xid int(10) not null unique primary key,name varchar(20) not null,createtime datetime,note varchar(500));
5、在mycat31上启动mycat服务(新开一个mycat31的终端)
cd /usr/local/mycat/bin
./mycat console
6、再打开个mycat31的终端,用于登录mycat数据管理平台
mysql -umycat -p123456 -h 10.100.100.31 -P 8066
并插入数据student表的数据
insert into student(xid,name) values (1,'serena');
insert into student(xid,name) values (2,'xishi');
insert into student(xid,name) values (3,'kahn');
insert into student(xid,name) values (4,'songsuer');
insert into student(xid,name) values (5,'liuduoyan');
insert into student(xid,name) values (6,'cuiseqi');
insert into student(xid,name) values (7,'yiwanka');
insert into student(xid,name) values (8,'linzhiling');
insert into student(xid,name) values (9,'xiaozemaria');
insert into student(xid,name) values (10,'jizemingbu');
7、去两台物理数据库服务器上检验student表是否被分到了
mysql -uroot -p123123
use xkahn;
select * from student;
注:必须保证都分到数据了,不然说明水平分表是失败的
8、然后在mycat31的mycat8066往student_record表中插入数据
mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;
insert into student_record(xid,student_id,record) values (1,1,'serena record, form shanghai,175cm');
insert into student_record(xid,student_id,record) values (2,2,'xishi,aaaaaaaaaa,171cm');
insert into student_record(xid,student_id,record) values (3,3,'kahn666666,180cm');
insert into student_record(xid,student_id,record) values (4,4,'songsuer,model,korea,171cm');
insert into student_record(xid,student_id,record) values (5,5,'liuduoyan,meinvchemo.com,172cm');
insert into student_record(xid,student_id,record) values (6,6,'cuiseqi,korea south,170cm');
insert into student_record(xid,student_id,record) values (7,7,'yiwanka,dadaoUSAhuozhuo10000ka,170cm');
insert into student_record(xid,student_id,record) values (8,8,'linzhiling,laonvrenxiaoriben,173cm');
insert into student_record(xid,student_id,record) values (9,9,'xiaozemaria,fromjp,166cm');
insert into student_record(xid,student_id,record) values (10,10,'jizelaoshi66666,163cm');
8-1、顺手查一下刚才插入的数据
select * from student_record;
9、再去两台mysql物理服务器上查看一下子表的数据是否也被分割到了两台服务器上
select * from student_record;
(两台服务器上的student_record数据必须被分割,不然说明水平分割ER表是失败的)
10、检验ER表的join功能是否能实现
在mycat的8066上join查询
SELECT s.*,r.record FROM student AS s INNER JOIN student_record AS r ON s.xid=r.student_id;
(必须能实现查到数据,不然就说明水平分表ER表是失败的了)
11.在mycat31上的mycat数据管理平台插入全局表的数据
mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;
show tables;
insert into xuser (xid,name,createtime,note) VALUES (1,'admin001','2020-03-01','the first administrator');
insert into xuser (xid,name,createtime,note) VALUES (2,'admin002','2020-03-02','the second administrator');
insert into xuser (xid,name,createtime,note) VALUES (3,'admin003','2020-03-03','the thirdly administrator');
insert into xuser (xid,name,createtime,note) VALUES (4,'admin004','2020-03-04','the fourthly administrator');
insert into xuser (xid,name,createtime,note) VALUES (5,'admin005','2020-03-05','the fifth administrator');
12.去两台物理机上检验是否都有数据存在?如果都有就说明成功了。
发现两台物理服务器上的mycat全局表xuser的数据是完全一样的。这样的效果就对了,这就是Mycat全局表。