01、Mycat实战:centos7上使用mycat部署垂直分库

一、目标

在Centos7.6上安装mycat部署,并设定mysql垂直分库。理解什么叫mysql垂直分库。
什么叫垂直分库?比如一个应用用一台服务器,当数据库表非常大的时候,服务器压力也就大了,怎么办?可以考虑使用垂直分库,看清了是可以考虑,仅仅是考虑,为什么这么说?因为垂直分库有个致命的缺陷,那就是不能做join查询。

有点乱描述的,举个栗子:
你有个数据库,有10个表,可以将2个或3个或9个表放到单独的一台服务器,将剩余的8个or7个or1个表放到另外一台物理服务器,这样就能分担服务器压力。

那怎么使用这个分开的数据呢?
比如以前你写连接字符串的ip是192.168.73.100。那么以后你就可以把这个ip换成mycat服务器的ip,不用考虑另外两台真实的mysql服务器(前提是你不要使用join语句)(还有两篇关于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库kahncool的部分表存储地
mycat32 192.168.73.32 mysql5.7 mysql库kahncool的部分表存储地

四、准备工作

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互通;

五、前言啰嗦

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

1、 (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配置文件,使其支持本次实验的垂直分库

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-1.(mycat31上执行)修改配置文件/usr/local/mycat/conf/schema.xml

cp /usr/local/mycat/conf/schema.xml{,.bak}
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="customer" dataNode="dn2"></table>
        </schema>
        <dataNode name="dn1" dataHost="host1" database="kahncool" />
        <dataNode name="dn2" dataHost="host2" database="kahncool" />
        <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="192.168.73.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="hostM2" url="192.168.73.32:3306" user="root"
                                   password="123123">
                </writeHost>
        </dataHost>
</mycat:schema>
EOF

注释:
<schema name="TESTDB" ----->必须和server.xml中设置的property name="schemas"的值TESTDB保持一致
<schema dataNode="dn1" ----->指的是默认的mysql服务器,注意这个值不能与table中的值一样。否则的话就说明只有一台物理mysql服务器了
<schema

--->指特定的表teacher会放在mysql主机dn2上
<schema

--->指特定的表teacher会放在mysql主机dn2上
<dataNode name="dn1" --->和上面的schema中的dataNode主机相对应
<dataNode dataHost="host1"------> 定义第一台mysql主机别名,下面会有参数 <dataHost name=必须也的指定一个host1做对应<dataNode database="kahncool"------> 定义在物理mysql服务器上有个数据库叫kahncool
<dataNode name="dn2" ------> 和上面的schema中的table标签的主机相对应
<dataNode dataHost="host2" ------>定义第二台mysql主机别名,下面会有参数 <dataHost name=必须也的指定一个host2做对应
<dataNode database="kahncool"-> 定义第二台物理mysql服务器上有数据库叫kahncool,必须和节点1的实际数据库名保持一致。
<dataHost name="host1" ------>和上面的<dataNode dataHost="host1" 必须保持一致
<dataHost balance="0" ------>指的是mycat机制读写分离,0代表不做读写分离
<dataHost writeType="0" ---->这跟读写分离有关的参数,本次用不到
<dataHost dbType="mysql" ------>指的是mycat本次做的是数据库类型是mysql
<dataHost switchType="1" ---->这跟读写分离有关的参数,本次用不到
select user() ------>指的是心跳检测的方法
<writeHost host="hostM1" ------>指的是mycat写主机的主机识别名(可随意写,,也可以与第二台主机的别名一样)
<writeHost url="10.100.100.31:3306" ------>指的是mycat写主机的mysql地址和端口号
<writeHost user="root" ------>指的是mycat执行写操作的mysql账号是root
------>指的是mycat执行写操作的mysql账号是root的密码
<writeHost host="hostM2"指的是mycat写主机的主机识别名(可随意写,,也可以与第一台主机的别名一样)
剩余的就一样的道理了,这里就略过了。

*

八、在两台物理服务器上新建数据库

mysql -uroot -p'123123' -e "CREATE DATABASE IF NOT EXISTS kahncool DEFAULT CHARSET utf8 COLLATE utf8_general_ci;"
mysql -uroot -p'123123' -e "show databases;"

九、在mycat31上启动mycat

在mycat31上开一个新的终端窗口再执行

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

十、登录mycat的数据管理平台

1、 在mycat31上开一个新的终端窗口再执行;

mysql -umycat -p123456 -h 192.168.73.31 -P 8066
show databases;
use TESTDB;
show tables;

注释:
-umycat 指的是mycat配置文件中的账号名叫"mycat",
-h192.168.73.31 指的是mycat服务器的ip
-P8066 指的是mycat的数据管理平台的端口号
useTESTDB; 使用mycat的逻辑数据库TESTDB,它对应者物理实际数据库kahncool

*

在使用show tables;命令后,会看到schema.xml中定义的那两个特殊的表,在mycat里第一次就能看到这两张表customer和teacher,你看到的仅仅是个假象,这两个表在物理服务器中其实是不存在的,若要使用这两个表的话,第一次必须先把这两个表建一下,这一点你必须得清楚。

十一、在mycat中操作数据库(创建表、插入数据)

(mycat创建表到node2上,即创建表到mycat32上,为啥?因为schema中的table标签中定义了)
create table teacher(tid int(10) not null unique primary key,tname varchar(20) not null );
insert into teacher(tid,tname) VALUES (1,'liuduoyan');
(mycat创建表到node*上,即创建表到mycat31上)
create table student(num 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 (num,name,gender,birthday,address) VALUES (1,'serena','women','2000-12-31','shanghai');

(mycat创建表到node2上,即创建表到mycat32上,为啥?因为schema中的table标签中定义了)
create table customer(cid int(10) not null unique primary key,cname varchar(20) not null );
insert into customer(cid,cname) VALUES (1,'cuiseqi');
insert into customer(cid,cname) VALUES (2,'songsuer');

(mycat创建表到node1上,即创建表到mycat31上)
create table product(pid int(10) not null unique primary key,pname varchar(20) not null );
insert into product(pid,pname) VALUES (1,'apple');
insert into product(pid,pname) VALUES (2,'orangen');

*

十二、在两台物理服务器上检验数据库表是否分开了

1、 在mycat31上查询本地mysql的kahncool数据库;

mysql -uroot -p'123123'
use kahncool;
show tables;
select * from product;
select * from student;

*

2、 在mycat32上查询本地mysql的kahncool数据库;

mysql -uroot -p'123123'
use kahncool;
show tables;
select * from product;
select * from student;

*

3、 小结;

发现两台物理数据库都已经有一些表和数据存在了。这已经说明我们不熟的mycat已经成功的把数据库的表分开了。
等等,是不是感觉有点乱?以后再创建表的话将被创建到哪台物理服务器呢?
捋一捋?
*

这下看懂了吗?图中说的很清楚了。默认的服务器就是dn1,dn1是啥?dn1就是dataNode中定义的name="dn1",,它又等价于dataHost,那dataHost的值又传给了host1,那host1又是谁?下面又有一一对应的关系,host1指的就是writeHost中的host:192.168.73.31。

够清楚吧老铁?给双击不?

十三、登录mycat使用select再检查一下是否好用

mysql -umycat -p123456 -h 192.168.73.31 -P 8066
use TESTDB;
show tables;
select * from cutomer;
select * from student;

*

完美,能看到所有表已存在,而且都有数据。

至此,mycat垂直分库就做完了。

----------------------------------END-----------------2020年3月20日17:58:08-------------------------

写博客累,写教程更累,花费了整整半天时间。

如果对你有帮助,希望支持一把。谢谢老铁!
*

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