MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,从节点可以复制主数据库中的所有数据库,或者特定的数据库,或者特定的表。
mysql主从复制用途:

  • 实时灾备,用于故障切换(高可用)
  • 读写分离,提供查询服务(读扩展)
  • 数据备份,避免影响业务(高可用)

主从复制整体分为以下三个步骤:

  • 主库将数据库的变更操作记录到Binlog日志文件中
  • 从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中
  • 从库读取中继日志信息在从库中进行Replay,更新从库数据信息

搭建流程

  • 主服务器master
  • 从服务器 slave

主服务器

  • 从库服务器能连通主库
  • 主库开启binlog日志(设置log-bin参数)
  • 主从server-id不同


配置etc下的my.cnf(my.ini)文件

  1. #开启binlog日期
  2. log_bin=mysql-bin
  3. server-id=1
  4. ## 同步日志
  5. sync-binlog=1
  6. ## 忽略一些库
  7. binlog-ignore-db=performance_schema
  8. binlog-ignore-db=informance_schema
  9. binlog-ignore-db=sys
  10. ## 同步一些表
  11. binlog-do-db=xxx(表名)

修改后重启mysql

  1. systemctl restart mysqld

授权
进入mysql的命令行

  1. GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root';
  2. GRANT all privileges ON *.* TO 'root'@'%' identified by 'root';
  3. //刷新
  4. flush privileges;

查询主库状态

  1. show master status

mysql主从复制 - 图1

从服务器

配置etc下的my.cnf(my.ini)文件

  1. ## 同步日志
  2. sync-binlog=1
  3. ## 中继日志
  4. relay_log=mysql-relay-bin
  5. ##只读属性
  6. read_only=1

修改后重启mysql

  1. systemctl restart mysqld

清楚库状态

  1. show master status ## 从库中如果有值,说明之前做过
  2. stop slave; ##先停步slave服务线程,这个是很重要的,

同步复制进入mysql的命令行

  1. change master to master_host='192.168.182.128',master_port=3306,master_user='root',master_password='root',master_log_file='nysql_bin.000002',master_log_pos=154;

查询从库状态

  1. show master status \G; ## 从库中如果有值,说明之前做过
  2. start slave;

问题
mysql主从复制存在的问题:

  • 主库宕机后,数据可能丢失
    从库只有一个SQL Thread,主库写压力大,复制很可能延时

解决方法:

  • 半同步复制—解决数据丢失的问题
    并行复制——解决从库复制延迟的问题

    半同步复制

    semi-sync意思是MASTER只需要接收到其中一台SLAVE的返回信息,就会commit;否则需等待直至切换成异步再提交

    主库安装semi

    进入mysql 安装配置semi
    1. ##是否支持动态加载
    2. select @@have_dynamic_loading;
    3. ##开启插件
    4. show plugins;
    5. ##安装semi
    6. install plugin rpl_semi_sync_master soname 'semisync_master.so';
    7. ##查看
    8. show variables like '%semi%';
    9. //============下面部分无视
    10. ##开启semi
    11. set global rpl_semi_sync_master_enabled=1;
    12. ##1000毫秒
    13. set global rpl_semi_sync_master_timeout=1000;

    从库安装semi

    进入mysql 安装配置semi
    1. ##安装semi
    2. install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
    3. ##查看
    4. show variables like '%semi%';
    5. ##开启semi
    6. set global rpl_semi_sync_master_enabled=1;
    7. ## 重启
    8. stop slave;
    9. start slave;

    全同步复制

    为了兼容MySQL 5.6基于库的并行复制,5.7引入了新的变量slave-parallel-type,其可以配置的值有:
    DATABASE(默认值,基于库的并行复制方式)、LOGICAL_CLOCK(基于组提交的并行复制方式)。 ```sql show variables like ‘%binlog_group%’;

    先关闭

    stop slave;

    提交的时间

    set global binlog_group_commit_sync_delay=1000;

    提交的组数量

    set global binlog_group_commit_sync_no_delay_count=100;

show variables like ‘%slave%’;

并行组提交方式

set global slave_parallel_type=LOGICAL_CLOCK;

线程数

set global slave_parallel_workers=8;

show variables like ‘%relay_log%’;

转发的日志回复

set global relay_log_recovery=1;

存储方式

set relay_log_info_repository=’table’;

  1. 直接写配置文件与set global的区别<br />set global后重启服务,配置属性消失<br />写到my.ini文件中,不会消失<br />配置etc下的my.ini文件
  2. ```sql
  3. relay_log_recovery=1
  4. slave_parallel_type=LOGICAL_CLOCK
  5. slave_parallel_workers=8
  6. relay_log_info_repository=table;
  7. master_info_repository=table;
  8. #重启
  9. systemctl restart mysqld
  10. # 查询
  11. show variables like '%relay_log%';

并行复制配置与调优

binlog_transaction_dependency_history_size 用于控制集合变量的大小
binlog_transaction_depandency_tracking 控制binlog文件中事务之间的依赖关系
transaction_write_set_extraction 用于控制事务的检测算法
master_info_repository 性能提升
slave_parallel_workers SQL线程
slave_preserve_commit_order 实现更小粒度的并行复制

  1. slave-parallel-type=LOGICAL_CLOCK
  2. slave-parallel-workers=16
  3. slave_pending_jobs_size_max = 2147483648
  4. slave_preserve_commit_order=1
  5. master_info_repository=TABLE
  6. relay_log_info_repository=TABLE
  7. relay_log_recovery=ON