美文网首页
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