高可用设计

高可用设计 #

先对整体的高可用做一个简单的表单说明

场景 影响 原因
个别Broker挂机 无影响 Broker无状态,客户端会自动重连到其他broker
个别消息数据库挂机 无影响 主从保证高可用
元数据挂机 仅影响元数据的管理功能,现有的生产消费无影响 客户端和管理端会缓存元数据
管理端Portal挂机 仅影响元数据的管理功能,现有的生产消费无影响 客户端和管理端会缓存元数据
消费者挂机 无影响 catMQ的动态重平衡会重新分配消费者和队列

CatMQ高可用的实现方式,主要是通过构建多节点集群,利用抢占锁选主的方式,来保证自身的高可用性。具体来说,主要是通过下面几种方式和策略:

  1. 抢占式选主, CatMQ 的选主采取的是抢占式式选主,如果主master宕机,或者连续一分钟没有反应, 系统会重新进行选主,确保系统可用。主master负责同步元数据和更新元数据
  2. 主从复制 CatMQ主节点会从数据库读取获取元数据或者更新元数据,从节点只会从数据库获取元数据,同时会确保主节点和从节点获取的元数据一致,这样即使主节点 宕机,新的主节点依旧可以保持服务可用。
  3. 节点故障检测 CatMQ 通过心跳机制来互相确认检测状态,一旦主服务器心跳没有在1分钟内更新,会重新启动集群选主。
  4. 写操作日志(Write-Ahead Logging,WAL) CatMQ在进行选主,心跳检测的时候,都会将自己的状态写入数据库中,然后再进行后续的操作,这样即使主节点发送崩溃,后续操作都可以继续进行。
  5. 顺序一致性 每次更新操作都分配一个全局唯一的递增的事务id,这个id 体现了所有事务操作的发生顺序,从而保证了所有的更新操作的全局顺序一致性。
  6. 分区 CatMQ 将每个主题(Topic)划分为多个分区(Partition)。每一个分区都对应数据库的一张表,这就实现了一种数据分布式存储的模式, 增加了系统的并发处理能力,也实现了负载均衡。
  7. 副本 CatMQ的每一个分区对应的数据库的表,都可以设置一个从数据库的表,这不仅增加了数据的冗余, 提高了系统的容错能力,一旦有一个数据库出现问题,从数据库还能够提供服务。
  8. 数据库集群 CatMQ的配置元数据以及服务端和消费端的实时对应关系都会实时存储在数据库中,借用业界成熟的的数据库集群的方案,可以进一步提高系统的可用性。

这些设计和实现方式使得 CatMQ 能够实现高可用性和故障转移,并能在面临服务器故障时,仍能维持服务可用。