天天看点

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

环境:

rocketmq4.5.1

摘要:

消息队列 RocketMQ是低延迟、高并发、高可用、高可靠的分布式消息中间件。该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集团 13 年,覆盖全集团所有业务。作为双十一交易核心链路的官方指定产品,支撑千万级并发、万亿级数据洪峰,历年刷新全球最大的交易消息流转记录;目前是由Apache基金会维护。

步骤:

一、相关概念

RocketMQ 是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。

RocketMQ 特点

  • 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式等特点
  • Producer、Consumer、队列都可以分布式
  • Producer 向一些队列轮流发送消息,队列集合称为 Topic,Consumer 如果做广播消费,则一个 Consumer 实例消费这个 Topic 对应的所有队列,如果做集群消费,则多个 Consumer 实例平均消费这个 Topic 对应的队列集合
  • 能够保证严格的消息顺序
  • 支持拉(pull)和推(push)两种消息模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力
  • 支持多种消息协议,如 JMS、OpenMessaging 等
  • 较少的依赖
RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。

Name Server:充当路由消息的提供者。是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。在消息队列 RocketMQ 中提供命名服务,更新和发现 Broker 服务。

主要功能为:

  • 接收

    broker

    的请求,注册

    broker

    的路由信息
  • 接收

    client(producer/consumer)

    的请求,根据某个

    topic

    获取其到

    broker

    的路由信息;

    NameServer

    没有状态,可以横向扩展。每个

    broker

    在启动的时候会到

    NameServer

    注册;

    Producer

    在发送消息前会根据

    topic

    NameServer

    获取路由(到

    broker

    )信息;

    Consumer

    也会定时获取

    topic

    路由信息。

Broker:消息中转角色,负责存储消息,转发消息。可以理解为消息队列服务器,提供了消息的接收、存储、拉取和转发服务。

broker

是RocketMQ的核心,它不不能挂的,所以需要保证

broker

的高可用。

  • broker分为 Master Broker 和 Slave Broker,一个 Master Broker 可以对应多个 Slave Broker,但是一个 Slave Broker 只能对应一个 Master Broker。
  • Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。
  • 每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。Broker 启动后需要完成一次将自己注册至 Name Server 的操作;随后每隔 30s 定期向 Name Server 上报 Topic 路由信息。

生产者:与 Name Server 集群中的其中一个节点(随机)建立长链接(Keep-alive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的 Master Broker 建立长链接,且定时向 Master Broker 发送心跳。

消费者:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。

Topic:表示消息的第一级类型,比如一个电商系统的消息可以分为:交易消息、物流消息...... 一条消息必须有一个

Topic。

Queue:主题被划分为一个或多个子主题,称为“message queues”。一个

topic

下,我们可以设置多个

queue(消息队列)

。当我们发送消息时,需要要指定该消息的

topic

。RocketMQ会轮询该

topic

下的所有队列,将消息发送出去。

Tags:Tags是Topic下的次级消息类型/二级类型(注:Tags也支持

TagA || TagB

这样的表达式),可以在同一个Topic下基于Tags进行消息过滤。Tags的过滤需要经过两次比对,首先会在Broker端通过Tag hashcode进行一次比对过滤,匹配成功传到consumer端后再对具体Tags进行比对,以防止Tag hashcode重复的情况。

二、安装及启动

1、从rocketMQ官网下载rocketMQ版本如:rocketmq-all-4.5.1-bin-release.zip

2、解压

unzip rocketmq-all-4.5.1-bin-release.zip
           

主目录下:

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

conf目录下:

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

bin目录下:

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

3、修改bin/runserver.sh和bin/runbroker.sh中修改下面1-3行注释掉,当然也可以在这个两个配置文件中配置内存:

如果JAVA_HOME配置有问题就可以直接写export JAVA_HOME=/xx/xx/xxx

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

4、先后启动mqnamesrv和mqbroker,这样一个单机版的rocketmq就安装好了

nohup sh mqnamesrv & 
nohup sh mqbroker &
           

三、高可用配置

RocketMQ在众多消息队列产品中高可用性是其亮点之一,其集群部署方式有很多种。比如单Master模式、多Master模式、多Master多Slave模式(异步复制)、多Master多Slave模式(同步双写)等。明确个概念,RocketMQ Slave不可以写,可以读,类似于MySQL的主从机制。

  • 单Master模式:无需多言,一旦单个broker重启或宕机,一切都结束了!很显然,线上不可以使用。
  • 多Master模式:全是Master,没有Slave。当然,一个broker宕机了,应用是无影响的,缺点在于宕机的Master上未被消费的消息在Master没有恢复之前不可以订阅。
  • 多Master多Slave模式(异步复制):多对Master-Slave,高可用!采用异步复制的方式,主备之间短暂延迟,MS级别。Master宕机,消费者可以从Slave上进行消费,不受影响,但是Master的宕机,会导致丢失掉极少量的消息。
  • 多Master多Slave模式(同步双写):和上面的区别点在于采用的是同步方式,也就是在Master/Slave都写成功的前提下,向应用返回成功,可见不论是数据,还是服务都没有单点,都非常可靠!缺点在于同步的性能比异步稍低。

上面的配置也分别对照着conf下面的:

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)
  • 2m-noslave:多Master模式
  • 2m-2s-async:多Master多Slave模式(异步复制)
  • 2m-2s-sync:多Master多Slave模式(同步双写)

此次我们以2m-2s-async为例搭建一个双Name Server,双主从的且异步复制的Broker

假设我们现在有六台机器:192.168.1.131、192.168.2.131、192.168.1.132、192.168.2.132、192.168.1.133、192.168.2.133;一般是分成两个网段。

Name Server:192.168.1.131、192.168.2.131;

Broker-a:192.168.1.132(主)、192.168.2.132(从)

Broker-b:192.168.1.133(主)、192.168.2.133(从)

其中Name Server的配置和单机一样,生产的启动可以如下:

nohup sh bin/mqnamesrv -n "192.168.1.131:9876" > /dev/null 2>&1 &
           
nohup sh bin/mqnamesrv -n "192.168.2.131:9876" > /dev/null 2>&1 &
           

Broker服务的配置就是在conf/2m-2s-async/下:

RocketMQ1.1RocketMQ安装及高可用搭建配置(附RocketMQ参数配置文件详解)

各配置如下:

broker-a.properties:

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
           

broker-a-s.properties: 

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
           

 broker-b.properties: 

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
           

broker-b-s.properties 

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
           

上面都是默认配置;我们这里最少每个文件都需要增加配置:

namesrvAddr=192.168.1.131:9876;192.168.2.131:9876
           

再接着依次启动192.168.1.132(主)、192.168.2.132(从)、192.168.1.133(主)、192.168.2.133(从):

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties  > /dev/null 2>&1 &
           
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties  > /dev/null 2>&1 &
           
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties  > /dev/null 2>&1 &
           
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties  > /dev/null 2>&1 &
           

启动后可以使用jps查看对应的进程是否启动成功

 四、常用配置

broker的常用配置如下:

#所属集群名字
brokerClusterName=DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0表示Master,>0表示Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=192.168.1.131:9876;192.168.2.131:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH


#其他配置
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/alibaba-rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/alibaba-rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/alibaba-rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/alibaba-rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
           

继续阅读