当前位置: 首页 > article >正文

[瑞吉外卖]-09数据库优化

MySql主从复制

介绍

当前项目中, 数据库的读和写都由一台数据库承担,压力大, 数据库服务器磁盘损坏则数据丢失,造成单点故障

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

  1. 就是一台或多台MySOL数据库(slave,即从库)从另一台MySOL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。
  2. MySQL主从复制是MySOL数据库自带功能,无需借助第三方工具。

MySQL复制过程分成三步:

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

配置

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

  • 主库Master 192.168.138.100
  • 从库slave 192.168.138.101

配置主库Master

第一步: 修改Mysql数据库的配置文件 /etc/my.cnf

  1. 修改的内容:
  • [mysqld]
  • log-bin=mysql-bin #[必须]启用二进制日志
  • server-id=100 #[必须]服务器唯一ID
  1. 注意:
  • 服务器id可以随便写, 只要是唯一的就行
  • vim /etc/my.cnf

第二步: 重启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 -uroot -proot

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

  • 命令: show master status;
  • 上面SOL的作用是查看Master的状态,执行完此SOL后不要再执行任何操作

配置从库Slave

第一步: 修改Mysql数据库的配置文件 /etc/my.cnf

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

第二步: 重启Mysql服务

  • systemctl restart mysqld

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

  1. 命令1:

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;

  1. 命令2:

start slave;

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

  • 命令: show slave status;

测试

连接两台数据库, 主库的增删改操作, 从库都会自动同步

Sharding-JDBC

背景

面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。

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

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规范的数据库。目前支持MySOL,Oracle,SOLServer,PostgreSQL 以及任何遵循SQL92标准的数据库。

入门案例

环境准备: 新建数据库和user表, 打开rw_demo工程

  • user表id字段的类型要用bigint

导入maven坐标

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

在配置文件中配置读写分离规则

server:
  port: 8080
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定义覆盖配置项

server:
  port: 8080
spring:
  shardingsphere:
  ... ...
  main:
    allow-bean-definition-overriding: true

功能测试

使用了Sharding-JDBC之后, 操作数据时, 读操作就会查询从数据库, 写操作就会操作主数据库,实现读写分离

项目改造

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

直接使用我们前面在虚拟机中搭建的主从复制的数据库环境即可

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

代码改造

新建分支

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

1、导入maven坐标

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

2、在配置文件中配置读写分离规则

server:
  port: 8080
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

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


server:
  port: 8080
spring:
  shardingsphere:
  ... ...
  main:
    allow-bean-definition-overriding: true

功能测试

项目启动时会初始化两个数据源

查询操作会操作从数据库

更新操作会操作主数据库

提交代码后, 合并分支


http://www.kler.cn/a/376247.html

相关文章:

  • C++ --- 多线程的使用
  • Automated Isotope Identification Algorithm UsingArtificial Neural Networks-论文阅读
  • 说说Dubbo有哪些核心组件?
  • K8S nginx pod结合cronJob实现日志按天切割 —— 筑梦之路
  • 啊手动阀示范点
  • 图传推流学习(敬请期待)
  • 【开源免费】基于SpringBoot+Vue.JS网上购物商城(JAVA毕业设计)
  • PHP文件包含漏洞
  • elf格式分析和动态库的链接过程
  • Java - 免费图文识别_Java_免费_图片转文字_文字识别_spring ai_spring ai alibaba
  • 群控系统服务端开发模式-应用开发-上传工厂开发
  • PySpark和Hadoop
  • 前端加密解密
  • 基于springboot的社区团购系统设计与实现
  • 【数据结构-邻项消除】力扣2216. 美化数组的最少删除数
  • [STM32]从零开始的IIC协议讲解与设备驱动
  • 【周末推荐】Windows无缝连接iPhone
  • HCIA(ACL)
  • 如何看待长周期项目?
  • GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序
  • uaGate SI——实现OT与IT的安全连接
  • [Ubuntu] 文件/目录权限更改
  • 【零售和消费品&存货】超市购物车商品检测系统源码&数据集全套:改进yolo11-DySnakeConv
  • C++ [项目] 躺平发育
  • java stream流的使用
  • 使用 firewall-cmd 管理 Linux 防火墙