简介

  • 使用MySQL主从复制,进行读写分离:随着访问量的增大,数据的吞吐量面临瓶颈,对于同一时刻有大量的读操作,但是写操作较少的场景,可以将数据库拆分为主库和从库,主库负责数据库的增删改操作从库负责读查询操作,能够有效的避免由数据更新导致的行锁,使系统的查询性能得到很大的提升。

  • MySQL 是一个异步的复制过程,底层是基于mysql数据库自带的binlog功能,就是一台或多台数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制应用到自身,最终实现从库的数据和主库的数据保持一致。

  • MySQL主从复制是其自带功能,无需借助第三方工具。

  • MySQL 复制过程分为三步:

    • master 将改变记录到binlog
    • slave 将master的binlog拷贝到它的中继日志(relay log);
    • slave 重做(replay)中继日志中的事件,将改变应用到自己的数据库中;

配置

  • 配置主库(Master):master 会将改变记录到二进制日志binary log

    • 修改主库的配置文件 vim /etc/my.cnf,[mysqld]下添加如下代码:

      1
      2
      log-bin=mysql-bin  #启用二进制日志
      server-id=100 #id作为服务器唯一标识,不一定要100,只要不重复即可
    • 重启服务

      1
      systemctl restart mysql
    • 登录到mysql

      1
      mysql -u root -p
    • 创建一个用户叫xiaoming,密码是Root@123456,并给该用户授予REPLICATION SLAVE权限

      1
      2
      create user xiaoming identified by 'Root@123456';
      grant replication slave on *.* to xiaoming;
    • 查看主库状态

      1
      2
      3
      4
      5
      6
      7
      mysql> show master status;
      +------------------+----------+--------------+------------------+-------------------+
      | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
      +------------------+----------+--------------+------------------+-------------------+
      | mysql-bin.000001 | 697 | | | |
      +------------------+----------+--------------+------------------+-------------------+
      # 日志名称 # 记录位置
  • 配置从库(slave):slave 将master的binary log拷贝到它的中继日志relay log

    • 修改从库的配置文件 vim /etc/my.cnf,[mysqld]下添加如下代码:

      1
      server-id=101 #必须是唯一的id,不能重复
    • 重启mysql服务

      1
      systemctl restart mysql
    • 登录mysql

      1
      mysql -u root -p
    • 执行语句

      1
      2
      3
      mysql> change master to master_host='10.180.189.25',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=697,get_master_public_key=1;

      mysql> start slave;
    • 查看从库状态

      1
      mysql> show slave status\G
    • 若如下两个线程显示Yes则正常

      1
      2
      Slave_IO_Running: Yes
      Slave_SQL_Running: Yes
  • 配置成功,此时如果master发生改变,slave会重做中继日志中的事件,将改变也应用到自身的数据库中;