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

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

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

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

一、搭建一个“一主两从”的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 中随机选择。

-- 创建用户, 在主节点上执行
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.net/126809.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 树莓派python编程指南_树莓派python软件

    树莓派python编程指南_树莓派python软件一:格式化SD卡SD卡插入读卡器连接电脑,使用SDFormatter对SD卡进行格式化(重装烧录也要进行着SD卡格式化操作)二:下载官方镜像http://downloads.raspberrypi.org/raspbian_latest三:烧录SD卡使用Win32DiskImager将镜像烧录到格式化后的SD卡SD卡盘根目录(/boot)下新建一个命名为ssh的…

    2022年10月15日
    3
  • python中int的取值范围_int32的取值范围是多少?

    python中int的取值范围_int32的取值范围是多少?int32的数值取值范围为“-2147483648”到“2147483647”;而int64的数值取值范围为“-9223372036854775808”到“9223372036854775808”。int32的取值范围计算机中32位int类型变量的范围,其中int类型是带符号整数。正数在计算机中表示为原码,最高位为符号位:1的原码为000000000000000000000000000…

    2025年11月26日
    2
  • AlertDialog的几种用法

    AlertDialog的几种用法xml代码:java代码:

    2022年7月2日
    26
  • List集合转换成Json字符串

    List集合转换成Json字符串前言进行转换我们使用alibaba的jsonjar:com.alibaba.fastjson.jar1.导入依赖或者直接导入jar<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId&…

    2022年10月18日
    4
  • python实现卷积操作

    python实现卷积操作文章目录调用tf.nn.conv2d()实现卷积自己实现卷积函数我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现卷积操作,然后和tf.nn.conv2d()函数的结果对比,验证正确性。调用tf.nn.conv2d()实现卷积首先是调用卷积函数实现卷积操作:这里说明一下conv2d的定义及参数含义:参考【定义:】tf.n…

    2022年5月28日
    39
  • Win10+Ubuntu18.04双系统安装教程「建议收藏」

    Win10+Ubuntu18.04双系统安装教程「建议收藏」一.说在前头不同的配置安装方法不同,我也是小白第一次安,也是看了无数个教程不断重安了无数次才成功的,所以我的教程不一定适合你的配置,但你可以耐心的按照我的思路尝试,如果你有更好的想法,欢迎指出。我的配置如下:神舟笔记本,双硬盘(128固态+1t机械),bios模式为uefi(按Win+R打开运行,输入msinfo32,回车查看系统信息。在BIOS模式中如果显示“传统”,表示系统启动方式为…

    2022年7月24日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号