RocketMQ | 青训营笔记

146 阅读6分钟

这是我参与「第五届青训营 」笔记创作活动的第 11 天 。

一、知识点介绍

这篇笔记记录了我在配置RocketMQ过程中需要注意的点。

二、详细知识点

1.环境搭建

  • 首先是需要一个Linux系统,我在VMware虚拟机装上了Ubuntu系统,过程比较简单,去官网下载个镜像就可以了,这里不再赘述
  • 其次需要JDK和RocketMQ压缩包,同样在官网可以下载到

传输文件到虚拟机

我用的WinSCP传输文件。 image.png

  • 主机名是虚拟机的ip地址,在虚拟机终端键入ip a找到ens33对应的ip地址就是,端口默认
  • 用户名是安装Ubuntu系统时的用户名
  • 如果连接不成功,需要在Ubuntu终端安装ssh协议
    • 安装命令为:sudo apt-get install openssh-server
    • 重启命令为:sudo /etc/init.d/ssh restart

配置环境

  • 根目录/etc/profile

image.png

  • 配置完时候要source /etc/profile使环境变量生效

在配置环境踩到的几个坑

  • 配置java时最好在 ~/.bashrc 里面更改设置,这个只会对当前用户生效

  • 最开始用的jdk19总是报错,最后换了jdk1.8顺利运行,所以不要使用太高版本。

  • 在根目录查看一下.bashrc文件,如果里面已经配置了JAVA_HOME,会把~/etc/profile里面的配置覆盖!由于我这个文件里面自动配置了JAVA_HOME且与实际位置不符,总是把我的全局设置覆盖了导致启动服务时总是说找不到java,但是命令java -version又可以正常返回,最后查看.bashrc发现了这个问题,所以最好在.bashrc文件里面更改。

  • 更改后的.bashrc文件 image.png

  • 最后env指令查看环境变量,确定已经配置完毕。 image.png

更改虚拟机内存配置

  • rocketmq/bin/runserver.sh image.png

  • rocketmq/bin/runbroker.sh image.png

image.png

这一行的配置如果在上面做的改动之后还是不能生效,那再改下面的这个第一行:

  • JAVA_HOME=写在环境变量里的路径

image.png

启动namesrv

  • 启动namesrv

nohup sh bin/mqnamesrv &

  • 验证namesrv是否启动成功

tail -f ~/logs/rocketmqlogs/namesrv.log

The Name Server boot success...启动成功

启动broker

  • 修改配置使程序自动创建topic,便于实验(可选)

    • 在conf/broker.conf下autoCreateTopicEnable=true
  • 先启动broker

nohup sh bin/mqbroker -n localhost:9876 &

  • 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a

tail -f ~/logs/rocketmqlogs/broker.log

The broker[broker-a,192.169.1.2:10911] boot success...说明启动成功

  • 如果提示没找到文件的话可以ll ~/logs/rocketmqlogs看一下文件夹里面的文件,可能是文件名称大小写不匹配的问题。

收发消息测试

在进行消息收发之前,我们需要告诉客户端NameServer的地址,RocketMQ有多种方式在客户端中设置NameServer地址,这里我们利用环境变量NAMESRV_ADDR=localhost:9876

  • 发消息

    • sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
    • SendResult [sendStatus=SEND_OK, msgId= ...
  • 收消息

    • sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
    • ConsumeMessageThread_%d Receive New Messages: [MessageExt...

关闭服务器

  • 关闭broker sh bin/mqshutdown broker
    • The mqbroker(36695) is running...
      Send shutdown request to mqbroker(36695) OK
  • 关闭namesrv sh bin/mqshutdown namesrv
    • The mqnamesrv(36664) is running...
      Send shutdown request to mqnamesrv(36664) OK

2.集群搭建

集群特点

  • NameServer时一个几乎五状态节点,可集群部署,节点之间五任何消息同步。
  • Broker部署相对复杂,Broker分为Master和Slave,一个Master可偶一对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerID来定义,BrokerID为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。
  • Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer去Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
  • Connsumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave放心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅订阅规则由Broker配置决定。

集群模式

  • 单Master模式
    • 这种模式风险较大,一旦Broker宕机,会导致整个服务不可用
  • 多Master模式
    • 一个集群无Slave,全是Master
    • 优点:配置简单,单个Master宕机对应用无影响
    • 缺点:单台及其宕机期间,这台及其上未被消费的消息在及其回复之前不可订阅,消息实时性会受到影响
  • 多Master多Slave模式(异步)
    • 每个Master配置一个Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级)。
    • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会收到影响,同时Master宕机后,消费之仍然可以从Slaver消费,而且次过长对用于透明,不需要人工干预,性能同多Master模式几乎一样
    • 缺点:Master宕机,磁盘损坏情况下会丢失少量信息
  • 多Master多Slave模式(同步)
    • 每个Master配置一个Slave,HA采用同步双写方式,只有主备都写成功,才向应用返回成功。
    • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据性都非常高
    • 缺点:性能比异步复制略低(10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

3.双主双从模式搭建

需要两台Linux虚拟机,分别用ip a指令查看他们的IP地址,记作IP1,IP2。

节点序号IP架构模式
1IP1Master1、Slave2
2IP2Master2、Slave1

Host添加信息(在两台机器上)

位置sudo vim /etc/hosts

配置如下:

# nameserver
IP1 rocketmq-nameserver1
IP2 rockermq-nameserver2

# broker
IP1 rocketmq-master1
IP1 rocketmq-slave2
IP2 rocketmq-master2
IP2 rocketmq-slave1

配置完成后,重启网卡

systemctl restart network

防火墙配置

宿主机需要远程访问虚拟机的rocketmq服务和web服务,需要开放相关的端口号,简单粗暴的方式是直接关闭防火墙。

# 关闭防火墙
systemctl stop firewalld.service
# 查看防火墙状态
firewall-cmd --state
# 禁止防火墙开机启动
systemctl diable firewalld.service

或者只开放特定的端口,RocketMQ默认使用3个端口:

  • nameserver默认使用9876端口
  • master默认使用10911端口
  • slave默认使用11011端口
# 开放nameserver端口
firewall-cmd --remove-port=9876/tcp --permanent
# 开放master端口
firewall-cmd --remove-port=9876/tcp --permanent
# 开放slave端口
firewall-cmd --remove-port=9876/tcp --permanent
# 重启防火墙
firewall-cmd --reload

由于还有其他任务需要完成,rocketMQ的进一步学习先到这里停下,以后有空学习完再回来补充。