MyCat-03之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 -h 192.168.73.31 -P 3306(这是在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-------> ./mycat console
7.到mycat/bin目录下做后台启动mycat-----------> ./mycat start
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系统账号)
<property name="password">123456 ----->定义mycat的管理账号的密码
<property name="schemas">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 <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创建表到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-------------------------

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇洒哥Kahn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值