如下部署方式结合众多博友的博客,通过本身一步一步实际搭建,若有雷同,侵权行为,请见谅。。。其中遇到很多的坑,但愿能帮到更多的人,如今不多能找到一份完整版4.2.6版本的搭建教程了,若是你有幸碰见,那么咱们一定前世有缘。进入正题……java
首先,官方推荐有三种部署方式: linux
一个集群无Slave,全是Master,例如2个Master或者3个Master
优势:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即便机器宕机不可恢复状况下,因为RAID10磁盘很是可靠,消息也不会丢(异步刷盘丢失少许消息,同步刷盘一条不丢)。性能最高。
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复以前不可订阅,消息实时性会受到受到影响。缓存
每一个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。
优势:即便磁盘损坏,消息丢失的很是少,且消息实时性不会受影响,由于Master宕机后,消费者仍然能够从Slave消费,此过程对应用透明。不须要人工干预。性能同多Master模式几乎同样。
缺点:Master宕机,磁盘损坏状况,会丢失少许消息。服务器
每一个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功。
优势:数据与服务都无单点,Master宕机状况下,消息无延迟,服务可用性与数据可用性都很是高
缺点:性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。异步
注意:jvm
一、上述“2”只是说做为一个集群的最低配置数量,能够根据实际状况扩展。async
二、全部的刷盘(Dish Flush)操做所有默认为:ASYNC_FLUSH(异步刷盘)。性能
核心概念:测试
Disk Flush(磁盘刷新/同步操做):就是将内存的数据落地,存储在磁盘中。spa RocketMQ提供了如下两种模式: SYNC_FLUSH(同步刷盘):生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,可是有很大的磁盘IO开销,性能有必定影响。 ASYNC_FLUSH(异步刷盘):生产者发送的每一条消息并非当即保存到磁盘,而是暂时缓存起来,而后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种状况:1是按期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行刷盘。这种方式会存在消息丢失(在还将来得及同步到磁盘的时候宕机),可是性能很好。默认是这种模式。
|
环境: JDK1.8 java version "1.8.0_171" +虚拟机2台(至少)+rocketmq-all-4.2.0-bin-release.zip
|
一、单Master
# unzip -o rocketmq-all-4.2.0-bin-release.zip -d rocketmq1 (须要指定目录) # cd /ulic/rocketmq1 # nohup sh bin/mqnamesrv & #启动namesrv # tail -f ~/logs/rocketmqlogs/namesrv.log
# nohup sh bin/mqbroker -n 10.18.3.21:9876 & #启动broker # tail -f ~/logs/rocketmqlogs/broker.log # jps # 检查是否成功启动namesrv和broker 注意:启动mqbroker时须要确保主机有足够的内存,官方默认设置的-Xms8g -Xmx8g -Xmn4g都比较大; runBroker.sh中更改 JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m" runserver.sh中更改: JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" |
中止命令: (启动先namesrv,再broker;中止先broker,再namesrv)
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
二、双Master
序号 ip 用户名 密码 角色 模式 (1) 10.43.98.34 root nameServer1,brokerServer1 Master1 (2) 10.43.98.38 root nameServer1,brokerServer1 Master2 |
一、Host添加信息
对两台机器都执行vi /etc/hosts,将nameServer和broker部署在同一台机器上的,也能够分开部署。 输入以下图所示的信息
重启网卡:service network restart(可省略)
相互ping一下,在34机器上ping 10.43.98.38
# ping rocketmq-nameserver2
# ping rocketmq-master2
|
二、建立数据存储路径(两台机器都要建立)(为方便后面集群部署,最好设置,不设置也能够成功部署)
任意你想设置保存位置的目录下来存储产生的数据的,我是/rocketmq1目录下 mkdir store mkdir store/commitlog mkdir store/consumerqueue mkdir store/index |
三、修改conf下RocketMQ的配置文件:(34机器)broker-a.properties (38机器)broker-b.properties
brokerClusterName=DefaultCluster |
brokerClusterName=DefaultCluster namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 |
主要配置这些也能够,详细能够自行根据须要补全,好比文件保存路径配置等…… |
详细配置文件可参考:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不一样的配置文件填写的不同
brokerName=broker-a|broker-b
#0 表示 Master, >0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动建立服务器不存在的topic,默认建立的队列数
defaultTopicQueueNums=4
#是否容许 Broker 自动建立Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否容许 Broker 自动建立订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 0点
deleteWhen=00
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每一个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每一个文件默认存30W条,根据业务状况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/opt/rocketmq/data
#commitLog 存储路径
storePathCommitLog=/opt/rocketmq/data/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/opt/rocketmq/data/consumequeue
#消息索引存储路径
storePathIndex=/opt/rocketmq/data/index
#checkpoint 文件存储路径
storeCheckpoint=/opt/rocketmq/data/checkpoint
#abort 文件存储路径
abortFile=/opt/rocketmq/data/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 |
由于有两个master主节点,因此主节点1启动依赖broker-a.properties,主节点2启动依赖broker-b.properties,若是是三个Master,那么还会有一个broker-c.properties,以此类推。brokerId=0表示是master,大于0则表示是slave;
另外BrokerName=broker-a要对应;在34机器上是broker-a,在第二台机器38上则是broker-b。分别在34和38上修改broker-a.properties和broker-b.properties。
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876。这个要和以前配置的名称相互对应。
三、 修改日志配置文件(略,可参考)
修改日志配置文件
在建立的软链接文件夹rocketmq下建立一个logs目录 mkdir /opt/rocketmq/logs
而后执行cd /opt/rocketmq/conf && sed -i 's#${user.home}#/opt/rocketmq#g' *.xml进行日志文件的替换,sed是linux的替换命令。两台机器一样操做。
四、 修改启动脚本参数(JVM参数的调优)
1)broker的调优 vi /opt/rocketmq/bin/runbroker.sh JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m - XX:PermSize=128m -XX:MaxPermSize=320m" 2)nameserver的调优 vi /opt/rocketmq/bin/runserver.sh JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m - XX:PermSize=128m -XX:MaxPermSize=320m" |
将nameServer和broker放在了同一台机器上,因此须要分别对nameServer和broker进行jvm的性能调优。生产环境默认便可不要修改 |
启动两台机器的NameServer:先启动两台机器的NameServer,再启动两台机器的Borker,关机的时候顺序相反,先关闭两台机器的Broker,再关闭两台机器的Nameserver。
# cd /opt/rocketmq/bin # nohup sh mqnamesrv & 上面这条命令nohup是起一个守护线程。 # jps 查看进程 # tail -f -n 500 /opt/rocketmq/logs/rocketmqlogs/broker.log # tail -f -n 500 /opt/rocketmq/logs/rocketmqlogs/namesrv.log |
mqadnin是管理员命令,mqfiltersrv是rocketmq的单独组件,mqnamesrv是NameServer,mqbroker是Broker。 |
启动BrokerServer A 10.43.98.34和BrokerServer B 10.43.98.38
启动BrokerServer A 10.43.98.34 # nohup sh mqbroker -c /opt/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 & netstat -ntlp # jps # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
启动BrokerServer B 10.43.98.38 nohup sh mqbroker -c /opt/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null 2>&1 & netstat -ntlp # jps # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
|
成功启动后,经过mqadmin命令或者rocketmq-console监控界面查看,是否部署成功。。。
三、双Master+双Slave-Async
实际能够准备4台服务器,每台上面部署1个;
参考:RocketMQ环境搭建(双master双slave模式)
因资源有限,同一台机器部署两个节点,broker-a的主节点与broker-b的从节点部署在一台服务器,broker-a的从节点与broker-b的主节点部署在一台服务器(交叉部署实现HA)。
注:同一台机器部署两个broker时,必定要注意,在配置文件中配置:
若原broker-a.properties中配置:
listenPort=10911 //默认
storePathRootDir=/opt/logs/rocketmqlogs/store
storePathCommitLog=/opt/logs/rocketmqlogs/store /commitlog //日志存放目录
则broker-b-s.properties中配置(不能有冲突)
listenPort=10915 //默认:10911 更改端口号,同一台机器上两个broker不可采用同一端口,且端口号间隔2个以上(经测试10913不可启动)
storePathRootDir=/opt/logs/rocketmqlogs/store-b-s
storePathCommitLog=/opt/logs/rocketmqlogs/store-b-s /commitlog //日志存放目录
否则,会发现1台机器只能启动一个broker。。。。
主:192.168.151.131 从 192.168.151.132
1. 修改主从hosts文件
vi /etc/hosts 加入
192.168.153.131 rocketmq.master
192.168.153.132 rocketmq.slave
2. 修改mq配置文件采用异步复制 2m-2s-async
192.168.151.131 上的配置
(1)broker-a.properties(broker-a的master配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876 //所关联的namesrv地址
brokerClusterName=FusionCluster //集群名称
brokerName=broker-a
brokerId=0 //0表明主
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER //角色
flushDiskType=ASYNC_FLUSH //异步刷盘
storePathRootDir=/opt/logs/rocketmqlogs/store
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog //日志存放目录
(2)broker-b-s.properties(broker-b的slave配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10913 //更改端口号,同一台机器上两个broker不可采用同一端口
storePathRootDir=/opt/logs/rocketmqlogs/store
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog
192.168.151.132 上的配置
一、修改hosts文件
vi /etc/hosts 加入
192.168.153.131 rocketmq.master
192.168.153.132 rocketmq.slave
(1)broker-b.properties(broker-b的master配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/opt/logs/rocketmqlogs/store
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog //日志存放目录
(2)broker-a-s.properties(broker-a的slave配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10915
storePathRootDir=/opt/logs/rocketmqlogs/store
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog
注意: 这里将broker-a和broker-b的主从分别放到不一样的机器上启动是为了保证当与一台机器宕机时,另外一台可继续工做。
3.启动服务
192.168.153.131
sed -i 's#${user.home}#/opt#g' *.xml //将conf目录下全部xml文件中的${user.home}替换成/opt,进入rocketmq/conf目录下执行该命令
mqnamesrv & 启动nameservice
mqbroker -c /opt/alibaba-rocketmq/conf/2m-2s-async/broker-a.properties & //启动broker-a主
mqbroker -c /opt/alibaba-rocketmq/conf/2m-2s-async/broker-b-s.properties & //启动broker-b从
192.168.153.132
sed -i 's#${user.home}#/opt#g' *.xml //将conf目录下全部xml文件中的${user.home}替换成/opt,进入rocketmq/conf目录下执行该命令
mqnamesrv & 启动nameservice
mqbroker -c /opt/alibaba-rocketmq/conf/2m-2s-async/broker-b.properties & //启动broker-b主
mqbroker -c /opt/alibaba-rocketmq/conf/2m-2s-async/broker-a-s.properties & //启动broker-a从
4.到此已经完成,能够发布rocketmq-console项目来查看mq的信息和配置。
建立一个topic到两个broker上
mqadmi updateTopic -c FusionCluster -b 192.168.153.131:10911 -t testbroker
mqadmi updateTopic -c FusionCluster -b 192.168.153.132:10911 -t testbroker