【详解】Mycat读写分离与主从切换案例

举报
皮牙子抓饭 发表于 2025/09/23 21:42:25 2025/09/23
【摘要】 Mycat读写分离与主从切换案例前言随着互联网业务的快速发展,数据库的压力也越来越大。为了提高数据库的性能和可用性,读写分离和主从切换成为了常见的解决方案。Mycat(原名MySQL-CAT)是一个开源的分布式数据库系统,它支持读写分离、分表分库等特性,能够有效地解决高并发场景下的数据库瓶颈问题。本文将通过一个实际案例,介绍如何在Mycat中实现读写分离,并探讨主从切换的策略及其实现方法。1...

Mycat读写分离与主从切换案例

前言

随着互联网业务的快速发展,数据库的压力也越来越大。为了提高数据库的性能和可用性,读写分离和主从切换成为了常见的解决方案。Mycat(原名MySQL-CAT)是一个开源的分布式数据库系统,它支持读写分离、分表分库等特性,能够有效地解决高并发场景下的数据库瓶颈问题。

本文将通过一个实际案例,介绍如何在Mycat中实现读写分离,并探讨主从切换的策略及其实现方法。

1. 环境准备

1.1 软件环境

  • 操作系统:CentOS 7.x
  • 数据库:MySQL 5.7
  • Mycat版本:1.6

1.2 硬件环境

  • 主服务器:192.168.1.101
  • 从服务器1:192.168.1.102
  • 从服务器2:192.168.1.103
  • Mycat服务器:192.168.1.104

2. 配置MySQL主从复制

2.1 主服务器配置

编辑主服务器的MySQL配置文件​​/etc/my.cnf​​,添加以下内容:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=mixed

重启MySQL服务:

systemctl restart mysqld

创建用于同步的用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

查看主服务器的状态:

SHOW MASTER STATUS;

2.2 从服务器配置

编辑从服务器的MySQL配置文件​​/etc/my.cnf​​,添加以下内容:

[mysqld]
server-id=2
relay-log=mysql-relay-bin

重启MySQL服务:

systemctl restart mysqld

在从服务器上执行以下命令,设置主从关系:

CHANGE MASTER TO 
MASTER_HOST='192.168.1.101',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;

检查从服务器的状态:

SHOW SLAVE STATUS\G

确保​​Slave_IO_Running​​和​​Slave_SQL_Running​​都为​​Yes​​。

3. 配置Mycat

3.1 下载并安装Mycat

下载Mycat:

wget https://github.com/MyCATApache/Mycat2/releases/download/1.6/mycat-1.6.tar.gz
tar -zxvf mycat-1.6.tar.gz -C /usr/local/
cd /usr/local/mycat-1.6

启动Mycat:

./bin/mycat start

3.2 配置Mycat

编辑Mycat的配置文件​​/usr/local/mycat-1.6/conf/schema.xml​​,添加以下内容:

<schema name="testDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="user" dataNode="dn1,dn2" rule="mod-long" />
</schema>

<dataNode name="dn1" dataHost="localhost1" database="testDB" />
<dataNode name="dn2" dataHost="localhost2" database="testDB" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.1.101:3306" user="root" password="password">
        <readHost host="hostS1" url="192.168.1.102:3306" user="root" password="password" />
    </writeHost>
</dataHost>

<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM2" url="192.168.1.101:3306" user="root" password="password">
        <readHost host="hostS2" url="192.168.1.103:3306" user="root" password="password" />
    </writeHost>
</dataHost>

3.3 测试读写分离

连接到Mycat:

mysql -h192.168.1.104 -P8066 -uroot -p

执行一些读写操作,观察数据是否正确地被路由到不同的节点。

4. 主从切换策略

4.1 自动切换

Mycat支持自动切换功能,当主节点发生故障时,可以自动切换到从节点。在​​schema.xml​​中配置​​switchType​​参数,值为​​1​​表示自动切换。

4.2 手动切换

如果需要手动进行主从切换,可以通过以下步骤完成:

  1. 在新的主节点上执行:
STOP SLAVE;
RESET MASTER;
  1. 在旧的主节点和其他从节点上执行:
CHANGE MASTER TO 
MASTER_HOST='新主节点IP',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='新主节点日志文件',
MASTER_LOG_POS=新主节点日志位置;
START SLAVE;
  1. 更新Mycat的配置文件schema.xml,修改writeHostreadHost的URL。
  2. 重启Mycat服务:
./bin/mycat restart


以上是一篇关于Mycat读写分离与主从切换的技术博客文章,使用Markdown格式编写。希望对你有帮助!当然可以!Mycat 是一个开源的数据库中间件,主要用于实现数据库的读写分离、分库分表等高级功能。下面我将通过一个简单的示例来说明如何在 Mycat 中配置读写分离和主从切换。

环境准备

  1. Mycat 安装:确保你已经安装并启动了 Mycat。
  2. MySQL 主从复制:确保你已经配置好 MySQL 的主从复制环境,主库和从库都已经启动并且同步正常。

配置文件

Mycat 的配置文件主要包含 ​​schema.xml​​ 和 ​​server.xml​​ 两个文件。

1. ​​schema.xml​

​schema.xml​​ 文件用于定义数据库的逻辑结构和数据节点的映射关系。

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

    <schema name="testDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="user" dataNode="dn1,dn2" rule="auto-sharding-long" />
    </schema>

    <dataNode name="dn1" dataHost="host1" database="testDB" />
    <dataNode name="dn2" dataHost="host2" database="testDB" />

    <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.1.1:3306" user="root" password="password">
            <readHost host="hostS1" url="192.168.1.2:3306" user="root" password="password" />
        </writeHost>
    </dataHost>

    <dataHost name="host2" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="192.168.1.3:3306" user="root" password="password">
            <readHost host="hostS2" url="192.168.1.4:3306" user="root" password="password" />
        </writeHost>
    </dataHost>

</mycat:schema>
2. ​​server.xml​

​server.xml​​ 文件用于配置 Mycat 的系统参数和用户信息。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">

    <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="sqlExecuteTimeout">300</property>
    </system>

    <user name="mycat">
        <property name="password">mycat</property>
        <property name="schemas">testDB</property>
    </user>

</mycat:server>

配置解释

  • schema.xml:
  • ​<schema>​​ 标签定义了一个逻辑数据库 ​​testDB​​。
  • ​<table>​​ 标签定义了表 ​​user​​,并指定了数据节点 ​​dn1​​ 和 ​​dn2​​。
  • ​<dataNode>​​ 标签定义了数据节点 ​​dn1​​ 和 ​​dn2​​,分别对应 ​​host1​​ 和 ​​host2​​。
  • ​<dataHost>​​ 标签定义了数据主机 ​​host1​​ 和 ​​host2​​,其中 ​​writeHost​​ 表示主库,​​readHost​​ 表示从库。
  • ​balance="1"​​ 表示负载均衡策略,​​writeType="0"​​ 表示所有写操作都发送到主库,​​switchType="1"​​ 表示自动切换策略,​​slaveThreshold="100"​​ 表示从库延迟阈值。
  • server.xml:
  • ​<system>​​ 标签定义了一些系统参数。
  • ​<user>​​ 标签定义了一个用户 ​​mycat​​,并指定了密码和可访问的逻辑数据库。

测试读写分离

  1. 启动 Mycat
bin/mycat start
  1. 连接 Mycat
mysql -h127.0.0.1 -P8066 -umycat -pmycat
  1. 测试写操作
USE testDB;
INSERT INTO user (id, name) VALUES (1, 'Alice');
  1. 测试读操作
SELECT * FROM user;

主从切换

假设 ​​hostM1​​ 发生故障,需要手动或自动切换到 ​​hostM2​​ 作为新的主库。

  1. 手动切换
  • 停止 ​​hostM1​​ 的 MySQL 服务。
  • 在 Mycat 控制台执行切换命令:
./bin/mycat stop
./bin/mycat start
  1. 自动切换
  • Mycat 会根据配置的 ​​switchType​​ 和 ​​slaveThreshold​​ 自动检测从库的延迟情况,并在主库不可用时自动切换到从库。

Mycat 是一个开源的数据库中间件,它支持多种数据库(如 MySQL、PostgreSQL 等),并且能够实现读写分离、负载均衡、分库分表等高级功能。在读写分离与主从切换的场景中,Mycat 通过配置文件来管理数据源和路由规则,确保应用程序可以高效地利用数据库资源。

下面是一个简单的 Mycat 配置案例,展示如何实现读写分离与主从切换:

1. 安装 Mycat

首先,你需要安装 Mycat。可以从 Mycat 的官方网站下载最新版本,并按照官方文档进行安装。

2. 配置 Mycat

Mycat 的配置主要涉及以下几个文件:

  • ​schema.xml​​:定义数据库逻辑架构。
  • ​rule.xml​​:定义分片规则。
  • ​server.xml​​:定义全局属性和用户权限。
  • ​sequence_conf.properties​​:定义序列生成器。
2.1 配置 ​​schema.xml​
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 定义逻辑数据库 -->
    <schema name="testDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="user" dataNode="dn1,dn2" rule="mod-long" />
    </schema>

    <!-- 定义数据节点 -->
    <dataNode name="dn1" dataHost="host1" database="testDB" />
    <dataNode name="dn2" dataHost="host2" database="testDB" />

    <!-- 定义数据主机 -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host1_1" url="192.168.1.1:3306" user="root" password="password">
            <readHost host="host1_2" url="192.168.1.2:3306" user="root" password="password" />
        </writeHost>
    </dataHost>

    <dataHost name="host2" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host2_1" url="192.168.1.3:3306" user="root" password="password">
            <readHost host="host2_2" url="192.168.1.4:3306" user="root" password="password" />
        </writeHost>
    </dataHost>

</mycat:schema>
2.2 配置 ​​server.xml​
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="sqlExecuteTimeout">300</property>
    </system>

    <user name="mycat">
        <property name="password">mycat</property>
        <schema name="testDB" />
    </user>
</mycat:server>

3. 解释配置文件

  • schema.xml​:
  • ​<schema>​​ 标签定义了一个逻辑数据库 ​​testDB​​。
  • ​<table>​​ 标签定义了表 ​​user​​,并指定了数据节点 ​​dn1​​ 和 ​​dn2​​,以及分片规则 ​​mod-long​​。
  • ​<dataNode>​​ 标签定义了数据节点,每个数据节点对应一个数据主机。
  • ​<dataHost>​​ 标签定义了数据主机,其中 ​​balance​​ 属性控制负载均衡策略,​​writeType​​ 控制写操作的路由策略,​​switchType​​ 控制主从切换策略。
  • ​<writeHost>​​ 和 ​​<readHost>​​ 标签分别定义了写操作和读操作的数据源。
  • server.xml​:
  • ​<system>​​ 标签定义了系统级别的属性。
  • ​<user>​​ 标签定义了用户及其权限。

4. 主从切换

Mycat 支持自动主从切换,当主库不可用时,Mycat 会自动将写操作切换到从库。配置文件中的 ​​switchType​​ 和 ​​slaveThreshold​​ 属性控制了主从切换的行为。

  • ​switchType=1​​ 表示自动切换。
  • ​slaveThreshold​​ 表示从库的延迟阈值,超过该阈值则不考虑作为备选主库。

5. 启动 Mycat

启动 Mycat 服务:

bin/mycat start

6. 测试

连接到 Mycat 并执行 SQL 语句,验证读写分离和主从切换是否正常工作:

mysql -h127.0.0.1 -P8066 -umycat -pmycat

7. 监控和日志

Mycat 提供了详细的日志和监控功能,可以通过查看日志文件来诊断问题。日志文件通常位于 ​​logs​​ 目录下。

总结

通过上述配置,Mycat 可以实现高效的读写分离和主从切换,提高数据库的可用性和性能。希望这个案例对你有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。