今天分享一下读写分离使用 MyCAT 版本来实现 MySQL 主从集群与 MyCAT 双节点部署,并结合 Keepalived 实现高可用的完整解决方案。

一、架构设计
1. 场景说明
在大型业务系统中,数据库压力大,为了解决单点瓶颈和读写分离问题,采用 MySQL 主从集群和 MyCAT 做数据中间层。为保证 MyCAT 层面的高可用,部署两个 MyCAT 节点,利用 Keepalived 做 VIP 浮动 IP,保障服务不中断。
架构如下:

二、部署环境规划
主机 IP
安装服务
角色
10.0.0.41
MySQL 主库 + MyCAT + Keepalived
主节点(MASTER)
10.0.0.42
MySQL 从库 + MyCAT + Keepalived
备节点(BACKUP)
VIP
10.0.0.100
客户端访问入口
mysql集群已经部署完成。
三、MyCAT 双节点部署
1. 安装 MyCAT
两个节点都需要部署mycat,部署过程一样。
mycat官网:https://github.com/MyCATApache/Mycat-Server
(1) 安装java
(2) 下载并解压 MyCAT
复制
# 下载mycat
wget https://github.com/MyCATApache/Mycat-Server/releases/download/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
tar -xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
# 解压好的文件迁移到/usr/local
mv mycat /usr/local/mycat1.2.3.4.5.6.
(3) 创建 MyCAT 用户
复制
useradd mycat
chown -R mycat:mycat /usr/local/mycat1.2.
(4) 配置环境变量
复制
vi /etc/profile
# 在尾部添加
export PATH=/usr/local/mycat/bin:$PATH
# 立即生效
source /etc/profile1.2.3.4.5.6.
2. 配置 MyCAT
配置文件路径:/usr/local/mycat/conf/涉及 3 个主要文件:
server.xml — 配置 MyCAT 相关服务schema.xml — 配置数据库连接、读写分离rule.xml — 配置分库分表规则(此方案中不涉及)
(1) server.xml 配置
路径:/usr/local/mycat/conf/server.xml
复制
<?xml versinotallow="1.0" encoding="UTF-8"?>
<mycat:server xmlns:mycat="http://mycat.io/">
<user name="root">
<property name="password">123456</property>
<property name="schemas">testdb</property>
</user>
</mycat:server>1.2.3.4.5.6.7.
客户端通过 MyCAT 连接时,使用 root/123456 登录。

(2) schema.xml 配置
路径:/usr/local/mycat/conf/schema.xml
复制
<?xml versinotallow="1.0" encoding="UTF-8"?>
<mycat:schema xmlns:mycat="http://mycat.io/">
<!-- 定义逻辑库 -->
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100">
<table name="*" dataNode="dn1" />
</schema>
<!-- 数据节点配置 -->
<dataNode name="dn1" dataHost="localhost" database="testdb" />
<!-- 主从数据库节点配置 -->
<dataHost name="localhost" maxCnotallow="1000" minCnotallow="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<!-- 主库 -->
<writeHost host="hostM1" url="10.0.0.41:3306" user="root" password="123456">
<!-- 从库 -->
<readHost host="hostS1" url="10.0.0.42:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.

关键配置说明
配置项
说明
balance="1"
配置读写分离,读操作自动分发到从库
writeType="0"
只允许向主库写入数据
writeHost
主库配置
readHost
从库配置
(3) 启动 MyCAT
复制
cd /usr/local/mycat/bin
./mycat start1.2.
(4) 查看 MyCAT 日志
复制
tail -f /usr/local/mycat/logs/wrapper.log1.
(5) 查看状态

两个节点配置完mycat后,接下来配置keepalived。
四、配置 Keepalived 高可用
1. 安装 Keepalived
复制
yum install keepalived -y1.
2. 配置 Keepalived
(1) 主节点 /etc/keepalived/keepalived.conf
复制
global_defs {
router_id MyCAT_1
}
vrrp_script chk_mycat {
script "/usr/local/mycat/bin/check_mycat.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33 # 确保网卡名正确
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100
}
track_script {
chk_mycat
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.
(2) 备节点 /etc/keepalived/keepalived.conf
复制
global_defs {
router_id MyCAT_2
}
vrrp_script chk_mycat {
script "/usr/local/mycat/bin/check_mycat.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100
}
track_script {
chk_mycat
}
}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.
(3) 健康检查脚本
复制
vi /usr/local/mycat/bin/check_mycat.sh1.
复制
#!/bin/bash
MYCAT_PORT=8066
if ! netstat -ntlp | grep $MYCAT_PORT > /dev/null
then
echo "MyCAT is down, stopping keepalived"
systemctl stop keepalived
fi1.2.3.4.5.6.7.8.9.
(4) 授权执行权限
复制
chmod +x /usr/local/mycat/bin/check_mycat.sh1.
3. 启动 Keepalived 服务
复制
# 启动keepalived并设置开机自启动
systemctl enable --now keepalived1.2.

五、客户端访问
客户端或应用通过 VIP(10.0.0.100)和端口 8066 访问:
复制
mysql -h 10.0.0.100 -P 8066 -uroot -p1234561.

高可用实现:
默认情况下,VIP 在主节点上,MyCAT 监听 8066 端口如果主节点的 MyCAT 异常,VIP 会自动漂移到备节点