Mycat实现读写分离

it2024-12-18  10

概述

通过Mycat和MySQL的主从复制配合搭建数据库的读写分离,实现MySQL的高可用性。我们将搭建:一主一从、双主双从两种读写分离模式。

一主一从模式

一主一从模式是指一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下

1、搭建 MySQL 数据库主从复制

具体实现过程,MySQL主从复制配置过程

2、修改Mycat的配置文件schema.xml

之前的配置已分配了读写主机,是否已实现读写分离?

验证读写分离

(1)在写主机插入:insert into uservalues (1,@@hostname);

主从主机数据不一致了

(2)在Mycat里查询:select * from user;

修改的balance属性,通过此属性配置读写分离的类型

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

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

为了能看到读写分离的效果,把balance设置成2,会在两个主机间切换查询

3、启动Mycat

4、验证读写分离

(1)在写主机数据库表mytbl中插入带系统变量数据,造成主从数据不一致

insert into user(name,source) values('C0055',@@hostname);

(2)在Mycat里查询user表,可以看到查询语句在主从两个主机间切换

双主双从模式

一个主机m1用于处理所有写请求,它的从机s1和另一台主机m2还有他的从机s2负责所有读请求。

当m1主机宕机后,m2主机负责写请求,m1、m2互为备机。架构图如下

角色IP地址节点名称Master1192.168.67.140CentOS01Slave1192.168.67.130CentOS02Master2192.168.67.180CentOS04Slave2192.168.67.190CentOS05

1、搭建 MySQL 数据库主从复制(双主双从模式)

具体实现过程,MySQL主从复制配置过程(双主双从模式)

2、修改Mycat的配置文件schema.xml

修改的balance属性,通过此属性配置读写分离的类型

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

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

为了能看到读写分离的效果,把balance设置成1

balance=“1”: 全部的readHost与stand by writeHost参与select语句的负载均衡。writeType=“0”: 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.propertiesswitchType=“1”: 1 默认值,自动切换。 -1 表示不自动切换2 基于 MySQL 主从同步的状态决定是否切换。 … <dataNode name="dn1" dataHost="host1" database="testdb" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" > <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.67.140:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.67.130:3306" user="root" password="123456" /> </writeHost> <writeHost host="hostM2" url="192.168.67.180:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.67.190:3306" user="root" password="123456" /> </writeHost> </dataHost>

3、启动Mycat

mysql -umycat -p123456 -P8066 -h 192.168.67.140

4、验证读写分离

(1)在写主机Master1数据库表userl中插入带系统变量数据,造成主从数据不一致

insert into user(name,source) values('test',@@hostname);

(2)在Mycat里查询user表,可以看到查询语句在Master2、Slave1、和Slave2主从三个主机之间切换

5、抗风险能力

停止数据库Master1

在Mycat里插入数据依然成功,Master2自动切换为写主机

insert into user(name,source) values('dead',@@hostname);

启动数据库Master1

在Mycat里查询user表,可以看到查询语句在Master1、Slave1和Slave2主从三个主机间切换

Master1、Master2互做备机,负责写的主机宕机,备机切换负责写操作,保证数据库读写分离高可用性

最新回复(0)