RocketMQ⾼可⽤和负载均衡

6、RocketMQ⾼可⽤和负载均衡
6.1、broker⾼可⽤

RocketMQ 的⾼可⽤主要是通过 Broker 的 Master 与 Slave 相互配合来实现的。Broker 分为 Master 与 Slave,⼀个 Master 可以对应多个 Slave,但是⼀个 Slave 只能对应⼀个 Master,Master 与 Slave 的对应关系通过指定相同的 BrokerName,不同的 BrokerId 来定义,BrokerId 为 0 表示 Master,⾮ 0 表示 Slave。Master 也可以部署多个。每个 Broker 与 NameServer 集群中的所有节点建⽴⻓连接,定时注册 Topic 信息到所有 NameServer。注意:当前 RocketMQ 版本在部署架构上⽀持⼀ Master多 Slave,但只有BrokerId=1的从服务器才会参与消息的读负载

6.1.1、同步刷盘和异步刷盘

RocketMQ 的消息是存储到磁盘上的,这样既能保证断电后恢复, ⼜可以让存储的消息量超出内存的限制。RocketMQ为了提⾼性能,会尽可能地保证磁盘的顺序写。消息在通过 Producer 写⼊ RocketMQ 的时候,有两种写磁盘⽅式,分别为同步刷盘和异步刷盘。

同步刷盘:在返回写成功状态时,消息已经被写⼊磁盘。具体流程是,消息写⼊内存的 PAGECACHE 后,⽴刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执⾏完成后唤醒等待的线程,返回消息写成功的状态。

优点:可以保持MQ的消息状态和⽣产者/消费者的消息状态⼀致

缺点:性能⽐异步的低

异步刷盘:在返回写成功状态时,消息可能只是被写⼊了内存的 PAGECACHE ,写操作的返回快,吞吐量⼤;当内存⾥的消息量积累到⼀定程度时,统⼀触发写磁盘动作,快速写⼊

优点:性能⾼。

缺点:Master 宕机,磁盘损坏的情况下,会丢失少量的消息, 导致MQ的消息状态和⽣产者/消费者的消息状态不⼀致。

同步刷盘和异步刷盘,都是通过 Broker 配置⽂件⾥的 flushDiskType 参数设置的,把这个参数被配置成 SYNC_FLUSH (同步)、 ASYNC_FLUSH (异步)中的⼀个

6.1.2、同步复制与异步复制

如果⼀个 Broker 组有 Master和 Slave,消息需要从 Master 复制到 Slave 上,有同步和异步两种复制⽅式。同步复制:即同步双写,等 Master 和 Slave 均写成功后才反馈给客户端写成功状态

优点:如果 Master 出故障,Slave 上有全部的备份数据,容易恢复,消费者仍可以从 Slave 消费, 消息不丢失。

缺点:增⼤数据写⼊延迟,降低系统吞吐量,性能⽐异步复制模式略低,⼤约低10%左右,发送单个 Master 的响应时间会略⾼。

异步复制:只要 Master 写成功即可反馈给客户端写成功状态。

优点:系统拥有较低的延迟和较⾼的吞吐量,Master 宕机之后,消费者仍可以从 Slave 消费,此过程对应⽤透明,不需要⼈⼯⼲预,性能同多个 Master模式⼏乎⼀样。

缺点:如果 Master 出了故障,有些数据因为没有被写⼊ Slave,⽽丢失少量消息。

同步复制和异步复制是通过 Broker 配置⽂件⾥的 brokerRole 参数进⾏设置的,这个参数可以被设置成

ASYNC_MASTER、SYNC_MASTER、SLAVE 三个值中的⼀个。三个值说明:

ASYNC_MASTER:异步复制主节点。

SYNC_MASTER:同步复制主节点。

SLAVE:从节点。

6.2、producer⾼可⽤

在创建 Topic 的时候,把 Topic 的多个 Message Queue 创建在多个 Broker 组上(相同 Broker 名称,不同 brokerId 的机器组成⼀个 Broker 组),这样当⼀个Broker 组的 Master不可⽤后,其他组的 Master 仍然可⽤, Producer 仍然可以发送消息

  1. ⾸先Topic 在两个Master节点的Broker上都有分别4个Message Queue。

  2. 默认使⽤轮询的⽅式进⾏队列和Broker的选择。例如选中了 Broker A 的 Q4。

  3. 如果发送成功,则正常返回,结束。

  4. 如果发送失败就会触发 重试机制 (消息最⼤重试次数是2次),并选择使⽤哪⼀种重试策略。

  5. 重试策略有2种:开启和不开启故障延迟机制。(默认不开启)

  6. 如果不开启故障延迟机制,那么重试发送就会轮询选择刚才失败的那个Broker的下⼀个队列,例如Broker A 的Q1。(这种⽅式的缺点是有可能重试会再⼀次失败,因为如果第⼀次失败了⼤部分情况是这个Broker有问题了,所以当第⼆次选择这个Broker的其他队列时,⼤概率也会失败。)

  7. 如果开启了故障延迟机制,那么在消息第⼀次发送失败后就会将该Broker置为不可⽤列表,转⽽重新选择Broker。(这种⽅式的缺点是,⼀旦所有的Broker都失败了,那么这个客户端将⽆法发送消息。)

6.3、 consumer⾼可⽤

Consumer 的⾼可⽤是依赖于 Master-Slave 配置的,由于 Master 能够⽀持读写消息,Slave ⽀持读消息,当 Master 不可⽤或繁忙时, Consumer 会被⾃动切换到从 Slave 读取(⾃动切换,⽆需配置)。

故当 Master 的机器故障后,消息仍可从 Slave 中被消费。

6.4、 producer 负载均衡

对于⾮顺序消(普通消息、定时/延时消息、事务消息)场景,默认且只能使⽤轮询模式的负载均衡策略

Producer 端,每个实例在发消息的时候,默认会轮询所有的 message queue 发送,以达到让消息平均落在不同的 queue 上。⽽由于queue可以散落在不同的broker,所以消息就发送到不同的 broker下

如上图所示,M1、M2表示⽣产者发送的第⼀条消息、第⼆条消息,Queue1、Queue2、Queue3 表示主题中的三个队列。

⽣产者按照轮询⽅式分别将消息依次发送到这三个队列中,M1 发送⾄ Queue1 中、M2 发送⾄ Queue2 中、M3发送⾄ Queue3 中,以此类推,第四条消息 M4⼜发送⾄ Queue1 中,循环往复

6.5、consumer 负载均衡
6.5.1、集群消费( Clustering )和⼴播消费( Broadcasting )

集群消费同⼀ Topic 下的⼀条消息只会被同⼀消费组中的⼀个消费者消费。也就是说,消息被负载均衡到了同⼀个消费组的多个消费者实例上。

6.5.2、queue策略

Consumer 的负载均衡是指将 Broker 端中多个 Queue 按照某种策略分配给同⼀个消费组中的不同消费者,因此只有集群消费才能做到负载均衡

常⻅的有四种策略:平均分配、环形分配策略、⼀致性hash策略、同机房策略,消费者通过 consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragely());设置具体的分配策略

1、平均分配策略(默认)

该算法是要根据 avg = QueueCount / ConsumerCount 的计算结果进⾏分配的。如果能够整除,则按顺序将 avg

  • Queue 逐个分配 Consumer;如果不能整除,则将多余出的 Queue 按照 Consumer 顺序逐个分配

上⾯有 5 个 Queue,3 个 Consumer,那么每个 Consumer 可以分配到 1 个 Queue,但是还有 2 个 Queue 是多余的,那么这 2 个 Queue 将依次按顺序分给 Consumer1,Consumer2。

2、环形分配策略

环形平均算法是指,根据消费者的顺序,依次由 Queue 队列组成的环形图逐个分配,该⽅法不需要提前计算

同样以 5 个 Queue,3 个 Consumer 为例,Queue1、Queue2、Queue3 按照顺序分配给 3 个 Consumer, 剩下的Queue4、Queue5 继续按照顺序分配给 Consumer1,Consumer2。

3、⼀致性hash

该算法会将 Consumer 的 hash 值作为Node节点存放到 hash 环上,然后将 Queue 的 hash 值也放到 hash 环上,通过顺时针⽅向,距离 Queue 最近的那个Qonsumer 就是该 Queue 要分配的 Consumer。

顺时针⽅向进⾏判断,Queue1 分配给 Consumer1, Queue2、Queue3 分配给 Consumer2, Queue4、Queue5分配给 Consumer3。

该算法存在的问题:分配不均,其可以有效减少由于消费者组扩容或缩容所带来的⼤量的 Rebalance。

4、同机房策略

该算法会根据 Queue 的部署机房位置和 Consumer 的位置,过滤出当前 Consumer 相同机房的 Queue。然后按照平均分配策略或环形平均策略对同机房 Queue进⾏分配。如果没有同机房 Queue,则按照平均分配策略或环形分配策略对所有 Queue 进⾏分配

Queue1、Queue2、Queue3 与 Consumer1、Consumer2 同个机房,3个 Queue 按照平均分配策略或环形分配策略指定 Consumer1、Consumer2。⽽Queue4、Queue5 则直接分配给 Consumer3。

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Martin_lr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值