Mysql 主从复制机制

https://blog.csdn.net/girlgolden/article/details/89226528

MySQL异步复制及semi-sync半同步复制,它们都基于MySQL binlog,原生复制是完全异步的,master不需要保证slave接收并执行了binlog,能够保证master最大性能,但是slave可能存在延迟,主备数据无法保证一致性,在不停服务的前提下如果master宕机,提升slave为新的主库,就会丢失数据。

semi-sync在异步复制基础上增加了数据保护的考虑,这样一来master必须确认slave收到binlog后(但不保证slave执行了事务)才能最终提交事务,若再结合MHA(Master High Availability)高可用架构,此时master挂掉之后,slave可以在apply完所有relay log后切换成master提供读写服务。

semi-sync半同步复制工作原理,如下图所示。 

相对于MySQL源生复制和semi-sync半同步复制,Group Replication全同步复制的差异是:

  1. 全同步复制,主备无延迟,一个节点宕机后其他两个节点可以立即提供服务,而semi-sync需要应用(执行)完所有relay log,并依赖第三方高可用软件实现数据不丢失;
  2. 事务冲突检测保证数据一致性,多个节点可以同时读写数据,可以极大简化数据访问;
  3. 行级别并行复制,MySQL 5.7/MariaDB 10.0之前slave sql线程只有一个,这个长期饱受诟病,是导致slave落后master的主要原因。

1、Group Replication的工作原理

使用的是基于认证的复制,其流程如下图所示: 

当客户端发起commit命令时(此时仍然没有发生真正的commit),所有本事务内对数据库的更改行的主键都会被搜集到一个写入集(writeset)中,该写入集随后会被复制到其他节点,该写入集会在每个节点上使用搜索到的主键进行确认性认证测试来判断该写入集是否可以被应用。如果认证测试失败,写入集会被丢弃并且原始事务会被回滚;如果认证成功,事务会被提交并且写入集会被在剩余节点进行应用。最终,这意味着所有服务器以相同的顺序接收同一组事务。

其他节点只要验证成功了,就会返回成功的信号,即使当前数据并没有真正的写入当前节点,固这里的全同步复制,其实是虚拟的全同步复制。这段时间内,数据是有延迟的,但很小,如果应用程序访问的是远端节点,读到的数据是未改变之前的旧数据。固在生产环境里,对数据延迟要求很苛刻的情况下,建议在一个主节点上读写,避免造成数据不一致的情况发生。

(注:Galera通过设置参数wsrep_causal_reads = ON可以避免,这种情况下需要等待远端节点应用完事务后,才返回客户端读取请求,这将增加读取的响应时间。Group Replication未发现相关参数,如有朋友知道也请告知。)

而真正意义上的全同步复制,是要等所有节点事务都提交落地,才成功返回客户端。因此虚拟全同步复制的性能会更好一些。

Group Replication内部实现了flow control限流措施,作用就是协调各个节点,保证所有节点执行事务的速度大于队列增长速度,从而避免丢失事务。实现原理和简单:整个Group Replication集群中,同时只有一个节点可以广播消息(数据),每个节点都会获得广播消息的机会(获得机会后也可以不广播),当慢节点的待执行队列超过一定长度后,它会广播一个FC_PAUSE消息,所以节点收到消息后都会暂缓广播消息并不提供写操作,直到该慢节点的待执行队列长度减小到一定长度后,Group Replication数据同步又开始恢复。

变量参数:

  1. group_replication_flow_control_applier_threshold = 25000

  2.  

    group_replication_flow_control_certifier_threshold = 25000

待执行队列长度超过该值时,flow control被触发,默认是25000。

2、Group Replication的特性和注意事项

  • 全同步复制,事务要么在所有节点都提交,要么都回滚;
  • 多主复制,可以在任意节点进行写操作;
  • 在从服务器上并行应用事件,真正意义上的并行复制;
  • 节点自动配置–故障节点自动从集群中移除,当故障节点再次加入集群,无需手工备份当前数据库并拷贝至故障节点;
  • 应用程序的兼容性:无需更改应用程序,原生的MySQL接口;
  • 生产环境上集群推荐配置3个节点; 每个节点都包含完整的数据副本;
  • 各个节点的同步复制,通过GTID binlog ROW实现。

优点:

  1. 真正的多主架构,任何节点都可以进行读写,无需进行读写分离;(注:生产环境建议只在一台机器上写,由于集群是乐观锁并发控制,事务冲突的情况会在commit阶段发生。如果有两个事务在集群中不同的节点上对同一行写入并提交,失败的节点将回滚,客户端返回报错,作为DBA你不想被一群开发投诉的话,还是默默的开启Single-Primary写入模式)
  2. 无集中管理,可以在任何时间点失去任何一个节点,集群将正常工作不受影响;
  3. 节点宕机不会导致数据丢失;
  4. 对应用透明。

缺点:

  1. 加入新节点,开销大,需要复制完整的数据。
  2. 不能有效的解决写扩展问题,磁盘空间满了,无法自动扩容,不能像MongoDB分片那样自动移动chunk做balance
  3. 有多少个节点就有多少份重复的数据
  4. 由于事务提交需要跨节点通讯(分布式事务),写入会比主从复制慢
  5. 对网络要求非常高,如果网络出现波动或机房被ARP攻击,造成两个节点失联,Group Replication集群发生脑裂,服务将不可用。

下面是官方集群节点投票示意图,如果是3个节点,必须满足大多数节点2个投票: 

集群自身不提供VIP机制,也没有像MongoDB副本集那样提供JAVA/PHP客户端API接口实现故障切换(需要开发自己写,成本较高),需要结合第三方HaProxy软件(建议2块网卡做bond0)+自定义脚本实现秒级故障切换,另通过代理方式,性能会降低,因为多了一层网络转发。

局限性:

  • 目前的复制仅仅支持InnoDB存储引擎
  • 每张表必须有主键
  • 只支持ipv4网络
  • 集群最大支持9个节点
  • 不支持Savepoints
  • 不支持SERIALIZABLE隔离级别在Multi-Primary多主模式
  • 不支持外键在Multi-Primary多主模式
  • 整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,比如硬盘故障(RAID10坏了一块盘),那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

3、Group Replication的使用

Single-Primary模式配置环境:

1、设置host解析

三台服务器的配置如下:

  1. # cat /etc/hosts

  2.  

    192.168.17.133 node1

  3.  

    192.168.17.134 node2

  4.  

    192.168.17.135 node3

2、编辑/etc/my.cnf配置参数(三个节点按照如下设置)

  1. log-bin = /data/mysql57/binlog/mysql-bin

  2.  

    binlog_format = ROW

  3.  

    sync_binlog = 1

  4.  

    binlog_checksum = NONE

  5.  

    log_slave_updates = 1

  6.  

    gtid_mode = ON

  7.  

    enforce_gtid_consistency = ON

  8.  

    master_info_repository = TABLE

  9.  

    relay_log_info_repository = TABLE

3、安装插件

INSTALL PLUGIN group_replication SONAME ‘group_replication.so‘;
  • 1

4、设置集群参数(三个节点都执行)

注:group_replication_group_name名字要通过select uuid()来生成 
group_replication_local_address在节点2和节点3上改成本地IP地址 
执行完了,别忘了修改my.cnf里加入到配置文件里。

5、节点加入集群

Primary节点上执行

注:待replication_group_members表查询结果MEMBER_STATE字段状态为ONLINE,再执行关闭初始化。

两台Secondary上执行

  1. SET SQL_LOG_BIN=0;

  2.  

    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO ‘repl‘@‘%‘ IDENTIFIED BY ‘repl‘;

  3.  

    FLUSH PRIVILEGES;

  4.  

    SET SQL_LOG_BIN=1;

  5.  

    CHANGE MASTER TO MASTER_USER=‘repl‘,

  6.  

    MASTER_PASSWORD=‘repl‘ FOR CHANNEL

  7.  

    ‘group_replication_recovery‘;

  8.  

    START GROUP_REPLICATION;

  9.  

    select * from performance_schema.replication_group_members;

如下图所示,代表集群已经成功运行。

4、Group Replication的维护

假如Secondary节点宕机,重启后由于种种原因加入集群失败,现需要重新恢复,步骤如下:

1、在另一台Secondary节点上mysqldump全量

  1. mysqldump -uroot -p123456 -q --single-transaction

  2.  

    --master-data=2 -B yourDB > /root/yourDB.sql

这一步会自动在yourDB.sql里生成

SET @@GLOBAL.GTID_PURGED=‘23e510dc-d30b-11e6-a4c6-b82a72d18b06:1,4d1fd6ec-d2fd-11e6-ae4b-549f3503ab31:1-1543112:2003786-2003789:3003787,e4e34dd3-d2fa-11e6-984b-b82a72d18b06:1‘;

2、导入进去

再执行下面的语句即可

  1. CHANGE MASTER TO MASTER_USER=‘repl‘,

  2.  

    MASTER_PASSWORD=‘repl‘ FOR CHANNEL

  3.  

    ‘group_replication_recovery‘;

  4.  

    START GROUP_REPLICATION;

原文地址:https://www.cnblogs.com/zhangmingda/p/11495877.html

时间: 2024-11-10 08:23:23

Mysql 主从复制机制的相关文章

通过主从复制机制完成MySQL数据库服务迁移

qunyingliu 0x00 背景 业务所在机房裁撤,原业务机器也已经过保,通过MySQL主从复制机制完成MySQL数据服务的无缝迁移. 0x01 准备 1.环境: 原则上搭建mysql主从复制最好是操作系统版本.环境,MySQL版本.配置保持一致,这样可以保证MySQL主从集群的稳定性,以及减少版本和环境造成的异常,便于排查和定位问题. 由于我们涉及迁移的机器往往是很久以前上线,而且也从未有相关系统和服务升级的机制,还好这次涉及的MySQL版本比较高,与MySQL 5.6的兼容性还是比较好的

mysql主从复制--mysql-5.5异步、半同步配置

背景介绍 mysql5.5之前版本,mysql主从复制比较简单 mysql5.6:gtid,multi-thread replication master 1 启用二进制日志 log-bin = master-bin log-bin-index = master-bin.index 2 选择一个唯一的server id server-id = [0~2^32] 3 创建具有复制权限的用户 replication slave,复制的从节点 replication client,联系master,获

MySQL - 主从复制及读写分离原理

1.MySQL主从复制与读写分离原理 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端口,通过网络发给MYSQL-B. MYSQL-B收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库中完成. 那么,MYSQL-A的变化,MYSQL-B也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication. 在上面的模型中,MYSQL-A就是主服务器

MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

Technorati 标签: 那你魔鬼 一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读

mysql之 MySQL 主从复制概述

1 .主从复制简介MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实例(slave)中,而且这个复制是一个异步复制的过程.实现整个复制操作主要由三个进程完成的,其中两个进程在 Slave(sql_thread 和IO_thread),另外一个进程在 Master(IO 进程)上.2 .主从复制 原理 . 机制要实施复制,首先必须打开 Master 端的 binary log(bin-log)功能,否则无法实现.因为整个复制过程实际上就是 Sl

【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构 一、业务发展驱动数据发展

一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案不够健壮,那么数据库服务器很有可能在高并发访问负载压力下宕机,造成数据访问服务的失效,从而导致网站的业务中断,给公司和用户造成双重损失.那么,有木有一种方案能够解决此问题,使得数据库不再因为负载压力过高而成为网站的瓶颈呢?答案肯定是有的. 目前,大部分的主流关系型数据库都提供了主从热备功能,通过配置

MySQL主从复制的配置

MySQL主从复制的配置 环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205     主机名:edu-mysql-01 从节点IP:192.168.1.206     主机名:edu-mysql-02 主机配置:4核CPU.4G内存 依赖课程 <高可用架构篇--第13节--MySQL源码编译安装(CentOS-6.6+MySQL-5.6)> MySQL主从复制官方文档 ht

高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离

点击链接加入群[Dubbo技术交流2群]:https://jq.qq.com/?_wv=1027&k=46DcDFI 一.环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso JDK版本:jdk1.7.0_45 MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz MyCat节点IP:192.168.1.203      主机名:edu-mycat-01  主机配置:4核CPU.4G内存 MySQL版本:

MySQL 主从复制与读写分离概念及架构分析

1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端口,通过网络发给MYSQL-B. MYSQL-B收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库中完成. 那么,MYSQL-A的变化,MYSQL-B也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication. 在上面的模型中,MYSQL-A就是主服务器,即mast