RocketMQ介绍
概述
Apache RocketMQ是一个具有低延迟、高性能和高可靠性、万亿级容量,同时具备灵活的、可伸缩性强的分布式消息流处理平台,它由四个部分组成:name servers, brokers, producers 和 consumers。它们所有部分都可以水平扩展避免单点故障,就像上图所示。
名称服集群务 NameServer cluster
NameServer服务提供了轻量级的服务发现和路由。每个NameServer服务记录完整的路由信息,提供一致的读写服务,支持快速存储扩展
代理服务集群 Broker Cluster
Broker通过提供轻量级主题和队列机制来处理消息存储。它们支持Push和Pull模型,包含容错机制(2个副本或3个副本),提供了极强的峰值处理里能力和按照时间顺序存储数以百万记的消息存储能力,此外,代理提供了灾难恢复、丰富的度量统计和警报机制,这些都是在传统的消息传递系统中缺乏的
生产者集群 Producer Cluster
produce支持分布式部署,分布式的produce通过broker集群提供的各种负载均衡策略将消息发送到broker集群中。发送过程支持快速失败是低延迟的。
消费者集群 Consumer Cluster
消费者也支持在推送或者拉取模式下分布式部署,它还支持集群消费和消息广播。提供实时的消息订阅机制,能够满足大多数消费者的需求。RocketMQ的网站为感兴趣的用户提供了一个简单的快速入门指南。
名称服务NameServer
NameServer是一个功能齐全的服务器,主要包括两个功能:
⊙broker 管理,nameserver 接受来自broker集群的注册信息并提供心跳来检测他们是否可用。
⊙路由管理,每一个nameserver都持有关于broker集群和队列的全部路由信息,用来向客户端提供查询。
我们知道 ,rocketMQ客户端(生产者/消费者)会从nameserver查询队列的路由信息,客户端是如何知道nameserver的地址的呢?
有四种方式能够让客户端获取到nameserver的地址:
⊙通过程序,像这样producer.setNamesrvAddr("ip:port")
⊙java 配置项,这么用rocketmq.namesrv.addr
⊙环境变量 NAMESRV_ADDR
⊙HTTP 端点
更多关于nameserver地址发现的详细信息请参考这里
代理服务 broker server
broker server负责消息的存储传递,消息查询,保证高可用等等。
像下图所示,broker server有一些非常重要的子模块:
⊙remoting(远程) 模块,broker的入口,处理从客户端发起的请求。
⊙client manager(客户端管理),管理各个客户端(生产者/消费者)还有维护消费者主题订阅。
⊙store(存储服务),提供简单的api来在磁盘保持或者查询消息。
⊙HA 高可用服务,提供主从broker的数据同步。
⊙index(索引服务),为消息建立索引提供消息快速查询。
RocketMQ与其他消息队列服务的区别
如下图,列出了 ActiveMQ、Kafka、RocketMQ 三者的区别,详见官方文档
服务器规划
如下表,准备两台服务器,互为主备:
RocketMQ环境准备
1、设置主机hosts
echo "192.168.2.177 rocketmq-nameserver1" >> /etc/hosts echo "192.168.2.177 rocketmq-master1" >> /etc/hosts echo "192.168.2.178 rocketmq-nameserver2" >> /etc/hosts echo "192.168.2.178 rocketmq-master2" >> /etc/hosts
2、准备 JAVA 环境
下载 JAVA 安装包:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
解压下载的 jdk 包到 /usr/local 目录,并配置环境变量
[root@rocketmq-nameserver1 ~]# vim .bash_profile export JAVA_HOME=/usr/local/jdk1.8.0_201 export PATH=$PATH:$JAVA_HOME/bin
3、准备 Maven 环境
下载 Maven 安装包:http://maven.apache.org/download.cgi
下载 bin 包,则直接解压到 /use/local 目录,再修改环境变量
[root@rocketmq-nameserver1 ~]# vim .bash_profile export JAVA_HOME=/usr/local/jdk1.8.0_201 export M2_HOME=/usr/local/maven3 export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
RocketMQ部署
下载 RocketMQ 安装包:http://rocketmq.apache.org/dowloading/releases/
解压所下载的 RocketMQ 安装包,进行编译
[root@rocketmq-nameserver1 rocketmq-all-4.4.0]# mvn -Prelease-all -DskipTests clean install –U
此过程受限于网络状况,有可能非常缓慢,请耐心等待。。。。。。
编译完成之后,进入 distribution/target/ 目录,将该目录下的 apache-rocketmq 目录整个复制到 /usr/local 目录下
[root@rocketmq-nameserver1 rocketmq-all-4.4.0]# cd distribution/target/ [root@rocketmq-nameserver1 target]# cp -raf apache-rocketmq /usr/local/rocketmq
进入 /usr/local/rocketmq/conf 目录,修改日志配置文件,将配置文件中的相关日志路径修改为自己设置的路径
[root@rocketmq-nameserver1 conf]# vim logback_broker.xml [root@rocketmq-nameserver1 conf]# vim logback_namesrv.xml [root@rocketmq-nameserver1 conf]# vim logback_tools.xml
再进入 2m-2s-async 目录(注意:这里一共三个目录,2m-2s-async为多主多异步复制预配置文件目录,2m-2s-sync为多主多从同步双写预配置文件目录,2m-noslave为双主预配置文件目录),修改 broker 配置文件
[root@rocketmq-nameserver1 2m-2s-async]# vim broker-a.properties brokerClusterName=rocketmq-cluster brokerName=broker-a brokerId=0 brokerIP1=192.168.2.177 brokerIP2=192.168.2.177 listenPort=10911 storePathRootDir=/wdata/rocketmq/store storePathCommitLog=/wdata/rocketmq/store/commitlog namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH
保存退出
[root@rocketmq-nameserver1 2m-2s-async]# vim broker-a-s.properties brokerClusterName=rocketmq-cluster brokerName=broker-a brokerId=1 brokerIP1=192.168.2.178 brokerIP2=192.168.2.178 listenPort=10920 storePathRootDir=/wdata/rocketmq/store-a-s storePathCommitLog=/wdata/rocketmq/store-a-s/commitlog namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 deleteWhen=04 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH
保存退出
[root@rocketmq-nameserver1 2m-2s-async]# vim broker-b.properties brokerClusterName=rocketmq-cluster brokerName=broker-b brokerId=0 brokerIP1=192.168.2.178 brokerIP2=192.168.2.178 listenPort=10911 storePathRootDir=/wdata/rocketmq/store storePathCommitLog=/wdata/rocketmq/store/commitlog namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH
保存退出
[root@rocketmq-nameserver1 2m-2s-async]# vim broker-b-s.properties brokerClusterName=rocketmq-cluster brokerName=broker-b brokerId=1 brokerIP1=192.168.2.177 brokerIP2=192.168.2.177 listenPort=10920 storePathRootDir=/wdata/rocketmq/store-b-s storePathCommitLog=/wdata/rocketmq/store-b-s/commitlog namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 deleteWhen=04 fileReservedTime=48 brokerRole=SLAVE flushDiskType=ASYNC_FLUSH
保存退出
注意:这里的 brokerId 格式为主0从1
进入 /usr/local/rocketmq/bin ,修改 JAVA 虚拟机运行的所占用的内存(这里主要看服务器配置,如果服务器配置较差,建议修改)
[root@rocketmq-nameserver1 bin]# vim runbroker.sh
[root@rocketmq-nameserver1 bin]# vim runserver.sh
修改为上图中红框中所示的内容
编辑 namesrv 服务的配置文件(此步可以忽略,采用系统默认的配置)
[root@rocketmq-nameserver1 conf]# vim /wdata/rocketmq/namesrv/namesrv.conf rocketmqHome=/usr/local/rocketmq kvConfigPath=/wdata/rocketmq/namesrv/kvConfig.json configStorePath=/wdata/rocketmq/namesrv/namesrv.properties productEnvName=center clusterTest=false orderMessageEnable=false listenPort=9876 serverWorkerThreads=8 serverCallbackExecutorThreads=0 serverSelectorThreads=3 serverOnewaySemaphoreValue=256 serverAsyncSemaphoreValue=64 serverChannelMaxIdleTimeSeconds=120 serverSocketSndBufSize=65535 serverSocketRcvBufSize=65535 serverPooledByteBufAllocatorEnable=true useEpollNativeSelector=false
主要修改相关的目录以及端口号,其他想不用管
说明:以上配置中所涉及的字段含义,详情请参阅官方文档,这里不错过多说明。
复制文件
将 192.168.2.177 上 /usr/local/rocketmq 整个目录复制到 192.168.2.178 上。
[root@rocketmq-nameserver1 local]# scp -r rocketmq [email protected]:/usr/local/ [root@rocketmq-nameserver1 local]# scp -r /wdata/rocketmq [email protected]:/wdata/
此处操作为了方便起见,如果不是很放心,可在另外一台服务器上做上述同样的操作。
启动 RocketMQ
在 192.168.2.177上操作
[root@rocketmq-nameserver1 ~]# nohup /usr/local/rocketmq/bin/mqnamesrv -c /wdata/rocketmq/namesrv/namesrv.conf 2>&1 & [root@rocketmq-nameserver1 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-a.log 2>&1 & [root@rocketmq-nameserver1 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-b-s.log 2>&1 &
在 192.168.2.178 上操作
[root@rocketmq-nameserver2 ~]# nohup /usr/local/rocketmq/bin/mqnamesrv -c /wdata/rocketmq/namesrv/namesrv.conf 2>&1 & [root@rocketmq-nameserver2 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-b.log 2>&1 & [root@rocketmq-nameserver2 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-a-s.log 2>&1 &
到此,RocketMQ 集群部署完成,为了查看集群的状态,我们可以使用 github 上的图形化开源工具 rocketmq-console 。
下载 rocketmq-console :https://github.com/apache/rocketmq-externals
解压并进入 rocketmq-console 目录,进行编译
[root@rocketmq-nameserver1 opt]# cd rocketmq-externals-master/rocketmq-console/
在编译之前,需要先修改该目录下的 pom.xml 文件
[root@rocketmq-nameserver1 rocketmq-console]# vim pom.xml
将上图中红框内的
编译
[root@rocketmq-nameserver1 rocketmq-console]# mvn clean package -Dmaven.test.skip=true
此过程较为漫长,需耐心等待。。。。。。
等编译完成之后,进入 target/ 目录
[root@rocketmq-nameserver1 rocketmq-console]# cd target/
运行 rocketmq-console-ng-1.0.0.jar 包
[root@rocketmq-nameserver1 target]# java -jar rocketmq-console-ng-1.0.0.jar
如上图,出现 Tomcat started on port(s): 8080 (http) 表示服务开启成功。
然后我们在浏览器中输入 192.168.1.177:8080 查看
如图,出现两主两从,表示我们的集群配置成功