一、目标
在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版本:
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互通。
5.数据库使用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
(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配置文件,使其支持本次实验的垂直分库
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
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 <table name="teacher" dataNode="dn2"></table> --->指特定的表teacher会放在mysql主机dn2上
<schema <table name="customer" dataNode="dn2"></table> --->指特定的表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" ---->这跟读写分离有关的参数,本次用不到
<heartbeat>select user() ------>指的是心跳检测的方法
<writeHost host="hostM1" ------>指的是mycat写主机的主机识别名(可随意写,,也可以与第二台主机的别名一样)
<writeHost url="10.100.100.31:3306" ------>指的是mycat写主机的mysql地址和端口号
<writeHost user="root" ------>指的是mycat执行写操作的mysql账号是root
<writeHost password="123123"> ------>指的是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",
-h 192.168.73.31 指的是mycat服务器的ip
-P 8066 指的是mycat的数据管理平台的端口号
use TESTDB; 使用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创建表到node1上,即创建表到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垂直分库就做完了。