RocketMQ运行版本下载地址: https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
RocketMQ源码版本下载地址: https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/rocketmq-all-4.7.1-source-release.zipjava
单机版rocketMQ安装linux
前提:确保linux已安装jdk,由于rocketMQ依赖javaapache
①:安装jdk(如已安装请忽略)centos
# 1.解压jdk tar -zxvf jdk-8u171-linux-x64.tar.gz # 2.打开环境变量 vi ~/.bash_profile # 3.配置环境变量 export JAVA_HOME=/app/jdk1.8/ PATH=$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin export PATH
编辑完成后,执行 source ~/.bash_profile让环境变量生效。安全
# 3.生效环境变量 source ~/.bash_profile
输入java -version能查看到如下内容代表JDK安装成功了。bash
[oper@worker1 ~]$ java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
②:安装RocketMQ服务器
rocketrMQ经过ftp上传到linux自定义目录后,须要把rocketmq的bin目录也配置到环境变量中app
# 1.打开环境变量 vi ~/.bash_profile # 2.新增RocketMQ后的环境变量 export JAVA_HOME=/app/jdk1.8/ export ROCKETMQ_HOME=/app/rocketmq/rocketmq-all-4.7.1-bin-release //新增RocketMQ PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin //配置进去 export PATH
一样不要忘了生效环境变量异步
# 3.生效环境变量 source ~/.bash_profile
注意:这个ROCKETMQ_HOME的环境变量是必需要单独配置的,若是不配置的话,启动NameSever和Broker都会报错。jvm
这个环境变量的做用是用来加载 $ROCKETMQ_HOME/conf 下的除broker.conf之外的几个配置文件。因此实际状况中,能够不按这个配置,可是必定要能找到配置文件。
③:启动NameServer
要启动RocketMQ服务,须要先启动NameServer。启动NameServer很是简单, 在$ROCKETMQ_HOME/bin目录下有个mqnamesrv。直接执行这个脚本就能够启动RocketMQ的NameServer服务。
注意:RocketMQ默认预设的JVM内存是4G,这是RocketMQ给咱们的最佳配置。可是一般咱们用虚拟机的话都是不够4G内存的,因此须要调整下JVM内存大小。修改的方式是直接修改runserver.sh。 用vi runserver.sh编辑这个脚本,在脚本中找到这一行调整内存大小为512M
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m - XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改后以下:
而后咱们用静默启动的方式启动NameServer服务:
nohup bin/mqnamesrv &
启动完成后,在nohup.out里看到这一条关键日志就是启动成功了。而且使用jps指令能够看到有一个NamesrvStartup进程。
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release. The Name Server boot success. serializeType=JSON
④:启动Broker
启动Broker的脚本是bin目录下的runbroker.sh。Broker的默认预设内存是8G,启动前,若是内存不够,一样须要调整下JVM内存。vi runbroker.sh,找到这一行,进行内存调整,与namserver相似
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
以下所示:
而后须要找到$ROCKETMQ_HOME/conf/broker.conf, vi指令进行编辑,在最下面加入一个配置:表明自动建立topic
# 自动建立Topic设置 autoCreateTopicEnable=true
而后也以静默启动的方式启动runbroker.sh
nohup ./bin/mqbroker &
启动完成后,一样是检查nohup.out日志,有这一条关键日志就标识启动成功了。 而且jps指令能够看到一个BrokerStartup进程。
The broker[worker1, 192.168.232.128:10911] boot success. serializeType=JSON
注意:在观察runserver.sh和runbroker.sh时,咱们还能够查看到其余的JVM执行参数,这些参数均可以进行定制。例如咱们观察到一个比较有意思的地方,nameServer使用的是CMS垃圾回收器,而Broker使用的是G1垃圾回收器
⑤:验证
因为rocketmq是java写的,因此使用 jps 命令若是能够查看到有nameserver、broker进程就说明启动成功
另外,在RocketMQ的安装包中,提供了一个tools.sh工具能够用来在命令行快速验证RocketMQ服务。
首先须要配置一个环境变量NAMESRV_ADDR指向咱们启动的NameServer服务。
export NAMESRV_ADDR='localhost:9876'
而后启动消息生产者发送消息脚本:默认会发1000条消息
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
看到下面的内容表明发送成功!
而后启动消费者消费消息
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
看到以下打印,表明消费者消费成功
这个Consume指令并不会结束,他会继续挂起,等待消费其余的消息。咱们可使用CTRL+C中止该进程。
⑥:关闭RocketMQ服务
# 1.关闭NameServer sh bin/mqshutdown namesrv # 2.关闭Broker sh bin/mqshutdown broker
至此,roicketMQ单机版安装并测试完成
克隆两台虚拟机,模拟集群环境,点此查看克隆教程。一样的,在两台虚拟机上都要安装 jdk 和 rockeMQ,并配置环境变量,此过程跟单机环境同样。为了便于观察,此次搭建一个2主2从异步刷盘的集群,因此咱们会使用conf/2m-2s-async下的配置文件,实际项目中,为了达到高可用,通常会使用dleger。这些原始的集群配置文件在RocketMQ安装时已默认生成,咱们只需修改配置文件。内部预备设计的集群状况以下:
机器名 | nemaeServer节点部署 | broker节点部署 |
---|---|---|
centos7 - 主机 | nameserver | |
centos7 - chunjing | nameserver | broker-a, broker-b-s |
centos7 - clone1 | nameserver | broker-b,broker-a-s |
集群方案解读以下:
配置集群时可使用RocketMQ安装时已默认生成的文件,进入rocketmq的config目录下能够看到rocketmq建议的各类配置方式:
conf目录结构以下:
当前咱们选择的方案为2主2从异步刷盘: 2m-2s-async,其目录结构以下:
集群方案设计完毕后,接下来进行具体的搭建步骤:
①:安装 jdk ,如上,省略
②:安装RocketMQ ,如上,省略
③:在 centos7 - chunjing 机器上,配置第一组 broker-a主节点
编辑 2m-2s-async/broker-a.properties 文件
broker - a 主节点配置以下: #所属集群名字,名字同样的节点就在同一个集群内 brokerClusterName=rocketmq-cluster #broker名字,名字同样的节点就是一组主从节点。 brokerName=broker-a #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=0 #nameServer地址,分号分割 namesrvAddr=192.168.100.100:9876;192.168.100.103:9876;192.168.100.104:9876 #在发送消息时,自动建立服务器不存在的topic,默认建立的队列数 defaultTopicQueueNums=4 #是否容许 Broker 自动建立Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否容许 Broker 自动建立订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=10911 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=120 #commitLog每一个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每一个文件默认存30W条,根据业务状况调整 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/tuling/rocketMQ/store #commitLog 存储路径 storePathCommitLog=/tuling/rocketMQ/store/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/tuling/rocketMQ/store/consumequeue #消息索引存储路径 storePathIndex=/tuling/rocketMQ/store/index #checkpoint 文件存储路径 storeCheckpoint=/tuling/rocketMQ/store/checkpoint #abort 文件存储路径 abortFile=/tuling/rocketMQ/store/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=ASYNC_MASTER #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #这一个参数是代表RocketMQ内部用来发送消息的线程池的线程数量是16个, #其实这个参数能够根据机器的CPU核心数进行适当调整 #例如若是你的机器核心数超过16个,就能够把这个参数适当调大。 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128
④:在 centos7 - clone1 机器上,配置第一组 broker-a-s 从节点
编辑 2m-2s-async/broker-a-s.properties 文件,只须要修改brokerId,brokerRole和listenPort 便可
broker - a - s 配置以下 #所属集群名字,名字同样的节点就在同一个集群内 brokerClusterName=rocketmq-cluster #broker名字,名字同样的节点就是一组主从节点。 brokerName=broker-a #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=1 #nameServer地址,分号分割 namesrvAddr=192.168.100.100:9876;192.168.100.103:9876;192.168.100.104:9876 #在发送消息时,自动建立服务器不存在的topic,默认建立的队列数 defaultTopicQueueNums=4 #是否容许 Broker 自动建立Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否容许 Broker 自动建立订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=11011 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=120 #commitLog每一个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每一个文件默认存30W条,根据业务状况调整 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/tuling/rocketMQ/storeSlave #commitLog 存储路径 storePathCommitLog=/tuling/rocketMQ/storeSlave/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/tuling/rocketMQ/storeSlave/consumequeue #消息索引存储路径 storePathIndex=/tuling/rocketMQ/storeSlave/index #checkpoint 文件存储路径 storeCheckpoint=/tuling/rocketMQ/storeSlave/checkpoint #abort 文件存储路径 abortFile=/tuling/rocketMQ/storeSlave/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=SLAVE #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128
⑤:在 centos7 - clone1 机器上,配置第一组 broker-b 主节点
编辑 2m-2s-async/broker-b.properties 文件
broker - b 配置以下 #所属集群名字,名字同样的节点就在同一个集群内 brokerClusterName=rocketmq-cluster #broker名字,名字同样的节点就是一组主从节点。 brokerName=broker-b #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=0 #nameServer地址,分号分割 namesrvAddr=192.168.100.100:9876;192.168.100.103:9876;192.168.100.104:9876 #在发送消息时,自动建立服务器不存在的topic,默认建立的队列数 defaultTopicQueueNums=4 #是否容许 Broker 自动建立Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否容许 Broker 自动建立订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=10911 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=120 #commitLog每一个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每一个文件默认存30W条,根据业务状况调整 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/tuling/rocketMQ/store #commitLog 存储路径 storePathCommitLog=/tuling/rocketMQ/store/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/tuling/rocketMQ/store/consumequeue #消息索引存储路径 storePathIndex=/tuling/rocketMQ/store/index #checkpoint 文件存储路径 storeCheckpoint=/tuling/rocketMQ/store/checkpoint #abort 文件存储路径 abortFile=/tuling/rocketMQ/store/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=ASYNC_MASTER #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128
⑥:在 centos7 - chunjing 机器上,配置第一组 broker-b-s 主节点
编辑 2m-2s-async/broker-b-s.properties 文件
broker - b - s 配置以下 #所属集群名字,名字同样的节点就在同一个集群内 brokerClusterName=rocketmq-cluster #broker名字,名字同样的节点就是一组主从节点。 brokerName=broker-b #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=1 #nameServer地址,分号分割 namesrvAddr=192.168.100.100:9876;192.168.100.103:9876;192.168.100.104:9876 #在发送消息时,自动建立服务器不存在的topic,默认建立的队列数 defaultTopicQueueNums=4 #是否容许 Broker 自动建立Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否容许 Broker 自动建立订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=11011 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=120 #commitLog每一个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每一个文件默认存30W条,根据业务状况调整 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/tuling/rocketMQ/storeSlave #commitLog 存储路径 storePathCommitLog=/tuling/rocketMQ/storeSlave/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/tuling/rocketMQ/storeSlave/consumequeue #消息索引存储路径 storePathIndex=/tuling/rocketMQ/storeSlave/index #checkpoint 文件存储路径 storeCheckpoint=/tuling/rocketMQ/storeSlave/checkpoint #abort 文件存储路径 abortFile=/tuling/rocketMQ/storeSlave/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=SLAVE #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #checkTransactionMessageEnable=false #发消息线程池数量 #sendMessageThreadPoolNums=128 #拉消息线程池数量 #pullMessageThreadPoolNums=128
须要注意的配置项:
启动RocketMQ
①:先启动nameServer
如单机版配置同样,修改三个节点上的bin/runserver.sh,调整里面的jvm内存配置。找到下面这一行调整下内存
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
直接在三个节点上启动nameServer。
nohup bin/mqnamesrv &
启动成功标志:进入bin同级目录的 nohub.out 文件中看到以下图,表示启动成功!
或者使用 jps 查看有nameServer进程便可:
②:再启动broker
启动broker是使用的mqbroker指令,只是注意启动broker时须要经过-c 指定对应的配置文件。同时也要注意若是linux配置过小,不知足rocketmq的默认内存大小,须要手动进入 bin/runbroker.sh 中修改一下启动参数,不然启动会报错,修改以下
# 在centos7-chunjing 机器上启动broker-a的master节点和broker-b的slave节点 nohup ./mqbroker -c ../conf/2m-2s-async/broker-a.properties & nohup ./mqbroker -c ../conf/2m-2s-async/broker-b-s.properties &
# 在centos7-clone1 机器上启动broker-b的master节点和broker-a的slave节点 nohup ./mqbroker -c ../conf/2m-2s-async/broker-b.properties & nohup ./mqbroker -c ../conf/2m-2s-async/broker-a-s.properties &
注意:启动slave时,若是遇到报错 Lock failed,MQ already started ,那是由于有多个实例共用了同一个storePath形成的,这时就须要调整store的路径。
启动成功标志:进入bin/nobub.out文件中能够看到下图表示成功。
也可以使用jps查看进程确认是否成功!
命令行快速验证
指定NameServer地址,能够配置一个环境变量NAMESRV_ADDR,这样默认会读取这个NameServer地址。能够配到.bash_profile里或者直接临时指定。
# 添加环境变量 export NAMESRV_ADDR='worker1:9876;worker2:9876;worker3:9876' # 生效环境变量 source ~/.bash_profile
# 发送消息:默认会发1000条消息 bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
# 接收消息: bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
经过上面那种方式,咱们搭建了一个主从结构的RocketMQ集群,可是咱们要注意,这种主从结构是只作数据备份,没有容灾功能的。也就是说当一个master节点挂了后,slave节点是没法切换成master节点继续提供服务的。注意这个集群至少要是3台,容许少于一半的节点发生故障。而若是要进行高可用的容灾备份,须要采用Dledger的方式来搭建高可用集群。注意,这个Dledger须要在RocketMQ4.5之后的版本才支持,咱们使用的4.7.1版本已经默认集成了dledger。
要搭建高可用的Broker集群,咱们只须要配置conf/dleger下的配置文件就行。这种模式是基于Raft协议的,是一个相似于Zookeeper的paxos协议的选举协议,也是会在集群中随机选举出一个leader,其余的就是follower。只是他选举的过程跟paxos有点不一样。Raft协议基于随机休眠机制的,选举过程会比paxos相对慢一点。
首先:咱们一样是须要修改runserver.sh和runbroker.sh,对JVM内存进行定制。
而后:咱们须要修改conf/dleger下的配置文件。 跟dleger相关的几个配置项以下:
配置项 | 含义 | 配置值 |
---|---|---|
enableDLegerCommitLog | 是否启动 DLedger | true |
dLegerGroup | DLedger Raft Group的名字,建议和 brokerName 保持一致 | RaftNode00 |
dLegerPeers | DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必需要保证一致 | n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913 |
dLegerSelfId | 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要惟一 | n0 |
sendMessageThreadPoolNums | 发送线程个数,建议配置成 Cpu 核数 | 16 |
conf/dleger目录以下:
配置完后,一样是使用 nohup bin/mqbroker -c $conf_name & 的方式指定实例文件来启动。
注意:
RocketMQ源代码中并无提供控制台,可是有一个Rocket的社区扩展项目中提供了一个控制台,
下载下来后,进入其中的rocket-console目录,使用maven进行编译
mvn clean package -Dmaven.test.skip=true
编译完成后,获取target下的jar包,就能够直接执行。可是这个时候要注意,在这个项目的application.properties中须要指定nameserver的地址。默认这个属性是空的。那咱们能够在jar包的当前目录下增长一个application.properties文件,覆盖jar包中默认的一个属性:
rocketmq.config.namesrvAddr=192.168.100.100:9876;192.168.100.103:9876;192.168.100.104:9876
而后执行:
java -jar rocketmq-console-ng-1.0.1.jar
启动完成后,能够访问 http://ip:8080看到管理页面 以下所示: