乐趣区

关于linux:手把手教你搭建-RocketMQ-高可用集群

RocketMQ 倒退历史

RocketMQ 是一个由阿里巴巴开源的消息中间件,2012 年开源,2017 年成为 apache 顶级我的项目。RocketMQ 在阿里外部利用是十分宽泛的,阿里外部的几千个利用都运行在 RocketMQ 之上,双十一期间须要解决亿万级别的音讯,TPS 能够达到几十万。目前反对 Java、C/C++,Python、Go 四种语言拜访。

RocketMQ 当初有两个版本,一个是社区开源版,一个是商业的云服务版(AliwareMQ)。最新版本:4.8.0(本文演示版本)。

它的外围设计借鉴了 Kafka,所以咱们在学习 RocketMQ 的时候,会发现很多和 kafka 雷同的个性,然而在某些性能上和 kafka 又有较大的差别,它有以下一些个性:

  • 反对集群模型、负载平衡、程度扩大能力
  • 亿级别音讯沉积能力
  • 采纳零拷贝的原理,程序写盘,随机读
  • 底层通信框架采纳 Netty NIO
  • NameServer 代替 Zookeeper,实现服务寻址和服务协调
  • 音讯失败重试机制、音讯可查问
  • 强调集群无单点,可扩大,任意一点高可用,程度可扩大
  • 通过屡次双十一的考验

高可用架构

RocketMQ 天生对集群的反对十分好,它有以下一些模式:

单 Master

  • 长处:除了配置简略没什么长处
  • 毛病:不牢靠,该机器重启或者宕机,将要导致整个服务不可用

多 Master

  • 长处:配置简略,性能最高
  • 毛病:可能会有大量音讯失落(配置相干),单台机器重启或宕机期间,该机器下未被生产的音讯在机器复原前不可订阅,影响音讯实时性

多 Master 多 Slave

每个 Master 配一个 Slave,有多对 Master-Slave,集群采纳异步复制形式,主备有短暂音讯提早,毫秒级

  • 长处:性能同多 Master 简直一样,实时性高,主备间切换对利用通明,不需人工干预
  • 毛病:Master 宕机或磁盘损坏时会有大量音讯失落

多 Master 多 Slave

每个 Master 配一个 Slave,有多对 Master-Slave,集群采纳同步双写形式,主备都写胜利,向利用返回胜利

  • 长处:服务可用性与数据可用性十分高
  • 毛病:性能比异步集群略低,以后版本主宕备不能主动切换为主

二主二从异步集群装置

本文采纳的是二主二从装置模式,即第四种多 Master 多 Slave

端口布局

首先我买了两台云服务器,平时我会用来学习装置一些中间件,比拟不便,大家有条件的话也能够买下,当然也能够通过在本地装置虚拟机的形式来操作。

接下来我要通过这两台服务器来实现二主二从的装置,首先对它们的端口进行一下布局

 第一台机器  42.192.77.73
#端口布局:9876     NameServer1
10910    BrokerA-master
10921    BrokerB-slave
第二台机器  39.103.144.86
#端口布局:9876     NameServer2
10920    BrokerB-master
10911    BrokerA-slave

画图看上去更加清晰明了一些

下载

从官网 rocketmq.apache.org/ 进去取得最新的下载地址,红框里标注进去的

这里的地址都能够,下载下来

cd /jackxu
wget https://mirror.bit.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip

下载好后解压,改个名字

unzip rocketmq-all-4.8.0-bin-release.zip
mv unzip rocketmq-all-4.8.0-bin-release.zip rocketmq

配置第一台机器

在两台机器上都下载、解压好。在 rocketmq/conf 目录下,有三种倡议配置模式:

  • 2m-2s-async(2 主 2 从异步) —— 本文采纳这种
  • 2m-2s-sync (2 主 2 从同步)
  • 2m-noslave (2 主)

当初须要批改两台机器上 2m-2s-async 这个目录中的文件。在 42.192.77.73 机器上批改 broker-a.properties

cd /jackxu/rocketmq/conf/2m-2s-async
vim  broker-a.properties

批改集群名字

brokerClusterName=jackxu-cluster

减少的内容

#Broker 对外服务的监听端口
listenPort=10910
#是否容许 Broker 主动创立 Topic,倡议线下开启,线上敞开
autoCreateTopicEnable=true
#是否容许 Broker 主动创立订阅组,倡议线下开启,线上敞开
autoCreateSubscriptionGroup=true
#nameServer 地址,分号宰割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存储门路
storePathRootDir=/jackxu/rocketmq/store/broker-a
#commitLog 存储门路
storePathCommitLog=/jackxu/rocketmq/store/broker-a/commitlog
#生产队列存储门路存储门路
storePathConsumeQueue=/jackxu/rocketmq/store/broker-a/consumequeue
#音讯索引存储门路
storePathIndex=/jackxu/rocketmq/store/broker-a/index
#checkpoint 文件存储门路
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存储门路
abortFile=/jackxu/rocketmq/store/abort

批改 broker-b-s.properties

vim  broker-b-s.properties

批改集群名字

brokerClusterName=jackxu-cluster

减少的内容

#Broker 对外服务的监听端口
listenPort=10921
#是否容许 Broker 主动创立 Topic,倡议线下开启,线上敞开
autoCreateTopicEnable=true
#是否容许 Broker 主动创立订阅组,倡议线下开启,线上敞开
autoCreateSubscriptionGroup=true
#nameServer 地址,分号宰割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存储门路
storePathRootDir=/jackxu/rocketmq/store/broker-b-s
#commitLog 存储门路
storePathCommitLog=/jackxu/rocketmq/store/broker-b-s/commitlog
#生产队列存储门路存储门路
storePathConsumeQueue=/jackxu/rocketmq/store/broker-b-s/consumequeue
#音讯索引存储门路
storePathIndex=/jackxu/rocketmq/store/broker-b-s/index
#checkpoint 文件存储门路
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存储门路
abortFile=/jackxu/rocketmq/store/abort

配置第二台机器

在 39.103.144.86 机器上批改 broker-b.properties

cd /jackxu/rocketmq/conf/2m-2s-async
vim  broker-b.properties

批改集群名字

brokerClusterName=jackxu-cluster

减少的内容

#Broker 对外服务的监听端口
listenPort=10920
#是否容许 Broker 主动创立 Topic,倡议线下开启,线上敞开
autoCreateTopicEnable=true
#是否容许 Broker 主动创立订阅组,倡议线下开启,线上敞开
autoCreateSubscriptionGroup=true
#nameServer 地址,分号宰割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存储门路
storePathRootDir=/jackxu/rocketmq/store/broker-b
#commitLog 存储门路
storePathCommitLog=/jackxu/rocketmq/store/broker-b/commitlog
#生产队列存储门路存储门路
storePathConsumeQueue=/jackxu/rocketmq/store/broker-b/consumequeue
#音讯索引存储门路
storePathIndex=/jackxu/rocketmq/store/broker-b/index
#checkpoint 文件存储门路
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存储门路
abortFile=/jackxu/rocketmq/store/abort

批改 broker-a-s.properties

vim  broker-a-s.properties

批改集群名字

brokerClusterName=jackxu-cluster

减少的内容

#Broker 对外服务的监听端口
listenPort=10911
#是否容许 Broker 主动创立 Topic,倡议线下开启,线上敞开
autoCreateTopicEnable=true
#是否容许 Broker 主动创立订阅组,倡议线下开启,线上敞开
autoCreateSubscriptionGroup=true
#nameServer 地址,分号宰割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存储门路
storePathRootDir=/jackxu/rocketmq/store/broker-a-s
#commitLog 存储门路
storePathCommitLog=/jackxu/rocketmq/store/broker-a-s/commitlog
#生产队列存储门路存储门路
storePathConsumeQueue=/jackxu/rocketmq/store/broker-a-s/consumequeue
#音讯索引存储门路
storePathIndex=/jackxu/rocketmq/store/broker-a-s/index
#checkpoint 文件存储门路
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存储门路
abortFile=/jackxu/rocketmq/store/abort

创立数据目录

第一台机器 42.192.77.73 执行,只须要执行一次

mkdir -p /jackxu/rocketmq/store/broker-a /jackxu/rocketmq/store/broker-a/consumequeue /jackxu/rocketmq/store/broker-a/commitlog /jackxu/rocketmq/store/broker-a/index /jackxu/rocketmq/logs /jackxu/rocketmq/store/broker-b-s /jackxu/rocketmq/store/broker-b-s/consumequeue /jackxu/rocketmq/store/broker-b-s/commitlog /jackxu/rocketmq/store/broker-b-s/index

第二台机器 39.103.144.86 执行,只须要执行一次

mkdir -p /jackxu/rocketmq/store/broker-a-s /jackxu/rocketmq/store/broker-a-s/consumequeue /jackxu/rocketmq/store/broker-a-s/commitlog /jackxu/rocketmq/store/broker-a-s/index /jackxu/rocketmq/logs /jackxu/rocketmq/store/broker-b /jackxu/rocketmq/store/broker-b/consumequeue /jackxu/rocketmq/store/broker-b/commitlog /jackxu/rocketmq/store/broker-b/index

启动两个 NameServer

在两台机器别离执行,& 示意在后盾运行,默认状况下,nameserver 监听的是 9876 端口

nohup sh /jackxu/rocketmq/bin/mqnamesrv >/jackxu/rocketmq/logs/mqnamesrv.log 2>&1 &

查看日志

tail -f /jackxu/rocketmq/logs/mqnamesrv.log

启动 Broker

启动的时候依照上面的程序来,-c 是指定 broker 的配置文件

1、启动 73 的 A 主

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-a.properties > /jackxu/rocketmq/logs/broker-a.log 2>&1 &

2、启动 86 的 A 从

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties > /jackxu/rocketmq/logs/broker-a-s.log 2>&1 &

3、启动 86 的 B 主

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-b.properties > /jackxu/rocketmq/logs/broker-b.log 2>&1 &

4、启动 73 的 B 从

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties > /jackxu/rocketmq/logs/broker-b-s.log 2>&1 &

查看日志

tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-a.properties
tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties
tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-b.properties
tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties

查看是否启动胜利

输出 jps 命令,一共四个过程没问题

然而大多数状况下不会这么顺利,我在装置中有一些坑点:

  • 1、没有装置 jdk,因为这是我新的服务器,下面是没有 jdk 环境的,大家晓得 rocketmq 是用 java 写的,所以须要有 java 环境能力运行,包含 jps 命令就是查看 java 过程

  • 2、内存不足,因为默认的配置文件设置了很大的内存,然而我的机器只有 1 核 2G,必定是不够的,所以在启动的时候会报内存不足

解决办法就是批改配置文件

vim /jackxu/rocketmq/bin/runserver.sh
vim /jackxu/rocketmq/bin/runbroker.sh

把 NameServer 和 Broker 的内存大小都改小一点,而后重新启动即可

敞开命令

进行服务的时候须要留神,要先进行 broker,其次进行 nameserver。

cd /jackxu/rocketmq/bin
sh mqshutdown namesrv
sh mqshutdown broker

web 控制台装置

与 kafka 不同的是,rocket 官网提供了一个可视化控制台,大家能够在这里下载

https://github.com/apache/rocketmq-externals

这个是 rocketmq 的扩大,外面不仅蕴含控制台的扩大,也蕴含对大数据 flume、hbase 等组件的对接和扩大。

下载

下载源码,个别下载速度会比较慢,等不及的话能够去网盘下载链接:

cd /jackxu
wget https://github.com/apache/rocketmq-externals/archive/master.zip

解压

unzip master.zip

批改配置文件

cd /jackxu/rocketmq-externals-master/rocketmq-console/src/main/resources
vim application.properties
#这是一个 spring boot 我的项目,咱们须要批改外面的参数
#批改端口号:server.port=7298
#批改 name server 地址(多个地址用英文分号隔开)rocketmq.config.namesrvAddr=39.103.144.86:9876;42.192.77.73:9876

打包

打成一个 jar 包,这里须要先装置 maven,编译慢的话能够替换成淘宝的镜像

cd /jackxu/rocketmq-externals-master/rocketmq-console
mvn clean package -Dmaven.test.skip=true

启动 jar 包

cd target
java -jar rocketmq-console-ng-2.0.0.jar

拜访

拜访一下  http://42.192.77.73:7298/,能够看到都曾经启动胜利了

踩坑点

这里有两个踩坑点,在启动的时候会报错

  • (1)spring boot 启动的时候报连贯不上 39.103.144.86:9876;42.192.77.73:9876,这里我的第一反馈是防火墙的起因,敞开一下
systemctl disable firewalld.service 

再次启动还是不行,而后我的第二个反馈是端口没有凋谢,telnet 一下

telnet 42.192.77.73 9876

果然 telnet 不通,起因是这样的,我装置在云服务器上,默认端口是不凋谢的,须要到控制台关上,这也算是一个教训吧。

  • (2)再次启动的时候又报了另一个谬误,连贯不上 172.26.182.88:9876,过后我就奇怪了,我写的地址里没有这个地址啊,怎么在连贯它,而且这个 IP 看上去又像是内网地址,起初我关上阿里云控制台一看,果然是这台机器的内网地址,而后我又百度了一番,大略起因就是 RocketMQ 是阿里开源的,而那台机器又是阿里云的机器,它的源码里应该是优先连贯到阿里云的内网地址,网上的做法是在配置文件外面显式的加上公网地址即可解决。
# 新增公网 IP
brokerIP1=39.103.144.86

控制台介绍

  • 运维:次要是设置 nameserver 和配置 vipchannel。
  • 驾驶舱:控制台的 dashboard,能够别离按 broker 和主题来查看音讯的数量和趋势。
  • 集群:整个 RocketMQ 的集群状况,包含分片,编号,地址,版本,音讯生产和音讯生产的 TPS 等,这个在做性能测试的时候能够作为数据指标。
  • 主题:即 topic,能够新增 / 更新 topic,也能够查看 topic 的信息,如状态,路由,消费者治理和发送音讯等。
  • 消费者:能够在以后 broker 中查看 / 新建消费者 group,包含消费者信息和生产进度。
  • 生产者:能够在以后 broker 中查看生产组下的生产者 group,包含生产者信息和生产者状态。
  • 音讯:能够依照 topic,messageID,messageKey 别离查问具体的音讯。
  • 用户核心:切换语言和登录相干(登录须要在 console 的配置中关上对应配置,默认不须要登录)。

其中最罕用的是集群,主题,消费者和音讯这四局部。

配置文件阐明

上面介绍一下装置 RocketMQ 配置文件外面的属性首先是集群名字雷同,下面四台机器的集群名字都叫 brokerClusterName=jackxu-cluster,其次是连贯到雷同的 NameServer,namesrvAddr=39.103.144.86:9876;42.192.77.73:9876。在配置文件中 brokerId= 0 代表 master,brokerId= 1 代表 slave。

在配置文件中还有这两个属性

brokerRole 在 master broker 能够配置成 SYNC_MASTER 或者 ASYNC_MASTER,在 slave broker 对立配置成 SLAVE

流程图

咱们举荐的配置是异步刷盘 + 同步复制。

HA 与故障转移

在之前的版本中,RocketMQ 只有 master/slave 一种部署形式,一组 broker 中有一个 master,有 0 到多个 slave,这种模式下提供了肯定的高可用性。

master 在挂了的状况下,slave 依然能够提供读服务。默认状况下,读写都在 master 上,如果开启了 slaveReadEnable=true,slave 也能够参加读负载,然而是在 master 积压的音讯超过了物理内存的 40%,才会默认转向 brokerId 为 1 的从服务器读取,具体转向哪台机器由 whichBrokerWhenConsumeSlowly 参数管制。

org.apache.rocketmq.common.subscription.SubscriptionGroupConfig
private long whichBrokerWhenConsumeSlowly=1;

因为是多主的存在,当一个 master 挂了当前,能够写到其余的 master 上。

RocketMQ 2019 年 3 月公布的 4.5.0 版本中,利用 Dledger 技术解决了主动选主的问题。Dledger 就是一个基于 raft 协定的 commitlog 存储库,也是 RocketMQ 实现新的高可用多正本架构的要害。它的长处是不须要引入内部组件,主动选主逻辑集成到各个节点的过程中,节点之间通过通信就能够实现选主。

架构图

在这种状况下,commitlog 是 Dledger 治理的,具备选主的性能。默认是不开启,如果须要开启,须要在配置文件外面增加以下配置:

 # 是否启用 DLedger
    enableDLegerCommitLog=true
    # DLedger Raft Group 的名字
    dLegerGroup=broker-a
    # DLedger Group 内各节点的地址和端口,至多须要 3 个节点
    dLegerPeers=n0-192.168.44.163:10911;n1-192.168.44.164:10911;n2-192.168.44.165:10911
    # 本节点 id
    dLegerSelfId=n0

结语

小伙伴在学习一个中间件的时候肯定要入手实际装置,首先是体验一下装置的过程气氛,理解一些参数配置,尽管咱们平时可能接触不到,然而学习还是须要的,不肯定须要精,至多是要会。

起源:jack_xu | https://juejin.cn/post/692950…

退出移动版