实时数据相关消息中间件

rocketmq总结以及自动化部署策略

2018-01-31  本文已影响298人  随意多好

RocketMQ总结

1 rocketmq是什么?

what_is_rocketmq.png

是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。

实例消费这个 Topic 对应的所有队列,如果做集群消费,则多个 Consumer 实例平均消费这个 topic 对应的队列集合。

2 rocketmq网络结构

rocketmq网络架构

RocketMQ 网络部署特点

3 模块功能特性

3.1 Namesrv

  1. Namesrv用于存储Topic、Broker关系信息,功能简单,稳定性高。多个Namesrv之间相互没有通信,单台Namesrv宕机不影响其他Namesrv与集群;即使整个Namesrv集群宕机,已经正常工作的Producer,Consumer,Broker仍然能正常工作,但新起的Producer, Consumer,Broker就无法工作。

  2. Namesrv压力不会太大,平时主要开销是在维持心跳和提供Topic-Broker的关系数据。但有一点需要注意,Broker向Namesr发心跳时,会带上当前自己所负责的所有Topic信息,如果Topic个数太多(万级别),会导致一次心跳中,就Topic的数据就几十M,网络情况差的话,网络传输失败,心跳失败,导致Namesrv误认为Broker心跳失败。

3.2 Broker

1)高并发读写服务

Broker的高并发读写主要是依靠以下两点:

2) 负载均衡与动态伸缩

负载均衡:Broker上存Topic信息,Topic由多个队列组成,队列会平均分散在多个Broker上,而Producer的发送机制保证消息尽量平均分布到所有队列中,最终效果就是所有消息都平均落在每个Broker上。

动态伸缩能力(非顺序消息):Broker的伸缩性体现在两个维度:Topic, Broker。

3) 高可用&高可靠

高可用:集群部署时一般都为主备,备机实时从主机同步消息,如果其中一个主机宕机,备机提供消费服务,但不提供写服务。

高可靠:所有发往broker的消息,有同步刷盘和异步刷盘机制;同步刷盘时,消息写入物理文件才会返回成功,异步刷盘时,只有机器宕机,才会产生消息丢失,broker挂掉可能会发生,但是机器宕机崩溃是很少发生的,除非突然断电

4)Broker与Namesrv的心跳机制
单个Broker跟所有Namesrv保持心跳请求,心跳间隔为30秒,心跳请求中包括当前Broker所有的Topic信息。Namesrv会反查Broer的心跳信息,如果某个Broker在2分钟之内都没有心跳,则认为该Broker下线,调整Topic跟Broker的对应关系。但此时Namesrv不会主动通知Producer、Consumer有Broker宕机。

3.3 消费者

消费者启动时需要指定Namesrv地址,与其中一个Namesrv建立长连接。消费者每隔30秒从nameserver获取所有topic的最新队列情况,这意味着某个broker如果宕机,客户端最多要30秒才能感知。连接建立后,从namesrv中获取当前消费Topic所涉及的Broker,直连Broker。

Consumer跟Broker是长连接,会每隔30秒发心跳信息到Broker。Broker端每10秒检查一次当前存活的Consumer,若发现某个Consumer 2分钟内没有心跳,就断开与该Consumer的连接,并且向该消费组的其他实例发送通知,触发该消费者集群的负载均衡。

消费者端的负载均衡
先讨论消费者的消费模式,消费者有两种模式消费:集群消费,广播消费。

消费者端的负载均衡,就是集群消费模式下,同一个ID的所有消费者实例平均消费该Topic的所有队列。

3.4 生产者(Producer)

Producer启动时,也需要指定Namesrv的地址,从Namesrv集群中选一台建立长连接。如果该Namesrv宕机,会自动连其他Namesrv。直到有可用的Namesrv为止。

生产者每30秒从Namesrv获取Topic跟Broker的映射关系,更新到本地内存中。再跟Topic涉及的所有Broker建立长连接,每隔30秒发一次心跳。在Broker端也会每10秒扫描一次当前注册的Producer,如果发现某个Producer超过2分钟都没有发心跳,则断开连接。

生产者端的负载均衡

生产者发送时,会自动轮询当前所有可发送的broker,一条消息发送成功,下次换另外一个broker发送,以达到消息平均落到所有的broker上。

这里需要注意一点:假如某个Broker宕机,意味生产者最长需要30秒才能感知到。在这期间会向宕机的Broker发送消息。当一条消息发送到某个Broker失败后,会往该broker自动再重发2次,假如还是发送失败,则抛出发送失败异常。业务捕获异常,重新发送即可。客户端里会自动轮询另外一个Broker重新发送,这个对于用户是透明的。

4 集群说明

brokerClusterName brokerName brokerRole brokerId
DefaultCluster broker-a SYNC_MASTER 0
DefaultCluster broker-a SLAVE 1
DefaultCluster broker-b SYNC_MASTER 0
DefaultCluster broker-b SLAVE 1
说明:每个 Master 配置一个 Slave,有多对Master-Slave,HA。采用同步双写方式,主备都写成功,向应用返回成功。

优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高

缺点:性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

启动说明:
  先启动 NameServer
  在机器 A,启动第一个 Master
  在机器 B,启动第二个 Master
  在机器 C,启动第一个 Slave
  在机器 D,启动第二个 Slave

以上 Broker 与 Slave 配对是通过指定相同的brokerName 参数来配对,Master
的 BrokerId 必须是 0,Slave 的BrokerId 必须是大与 0 的数。另外一个 Master
下面可以挂载多个 Slave,同一 Master 下的多个 Slave通过指定不同的 BrokerId
来区分。

5 集群部署案例-2m-2s-sync

5.1 环境说明

1) 软件及其机器

软件及版本 下载地址
系统 centos7 https://www.centos.org/download/
软件 rocketmq-all-4.2.0 https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.2.0/rocketmq-all-4.2.0-source-release.zip
依赖 jdk1.8+ oracle官网
ip hostname 部署服务 role/brokerid
192.168.59.2 mqnamesrv-*.env.rocketmq.com NameServer No
192.168.59.3 mqnamesrv-*.env.rocketmq.com NameServer No
192.168.59.4 mqbroker-*.env.rocketmq.com Broker SYNC_MASTER/0
192.168.59.5 mqbroker-*.env.rocketmq.com Broker SLAVE/1
192.168.59.6 mqbroker-*.env.rocketmq.com Broker SYNC_MASTER/0
192.168.59.7 mqbroker-*.env.rocketmq.com Broker SLAVE/1 表 5.2

绑定hosts或dns:

#测试环境hosts
#Name Server 提供给外部访问
192.168.59.2 nameserver1.rocketmq.test.com
192.168.59.3 nameserver2.rocketmq.test.com
#Broker Server 绑定网卡,方便扩容
192.168.59.4 broker01.rocketmq.test.com
192.168.59.5 broker02.rocketmq.test.com
192.168.59.6 broker03.rocketmq.test.com
192.168.59.7 broker04.rocketmq.test.com

主机命名说明:

主机名命名规范:项目名-随机数.环境.组件.公司/机房

例如:表5.2中第一行,项目名:mqnamesrv,部署环境:dev,ip:192.168.59.2,组件是rocketmq,命名主机名为:

mqnamesrv-192168059002.dev.rocketmq.com

该命名好处:通过主机名可以判断当前机器部署的服务以及部署环境、机房情况,方便在报警系统里或者cmdb中很快判断到该主机的的影响。

2) 多环境说明

在实际应用中都会涉及多环境的问题,比如有线下环境(dev)和生产环境(prod),不同环境的应用最好保持配置一致,减少各个每个环境的配置工作量。

Rocketmq各环境统一连接地址

NAMESRV_ADDR="nameserver1.rocketmq.test.com:9876;nameserver2.rocketmq.test.com:9876"

根据Rocketmq集群说明,其实最终只需暴露nameserver的地址给应用即可,因此,各个环境绑定各个环境对应的hosts/dns即可使用统一连接的地址。

3) 打包部署

4) 集群扩容

rocketmq各个组件都支持横向扩容:

组件 扩容
Producer 横向扩容,添加机器
Consumer 横向扩容,添加机器,数量<=队列数(分区)
NameServer 横向扩容,无状态
Broker 横向扩容,新增topic会自动负载

5) WEB管理(rocketmq-console)

通过web可以查看集群状态,查看topic信息以及创建更改topic,管理producer和consumer等。

#安装 && 启动
mvn clean package -Dmaven.test.skip=true
java -jar target/rocketmq-console-ng-1.0.0.jar

用户手册:https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md

rocketmq-console-gui rocketmq-console-2 rocketmq-topic
上一篇下一篇

猜你喜欢

热点阅读