红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 专栏
  3. MySQL学习笔记
  4. 正文

MySQL 从入门到精通 18:读写分离

2025年8月11日 5点热度 0人点赞 0条评论

最简单的读写分离实现是提供两台已经设置了主从复制的 MySQL 服务器,然后由应用程序自身根据 SQL 类型决定在哪台服务器执行读在哪台服务器上执行写:

image-20250811120313667

这种方式的优点是结构简单且性能较好,通常由应用程序的持久层框架实现(比如 MyBatis)对 MySQL 数据库的读写控制。

如果因为某些原因不能使用这种方式(比如绕过持久层框架直接执行 SQL),还有另一种方式可选:

image-20250811120541932

即由 MyCat 实现的读写分离,应用程序将 MyCat 当做一个可读可写的 MySQL 服务器,由 MyCat 判断执行的 SQL 是只读还是写入,再将具体 SQL 路由到主库或从库进行执行。

下面演示如何实现这种方式的读写分离。

先准备两台已经设置好主从复制的 MySQL 数据库服务器。

我这里准备好的两台:

  • 主库:192.168.0.88

  • 从库:192.168.0.133

MyCat 配置:

<schema name="WRTEST" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"/>
<dataNode name="dn1" dataHost="localhost1" database="wrtest" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="jdbc" switchType="3" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="master"
               url="jdbc:mysql://192.168.0.88:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8"
               user="icexmoon"
               password="Mysql@123">
        <readHost host="slave"
                  url="jdbc:mysql://192.168.0.133:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8"
                  user="icexmoon"
                  password="Mysql@123"/>
    </writeHost>
</dataHost>

主要注意的是 dataHost 的 balance 属性,它表示负载均衡策略,可选值有:

  • 0,不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上

  • 1,全部的 readHost 与备用的 writeHost 都参与 select 语句的负载均衡(主要针对双主双从模式)

  • 2,所有的额读写操作都随机在 writeHost,readHost 上分发

  • 3,所有的读请求随机分发到 writeHost 对应的 readHost 上执行,writeHost 不负担读压力

对于一主一从的情况,使用 1 或 3 都可以实现读写分离。

不要忘记修改用户权限,否则操作不了这个逻辑库:

<user name="user">
    <property name="password">123456</property>
    <property name="schemas">WRTEST</property>
    <property name="readOnly">true</property>
    <property name="defaultSchema">WRTEST</property>
</user>

通过 MyCat 添加表结构和数据:

create table tb_user(
    id int(11) not null,
    name varchar(50) not null,
    sex varchar(1),
    primary key (id)
)engine=innodb default charset=utf8;
​
insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');

为了证明 MyCat 通过从库读取数据,可以将从库数据修改(不会同步到主库)后观察 MyCat 查询到的数据。

为了证明 MyCat 通过主库写入数据,可以通过 MyCat 执行任意的数据修改操作,此时主库和从库的数据都会改变,这说明 MyCat 的 DML 语句在主库上执行。

在使用一主一从方式实现读写分离的情况下,如果主库宕机,将无法继续数据写入,业务就会停摆。如果要实现更高的可用性,可以考虑双主双从实现的读写分离。这里我就不不做演示了,如何实现可以观看这个视频。

参考资料

  • 黑马程序员 MySQL数据库入门到精通

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: MySQL 读写分离
最后更新:2025年8月11日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号