美文网首页
MySQL-主从复制&读写分离

MySQL-主从复制&读写分离

作者: 石头耳东 | 来源:发表于2022-04-26 18:48 被阅读0次

零、本文纲要

  • 一、MySQL主从复制
  1. 主从复制
  2. 主从复制过程
  3. 配置主从复制
  • 二、MySQL读写分离
  1. 读写分离
  2. Sharding-JDBC
  3. Sharding-JDBC快速入门
  4. MasterSlaveDataSource

一、MySQL主从复制

1. 主从复制

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

2. 主从复制过程

① master将改变记录到二进制日志binary log
② slave将master的binary log拷贝到自己的中继日志relay log
③ slave重做replay中继日志中的事件,将改变应用到自身数据库中

3. 配置主从复制

  • ① 配置主库master

Ⅰ 修改MySQL的配置文件/etc/my.cnf

命令:vim /etc/my.cnf

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

注意:server-id只要保证多台数据库ID不同即可

Ⅱ 重启服务使其生效

命令:systemctl restart mysqld

Ⅲ 登录MySQL,创建授权通信账户

命令:mysql -uroot -p 登录MySQL

命令:GRANT REPLICATION SLAVE ON *.* to 'slaveconnector'@'%' identified by 'Root@123456';
创建一个用户slaveconnector,密码为Root@123456,并且给该用户授予REPLICATION SLAVE权限。slave使用带有该权限该账户才能进行复制。

GRANT [OPTIONS] ON db_name.tbl_name TO 'USERNAME'@'PATH' IDENTIFIED BY 'PASSWORD';
授予 [权限] 在 某数据库.某表 给 '用户'@'访问地址' 识别码是 '密码';

更多内容可以参考:Grant语句官方文档

Ⅳ 查看File和Position

命令:show master status;

+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000040 |      156 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

如上,记录下此处的File和Position信息

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

  • ② 配置从库slave

Ⅰ 修改MySQL数据库的配置文件/etc/my.cnf

命令:vim /etc/my.cnf

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

注意:此处我们slave的ID要与master不同

Ⅱ 重启服务使其生效

命令:systemctl restart mysqld

Ⅲ 登录MySQL,配置从库关系

命令:change master to master_host='192.168.138.128',master_user='slaveconnector',master_password='Root@123456',master_log_file='binlog.000040',master_log_pos=156;

参数名 含义 8.0.23之前
SOURCE_HOST 主库IP地址 MASTER_HOST
SOURCE_USER 连接主库的用户名 MASTER_USER
SOURCE_PASSWORD 连接主库的密码 MASTER_PASSWORD
SOURCE_LOG_FILE binlog日志文件名 MASTER_LOG_FILE
SOURCE_LOG_POS binlog日志文件位置 MASTER_LOG_POS

命令:start slave;

注意:如果先前该数据库运行过slave相关配置,先stop slave;,再执行如上操作

Ⅳ 查看从库状态

命令:show slave status;

二、MySQL读写分离

1. 读写分离

将数据库分主从,主库master负责处理事务性的增删改操作,从库slave负责处理查询操作。有效避免数据更新导致的行锁,进而提升整体查询性能。

2. Sharding-JDBC

该框架兼容JDBC和各种ORM框架,可以在程序中轻松实现数据库读写分离。

① 适用于任何基于JDBC的ORM框架,如:JPA、Hibernate、MyBatis、Spring JDBC Template或者直接使用JDBC;
② 支持任何第三方的数据库连接池,如:DBCP、C3P0、BoneCP、Druid、HikariCP等;
③ 支持认知实现JDBC规范的数据库,如:MySQL、Oracle、SQLServer、PostgreSQL以及任何遵循SQL92标准的数据库;

3. Sharding-JDBC快速入门

  • ① 相关依赖
<dependency>
    <groupId>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.128: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.130: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定义覆盖,此处数据源bean需要此配置
mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID
  • ③ 测试

注意:其他内容均不用调整,Sharding-JDBC已经可以使用了。

4. MasterSlaveDataSource

在Sharding-JDBC框架内,将数据源对象封装为MasterSlaveDataSource

其内部维护了一个Map<String, DataSource> dataSourceMap,这也是其能够实现读写分离的关键。能够依据不同操作使用不同数据源。该属性可以在其继承的抽象父类AbstractDataSourceAdapter中看到,如下:

private final Map<String, DataSource> dataSourceMap;

三、结尾

以上即为MySQL-主从复制&读写分离的全部内容,感谢阅读。

相关文章

网友评论

      本文标题:MySQL-主从复制&读写分离

      本文链接:https://www.haomeiwen.com/subject/dsdhyrtx.html