SQL 基础及 MySQL DBA 运维实战 - 6:Mycat代理技术

MySQL DBA运维实战:集群与代理技术深度解析

引言

在现代互联网应用中,数据库的高可用性、可扩展性和性能是企业级应用的核心需求。随着业务量的增长,单一数据库服务器往往无法满足需求,此时数据库集群和代理技术成为解决这些问题的关键方案。

一、代理技术概述

1.1 什么是数据库代理

数据库代理(DB Proxy),也称为数据库中间件,是位于应用程序和数据库服务器之间的一层中间件,负责管理数据库连接、分发请求、实现读写分离、负载均衡等功能。

1.2 代理技术的核心功能

  • 读写分离:将读请求和写请求分离到不同的数据库节点,提高系统整体性能
  • 负载均衡:在多个数据库节点之间分发请求,避免单点压力过大
  • 数据分片:支持数据的分片自动路由与聚合,实现水平扩展

1.3 主流代理产品对比

产品名称 开发组织 特点
MySQL Proxy MySQL官方 官方产品,功能相对基础
Atlas 奇虎360 基于MySQL Proxy开发,性能更优
DBProxy 美团点评 针对美团业务场景优化
Amoeba 早期阿里巴巴 功能全面,但维护较少
Cobar 阿里巴巴 阿里早期开源产品
MyCat 阿里巴巴 功能强大,社区活跃

二、Mycat实战详解

Mycat作为一款功能强大的数据库中间件,提供了完整的数据库分片、读写分离和高可用解决方案。下面我们通过实际案例来详细介绍Mycat的部署和配置。

图示:

2.1 架构设计

在本次实战中,我们采用以下架构,做好域名解析环境如下:

  • Mycat服务器:192.168.88.29(主机名:mycat)
  • MySQL集群 :M-M-S-S架构
    • Master1:10.18.43.41
    • Master2:10.18.43.170
    • Slave1:192.168.0.116
    • Slave2:192.168.0.117

2.2 部署步骤

2.2.1 配置Java环境

Mycat基于Java开发,首先需要安装JDK:

资源比较难寻,我收集了现成的包,包含jdk以及下面需要的资源

通过网盘分享的文件:jdk+mycat

链接: https://pan.baidu.com/s/1bFy4wG1WvVdPWXijysXJeQ 提取码: 1031

bash 复制代码
tar xvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1.8.0_91/ /usr/local/java

配置环境变量(方便Java调用):

bash 复制代码
echo 'JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH' >> /etc/profile
source /etc/profile

验证Java安装:

bash 复制代码
[root@mycat ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

# 查询到版本说明jdk安装成功
2.2.2 安装与配置Mycat
  1. 下载并安装Mycat

    mycat官网:| MYCAT官方网站---中国开源分布式数据库中间件

bash 复制代码
wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 
# 因为网络问题该下载失效,可以用我提供的资源包
tar xfv  Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
  1. 配置Mycat前端

编辑/usr/local/mycat/conf/server.xml文件,配置用户信息并注释掉多余用户(大概在95-100行)。

启动mycat管理员。

  1. 配置Mycat后端

编辑/usr/local/mycat/conf/schema.xml文件,配置MySQL集群信息,配置前先备份配置文件,防止配错恢复使用。

bash 复制代码
cp /usr/local/mycat/conf/schema.xml  ./

进入配置文件后会有很多注释的内容,可以都删掉看着会清晰一些,配置示例如下
!!!注意我下图配置主机群少了一个结束标签,模板中是完整的!!!

配置文件模板如下

复制代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="jiqun" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>

        <dataNode name="dn1" dataHost="localhost1" database="jiqun" />

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <writeHost host="master1" url="master1:3306" user="mycatproxy" password="Abc@2929">
                        <readHost host="slave1" url="slave1:3306" user="mycatproxy" password="Abc@2929" />
                        <readHost host="slave2" url="slave2:3306" user="mycatproxy" password="Abc@2929" />
                </writeHost>
                
                <writeHost host="master2" url="master2:3306" user="mycatproxy" password="Abc@2929">
                        <readHost host="slave1" url="slave1:3306" user="mycatproxy" password="Abc@2929" />
                        <readHost host="slave2" url="slave2:3306" user="mycatproxy" password="Abc@2929" />
                </writeHost>
        </dataHost>
</mycat:schema>

关键配置项包括:

  • schema:Mycat维护的集群名称
  • datanode:后方节点群的名称
  • datahost:后方节点群的主机名称
  • writehost:写主机
  • readhost:读主机
  1. 关键属性配置
  • balance:读写分离策略

    • balance="0":关闭读写分离功能,所有读操作都发送到当前可用的writeHost
    • balance="1":开启读写分离,所有读操作都随机发送到readHost
  • writeType:写操作策略

    • writeType="0":备份型,所有写操作发送到配置的第一个writeHost,第一个挂了切到第二个
    • writeType="1":负载型,所有写操作都随机发送到配置的writeHost
  • switchType:切换模式

    • switchType="-1":不自动切换
    • switchType="1":根据延时自动切换
    • switchType="2":根据MySQL主从同步状态决定是否切换
  • slaveThreshold:主从延迟阈值,单位为秒

    • 例如设置为60,表示当主从延迟超过60秒时,读请求不会分发到该从节点
2.2.3 配置MySQL集群

在MySQL集群的所有节点上创建Mycat连接用户及权限:

sql 复制代码
grant all on *.* to 'mycatproxy'@'192.168.88.29' identified by 'Abc@2929';

其中192.168.88.29是Mycat服务器的IP地址

这里有个点就是我的集群是做了双主双从的,所以我在其中一台主数据库中创建用户相当于对所有的机器都做了创建的动作。

2.2.4 启动Mycat
bash 复制代码
/usr/local/mycat/bin/mycat start

Starting Mycat-server...

启动成功,否则就是配置Mycat后端语法错误。

验证Mycat是否启动成功:

bash 复制代码
ss -anpt | grep java
ps aux | grep mycat
2.2.5 测试Mycat连接

安装MySQL客户端并连接Mycat:

bash 复制代码
yum install -y mariadb
# 这里的密码是`/usr/local/mycat/conf/server.xml`文件中配置的密码
mysql -hmycat -uroot -p'111111' -P8066

查看数据库:

sql 复制代码
show databases;

如果在这一步看到了jiqun这个数据库,这个数据库只是虚拟的,注意后方数据库应该创建这个库。

2.3 案例实战

案例1:基本读写操作
  1. 在Master1上创建数据库和表
sql 复制代码
create database jiqun;
create table jiqun.t1 (id int);
  1. 通过Mycat进行数据操作
sql 复制代码
select * from jiqun.t1;
insert into jiqun.t1 values(3);
  1. 验证数据同步

在MySQL集群的其他节点上验证数据是否同步。

案例2:多库配置

当需要管理多个数据库时,可在Mycat的schema.xml文件中配置多个schema,每个schema对应一个或多个datanode,实现多库的统一管理。

配置文件示例如下:

server.xml

schema.xml

三、最佳实践与注意事项

3.1 性能优化

  • 合理配置连接池:根据应用需求调整Mycat的连接池大小
  • 优化分片策略:根据业务特点选择合适的分片规则
  • 监控主从延迟 :设置合理的slaveThreshold值,避免读取过期数据

3.2 高可用保障

  • 配置多个writeHost:实现主库的自动切换
  • 定期备份:即使使用了集群,也需要定期进行数据备份
  • 监控系统:部署监控系统,及时发现和解决问题

3.3 常见问题与解决方案

  • 连接失败:检查网络连接、用户权限和配置文件
  • 数据不一致 :检查主从同步状态,调整switchType参数
  • 性能下降:检查SQL语句、索引使用情况和系统资源

代理技术是构建高可用、高性能MySQL集群的关键组件。通过Mycat等中间件,我们可以实现读写分离、负载均衡和数据分片等功能,为应用提供更加稳定和高效的数据库服务。

在实际部署中,需要根据业务需求和系统规模,选择合适的代理产品和配置方案。同时,定期的维护和监控也是确保系统稳定运行的重要保障。

3.3 常见问题与解决方案

  • 连接失败:检查网络连接、用户权限和配置文件
  • 数据不一致 :检查主从同步状态,调整switchType参数
  • 性能下降:检查SQL语句、索引使用情况和系统资源

代理技术是构建高可用、高性能MySQL集群的关键组件。通过Mycat等中间件,我们可以实现读写分离、负载均衡和数据分片等功能,为应用提供更加稳定和高效的数据库服务。

在实际部署中,需要根据业务需求和系统规模,选择合适的代理产品和配置方案。同时,定期的维护和监控也是确保系统稳定运行的重要保障。

相关推荐
茉莉玫瑰花茶2 小时前
MySQL 存储过程与触发器超详解:从基础到实战(含面试题 + 案例)
数据库·mysql
xiaokangzhe2 小时前
MySQL故障排查与优化
数据库·mysql
2601_949818092 小时前
LangChain-08 Query SQL DB 通过GPT自动查询SQL
数据库·sql·langchain
战族狼魂3 小时前
AI 全程聊天式交互,自动修复错误--撸了一个中英多语言电商独立站,基于SpringBoot+React+MySQL 可Docker一键部署
spring boot·mysql·react.js
小尔¥3 小时前
MySQL故障排查与优化
运维·数据库·mysql
道清茗3 小时前
【MySQL知识点问答题】锁机制、索引优化与数据库恢复方法
数据库·mysql
RisunJan4 小时前
Linux命令-mysqldump(MySQL数据库中备份工具)
linux·数据库·mysql
FinTech老王4 小时前
告别“sql_mode“噩梦:MySQL 8.0 vs 5.7兼容性全对比与升级避坑指南
android·sql·mysql
孟章豪4 小时前
如何优雅封装.NET数据库访问层(彻底告别拼接SQL)
数据库·sql·.net