MySQL读写分离——基于主从复制

61 阅读3分钟

所有的数据库表都放在一台服务器上的缺点:

  1. 单台服务器压力大。
  2. 若磁盘损坏(单点故障),则数据丢失。

读写分离:主库负责增删改,从库负责读。

image.png

MySQL主从复制

MySQL主从复制是一个异步的复制过程,底层是基于MySQL自带的二进制日志功能。一台或多台从数据库从一台主数据库进行日志复制,再解析日志并应用到自身,从而实现从库和主库的数据保持一致。 MySQL主从复制是MySQL数据库自带的功能。

image.png

具体步骤分为三步:

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

image.png

开启主从复制(数据库版本:8.0)

前提:确保主服务器和从服务器都已经安装了MySQL数据库。

主库配置

  1. 修改配置文件/etc/mysql/my.cnf(或者在/etc/my.cnf),添加以下三行即可:

image.png

  1. 重启mysql服务,命令:systemctl restart mysql

  2. 创建一个新用户,并授予同步复制权限,后面从数据库就会以这个新用户的身份读取二进制日志文件。

    创建用户命令:create user 'xiaoming'@'%' identified by '123456';,其中xiaoming是用户名,% 表示任意主机都可远程登录,123456表示密码。

    授予权限:GRANT REPLICATION SLAVE ON *.* TO 'xiaoming'@'%';

  3. 执行show master status命令,查看主数据库状态,记录下前两列的数据后,不再执行其他命令。

image.png

从库配置

  1. 修改配置文件/etc/mysql/my.cnf

image.png

  1. 重启mysql服务,命令:systemctl restart mysql
  2. 执行代码:
change master to master_host='主数据库IP地址', master_user='xiaoming',      master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=690;

注意mysql-bin.000001690需要改成自己的。

start slave;

  1. 执行show slave status\G查看状态。

确保两个线程的状态为Yes,大功告成。

image.png

如果出错了,可以参考一下博客: Mysql主从同步情况故障排除

验证是否成功

在主库上新建一个数据,如果从库也出现了新建的数据库,证明配置成功。

Sharding-JDBC

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

ORM框架简介

ORM框架是对象关系映射(Object-Relational Mapping)的缩写,是一种编程技术,用于在面向对象的编程语言和关系数据库之间建立映射关系。它将数据库中的表和记录映射到面向对象编程语言中的类和对象,使得开发人员可以使用面向对象的方式进行数据库操作。ORM框架的主要目标是简化数据库操作,并提供更高级别、更抽象的接口,使开发人员能够使用更少的代码来完成数据库的增、删、改、查等操作。通过使用ORM框架,开发人员可以使用面向对象的思维来操作数据库,而不必直接编写SQL语句。

Sharding-JDBC案例

导入maven坐标

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

修改配置文件

spring:
  shardingsphere:
    datasource:
      names:
        master,slave
      # 主数据源
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://101.200.121.97: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://182.92.168.224: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: # 允许bean定义覆盖
    allow-bean-definition-overriding: true