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

目录

1 机器准备

2 mycat的安装

3 验证读写分离

3.1 验证写操作

3.2 验证读操作

4 主从切换

4.1 故障演示

4.2  主从切换


1 机器准备

机器名ip角色
wyl01192.168.52.128mycat,mysql客户端
wyl02192.168.52.129master
wyl03192.168.52.130slave

设计思路:部署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的指令进入到服务中,所以还需要安装mysql的客户端,不需要启动mysql的服务,所以wyl01机器上还需要有mysql的客户端。

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

	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">false</property>
	</user>

schema.xml文件配置内容 

<?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"></schema>  

        <dataNode name="dn1" dataHost="localhost1" database="test01" />  

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">  
                <heartbeat>show slave status</heartbeat>  
                <writeHost host="hostM1" url="192.168.52.129:3306" user="root" password="123456">  
                        <readHost host="slave1" url="192.168.52.130:3306" user="root" password="123456" />  
                </writeHost>  
        </dataHost>  

</mycat:schema>

这里有两个参数需要注意,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进行查询

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

 

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

4 主从切换

4.1 故障演示

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

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

4.2  主从切换

在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再次查看还是从的角色。这里有点乱。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值