读写分离需要借助MyCat来实现,我们要借助MyCat的一个标签(datahost)以及一个属性(balance)进行控制
通过writeType、switchType来完成失败自动切换的
MyCat控制后台数据库的读写分离和负载均衡由/usr/local/mycat/conf目录的schema.xml文件里面的'datahost标签的balance属性'来控制
balance指的是负载均衡策略,目前取值有四种(0、1、2、3。其中1和3是用于读写分离,3是用于一主一从分离,1是既可以一主一从也可以双主双从)如下 第一种:0(默认),表示不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。也就是读写操作只会被路由到单台特定服务器 第二种:1,表示全部的readHost与备用的writeHost都参与select语句的负载均衡,主要用于双主双从模式 第三种:2,表示所有的读写操作都随机在writeHost,readHost上分发。也就是读写操作会被随机路由到任意服务器 第四种:3,所有的读请求随机分发到writeHost对应的readHost上执行。writeHost不负担读压力,只负担写压力
balance="1" 代表全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2-S2,并且M1与M2互为主备),正常 情况下,M2、S1、S2都参与select语句的负载均衡。简单说就是M1是负责写操作,M2和S1和S2都负责读操作(当是查询业务,就由这三台服务器负载)
writeType (1)0,表示写操作都转发到第一台writeHost,当writeHost1挂了,才会切换到writeHost2上 (2)1,表示所有的写操作都随机地发送到配置的writeHost上
switchType (1)-1,不自动切换 (2)1,自动切换
1、第一台服务器(192.168.127.138)配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)
2、第一台服务器(192.168.127.138)配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)
3、第一台服务器(192.168.127.138)启动mycat
#停止
cd /usr/local/mycat && bin/mycat stop
#启动
cd /usr/local/mycat && bin/mycat start
#通过查看mycat日志文件来验证是否启动成功。日志末尾为successfully表示启动成功、Wrapper Stopped表示启动失败
cd /usr/local/mycat && tail -f logs/wrapper.log(需要大概10秒才能启动成功)
4、确保自己的主库1、从库1、主库2、从库2都有db01数据库,没有的话,去上一节课末尾的命令运行一遍
5、在第一台服务器登录进mycat,并进行测试,当执行查询及更新操作,能否进行读写分离,以及读写分离的策略是否正确,当主库挂掉一个之后,第二个主库能否切换生效
mysql -h 192.168.127.138 -P 8066 -u root -p123456
use ITCAST_RW2;
select * from tb_user;
如何知道MyCat在我们读数据的时候,到底路由的是哪台服务器,我们可以用下面的思路
分析: M1的数据会同步到S1,M2的数据会同步到S2。但是S1的数据不会同步到M1,S2的数据不会同步到M2。所以在S1和S2上修改表的数据,如下 在第一台从库上登录进mysql,执行一些语句使得表数据发生变化: mysql -u rooe -p use db01; update tb_user set name = '乌拉S1' where id = 1; 在第二台从库上登录进mysql,执行一些语句使得表数据发生变化: mysql -u rooe -p use db01; update tb_user set name = '乌拉S2' where id = 1; 如果第一台服务器(192.168.127.138)的Mycat查到的数据是'乌拉S1',说明数据来源于第一台从库,同理'乌拉S2'就证明来源于第二台从库,如果都不是说明就来源于两个主库 select * from tb_user; 上面那行多执行几次,会发现即有'乌拉S1',又有'乌拉S1',说明数据是随机来源于两台从库,原因:我们在schema.xml中设置的balance值为1,表示读请求会随机路由到从库
如何知道MyCat在我们写数据的时候,到底路由的是哪台服务器,我们可以用下面的思路
分析:一定是路由到主库。原因:如果插入数据是修改的从库的数据,那我们查看主库的时候,主库的数据还是原来的没更新的,但是 我们在查看主库的数据,发现主库是更新过来了的,也就是说明写操作是被路由到主库 insert into tb_user(id,name,sex) values(10,'李四',1); 上面那行,写入操作的时候,先写入的是M1服务器(当M1服务器没坏的时候,如果M1坏了,就先写入的是M2,然后实时同步到S1、S2),然后实时同步到M2、S1、S2 原因: 我们在schema.xml中设置的balance值为1,表示写请求必须是主库来处理,优先是M1
6、模拟M1故障,也就是M1宕机了
在第一台主库(192.168.127.145)停止Mysql服务
systemctl stop mysqld;
在第一台服务器(192.168.127.138)登录进MyCat,看看还能不能执行写入操作
mysql -h 192.168.127.138 -P 8066 -u root -p123456
insert into tb_user(id,name,sex) values(11,'王五',1);
上面那行,是可以执行的,原因:我们在schema.xml中设置的balance值为1,表示写请求必须是主库来处理,我们主库有两个,一个坏了就由另一个工作
select * from tb_user;#数据确实写入了,该数据会同步到S1、S2
保证了数据库的高可用
笔记已全部完成,由b站up主: 涣沷a靑惷,编写。有任何问题可联系解决,转载需经过'涣沷a靑惷'的本人同意 祝前程似锦,很荣幸能成为你逐梦的旅途一盏明灯