初识mysql组复制

327 阅读6分钟

一、什么是Mysql组复制

MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。组复制是MySQL5.7版本出现的新特性,它提供了高可用、高扩展、高可靠的MySQL集群服务。

二、与MySQL主从架构的区别

2.1 主从复制

主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。 如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?

原理:

  • 当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
  • salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
  • 当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
  • I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。
  • SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作

image.png

2.2 MySQL主从复制方式

异步复制

异步复制是MySQL中最常用的一种复制方式。该模式下主节点在写完操作后立即返回成功,而从节点需要通过网络异步读取主节点的二进制日志,然后执行相应的操作。

优点:

  • 没有网络延迟:主节点写入速度不会受到从节点的影响。
  • 对性能影响小:不需要等待从节点的确认,因此Serving请求时非常快。
  • 适用范围广:可以进行跨数据中心的异地备份,甚至可以异地部署组成灾备系统。

缺点:

  • 数据同步延迟:由于数据需要通过网络传输,从节点上可能存在数据与主节点之间的同步延迟,导致数据比较旧。
  • 可用性无法保证:当主服务器发生故障时,从服务器上的数据可能会滞后主服务器,从而导致数据丢失。

半同步复制

半同步复制需要等待至少一个从节点确认接收到日志位置才认为写操作已经成功被提交。这个确认是通过网络发送一个ACK给主节点来实现的。

优点:

  • 数据一致性更高:由于至少一个从节点都已经接收到写操作,因此可以保证数据的一致性。
  • 容错性更好:当主节点出现故障时,从节点可以立即接管成为新的主节点。

缺点:

  • 性能比异步复制差:需要等待至少一个从节点确认才能返回成功,对性能有所影响。
  • 可用性仍然存在问题:如果只有一个从节点成功,后面的从节点出现问题,意味着发起写请求可以得到确认,但其实至少有一个从节点还没有接受日志,此时可能会丢失数据。

全同步复制

全同步复制要求所有从节点在Commit操作之前都必须接收并应用主节点发送的二进制日志。只有所有节点完成整个操作,主节点才会返回给客户端。

优点:

  • 数据完整性最高:由于所有节点都已经接收并应用了主节点的写操作,因此保证了数据的完整性和一致性。
  • 适用于高可靠性场景:特别是金融、高安全行业容易用。

缺点:

  • 性能较差:由于必须等待所有从节点接受并应用写操作日志,因此性能比异步和半同步复制都要低一些。
  • 可用性较低:如果从节点的数量很多或网络延迟较高,可能会导致主节点处于不可响应状态。

三、组复制原理

组复制相较于主从复制的优势在于:

  1. 更高的可用性和容错能力:组复制中有多个节点可以提供读写服务,当其中某个节点出现故障时,其他节点仍然可以继续提供服务。
  2. 更好的扩展性:组复制中可以动态地添加或删除节点,以满足业务需求的变化。
  3. 更灵活的读写负载均衡:组复制可以根据实际需要将读请求分配到不同的节点上,以达到更好的性能和资源利用。

组复制的原理是将多个节点组成一个逻辑集群,并使它们保持同步。每个节点都可以接收来自外部的读写请求,同时还可以将其转发给其他节点进行处理。当节点发生故障或者需要扩展时,可以通过选举机制选择新的主节点或增加/删除从节点。通过这样的方式,组复制可以提供高可用性、高扩展性和高灵活性的服务。

四、搭建Mysql组复制

五、在windows环境下配置

  1. 下载并安装 MySQL:从 MySQL 官网下载 Windows 平台所对应的 MySQL 镜像,安装时选择“Custom”模式并勾选“MySQL Server”、“MySQL Router”和“MySQL Shell”等组件。

  2. 配置主节点:在主节点上修改 my.cnf 配置文件并启用二进制日志(binary logging),在 my.cnf 文件中添加以下语句:

    server-id=1
    log-bin=mysql-bin
    binlog-format=ROW
    

    同时,为了让其他节点能够连接到主节点,需要打开相应的端口(默认3306)。

  3. 配置从节点:在从节点上修改 my.cnf 配置文件,配置节点 ID 和复制日志位置,并指定主节点的地址和端口号。在 my.cnf 文件中添加以下语句:

    server-id=2
    log-bin=mysql-bin
    binlog-format=ROW
    relay-log=mysql-relay-bin
    log-slave-updates=true
    read-only=TRUE
    

    其中,relay-log 指示从节点存储中继日志文件的路径,read-only 设置从节点只读。

  4. 启动 MySQL 实例:在主节点和从节点上分别启动 MySQL 实例,确保它们都能正常运行。

  5. 使用 MySQL Shell 连接节点:使用 MySQL Shell 连接主节点并创建组(Group),再连接从节点并将其添加到组中。在 MySQL Shell 中输入以下语句完成上述操作:

    root@localhost:3306
    var groupReplication = plugin.get('group_replication');
    var status = groupReplication.status()
    status
    var options = {member: {host: '127.0.0.1', port: 3307, user:'root', password:'pwd'}}
    groupReplication.addInstance(options)
    

    其中,addInstance 将从节点添加到组中,hostport 分别指代从节点的 IP 地址和端口号。

  6. 验证复制:可以在主节点进行数据插入、更新等操作,然后在各个从节点上验证是否同步了这些操作。