MySQL基于MyCat的负载均衡与高可用

MySQL基于MyCat的负载均衡与高可用

  • MyCat中几种负载均衡的策略
    • 介绍
    • 测试
  • MyCat的高可用
    • 介绍
    • 测试

MyCat中几种负载均衡的策略

介绍

<dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();heartbeat>
<writeHost host="w1" url="192.168.12.141:3306" user="root" password="123456">
    <readHost host="r1" url="192.168.12.151:3306" user="root" password="123456">readHost>
writeHost>

<writeHost host="w2" url="192.168.12.142:3306" user="root" password="123456">
    <readHost host="r2" url="192.168.12.152:3306" user="root" password="123456">readHost>
writeHost>
dataHost>
mycat:schema>

在dataHost标签中,其中balance是用来配置负载均衡的属性。

属性值 作用
0 不开启读写分离机制,所用读写操作都发送到当前可用的writeHost
1 全部的readHost和备份writeHost都参与的负载均衡,例如上述配置中,参与读负载均衡的有r1,w2,r2
2 所有的读操作都会在writeHost和readHost上分发
3 所有的读请求随机分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压力

测试

  1. 首先搭建MySQL主从分离如图:
    MySQL基于MyCat的负载均衡与高可用_第1张图片
  • m1:192.168.12.141:3306
  • m2:192.168.12.141:3307
  • s1:192.168.12.151:3306
  • s2:192.168.12.152:3306
  • MyCat:192.168.12.150:8066

注意: 级联复制时需要在my.cnf中多配置一项log_slave_updates=1。此配置是将从服务器从主服务器中收到的命令更新到从服务器自己的二进制文件中。如果不配置的话m1更新数据后s1和m2都会正常更新,但是s2却没有更新,因为s2是m2的从机,它需要读取m2的二进制日志,然而它并没有更新。所以m1和m2都需要配置此项。

  1. 修改MyCat中的schema.xml


<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="cms" checkSQLschema="false" sqlMaxLimit="100">
    <table name="news" primaryKey="id" autoIncrement="true" dataNode="dn1"  />
    <table name="section" primaryKey="id" autoIncrement="true" dataNode="dn1"  />
	  
schema>

        
<dataNode name="dn1" dataHost="test1" database="cms" />

        
<dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();heartbeat>

<writeHost host="m1" url="192.168.12.141:3306" user="root" password="123456">
         <readHost host="s1" url="192.168.12.151:3306" user="root" password="123456">readHost>
writeHost>

<writeHost host="m2" url="192.168.12.141:3307" user="root" password="123456">
    <readHost host="s2" url="192.168.12.152:3306" user="root" password="123456">readHost>
writeHost>
dataHost>

mycat:schema>

  1. 启动MyCat,目前配置的是balance=“1”。在命令行中向MyCat发送几条查询语句:
use cms;

select * from t_sys_user;

查看日志:

tail -f mycat.log

分配到了m2
在这里插入图片描述分配到了s2
MySQL基于MyCat的负载均衡与高可用_第2张图片分配到了s1
MySQL基于MyCat的负载均衡与高可用_第3张图片

其余的策略有兴趣可以自己尝试分析。

MyCat的高可用

介绍

MyCat中在dataHost标签中提供了switchType 属性,用于配置MySQL的高可用。当writeHost宕机后会自动切换到备用的writeHost。同时宕机的writeHost中配置的readHost同时也会失效,防止读取老数据。

switchType 值 策略
-1 宕机时不自动切换
1 默认值,宕机时切换为备用机
2 基于MySQL的主从同步状态决定是否切换
3 基于MySQL galary cluster的切换机制,适用于集群

测试

服务器环境和负载均衡中的相同。

        
<dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql" dbDriver="native" switchType=“1” >
<heartbeat>select user();heartbeat>

<writeHost host="m1" url="192.168.12.141:3306" user="root" password="123456">
         <readHost host="s1" url="192.168.12.151:3306" user="root" password="123456">readHost>
writeHost>

<writeHost host="m2" url="192.168.12.141:3307" user="root" password="123456">
    <readHost host="s2" url="192.168.12.152:3306" user="root" password="123456">readHost>
writeHost>
dataHost>

swtichType=1时

  1. 首先正常执行一条update语句,此时的master服务器为192.168.12.141:3307,即m2
    在这里插入图片描述
  2. 手动关闭m2镜像后,再次执行update语句,发现此时处理的服务器已经切换成了m1。
    在这里插入图片描述
  3. 此时执行的select语句都只会被分配到s1中执行,因为m2挂了s2也会自动设置为不可用。

你可能感兴趣的:(MySQL基于MyCat的负载均衡与高可用)