Mycat实现Mysql的一主一从和双主双从读写分离

前提是:

  • 已经有了一主一从的Mysql服务架构。
  • 已经安装启动好了mycat。并对mycat有一定了解。
实现
  1. 修改mycat的schema配置文件:
<!--schema 标签用于定义 MyCat 实例中的逻辑库-->
<!-- name是逻辑库的名称,客户端连接mycat是看到这个数据库名称的-->
<!-- dataNode是设置逻辑库的真实数据库分片节点-->
<schema name="producer" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
              
        </schema>
        
        <!-- 设置分片节点-->
        <!-- dataHost设置真实数据库 database为真实数据库名称-->
        <dataNode name="dn1" dataHost="producerHost" database="producer" />
       
       <!-- 设置真实库-->
        <dataHost name="producerHost" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- 设置写的节点,通常是master节点 -->
                <writeHost host="MasterHost1" url="192.168.18.142:3306" user="root"
                                   password="123456">
                         <!-- 在writeHost 设置readHost,通常是从节点-->
                        <readHost host="slaveHost1" url="192.168.18.144:3306" user="root" password="123456"/>
                </writeHost>
                
        </dataHost>

dataHost 的balance属性说明:
此属性用于配置dataHost 的负载类型,可以设置以下值:

说明
0不开启读写分离机制,所以的读操作都发送到当前可用的writehost中,也就是相当于没有负载
1全部readhost和standby writehost参与select语句的负载均衡,这个是双主双从架构的情况下适用,M1位主机,M2为standby 主机,S1位M1从机,S2位M2从机,这种情况下就是M2、S1、S2进行读负载,M1负责写负载
2所有的读操作都在writehost和readhost上面随机分发
3所有读请求分发到readhost中,writehost不负载读请求

我们上面使用的是3.

设置完毕重启mycat。

验证:

先使用下面insert语句加入一条记录。

#@@host是系统变量,不同的主机不同。
INSERT INTO test(`name`) VALUES(@@hostname)

然后分别到两个mysql中查询。
在这里插入图片描述
在这里插入图片描述
主机的数据时142,从机是144.
然后我们连接mycat进行查询。

在这里插入图片描述
无论查多少次都是144,从机的数据,所以读压力都负载在从机上。

双主双从读写分离

使用mycat进行mysql双主双从读写分离,并进行主机故障时主备切换。
在上面单主单从的配置上,在配上一主一从。
在这里插入图片描述
然后修改blance的值,从3改成1

writeType属性说明:
0:所以的写请求都分发到配置的第一台writeHost上,也就是只有一台writeHost执行写操作(单写)。当该writeHost宕机后,会切换到还在生存的第二个。推荐使用单写模式。
1:所有的写请求都随机分配到所有配置的writeHost上,实现多写。1.5后废弃不推荐使用。

switchType属性说明:主备自动切换类型
1:自动切换。
-1:不切换。
2:基于Mysql主从同步状态来决定是否自动切换。

这里设置writeType=0 switchType=1

最终:

<!--schema 标签用于定义 MyCat 实例中的逻辑库-->
<!-- name是逻辑库的名称,客户端连接mycat是看到这个数据库名称的-->
<!-- dataNode是设置逻辑库的真实数据库分片节点-->
<schema name="producer" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
              
        </schema>
        
        <!-- 设置分片节点-->
        <!-- dataHost设置真实数据库 database为真实数据库名称-->
        <dataNode name="dn1" dataHost="producerHost" database="producer" />
       
       <!-- 设置真实库-->
        <dataHost name="producerHost" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- 设置写的节点,通常是master节点 -->
                <writeHost host="MasterHost1" url="192.168.18.142:3306" user="root"
                                   password="123456">
                         <!-- 在writeHost 设置readHost,通常是从节点-->
                        <readHost host="slaveHost1" url="192.168.18.144:3306" user="root" password="123456"/>
                </writeHost>
                <writeHost host="MasterHost2" url="192.168.18.145:3306" user="root"
                                   password="123456">
                        <readHost host="slaveHost2" url="192.168.18.143:3306" user="root" password="123456"/>
                </writeHost>

        </dataHost>

重启mycat验证:
插入一条数据:

INSERT INTO test(`name`) VALUES(@@hostname)

查询:
在这里插入图片描述
在这里插入图片描述
我后面两台虚拟机(145、143)没有修改主机名,所以会小时localhosy.localdomain。
点击多次,你会发现不会有42的 因为读负载都分摊到了m2 s1 s2上。

验证自动切换:
把m1关了。
在这里插入图片描述
然后继续插入查询数据。
在这里插入图片描述
在这里插入图片描述
也成功了,但是 这就相当于废了一个主从。M1S1不能用了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值