【Java项目 读写分离技术】

news2024/9/24 19:17:37

文章目录

  • Java项目 读写分离技术
  • 1 Mysql 主从复制
    • 1.1 介绍
    • 1.2 配置
  • 2 读写分离实现
    • 2.1 背景
    • 2.2 Sharding-JDBC 介绍
    • 2.3 配置步骤

Java项目 读写分离技术

面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库主库负责处理事务性的增删改操作从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

1 Mysql 主从复制

1.1 介绍

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库,可有多个)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

1

MySQL复制过程分成三步:

  1. master将改变记录到二进制日志(binary log)
  2. slave将master的binary log拷贝到它的中继日志(relay log)
  3. slave重做中继日志中的事件,将改变应用到自己的数据库中

1.2 配置

前置条件:

提前准备好两台服务器,分别安装Mysql并启动服务成功

  • 主库Master 192.168.138.100
  • 从库Slave 192.168.138.101

主库配置步骤:

  1. 修改Mysql数据库的配置文件 /etc/my.cnf

    [mysqld]
    log-bin=mysql-bin
    #[必须]启用二进制日志
    
    server-id=100
    #[必须]服务器唯一ID
    

    2

  2. 重启Mysql服务

    systemctl restart mysqld

  3. 登录Mysql数据库,执行下面SQL

    GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
    

    注:上面SQL的作用是创建一个用户xiaoming,密码为Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。

  4. 登录Mysql数据库,执行下面SQL,记录下结果中File和Position的值

    show master status;
    

    3

    注:上面SQL的作用是查看Master的状态,执行完此SQL后不要再执行任何操作

从库配置步骤:

  1. 修改Mysql数据库的配置文件 /etc/my.cnf

    [mysqld]
    server-id=101
    #[必须]服务器唯一ID
    
  2. 重启Mysql服务

    systemctl restart mysqld

  3. 登录Mysql数据库,执行下面SQL,根据主库中的内容修改

    change master to 
    master_host='192.168.138.100', master_user='xiaoming', master_password='Root@123456', master_log_file='mysql-bin.000001', master_log_pos=439; 
    
    start slave;
    

    注:若因为slave线程已启动需先停止slave线程(stop slave;)才能执行成功上述sql语句。

  4. 登录Mysq1数据库,执行下面SQL,查看从数据库的状态

    show slave status;
    

    4

测试:

​ 操作主库,查看从库是否有响应的内容变化。

2 读写分离实现

2.1 背景

面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

5

2.2 Sharding-JDBC 介绍

Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。

它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离,增删改操作自动修改主库,查询操作自动在从库中获取

  • 适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP,C3PO,BoneCP,Druid,HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

maven坐标:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
<dependency>

2.3 配置步骤

使用Sharding-JDBC实现读写分离步骤(不需要修改Java代码,只需完成三步配置):

  1. 导入Sharding-JDBCd的maven坐标

  2. 在配置文件中配置读写分离规则(application.yml配置文件)

  3. 在配置文件中配置允许bean定义覆盖配置项

    spring:
    	shardingsphere:
    		datasource:
    			names:
    				master,slave
    			#主数据源
    			master:
    				type: com.alibaba.druid.pool.DruidDataSource 
    				driver-class-name: com.mysql.cj.jdbc.Driver 
    				url: jdbc:mysql://192.168.138.100:3306/rw?characterEncoding=utf-8
    				username: root
    				password: root
                #从数据源
                slave:
                	type: com.alibaba.druid.pool.DruidDataSource 
                	driver-class-name: com.mysql.cj.jdbc.Driver 
                	url: jdbc:mysql://192.168.138.101:3306/rw?characterEncoding-utf-8
                	username: root
                	password: root
                masterslave:
                    #读写分离配置
                    load-balance-algorithm-type: round_robin
                    #最终的数据源名称
                    name: dataSource
                    #主库数据源名称
                    master-data-source-name: master
                    #从库数据源名称列表,多个逗号分隔
                    slave-data-source-names: slave 
                props:
                	sql:
                		show: true #开启sQL显示,默认false
        main:
        	allow-bean-definition-overriding: true #允许bean定义覆盖
    

资料来源:黑马程序员-瑞吉外卖项目-读写分离技术实现课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-date-picker设置今天之前的日期不可选

<el-date-pickerv-model"editForm.offlineTime"type"date"placeholder"选择日期"style"width: 150px":picker-options"{disabledDate: (time) >time.getTime() <new Date(new Date().setHours(0, 0, 0, 0))}">&…

GCDW云原生数据仓库获评“2023优秀科技成果奖”

5月26日&#xff0c;“2023中国国际大数据产业博览会”在贵阳盛大开幕&#xff0c;同日举行了“领先科技成果发布会”&#xff0c;来自国内外高校、科研机构、科技企业的357项优秀成果参与申报&#xff0c;代表了近年来国内外大数据领域最前沿的科技成果。“南大通用GCDW云原生…

原生JS实现图片裁剪功能(fixed布局)

功能介绍&#xff1a;图片通过原生input上传&#xff0c;使用canvas进行图片裁剪。 裁剪框限制不允许超出图片范围&#xff0c;图片限制了最大宽高&#xff08;自行修改要的尺寸&#xff09;&#xff0c;点击确认获取新的base64图片数据&#xff0c;大部分需求都是弹窗进行处理…

office word 2007

office word 2007 指数怎么写的

反AI来了…尼康的Natural Intelligence

a mutant_umbrella tree shaped like a nuclear bomb explosion,a photo-realism photograph, 4k, ultra realistic VS a mutant_umbrella tree shaped like a nuclear bomb explosion 尼康发起了一次名为&#xff1a;Natural Intelligence &#xff0c;“不要放弃现实世界”的…

机器学习之K-means聚类算法

目录 K-means聚类算法 算法流程 优点 缺点 随机点聚类 人脸聚类 旋转物体聚类 K-means聚类算法 K-means聚类算法是一种无监督的学习方法&#xff0c;通过对样本数据进行分组来发现数据内在的结构。K-means的基本思想是将n个实例分成k个簇&#xff0c;使得同一簇内数据相…

Java性能权威指南-总结18

Java性能权威指南-总结18 线程与同步的性能线程同步避免同步伪共享 线程与同步的性能 线程同步 避免同步 如果同步可以完全避免&#xff0c;那加锁的损失就不会影响应用的性能。 有两种一般性的方式可以应对。其一是在每个线程中使用不同的对象&#xff0c;这样访问对象时就…

Selenium教程__界面的刷新、后退、前进操作(4)

本文将介绍如何使用Selenium来实现界面的刷新、后退和前进操作&#xff0c;以便于测试、开发人员能够更好地控制和管理用户界面的交互行为。 通过学习本文内容&#xff0c;您将能够掌握Selenium中相关API的使用方法&#xff0c;并能够灵活地应用到您的项目中&#xff0c;从而提…

机器学习-搭建轻量级机器人模型

在自己的机器上部署一个机器人简直太酷啦&#xff0c;因为模型数据缘故&#xff0c;可能有时候回复会有一点点怪&#xff0c;不过不影响我们探索机器模型的学习&#xff0c;搭建安装完毕&#xff0c;大家就可自行学习源码啦。 这是启动后台的图片。 需要安装环境&#xff1a;p…

vue监听鼠标与键盘事件

mounted () {window.addEventListener(mousedown, this.handleMousedown)//监听鼠标按下window.addEventListener(mouseup, this.handleMouseup)//监听鼠标抬起window.addEventListener(keydown, this.handlekeydown)//监听键盘按下},methods: {// 鼠标按下事件handleMousedown…

GDAL 标记图像连接区域

文章目录 一、简介1.1原始算法1.2修改标记算法二、实现代码三、实现效果参考资料一、简介 1.1原始算法 标记图像连接区域的算法有很多,这里主要实现了一种基于扫描线的改进算法(Suzuki算法),原始算法使用了一种决策树策略,即对二进制图像b(x,y)进行重复传递,在前向和后向…

chatgpt赋能python:Python要点:从入门到精通

Python要点&#xff1a;从入门到精通 Python是一门高级编程语言&#xff0c;是一种解释型、面向对象、动态数据类型的语言。它的设计思想是“代码易读易写”&#xff0c;在数据科学、人工智能、自动化测试、Web开发等领域广泛应用。本文将从入门到精通的角度来介绍Python的要点…

模拟电路系列分享-电阻的选则

目录 概要 整体架构流程 技术名词解释 技术细节 1.阻值的选择 2.不能太小的原因 3.不能太大的原因 4.E系列选择 小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 电阻(Resistor]是我们的老朋友了&#xff0c;从初中就认识。但到目前为止&#xff0c;我们却…

chatgpt赋能python:Python获取电脑IP:教你简单又快速的实现方式

Python获取电脑IP&#xff1a;教你简单又快速的实现方式 如果你是一名网络工程师或者Web开发者&#xff0c;那么获得电脑IP地址对你来说是一个常见的任务。而Python作为一种流行的脚本语言&#xff0c;也提供了多种方法来获取电脑的IP地址。下面我们将介绍三种Python获取电脑I…

深度生成模型系统的实现原理有哪些?未来的挑战是什么?

由于计算机性能的快速提升, 学习可观测样本的概率密度并随机生成新样本的生成模型成为热点。相比于需要学习条件概率分布的判别模型生成模型的训练难度大、模型结构复杂, 但除了能够生成新样本外, 生成模型在图像重构、缺失数据填充、密度估计、风格迁移和半监督学习等应用领域…

【因果图法和决策表】某软件的一个模块的需求规格说明书中描述:(1)年薪制员工:严重过失,扣年终风险金的4%;过失,扣年终风险金的2%。(2)非年薪制员工:严重过失,扣当月薪资的8%;过失,扣当月薪

题目&#xff1a; 某软件的一个模块的需求规格说明书中描述&#xff1a; &#xff08;1&#xff09;年薪制员工&#xff1a;严重过失&#xff0c;扣年终风险金的4%&#xff1b;过失&#xff0c;扣年终风险金的2%。 &#xff08;2&#xff09;非年薪制员工&#xff1a;严重过…

14.RocketMQ之高可用性机制

1.2 高可用性机制 RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。 Master和Slave的区别&#xff1a;在Broker的配置文件中&#xff0c;参数 brokerId的值为0表明这个Broker是Master&#xff0c;大于0表明这个Broker是 Slave&#xff0c;同时brokerRole参数也会说…

保证水库大坝安全需要做好哪方面的监测

水库安全监测是保证水库大坝安全的重要手段是确保水库大坝安全运行的基础也是做好水库安全管理的重要技术保障。根据《水库大坝安全管理条例》《水库大坝安全监测技术规范》等有关规定&#xff0c;对坝体变形、渗透、应力应变等进行监测&#xff0c;以掌握坝体、坝基和库岸的运…

css增加高斯模糊的效果

实现效果 关键代码 backdrop-filter 当你创造一个元素加上这个属性后&#xff0c;会使得这个元素后面的区域添加效果&#xff08;如模糊或颜色偏移&#xff09; background: rgba(0,0,0,.5);backdrop-filter: blur(10px);

MFC开发第二天 Windows计算器的开发,常用消息解析与处理

文章目录 相关概念陈述一、初始API汇总消息汇总 二、Windows计算器的开发三、常见的消息解析与处理附录 相关概念陈述 INT PTR是一个指向整数类型数据的指针。PTR是指针的缩写&#xff0c;INT是表示整数类型。因此&#xff0c;INT PTR表示指向整数类型的指针。 1、对话框弹出…