目录
1 机器准备
2 mycat的安装
3 验证读写分离
3.1 验证写操作
3.2 验证读操作
4 主从切换
4.1 故障演示
4.2 主从切换
机器名 | ip | 角色 |
wyl01 | 192.168.52.128 | mycat,mysql客户端 |
wyl02 | 192.168.52.129 | master |
wyl03 | 192.168.52.130 | slave |
设计思路:部署2个数据库服务,分别存放在192.168.52.129 和192.168.52.130 ,这里数据库采用的mysql-5.7.20版本,mycat为mycat-1.6版本。
mysql的主从复制,这里就不展开讲了,前面的博客有介绍。MySQL的主从复制
mycat的官网地址,可以选择1.6版本的进行下载,我们选择的是1.6版本
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
安装很简单,直接将安装包解压到安装目录即可,这里注意的是,因为mycat也是通过mysql的指令进入到服务中,所以还需要安装mysql的客户端,不需要启动mysql的服务,所以wyl01机器上还需要有mysql的客户端。
mycat的目录结构如上图所示,conf目录是mycat的配置文件,接下来我们需要对server.xml和schema.xml文件进行配置
123456
TESTDB
user
TESTDB
false
schema.xml文件配置内容
show slave status
这里有两个参数需要注意,balance和 switchType。
其中,balance指的负载均衡类型,目前的取值有4种:
switchType指的是切换的模式,目前的取值也有4种:
配置完,然后启动mycat服务
[root@wyl01 mycat]# ./bin/mycat restart
# 在wyl01 mycat服务器登陆,创建一个表
[root@wyl01 mycat]# mysql -uroot -P8066 -p123456 -h127.0.0.1
MySQL [(none)]> use TESTDB;
Database changed
MySQL [TESTDB]> create table hello (id int not null primary key,hostname varchar(100),date DATE);
Query OK, 0 rows affected (0.02 sec)
#在wyl02服务器上查看test01数据库下是否有hello表
[root@wyl02 ~]# mysql -uroot -p123456
mysql> use test01
Database changed
mysql> show tables;
+------------------+
| Tables_in_test01 |
+------------------+
| hello |
+------------------+
1 row in set (0.00 sec)
#在wyl03服务器上查看test01数据库下是否有hello表
[root@wyl03 ~]# mysql -uroot -p123456
mysql> use test01
Database changed
mysql> show tables;
+------------------+
| Tables_in_test01 |
+------------------+
| hello |
+------------------+
1 row in set (0.00 sec)
插入数据
# 这里用一个方法,即对hostname插入了当前实例的主机名,这样可直观的观察写操作是在哪个数据库上执行的。
[root@wyl01 mycat]# mysql -uroot -P8066 -p123456 -h127.0.0.1
MySQL [(none)]> use TESTDB;
Database changed
MySQL [TESTDB]> insert into hello(id,hostname,date) values(1,@@hostname,20190801);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(2,@@hostname,20190802);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(3,@@hostname,20190803);
Query OK, 1 row affected (0.01 sec)
查看数据,可以看到hostname的这一栏值是wyl02,该服务器也是主节点,所以写操作是在wyl02上的数据库进行的。
[root@wyl01 mycat]# mysql -uroot -P8066 -p123456 -h127.0.0.1
MySQL [(none)]> use TESTDB;
Database changed
MySQL [TESTDB]> insert into hello(id,hostname,date) values(1,@@hostname,20190801);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(2,@@hostname,20190802);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(3,@@hostname,20190803);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> select * from hello;
+----+----------+------------+
| id | hostname | date |
+----+----------+------------+
| 1 | wyl02 | 2019-08-01 |
| 2 | wyl02 | 2019-08-02 |
| 3 | wyl02 | 2019-08-03 |
+----+----------+------------+
3 rows in set (0.01 sec)
我们可以在130的从数据库种对其中的一条数据进行修改,如下所示,将8月3号,改成8月31号,此时主肯定不会修改的,因为主向从我们做了同步,从向主并未做同步,所以主上的这个记录仍然是2019-08-03,然后再通过mycat进行查询
查询结果如下:在wyl01机器上操作。
以上操作如果成功,则表示mycat搭建MySQL,主从复制,读写分离已经实现。
演示如下:停掉wyl02上master节点,可以看到wyl02上服务已经停止
在wyl01上查看,发现查数据都会产生报错,很显然,不合符我们的预想
在schem.xml文件我们增加一条如下配置,配置添加完毕,记得要restart重启。
重启后,我们这里依然没有启动wyl02上的mysql服务,然后我们再进行演示操作,发现不但可以查到wyl03上的数据,还可以插入一条数据。
这里就做到主从切换了,但是有一个疑问, 重启wyl02上的主mysql服务后,我们再次查询操作。发现轮询查询wyl02和wyl03上的数据库服务,这是正常的,因为上面讲到balance这个值的作用就是做负载均衡的,问题在于当把wyl02上数据库起来后,wyl02和wyl03上数据就不一致了,主要看2019-08-04这个数据,这个数据是走的是wyl03这个mysql服务。所以这个操作很危险,要么做双主,要么不进行主从切换,只做查询操作。
最后,当把wyl02上的master节点启动后,我们再次插入数据查看
wyl03还是作为mycat的中的主的角色,因为从wyl03机器写进去的数据。为什么wyl02都启动了,不切回去呢?有知道的大神可以留言告知一下什么原理。
然而,当我们在wyl03上去show slave status\G再次查看还是从的角色。这里有点乱。