概述
通过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地址 | 节点名称 |
---|---|---|
Master1 | 192.168.67.140 | CentOS01 |
Slave1 | 192.168.67.130 | CentOS02 |
Master2 | 192.168.67.180 | CentOS04 |
Slave2 | 192.168.67.190 | CentOS05 |
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.properties
- switchType=“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互做备机,负责写的主机宕机,备机切换负责写操作,保证数据库读写分离高可用性