瑞吉外卖项目——读写分离

读写分离

读和写所有压力都由一台数据库承担,压力大数据库服务器磁盘损坏则数据丢失,单点故障

Mysql主从复制

介绍

MySQL主从复制是一个异步的复制过程,底层是基于Nysql数据库自带的二进制日志功能。

就是一台或多台MysQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。

MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

MySQL复制过程分成三步:

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

1

配置-前置条件

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

配置-主库Master

第一步:修改Mysql数据库的配置文件/etc/my. cnf(可使用find / -name my.cnf查找)

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

第二步:重启Mysql服务

systemctl restart mysqld

第三步:登录Mysql数据库,执行下面SQL

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

注:上面SQL的作用是创建一个用户xiaoming,密码为Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限。

常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。

第四步:登录Mysql数据库,执行下面SQL,记录下结果中File和Position的值

show master status;

记下二进制log文件名和Position

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

配置-从库Slave

第一步:修改Mysql数据库的配置文件/etc/my.cnf(ubuntu20为/etc/mysql/mysql.conf.d/mysqld.cnf)

[mysqld]
server-id=101 #[必须]服务器唯一ID

第二步:重启Mysql服务

systemctl restart mysqld

ubuntu22使用

service mysql restart

第三步:登录Mysql数据库,执行下面SQL

change master to
master_host='这里输入master的ip地址', master_user='这里输入master中有REPLICATION SLAVE权限的用户名' ,master_password='这里输入用户密码', master_log_file= '这里输入master里的二进制log文件名', master_log_pos=这里输入master里的Position;
start slave;

第四步:登录Mysql数据库,执行下面SQL,查看从数据库的状态

show slave status;
  • 此处使用
change master to
master_host='192.168.5.131', master_user='小明' ,master_password='Root@123456', master_log_file= 'mysql-bin.000002', master_log_pos=154;
  • 停止SLAVE服务
STOP SLAVE IO_THREAD;

读写分离案例

背景

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

Sharding-JDBC介绍

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

使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。

  • 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate,Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP,C3P0,BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.O-RC1</version>
</dependency>

使用Sharding-JDBC实现读写分离步骤:

  1. 导入maven坐标

    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.0-RC1</version>
    </dependency>
    
  2. 在配置文件中配置读写分离规则

    spring:
      shardingsphere:
        datasource:
          names:
            master,slave
          # 主数据源
          master:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://主库ip/使用的数据库名称?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://从库ip/使用的数据库名称?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
    
  3. 在配置文件中配置允许bean定义覆盖配置项

    spring:
      main:
        allow-bean-definition-overriding: true
    

项目实现读写分离

数据库环境准备(主从复制)

在主库中创建瑞吉外卖项目的业务数据库reggie并导入相关表结构和数据。

代码改造

在项目中加入Sharding-JDBC实现读写分离步骤:

  1. 导入maven坐标

    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.O-RC1</version>
    </dependency>
    
  2. 在配置文件中配置读写分离规则

    spring:
      shardingsphere:
        datasource:
          names:
            master,slave
          # 主数据源
          master:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://主库ip/使用的数据库名称?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://从库ip/使用的数据库名称?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
    
  3. 在配置文件中配置允许bean定义覆盖配置项

    spring:
      main:
        allow-bean-definition-overriding: true
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

偶数科技发布实时湖仓数据平台 Skylab 5.0

2023 年 4 月 11 日&#xff0c; 偶数发布了最新的实时湖仓数据平台 Skylab 5.0&#xff0c;平台各个组件进行了全面升级。新版 Skylab 的发布标志着偶数科技具有从数据存储、计算、管理到分析、应用和 AI 能力的完整的数据管理生态闭环&#xff0c;帮助用户实现批流一体、实时…

LeetCode LCP 04. 覆盖【二分图最大匹配,匈牙利算法】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

[Java]Session机制

什么是Session Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存在客户端浏览器中&#xff0c;而Session保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需…

springboot整合redis

一、总体概述 1、redis配置文件 redis.conf配置文件&#xff0c;改完后确保生效&#xff0c;记得重启&#xff0c;记得重启 默认daemonize no 改为 daemonize yes 默认protected-mode yes 改为 protected-mode no 默认bind 127.0.0.1 改为 直接注释掉(默认bind 127.0.0.1只能…

ApplicationContextAware接口

一、ApplicationContextAware接口的基本介绍 public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext applicationContext) throws BeansException;}在Spring/SpringMVC中&#xff0c;我们拿到IOC容器无非有三种方式&#x…

HCIE-Cloud Computing LAB常见问题收集谱

第一题&#xff1a;FusionCompute 扩容CNA与对接共享存储 FusionCompute&#xff1a;关联存储资源失败 物理阵列里面太多没清理的了。然后去排查问题&#xff0c;存储地址也正确&#xff0c;管理接口也互联&#xff0c;IQN号也修改了&#xff0c;结果是启动器快满了 排查网…

Javaweb基础配置模板(mybatis+javaweb)

1.大纲规划图 本配置涉及的技术:mybatis,javaweb,json转换&#xff0c;分页查询等 2.导入相关的配置文件pom.xml 2.1 依赖文件 <dependencies> <!-- 测试依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifact…

如何把视频里的声音提取出来,4种有效方法学起来

在我们日常生活中&#xff0c;可能会有需要从视频文件中提取音频的情况&#xff0c;比如想要将视频中的歌曲或语音内容提取出来&#xff0c;或者电脑上看视频时&#xff0c;总有一些很有意思的BGM&#xff0c;想录下来或者提取出来单独使用&#xff0c;不过有些小伙伴可能不知道…

[abc复盘] abc297 20230409

[atc复盘] abc297 20230409 一、本周周赛总结A - Double Click1. 题目描述2. 思路分析3. 代码实现 B - chess9601. 题目描述2. 思路分析3. 代码实现 C - PC on the Table1. 题目描述2. 思路分析3. 代码实现 D - Count Subtractions1. 题目描述2. 思路分析3. 代码实现 E - Kth …

AOP通知中获取数据

AOP通知中获取数据 之前我们写AOP仅仅是在原始方法前后追加一些操作&#xff0c;接下来我们要说说AOP中数据相关的内容&#xff0c;我们将从获取参数、获取返回值和获取异常三个方面来研究切入点的相关信息。 获取切入点方法的参数&#xff1a;所有的通知类型都可以获取参数 …

【JSP学习笔记】3.JSP 指令及动作元素

前言 本章介绍JSP的指令和动作元素。 JSP 指令 JSP指令用来设置整个JSP页面相关的属性&#xff0c;如网页的编码方式和脚本语言。 语法格式如下&#xff1a; <% directive attribute"value" %>指令可以有很多个属性&#xff0c;它们以键值对的形式存在&am…

数云融合|新手入门,5分钟秒懂开源

目录 一、开源软件开源领域的两大组织&#xff1a;FSF和OSI 二、开源许可证开源意味着免费吗&#xff1f; 三、开源技术应用领域四、总结 一、开源软件 开源即开放源代码&#xff0c;他的核心是源代码公开&#xff0c;任何人都可以查看、使用、修改和分发。与之相对的是闭源&a…

技术+商业“双轮”驱动,量旋科技加速推进全方位的量子计算解决方案

【中国&#xff0c;深圳】4月14日&#xff0c;在第三个“世界量子日”&#xff0c;以“‘双轮’驱动 加速未来”为主题的量旋科技2023战略发布会在线上举办。 本次发布会&#xff0c;量旋科技全线升级了三大业务线产品&#xff1a;其中重点布局的超导量子计算体系产品&#xf…

DolphinScheduler×T3出行 | 打造车联网一站式数据应用交互体验

点击蓝字 关注我们 用户案例 | T3 出行 业务挑战 作为一家车联网驱动的公司&#xff0c;T3出行汇聚了“人、车、路、云”各端的海量数据。为了承载如此多元化的数据以更好地释放数据价值&#xff0c;T3出行构建了以Apache Hudi为基础的企业级的数据湖&#xff0c;并在此之上搭建…

1 分钟给 Siri 升个级!从智Z变身 ChatSiri!

原文链接&#xff1a;https://forum.laf.run/d/79/17 众所周知&#xff0c;Siri 是一个智 Z&#xff01;那么如果能接入大火的 chatGPT&#xff0c;是不是就会从智 Z 变成人工智能&#xff1f;&#xff01; 众所周知&#xff0c;Laf 是一个集函数、数据库、存储为一体的云开发…

第五章_Redis事务

是什么 官网 能做什么 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 Redis事务 VS 数据库事务 1 单独的隔离操作 Redis的事务仅仅是保证事务里的操作会被连续独占的执行&#xff0c;redis命令执行是单线程架构&#xff0c;在执行完事务内所有指令前是不可…

消息队列kafka及zookeeper机制

目录 一、zookeeper 1、zookeeper简介 2、zookeeper特点 3、zookeeper工作模式及机制 4、zookeeper应用场景及选举机制 5、zookeeper集群部署 ①实验环境 ②安装zookeeper 二、消息队列kafka 1、为什么要有消息队列 2、使用消息队列的好处 3、kafka简介 4、kafka…

【云原生】Kubernetes(k8s)之容器的探测

Kubernetes&#xff08;k8s&#xff09;之容器的探测 一、探测类型及使用场景1.1、startupProbe&#xff08;启动探测&#xff09;1.2、readinessProbe&#xff08;就绪探测&#xff09;1.3、livenessProbe&#xff08;存活探测&#xff09; 二、检查机制三、探测结果四、容器探…

MySQL - 基于SSL安全连接的主从复制

目录 &#x1f341;主从复制的原理 &#x1f341;部署master &#x1f341;部署slave &#x1f341;测试SSL主从复制 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;MySQL专栏&#xff1a;MySQL专栏地址 生产环境中一台mysql主机存在单点故障&#xff0c;所…

SWCF QA集锦待查收 (车联网与V2X、自动驾驶、5G毫米波、射频测试、频谱监测与规划等)

感谢大家的观看与支持&#xff01;我们为大家整理了本次发布会中的演讲资料&#xff0c;汇总了直播过程中的热点问题并请讲师进行了详细解答&#xff0c;在此整理分享给大家&#xff01; 演讲Q&A Q&#xff1a;目前5G天线支持最大的MIMO是多少&#xff1f; A&#xff1a;…