一,介绍
读写分离,简单地说是把对数据库的读和写操作分开 ,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。
通过MyCat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持0racle和SQLServer。

二,一主一从
MySQL的主从复制,是基于二进制日志(binlog)实现的。
环境准备
主机 | 角色 | 用户名 | 密码 |
---|---|---|---|
192.168.200.211 | master | root | 1234 |
192.168.200.212 | slave | root | 1234 |
搭建详见 :主从复制 - wdadwa - 博客园 (cnblogs.com)
三,一主一从读写分离
-
配置
Mycat控制后台数据库的读写分离和负载均衡由
schema.xml
文件中datahost
标签的balance属性控制。在读写分离的结构中,逻辑表可以不写,如果不指定会自动加载所在数据节点的数据库里面的所有表作为逻辑表。
-
负载均衡而策略取值
取值 含义 0 不开启读写分离机制,所有读操作都可发送到当前可用的writeHost上 1 全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对于双主从模式) 2 所有的读写操作都随机在writeHost,readHost上分发 3 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力
一主一从读写分离存在的问题:
- 主节点Master宕机之后,业务系统就只能够读,而不能写入数据了。
四,双主双从
双主双从
-
一个个主机 Master1用于处理所有写请求,它的从机 slave1和另一台主机 Master2还有它的从机 slave2 负责所有读请求。当 Master1主机宕机后,Master2主机负责写请求,Master1、Master2互为备机。架构图如下:
-
环境准备
编号 IP 预装软件 角色 1 192.168.200.210 MYSQL,MyCat MyCat中间件服务器 2 192.168.200.211 MYSQL M1 3 192.168.200.212 MYSQL S1 4 192.168.200.213 MYSQL M2 5 192.168.200.214 MYSQL S2 -
双主从的搭建
-
M1主库配置
-
修改配置文件
/etc/my.cnf
ini#mysql服务id,保证整个集群环境中唯一,取值范围是1~2的32次方-1.默认为1 server-id=1 #指定同步的数据库 binlog-do-db=db01 binlog-do-db=db02 binlog-do-db=db03 #在作为从库数据库的时候,有写入操作也要更新二进制日志文件(因为和m2互为备用机) log-slave-updates
-
重启MySQL服务器
bashsystemctl restart mysqld
-
-
M2主库配置
-
修改配置文件
/etc/my.cnf
ini#mysql服务id,保证整个集群环境中唯一,取值范围是1~2的32次方-1.默认为1 server-id=3 #指定同步的数据库 binlog-do-db=db01 binlog-do-db=db02 binlog-do-db=db03 #在作为从库数据库的时候,有写入操作也要更新二进制日志文件(因为和m2互为备用机) log-slave-updates
-
重启MySQL服务器
bashsystemctl restart mysqld
-
-
创建两台主库之间进行主从复制的账号
sql#注,两个数据库都需要执行 #创建MS用户,并设置密码,该用户可在任意主机连接该MySQL服务 create user 'MS'@'%' identified with mysql_native_password by '123456'; #为MS用户分配主从复制权限 grant replication slave on *.* to 'MS'@'%';
通过指令,查看两台主库的二进制日志坐标
sqlshow master status;
-
S1从库配置
-
修改配置文件
/etc/my.cnf
ini#mysql服务id,保证整个集群环境中唯一,取值范围是1~2的32次方-1.默认为1 server-id=2
-
重启MySQL服务器
bashsystemctl restart mysqld
-
-
S2从库配置
-
修改配置文件
/etc/my.cnf
ini#mysql服务id,保证整个集群环境中唯一,取值范围是1~2的32次方-1.默认为1 server-id=2
-
重启MySQL服务器
bashsystemctl restart mysqld
-
-
配置两台从库关联的主库
sqlCHANGE REPLICATION SOURCE TO SOURCE_HOST='master的ip地址',SOURCE_USER='上述配置的用户',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='log文件',SOURCE_LOG_POS='上述的postition';
需要注意的是:Slave1对应Master1,Slave2对应Master2
启动两台从库的主从复制,查看从库状态
sqlstart slave; show slave status \G;
-
配置两台主库相互复制
Master2复制Master2,Master1复制Master2,故下面要分别配置两次
sqlCHANGE REPLICATION SOURCE TO SOURCE_HOST='master的ip地址',SOURCE_USER='上述配置的用户',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='log文件',SOURCE_LOG_POS='上述的postition';
启动两台从库主从复制,查看从库状态
sqlstart slave; show slave status \G;
-
五,双主双从读写分离
Mycat控制后台数据库的读写分离和负载均衡由schema.xml
文件datahost
标签的balance属性 控制,通过writeType
及switchType
来完成失败自动切换的。

-
balance="1"
代表 全部的 readHost 与 stand bywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->51,M2->52,并且 M1与M2互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
-
writeType
0
:写操作都转发到第1台writeHost,writeHost1挂了,会切换到writeHost2上1
:所有的写操作都随机的分发到配置的writeHost上
-
switchType
-1
:不自动切换1
:自动切换
六,总结
-
可以根据双主从的原理扩展为n主从。
-
分库分表可以结合主从复制
-
可以在 Mycat 中配置特定的逻辑表进行分库分表,同时保留其他表不做分库分表处理。默认情况下,Mycat 会将所有表当作逻辑表,但你可以通过 Mycat 的
schema.xml
和rule.xml
文件进行更细粒度的配置,指定哪些表需要分库分表,哪些表不需要。 -
在
schema.xml
中没有为某些表定义逻辑表,它们会被默认映射为物理表,Mycat 会自动处理这些表,直接将查询路由到后端的对应数据库。这种情况下,这些表不会使用分库分表策略,也不会有路由规则,Mycat 仅作为一个简单的代理,将操作转发到后端的主库或从库。
-