02、Mycat实战:centos7上使用mycat部署水平分表

一、目标

在Centos7.6上安装mycat部署,并设定mysql水平分表。理解什么叫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-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-uroot-p123123-h192.168.73.31-P3306(这是在32主机上去连接31主机上的mysql,31上的mysql的root密码是123123,31上的mysql端口是3306),再啰嗦,必须两台互相做一下mysql互通;
5、 如果你做过mysql主从复制,最好把主从复制给停掉(my.cnf中不必要的设置注释掉);

五、前言啰嗦

1、 mycat官网http://www.mycat.io/;
2、 mycat下载地址http://dl.mycat.io/;
3、 schema.xml—–>定义逻辑库,表,分片节点等内容;
4、 rule.xml—–>定义分片规则;
5、 server.xml—–>定义用户以及系统相关变量、端口等;
6、 到mycat/bin目录下做控制台启动mycat——->./mycatconsole;
7、 到mycat/bin目录下做后台启动mycat———–>./mycatstart;
8、 mycat的运行是依赖java的,所以事先需要在主机上安装jdk,关于jdk的安装略过了使用命令java-version查本机是否安装了java环境,jdk至少需要1.8及以上的版本才可以;

六、下载并安装mycat

(mycat31上执行)下载并安装mycat

mkdir -p /opt/software/mycat
cd /opt/software/mycat
wget -P /opt/software/mycat/ http://dl.mycat.io/1.6.7.5/2020-3-3/Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
tar -zxvf Mycat-server-1.6.7.5-test-20200303154735-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系统账号) 123456 —–>定义mycat的管理账号的密码 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"></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部署垂直分库》。
基于上一篇帖子,本次新增了一行

,意思是有一个student表分部在两个节点主机上,怎么分的呢?利用规则mod_rule。(那mod_rule是个什么鬼呢?看下面的介绍)

3、 (mycat31上执行)修改配置文件rule.xml;

cp /usr/local/mycat/conf/rule.xml{,.bak}
vim /usr/local/mycat/conf/rule.xml

3-1.添加自定义规则
sid代表schema.xml中定义的数据库xkahn中的表student中的column列的名字叫sid。(mycat拿我们自定义的列sid用一定的算法把一张表分割到两台mysql上)
在<mycat:rule xmlns:mycat="http://io.mycat/">的下面添加7行内容(包含最后一行空白行)

        <tableRule name="mod_rule">
                <rule>
                        <columns>sid</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>

3-2.修改系统预定义的算法mod-long的mysql主机数量
原本mod-long默认的是3台mysql主机,因为我们测试的就两台,所以就写成2。

3
改为

        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">2</property>
        </function>

4、 在两台主机上新建数据库xkahn;

mysql -uroot -p123123
CREATE DATABASE IF NOT EXISTS xkahn DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

5、 (mycat31上执行)再开一个终端用于启动mycat;

cd /usr/local/mycat/bin
./mycat console

6、 (mycat31上执行)再开一个终端用于进入mycat的数据管理平台;

mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;

如果此时你在mycat中看到了已经有表存在了,那全是假象,你必须再mycat上再创建一次表(看下面)

create table student(sid int(10) not null unique primary key,name varchar(20) not null,gender varchar(20) not null,birthday datetime,address varchar(50));

插入测试数据

insert into student (sid,name,gender,birthday,address) VALUES (1,'serena','woman','2000-01-29','shanghai');
insert into student (sid,name,gender,birthday,address) VALUES (2,'xishi','woman','2000-03-21','shanghai');
insert into student (sid,name,gender,birthday,address) VALUES (3,'kahn','men','2000-06-06','shanghai');
insert into student (sid,name,gender,birthday,address) VALUES (4,'songsuer','woman','2000-01-31','korea');
insert into student (sid,name,gender,birthday,address) VALUES (5,'liuduoyan','woman','2010-03-01','korea');
insert into student (sid,name,gender,birthday,address) VALUES (6,'cuiseqi','woman','2001-11-20','korea');
insert into student (sid,name,gender,birthday,address) VALUES (7,'yiwanka','woman','2002-10-05','us');
insert into student (sid,name,gender,birthday,address) VALUES (8,'linzhilin','woman','2003-09-11','Japan');
insert into student (sid,name,gender,birthday,address) VALUES (9,'xiaozemaria','woman','2004-08-05','Tokoyo');
insert into student (sid,name,gender,birthday,address) VALUES (10,'jizemingbu','woman','2005-11-30','Tokoyo');

查询数据,检验刚才数据是否都能查到

select * from student;

可以看到表是乱序的,为啥?因为表被水平分割了,mycat去取两张表的数据合起来显示给用户。
想排序怎么办?
select * from student order by sid;

八、分别去两台物理服务器上看数据的分布情况

mysql -uroot -p123123
use xkahn;
select * from student;

你应当在一台mysql服务器上看到sid有1,3,5,7,9。而另外一台mysql服务器上的student表的sid只有2,4,6,8,10几条数据。这就对了,说明mycat分表成功了

————————-END————2020年3月21日22:39:40————————-

老铁双击666,欢迎订阅,顺手点赞,谢谢。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: