MyCat实现MySQL主从读写分离
作者:柒柒qr
本文详细讲解读写分离的原理和优势,手把手教你安装配置MyCat中间件,实现主从复制和故障切换,轻松提升数据库性能和可用性,适合运维和开发人员实战参考
前言
在现代高并发数据库应用场景中,单台MySQL服务器往往难以应对读写混合的压力。读写分离技术通过将数据库的写操作和读操作分配到不同的服务器节点,能有效提升系统性能和可用性。MyCAT 是一个数据库中间件,它能解决单台 MySQL 扛不住的问题。
一、MySQL读写分离概述
1.1 工作原理
- 主库负责写操作:如:INSERT、UPDATE、DELETE
- 从库负责读操作:如:SELECT
- 数据同步机制:主库通过二进制日志将数据变更同步到从库
1.2 为什么要读写分离
突破性能瓶颈:单台服务器性能有限,分担负载提升整体吞吐量
缓解锁争用问题:主库处理写操作(X锁),从库处理读操作(S锁),减少锁冲突
优化存储引擎:从库可使用MyISAM引擎(查询性能更优),主库使用InnoDB(保证事务安全)
保障高可用:主从架构提供冗余,主库故障时可快速切换到从库
1.3 实现方式
应用程序层实现
- 优点:易部署,对访问压力中等的系统性能良好
- 缺点:代码耦合、难以支持高级功能、大型系统不适用
中间件层实现
- 优点:架构灵活、透明化分库分表、可做 failover 和监控
常用中间件:
- Cobar:阿里B2B的分布式系统,已停更
- MyCat:Cobar二次开发,社区活跃
- OneProxy:商业收费,高并发稳定
- Vitess:YouTube使用,架构复杂
- Kingshard、Atlas、MaxScale、MySQL Router等
二、什么是MyCat
MyCat是开源的企业级数据库中间件,核心特性包括:
- 支持完整ACID事务
- 可替代MySQL集群或Oracle集群
- 融合内存缓存、NoSQL、HDFS等大数据技术
- 核心功能:分库分表、读写分离、故障切换
三、MyCat 安装与配置
3.1 准备环境
关闭防火墙
关闭增强功能
Master服务器:10.8.0.10 mysql5.7
Slave1服务器:10.8.0.30 mysql5.7
Slave2服务器:10.8.0.50 mysql5.7
客户端服务器:10.8.0.60 安装mycat,测试
# 关闭防火墙 systemctl stop firewalld # 关闭增强功能 setenforce 0
3.2 下载与解压(10.8.0.60)
# 官方下载地址 wget https://github.com/MyCATApache/Mycat-download/blob/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz # 解压到安装目录 tar -zxvf Mycat-server-1.6-RELEASE-*.tar.gz -C /usr/local/ cd /usr/local/mycat
3.3 创建用户
useradd mycat # 设置密码 passwd mycat # 授权 chown -R mycat.mycat /usr/local/mycat

3.4 Java环境配置
# 安装JDK 1.8+ tar xf jdk-8u191-linux-x64.tar.gz -C /usr # 配置环境变量 vim /etc/profile.d/java.sh export JAVA_HOME=/usr/jdk1.8.0_191 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar # 生效配置 source /etc/profile.d/java.sh java -version # 验证安装


四、MyCat核心配置实战
4.1 环境变量配置
# 创建MyCat环境变量 vim /etc/profile.d/mycat.sh #!/bin/bash export MYCAT_HOME=/usr/local/mycat export PATH=$MYCAT_HOME/bin:$PATH # 生效配置 source /etc/profile.d/mycat.sh

4.2 主机名解析配置
# 编辑/etc/hosts添加集群节点 vim /etc/hosts 10.8.0.30 slave1 10.8.0.50 slave2 10.8.0.10 master

4.3 核心配置文件
4.3.1 用户权限配置(server .xml)
vim /usr/local/mycat/conf/server.xml
<!-- 管理用户,具有读写权限 -->
# 用户名:mycat ;密码:123456;可访问逻辑库:ha ;权限:默认是读写都有(全权限) ;schemas="ha" 必须存在
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">ha</property>
# dml 权限含义:1111:全权限;0001:只能查;0110:删 + 改
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">ha</property>
<property name="readOnly">true</property>
</user>
4.3.2 schema 配置
# 备份
mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
vim /usr/local/mycat/conf/schema.xml
# 直接复制
# 一主两从
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义逻辑库 schema -->
<schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- 数据节点 -->
<dataNode name="dn1" dataHost="dthost" database="ha"/>
#name="ha":定义 schema 名称为 ha,客户端通过 use ha 来访问。checkSQLschema="false":关闭 SQL schema 检查,加快解析。sqlMaxLimit="100":单条 SQL 返回最大 100 行。dataNode='dn1':指定使用的数据节点为 dn1。
<!-- 数据主机组 -->
<dataHost name="dthost"
maxCon="500"
minCon="10"
balance="1"
writeType="0"
dbType="mysql"
dbDriver="native"
switchType="-1"
slaveThreshold="100">
# 心跳检测
<!-- 心跳语句 -->
<heartbeat>select 1</heartbeat>
<!-- 主库 (写) -->
<writeHost host="master" url="10.8.0.10:3306" user="mycat" password="123456">
<!-- 从库 (读) -->
<readHost host="slave1" url="10.8.0.30:3306" user="mycat" password="123456"/>
<readHost host="slave2" url="10.8.0.50:3306" user="mycat" password="123456"/>
</writeHost>
</dataHost>
</mycat:schema>
4.3.3 关键参数解析
balance(读负载均衡方式)
0:不开启读写分离 1:所有读节点参与负载均衡(推荐) 2:随机分配读请求 3:读请求只分发给从节点
writeType(写节点策略)
0:写操作只发往第一个writeHost 1:写操作随机分配(已废弃)
switchType(故障切换策略)
-1:不自动切换 1:自动切换(默认) 2:基于MySQL主从状态切换 3:基于Galera Cluster切换
4.4 启动MyCat服务
# 切换到MyCat安装目录 cd /usr/local/mycat/bin # 启动服务 ./mycat start # 查看启动日志 cat /usr/local/mycat/logs/wrapper.log
![]()
五、MySQL主从环境搭建
5.1 主库配置(10.8.0.10)
# 创建MyCat连接账号并赋权 grant all privileges on *.* to 'mycat'@'%' identified by '123456'; # 刷新权限 flush privileges;
5.2 从库配置(10.8.0.30/50)
# 配置好主从复制的基础上直接为mycat用户赋权 grant all privileges on *.* to 'mycat'@'%' identified by '123456';

六、读写分离效果验证
6.1 测试环境准备
# 在客户端(10.8.0.60)安装MySQL客户端 yum install -y mariadb-server systemctl start mariadb.service # 连接MyCat管理端口 mysql -u mycat -p123456 -h 10.8.0.60 -P 8066 # 通过mycat服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器
6.2 读写分离验证步骤
在主服务器上: create database ha; use ha; create table test (id int(10),name varchar(10),address varchar(20));

在两台从服务器上:
# 关闭同步
stop slave;
use ha;
# 在slave1上:
insert into test values('1','csq','this_is_slave1');
# 在slave2上:
insert into test values('2','zx','this_is_slave2');
# 在主服务器上:
insert into test values('3','yr','this_is_master');
# 在客户端服务器上: use ha; # 客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据 select * from test;

# 在客户端服务器上:
# 只有主服务器上有此数据
insert into test values('4','qiran','this_is_client');



# 在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据 start slave; # 在客户端执行查询 select * from test;

总结
注意:数据库关掉后,主从不再同步,若SQL线程出现问题,可以重新配置偏移量和file文件
到此这篇关于MyCat实现MySQL主从读写分离的文章就介绍到这了,更多相关MySQL MyCat主从读写分离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
