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

时间:2024-10-29 08:07:01

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

功能测试

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

查询操作会操作从数据库

更新操作会操作主数据库

提交代码后, 合并分支