以下部署方式结合众多博友的博客,经过自己一步一步实际搭建,如有雷同,侵权行为,请见谅。。。其中遇到不少的坑,希望能帮到更多的人,现在很少能找到一份完整版4.2.6版本的搭建教程了,如果你有幸遇见,那么我们必定前世有缘。进入正题……

  首先,官方推荐有三种部署方式:  

多Master模式(2m-noslave)

一个集群无Slave,全是Master,例如2个Master或者3个Master
优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到受到影响。

多Master多Slave模式,异步复制(2m-2s-async)

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master宕机后,消费者仍然可以从Slave消费,此过程对应用透明。不需要人工干预。性能同多Master模式几乎一样。
缺点:Master宕机,磁盘损坏情况,会丢失少量消息。

多Master多Slave模式,同步双写(2m-noslave)

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功。
优点:数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高
缺点:性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。

注意:

1、上述“2”只是说作为一个集群的最低配置数量,可以根据实际情况扩展。

2、所有的刷盘(Dish Flush)操作全部默认为:ASYNC_FLUSH(异步刷盘)。

核心概念:

  Disk Flush(磁盘刷新/同步操作):就是将内存的数据落地,存储在磁盘中。

  RocketMQ提供了以下两种模式:

   SYNC_FLUSH(同步刷盘):生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。                         ASYNC_FLUSH(异步刷盘):生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种情况:1是定期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行刷盘。这种方式会存在消息丢失(在还未来得及同步到磁盘的时候宕机),但是性能很好。默认是这种模式。

  • Broker Replication(Broker间数据同步/复制):集群环境下需要部署多个Broker,Broker分为两种角色:一种是master,即可以写也可以读,其brokerId=0,只能有一个;另外一种是slave,只允许读,其brokerId为非0。一个master与多个slave通过指定相同的brokerName被归为一个broker set(broker集)。通常生产环境中,我们至少需要2个broker set。Broker Replication只的就是slave获取或者是复制master的数据。
  • Sync Broker:生产者发送的每一条消息都至少同步复制到一个slave后才返回告诉生产者成功,即“同步双写”。
  • Async Broker:生产者发送的每一条消息只要写入master就返回告诉生产者成功。然后再“异步复制”到slave。

环境:

JDK1.8    java version "1.8.0_171"  +虚拟机2台(至少)+rocketmq-all-4.2.0-bin-release.zip

1、单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

2、双Master

序号  ip            用户名    密码      角色               模式

(1) 10.43.98.34    root        nameServer1,brokerServer1   Master1

(2) 10.43.98.38   root        nameServer1,brokerServer1   Master2

1、Host添加信息

两台机器都执行vi  /etc/hosts,将nameServer和broker部署在同一台机器上的,也可以分开部署。  输入如下图所示的信息

重启网卡:service network restart(可省略)

相互ping一下,在34机器上ping  10.43.98.38

# ping  rocketmq-nameserver2

# ping  rocketmq-master2

  2、创建数据存储路径(两台机器都要创建)(为方便后面集群部署,最好设置,不设置也可以成功部署)

任意你想设置保存位置的目录下来存储产生的数据的,我是/rocketmq1目录下

mkdir store

mkdir store/commitlog

mkdir store/consumerqueue

mkdir store/index

  3、修改conf下RocketMQ的配置文件:(34机器)broker-a.properties  (38机器)broker-b.properties

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0

namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

主要配置这些也可以,详细可以自行根据需要补全,比如文件保存路径配置等……  

  详细配置文件可参考:  

#所属集群名字
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。这个要和之前配置的名称相互对应。

3、修改日志配置文件(略,可参考)

  修改日志配置文件

  在创建的软连接文件夹rocketmq下创建一个logs目录 mkdir /opt/rocketmq/logs

  然后执行cd /opt/rocketmq/conf && sed -i 's#${user.home}#/opt/rocketmq#g' *.xml进行日志文件的替换,sed是linux的替换命令。两台机器同样操作。

4、修改启动脚本参数(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监控界面查看,是否部署成功。。。

3、双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 上的配置

1、修改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

RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)的更多相关文章

  1. Hadoop分布式集群部署(单namenode节点)

    Hadoop分布式集群部署 系统系统环境: OS: CentOS 6.8 内存:2G CPU:1核 Software:jdk-8u151-linux-x64.rpm hadoop-2.7.4.tar. ...

  2. K8s集群部署(二)------ Master节点部署

    Master节点要部署三个服务:API Server.Scheduler.Controller Manager. apiserver提供集群管理的REST API接口,包括认证授权.数据校验以 及集群 ...

  3. Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

    文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...

  4. 使用kubeadm进行单master(single master)和高可用(HA)kubernetes集群部署

    kubeadm部署k8s 使用kubeadm进行k8s的部署主要分为以下几个步骤: 环境预装: 主要安装docker.kubeadm等相关工具. 集群部署: 集群部署分为single master(单 ...

  5. RocketMQ(2)---Docker集群部署RocketMQ

    RocketMQ(2)-Docker集群部署RocketMQ =前言= 1.因为自己只买了一台阿里云服务器,所以RocketMQ集群都部署在单台服务器上只是端口不同,如果实际开发,可以分别部署在多台服 ...

  6. RocketMQ 4.7.1 环境搭建、集群、MQ整合SpringBoot

    导读 之前学过ActiveMQ但是并发量不是很大点我直达,所以又学阿里开源的RocketMQ,据说队列可以堆积亿级别.下面是网上找的消息队列对比图,仅供参考 部署 官网 点我直达 前置条件 推荐使用6 ...

  7. rocketmq高可用集群部署(RocketMQ-on-DLedger Group)

    rocketmq高可用集群部署(RocketMQ-on-DLedger Group) rocketmq部署架构 rocketmq部署架构非常多,都是为了解决一些问题,越来越高可用,越来越复杂. 单ma ...

  8. RocketMQ 简单梳理 及 集群部署笔记【转】

    一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...

  9. RocketMQ集群部署记录

    RocketMQ集群部署记录 #引用    https://cloud.tencent.com/developer/article/1147765         一.RocketMQ基础知识介绍 A ...

随机推荐

  1. 隐藏tabbar的属性hidesBottomBarWhenPushed

    项目中有需求是A视图控制器push之后B视图控制器需要隐藏底部的tabbar,在pop之后A视图控制器仍然显示tabbar. 其实不需要在push操作时敲 self.hidesBottomBarWhe ...

  2. UML类图6种关系的总结

    http://www.open-open.com/lib/view/open1328059700311.html

  3. c/c++面试题(4)字符串翻转/打印任意进制格式/类型转换

    1.字符串的翻转,这里一般是字符数组.不包括字符串字面值. char* reversal_str(char* str,size_t size); 翻转之后的字符串是原来的字符串的翻转. #includ ...

  4. Rest中获取制定操作的UriTemplate

    UriTemplate uri = WebOperationContext.Current.GetUriTemplate("DownloadFile");

  5. BZOJ 4571 美味

    又一部SCOI血泪史.... 唉. 就是在这棵树上一遍又一遍跑嘛. 以后不要直接求答案啊.要最后再异或起来. 要学习简单的代码风格. #include<iostream> #include ...

  6. iOS:等待控件

    定义: @interface ViewController () { UIActivityIndicatorView *testActivityIndicator; } 实例化,开始旋转: -(voi ...

  7. Ubuntu安装及配置virtualenv,virtualenvwrapeer

    安装virtualenv pip install virtualenv 如果下载较慢,可以添加豆瓣源: pip install -i https://pypi.douban.com/simple/ v ...

  8. 【Topcoder 10384】KingdomMap

    Topcoder 10384 题意:给你一个森林,求是否能将这个森林的点集分成两部分,每部分放在一列中,要求边是直的并且不能交叉,问最少删哪几条边. 思路:我们考虑森林中的一棵树,以\(u\)为根,将 ...

  9. [原]关于在Python和C#之间消息传递的问题

    问题的描述: 鉴于Python强大的网络功能和丰富的开源组件和C#开发Windows Form程序时优秀的框架,使用Python和C#混合编程可以有效的结合二者的长处,快速开发产品. 然而在这两者之间 ...

  10. python3+pyshark读取wireshark数据包并追踪telnet数据流

    一.程序说明 本程序有两个要点,第一个要点是读取wireshark数据包(当然也可以从网卡直接捕获改个函数就行),这个使用pyshark实现.pyshark是tshark的一个python封装,至于t ...