MySQL读写分离的三种实现方案

2022-07-23 17:19:25 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

MySQL读写分离的三种实现方案

文章目录

  • MySQL读写分离的三种实现方案
    • 一、搭建一个“一主两从”的MySQL集群
    • 二、读写分离实现:方案一
      • 2.1 配置多个数据源
      • 2.2 使用AbstractRoutingDataSource
      • 2.3 这个版本的缺点:
    • 三、读写分离实现:方案二
      • 3.1 通过ShardingSphere-jdbc 实现读写分离
      • 3.2 这个版本的缺点:
    • 四、读写分离实现:方案三
      • 4.1 通过ShardingSphere-Proxy 实现读写分离

一、搭建一个“一主两从”的MySQL集群

先搭建一个mysql集群(一主两从),半同步复制:mysql 半同步复制,三个节点。

二、读写分离实现:方案一

2.1 配置多个数据源

(1)、基于 Spring/Spring Boot,配置多个数据源(例如2个,master 和 slave)

(2)、根据具体的 Service 方法是否会操作数据,注入不同的数据源,1.0版本

通过配置多个数据源,在service层实现读写分离。

2.2 使用AbstractRoutingDataSource

(3)、改进一下1.1:基于操作 AbstractRoutingDataSource 和自定义注解 readOnly 之 类的,简化自动切换数据源

(4)、改进二下1.2:支持配置多个从库;

使用AbstractRoutingDataSource和自定义注解。

(5)、改进三下1.3:支持多个从库的负载均衡

思路:在myreadwritesep-abstract-rounting-v1基础之上,多一个read类型的数据源,然后判断注解的name为read时候,在read01和read02 中随机选择。

代码语言:javascript复制
-- 创建用户, 在主节点上执行
create schema performance;
CREATE USER 'performance'@'%' IDENTIFIED BY 'performance^pw';
GRANT ALL ON performance.* TO 'performance'@'%';
flush privileges;

-- 在主节点上执行
create table performance.t_model_info(
  m_id    int(11)  not null primary key auto_increment comment '主键,自增',
  model_type varchar(128) not null unique comment '模块类型',
  model_name varchar(128) not null unique comment '模块名称',
  model_status tinyint(1)  not null default 0 comment '0 启用, 1 不启用'
)Engine=InnoDB AUTO_INCREMENT=1 default CHARSET=utf8mb4;

2.3 这个版本的缺点:

  • 侵入性强;
  • “写完读”不一致问题,server方法,先向主库insert语句,然后立刻select,却查不出数据;

三、读写分离实现:方案二

3.1 通过ShardingSphere-jdbc 实现读写分离

改进v1.0,ShardingSphere-jdbc 的 Master-Slave 功能

1)SQL 解析和事务管理,自动实现读写分离

  • 第一,将事务都管理起来;
  • 第二,做SQL解析,自动实现读写分离;

2)解决”写完读”不一致的问题

  • 如果在一个事务中,先写后读,该框架有个优化;在一个事务里,前几个都是毒,正常读就行,只要碰到一个写,后面不管有多少条读,都走主库。这样就完美解决了“写完读”不一致的问题。

通过Shardingsphere-jdbc框架实现读写分离。

3.2 这个版本的缺点:

  • 对业务还是有侵入性(这一套东西,需要配置到业务代码中);
  • 对已存在的旧系统改造不友好;

四、读写分离实现:方案三

4.1 通过ShardingSphere-Proxy 实现读写分离

改进v2.0, MyCat/ShardingSphere-Proxy 的 Master-Slave 功能

1)需要部署一个中间件,规则配置在中间件

2)模拟一个 MySQL 服务器,对业务系统无侵入

shardingsphere-proxy实现读写分离。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126809.html原文链接:https://javaforall.cn

0 人点赞