技术架构

- Producer:消息发布的角色,支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。

- Consumer:消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。

- NameServer:NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。

- BrokerServer:Broker主要负责消息的存储、投递和查询以及服务高可用保证,为了实现这些功能,Broker包含了以下几个重要子模块。
    1. Remoting Module:整个Broker的实体,负责处理来自clients端的请求。
    2. Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息
    3. Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。
    4. HA Service:高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能。
    5. Index Service:根据特定的Message key对投递到Broker的消息进行索引服务,以提供消息的快速查询。

RocketMQ 网络部署特点

- NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。

- Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。

- Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic 服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。

- Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读老消息,产生读I/O),以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。

结合部署架构图,描述集群工作流程:

- 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
- Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
- 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
- Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
- Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。

RocketMQ支持的架构

单Master模式

这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。

多Master模式

一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:

- 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;

- 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。

多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:

- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;

- 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

- 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;

- 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。

安装

单台安装rocketMQ需要4G+的硬盘空间,需要先留足了。

1.安装rocketMQ的依赖,javajdk

在命令行直接敲java,如果没安会提示你安装:

sudo apt install openjdk-8-jre-headless
#或者
sudo apt install openjdk-8-jre

安装完成后,输入java -verbose,可以在最后看到java的安装路径,之后编辑/etc/profile配置环境变量

expose JAVA_HOME=你的jdk路径

修改后需要重启或者在命令行让配置生效。

2.安装rocketMQ

下载

官网下载bin文件(bin是编译后的,下载源码还需自己编译,但是源码中有does、example等适合下载后查看的文档和示例)

http://rocketmq.apache.org/docs/quick-start/

官网更新的很勤奋,现在已经4.9.0了

下载完成后,需要解压(unzip),移动到自己习惯的目录,我放在了/opt/rocketMQ_4.9.0

修改配置

需要进入到rocketMQ安装目录/bin,修改runserver.sh、runbroker.sh,把内存限制改了,默认的占太多,一般人的测试环境是给不了这么高的,超出内存限制会报错,当然线上可以根据情况调大避免闲置浪费。

#runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"#改为 512m或者256m 128m之类的
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"#改为512m 256m 128m之类
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

官方runserver.sh与runbroker.sh内存占用比例是1:2,可以参考

还可以再修改broker.conf,增加:

#自动创建topic
autoCreateTopicEnable = true

再修改/etc/profile,增加rocketMQ的环境变量

export ROCKERMQ_HOME=/opt/rocketMQ_4.9.0/
export NAMESRV_ADDR=localhost:9876

启动

之后就可以依次启动

#启动mqnamesrv
nohup sh bin/mqnamesrv &#启动mqbroker 可以在这里指定localhost:9876 也可以指定加载conf/brocker.conf文件
nohup sh bin/mqbroker -n localhost:9876 &

(如果没安装nohup,会提示,安装后运行即可  nohup ... &不挂断地在后台运行命令)

jps是java的命令,安了java后就可以用了,用来显示java进程情况,由于后台不挂断运行,所以jps还能看到它。

关闭:

#注意顺序
sh bin/mqshutdown brokersh bin/mqshutdown namesrv

测试

自带的测试单元会生产消费1000条消息

#生产
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer#消费
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

出现消费队列列表,说明单机部署成功了

但是实际生产中为了保证高可用,不可能用单机的。

集群搭建

在搭建前,如果是测试环境可以直接关闭防火墙,如果生产环境需要开启每个服务器上的broker端口11011、10911(这些都可以自己指定,这是我指定的),namesrv端口9876.

准备搭建的架构如下:

三台机器均部署nameserver节点,worker2部署broker-a主节点和broker-b从节点,worker3部署broker-b主节点和broker-a从节点,这样一个2主2从异步刷盘的集群。

broker-a、broker-a-s这种一主一从的架构是没法自动故障转移的,但是这样交叉配,可以保障任一台机器故障后其他机器还可用。

当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载

准备三台虚拟机,ip分别是ubuntu1:10.3.141.2、u2:10.3.141.95、1:10.3.141.96,每台都配上nameserver,另外在10.3.141.95、96上分别配置broker-a、broker-b-s和broker-a-s、broker-b节点。

(ps:如果没安装ifconfig,就用自带的ip addr,尽量节省一些磁盘)

1.在三台机器分别安装rocketMQ服务,步骤和单机安装一样,都需要先配java,环境变量等,更改内存限制、打开防火墙指定端口。

2.部署nameserver集群

三台机器在一个网段内,无需特别配置,直接启动nameserver就行了。

3.配置2主2从

config文件夹下已经给出了一些配置示例文件:2m-2s-async(2主2从异步刷盘,这也是本例采用的)2m-2s-sync(2主2从同步刷盘)、2m-noslave(2主无从)

点开要用的2m-2s-async,在每台服务器上只保留所需文件,其余可以删掉,2上可以全删了,95留着a和b-s、96留着a-s、b,就是这样的效果:

并修改配置(当然在这个长长的配置清单里,只有前4个是和集群密切相关的,没有它们就配不好集群)

#集群名称,在同一个局域网内有相同集群名字,就表名属于同一个集群
brokerClusterName=DefaultCluster#相同名字的broker节点与-s节点,就是一组主从节点
brokerName=broker-a#0是master, >0是slave 一个主可以多个从
brokerId=0#nameserver地址,分号分隔worker1:9876;worker2:9876;worker3:9876;
namesrvAddr=10.3.141.2:9876;10.3.141.95:9876;10.3.141.96:9876;#默认创建topic数量
defaultTopicQueueNums=4#broker自动创建topic。这个在测试环境建议开启,线上不能开。参考《rocketMQ从入门到实践》
autoCreateTopicEnable = true#broker自动创建订阅组,同线下开启,线上关闭。
autoCreateSubscriptionGroup = true#broker默认对外服务监听端口.vip端口是10911-2,=10909。同一台主机上不同broker端口不能一样,会冲突。本例中主10911,从11011
listenPort = 10911#凌晨4点删除文件
deleteWhen=04#文件保留48小时
fileReservedTime=48#commitLog每个文件大小,默认1G
mapedFileSizeCommintLog = 1073741824#ConsumeQueue每个文件默认存30W条数据
mapedFileSizeConsumeQueue = 300000destroyMapedFileInterval = 120000#检测物理文件磁盘空间
diskMaxUsedSpaceRatio = 88#存储路径 因为一台机器有a和b-s,路径不能相同。可以设storeA和storeB-S之类文件夹做区分
storePathRootDir = /opt/rocketMQ_4.9.0/storeA#CommintLog存储路径
storePathCommintLog = /opt/rocketMQ_4.9.0/storeA/CommintLog#消费队列存储路径
storePathConsumeQueue = /opt/rocketMQ_4.9.0/storeA/ConsumeQueue#消息索引存储路径
storePathIndex = /opt/rocketMQ_4.9.0/storeA/index#限制消息大小
maxMessageSize = 65536#flushCommitLogLeastPages = 4
#flushConsumeQueueLeastPages = 2
#flushCommintLogThoroughInterval = 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#允许消息过滤
enablePropertyFilter = true

特别注意,以下配置项需要每个节点根据情况更改:

#broker-a broker-a-s设置为broker-a;broker-b、broker-b-s设置为broker-b
brokerName=broker-a#broker-a、broker-b设为0;broker-a-s、broker-b-s设置为1
brokerId=0#broker-a、broker-b设为10911;broker-a-s、broker-b-s设置为11011
listenPort = 10911

配置好之后,需要从指定配置文件启动服务

nohup bin/mqbroker -c conf/2m-2s-async/broker-a.properties &

启动之后查看一下

tail nohup.out

显示启动成功,即可

同样的方式,在96上配置b并启动,在96上配置a-s、95上配置b-s并启动,注意要先启动主才能启动它对应的从。

启动之后,在95、96都用jps查看一下,分别发现有两个broker和一个namesrv,说明都启动成功了

至此,本集群已经搭建和启动完成了。

mqadmin

bin目录下有自带的管理工具,mqadmin。使用方式为./mqadmin 命令 参数

Topic相关

clusterList相关

在10.3.141.2上,rocketMQ4.9.0/bin目录下运行  mqadmin clusterList -n  10.3.141.2:9876;10.3.141.95:9876;10.3.141.96:9876;

多个服务器用;分割

也可以只打印一个,效果一样

mqadmin clusterList -n  10.3.141.2:9876;

因为namesrv每个节点存的数据一样

rocketmq-console

rocketmq有很多好用的扩展(不是官方的),地址:https://github.com/apache/rocketmq-externals 其中有图形化管理控制台rocketmq-console,https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console

根据提示:(需要java 1.8+)

mvn spring-boot:run

打开rocketmq-console下的src/main/resources/application.properties ,修改端口8080为8089(主要是我们本机已安了nginx开了8080端口,如没有可忽略)

$ mvn clean package -Dmaven.test.skip=true
$ java -jar target/rocketmq-console-ng-1.0.0.jar
#如果配置文件没有填写Name Server的话,可以在启动项目时指定namesrvAddr
$ java -jar target/rocketmq-console-ng-1.0.0.jar --rocketmq.config.namesrvAddr='localhost:9876'#因为本文在打包时配置了namesrvAddr,故而执行如下命令
$ java -jar target/rocketmq-console-ng-1.0.0.jar

访问:localhost:8089(8089是我指定的端口,默认8080)

顶部有非常友好的切换中文按钮

各种图表,非常方便

至此,搭建已完成,之后会新开一篇写domo项目

RocketMQ也可以用Docker搭建(参考:https://github.com/apache/rocketmq-docker),后续我有空会也部署一遍

参考:

单机配置(官网):http://rocketmq.apache.org/docs/quick-start/

弹性集群(官网):http://rocketmq.apache.org/docs/rmq-deployment/

B站视频教程:https://www.bilibili.com/video/av630745037/?p=5&spm_id_from=pageDriver

端口冲突、路径冲突解决:https://tieba.baidu.com/p/6473154186

rocketmq-console 配置:https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md

rocketmq-console 配置:https://blog.csdn.net/so_geili/article/details/90142461

【RocketMQ】ubuntu18下部署RocketMQ集群相关推荐

  1. 多云环境下部署 k3s 集群

    多云环境下部署 k3s 集群 最近在玩k3s,刚好手上有三台云服务器(白嫖的一年亚马逊,双11买的腾讯云,朋友的阿里云),尝试跨云厂商搭建k3s集群玩玩 一.基础配置 服务器信息 系统 公网IP 内网 ...

  2. mysql集群异地部署_linux 环境下 部署mysql 集群

    概述 环境描述:适用于新环境部署 安装目录:/data/mysql 数据目录:/data/mysqldata 端口号 :3306 socket :/data/mysqldata/mysql.sock ...

  3. 通过operator部署redis集群(ucloud版)

    operator部署有状态的应用会简单很多 github文档:https://github.com/ucloud/redis-cluster-operator#deploy-redis-cluster ...

  4. Windows环境下redis的集群部署

    一.软件环境&工具 1.  windows7 2.  Redis-x64-3.2.100.msi 安装包 redis-win-3.2.100.zip代码包 下载地址:https://githu ...

  5. ceph 部署单机集群

    文章目录 ceph-deploy部署集群 ceph-deploy 部署单机 ceph-deploy 创建osd ceph osd创建资源池 ceph创建rbd块设备 ceph创建fs文件系统 本文档主 ...

  6. 2、使用 kubeadm 方式快速部署K8S集群

    文章目录 一.kubernetes 官方提供的三种部署方式 二.使用kubeadm搭建k8s集群 2.1 基础环境设置 2.2 安装Docker 2.3 添加kubernetes软件源 2.4 安装k ...

  7. Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)

    前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...

  8. 从零部署TiDB集群

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | yangyidba 来源 | 公众号「yang ...

  9. 部署Ceph集群(块存储,文件系统存储,对象存储)

    一 前言 分布式文件系统(Distributed File System):文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.分布式文件系统的设计基于C/S模式 1, ...

最新文章

  1. linux 内核调整相关参数
  2. JavaScript中的load事件的作用_史上最全的web前端面试题汇总及答案JavaScript之二(二)...
  3. Oracle分区表详解 .
  4. SAP UI5 sap.m.ListMode - ModesingleSelectMaster
  5. socket 编程原理1
  6. 拉格朗日方程的三种推导方法之基于汉密顿原理推导
  7. 我的管理成长与思考 - 那些领导的真相,理解和思考
  8. 奇虎360笔试题 挑选镇长
  9. 在Apple Watch上了解时间旅行
  10. 【H3C模拟器】VLAN单臂路由通信:用路由器实现和三层交换机实现
  11. oracle append parallel,大量数据快速插入方法探究[nologging+parallel+append]
  12. matlab表示颜色的词语三个字,三个字的形容颜色的词语
  13. maya(学习笔记)之Arnold渲染器二
  14. 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息
  15. C# Activator的使用(类工厂动态创建类的实例)
  16. AD16实现板框挖空
  17. 全志T3开发板——嵌入式入门学习测试教程(6)
  18. 用Python的networkx绘制精美网络图
  19. EXCEL VBA基础:通过创建模块完成简单SUB过程
  20. 最好和最便宜的照片存储网站(优质图库摄影)

热门文章

  1. 无法启动 Microsoft Outlook。无法打开 Outlook 窗口。无法打开此文件夹集合:解决方法
  2. IOT物联网观察之如果不卖物联网卡,怎么切入物联网?
  3. 【笔记整理】vuex介绍和原理以及mapState与mapGetters、mapActions与mapMutations
  4. 腾讯官方可编程QQ机器人来了?QQHook
  5. Python中list的内存分配
  6. android微信新功能,安卓微信6.6.7正式发布:三大重磅新特性
  7. win8 Oracle 12c安装
  8. mongodb数据同步到oracle_数据库周刊41丨9月数据库排行榜;2020 数据技术嘉年华…...
  9. 吉首大学计算机科学与技术怎么样,吉首大学是几本 学生评价怎么样好不好(10条)...
  10. 程序员你在干嘛?——我在改变世界