Mycat实现Mysql主从复制和读写分离

目录

1 机器准备

2 mycat的安装

3 验证读写分离

3.1 验证写操作

3.2 验证读操作

4 主从切换

4.1 故障演示

4.2  主从切换


1 机器准备

机器名 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版本。

2 mycat的安装

    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主从复制和读写分离_第1张图片

 安装很简单,直接将安装包解压到安装目录即可,这里注意的是,因为mycat也是通过mysql的指令进入到服务中,所以还需要安装mysql的客户端,不需要启动mysql的服务,所以wyl01机器上还需要有mysql的客户端。

Mycat实现Mysql主从复制和读写分离_第2张图片

mycat的目录结构如上图所示,conf目录是mycat的配置文件,接下来我们需要对server.xml和schema.xml文件进行配置

	
		123456
		TESTDB
	

	
		user
		TESTDB
		false
	

schema.xml文件配置内容 





           

          

          
                show slave status  
                  
                          
                  
          


这里有两个参数需要注意,balance和 switchType。

其中,balance指的负载均衡类型,目前的取值有4种:

  • balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
  • balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
  • balance="2",所有读操作都随机的在writeHost、readhost上分发。
  • balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

  • switchType='-1' 表示不自动切换
  • switchType='1' 默认值,表示自动切换
  • switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
  • switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。

配置完,然后启动mycat服务 

[root@wyl01 mycat]# ./bin/mycat restart

 

3 验证读写分离

3.1 验证写操作

# 在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)

3.2 验证读操作

我们可以在130的从数据库种对其中的一条数据进行修改,如下所示,将8月3号,改成8月31号,此时主肯定不会修改的,因为主向从我们做了同步,从向主并未做同步,所以主上的这个记录仍然是2019-08-03,然后再通过mycat进行查询

Mycat实现Mysql主从复制和读写分离_第3张图片

查询结果如下:在wyl01机器上操作。

 Mycat实现Mysql主从复制和读写分离_第4张图片

以上操作如果成功,则表示mycat搭建MySQL,主从复制,读写分离已经实现。

4 主从切换

4.1 故障演示

演示如下:停掉wyl02上master节点,可以看到wyl02上服务已经停止

在wyl01上查看,发现查数据都会产生报错,很显然,不合符我们的预想

Mycat实现Mysql主从复制和读写分离_第5张图片

4.2  主从切换

在schem.xml文件我们增加一条如下配置,配置添加完毕,记得要restart重启。

Mycat实现Mysql主从复制和读写分离_第6张图片

 重启后,我们这里依然没有启动wyl02上的mysql服务,然后我们再进行演示操作,发现不但可以查到wyl03上的数据,还可以插入一条数据。

Mycat实现Mysql主从复制和读写分离_第7张图片

Mycat实现Mysql主从复制和读写分离_第8张图片

这里就做到主从切换了,但是有一个疑问, 重启wyl02上的主mysql服务后,我们再次查询操作。发现轮询查询wyl02和wyl03上的数据库服务,这是正常的,因为上面讲到balance这个值的作用就是做负载均衡的,问题在于当把wyl02上数据库起来后,wyl02和wyl03上数据就不一致了,主要看2019-08-04这个数据,这个数据是走的是wyl03这个mysql服务。所以这个操作很危险,要么做双主,要么不进行主从切换,只做查询操作。

Mycat实现Mysql主从复制和读写分离_第9张图片

最后,当把wyl02上的master节点启动后,我们再次插入数据查看

Mycat实现Mysql主从复制和读写分离_第10张图片

wyl03还是作为mycat的中的主的角色,因为从wyl03机器写进去的数据。为什么wyl02都启动了,不切回去呢?有知道的大神可以留言告知一下什么原理。

然而,当我们在wyl03上去show slave status\G再次查看还是从的角色。这里有点乱。

Mycat实现Mysql主从复制和读写分离_第11张图片

你可能感兴趣的:(MySQL)