以下部署方式结合众多博友的博客,经过自己一步一步实际搭建,如有雷同,侵权行为,请见谅。。。其中遇到不少的坑,希望能帮到更多的人,现在很少能找到一份完整版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. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  4. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 系列文章--从零开始学习ASP.NET MVC 1.0

    从零开始学习ASP.NET MVC 1.0 (一) 开天辟地入门篇 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件 从零开始学习 ASP.NET MVC 1.0 ...

  2. O(n)线性空间的迷宫生成算法

    之前所有的迷宫生成算法,空间都是O(mn),时间同样是O(mn),时间上已经不可能更优化, 于是,我就从空间优化上着手,研究一个仅用O(n)空间的生成算法. 我初步的想法是,每次生成一行,生成后立即输 ...

  3. mySQL 教程 第8章 视图

    创建视图的目的 简单 隐藏数据复杂性 安全 可以对视图授权 数据独立 可以屏蔽表结构变化对用户的影响,比如增加列,更改列名 创建视图 1. 创建单表视图 以下视图显示JAVA班的学生姓名.身份证号和班 ...

  4. springMVC学习(3)-springMVC和mybatis整合

    一.需求:使用springmvc和mybatis完成商品列表查询. 二.整合思路:springMVC+mybaits的系统架构: 1步):整合dao层 mybatis和spring整合,通过sprin ...

  5. shell_sctipts: 删除mysql备份到最后7日

    目前,mysql的备份文件,经过一周左右清理,手动清理会比较费事,所以写了一个简单脚本来实现. 前提介绍: mysql备份文件放在/usr/bak/sql里面,sql文件的备份名称格式为: mysql ...

  6. h3c端口汇聚的几种情况-S5500-S5048

    S5500和S5048E聚合的几种情况,分享下:1.S5048E用手工的话,S5500用静态方式2.S5048E用静态的话,S5500用动态方式3.S5048E和S5048E聚合的话,用相同方式即可. ...

  7. PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/classname

    php利用PHPExcel类导出导入Excel用法 来源:   时间:2013-09-05 19:26:56   阅读数: 分享到: 16 [导读] PHPExcel类是php一个excel表格处理插 ...

  8. python爬虫小试

  9. solr入门之权重排序方法初探之使用edismax改变权重

    做搜索引擎避免不了排序问题,当排序没有要求时,solr有自己的排序打分机制及sorce字段 1.无特殊排序要求时,根据查询相关度来进行排序(solr自身规则) 2.当涉及到一个字段来进行相关度排序时, ...

  10. re模块 ,random模块

    # 在python中使用正则表达式 # 转义符 : 在正则中的转义符 \ 在python中的转义符# 正则表达式中的转义 :# '\(' 表示匹配小括号# [()+*?/$.] 在字符组中一些特殊的字 ...