这是我参与「第五届青训营 」笔记创作活动的第 11 天 。
一、知识点介绍
这篇笔记记录了我在配置RocketMQ过程中需要注意的点。
二、详细知识点
1.环境搭建
- 首先是需要一个Linux系统,我在VMware虚拟机装上了Ubuntu系统,过程比较简单,去官网下载个镜像就可以了,这里不再赘述
- 其次需要JDK和RocketMQ压缩包,同样在官网可以下载到
传输文件到虚拟机
我用的WinSCP传输文件。
- 主机名是虚拟机的ip地址,在虚拟机终端键入
ip a找到ens33对应的ip地址就是,端口默认 - 用户名是安装Ubuntu系统时的用户名
- 如果连接不成功,需要在Ubuntu终端安装ssh协议
- 安装命令为:
sudo apt-get install openssh-server - 重启命令为:
sudo /etc/init.d/ssh restart
- 安装命令为:
配置环境
- 根目录/etc/profile
- 配置完时候要
source /etc/profile使环境变量生效
在配置环境踩到的几个坑:
-
配置java时最好在
~/.bashrc里面更改设置,这个只会对当前用户生效 -
最开始用的jdk19总是报错,最后换了jdk1.8顺利运行,所以不要使用太高版本。
-
在根目录查看一下.bashrc文件,如果里面已经配置了JAVA_HOME,会把
~/etc/profile里面的配置覆盖!由于我这个文件里面自动配置了JAVA_HOME且与实际位置不符,总是把我的全局设置覆盖了导致启动服务时总是说找不到java,但是命令java -version又可以正常返回,最后查看.bashrc发现了这个问题,所以最好在.bashrc文件里面更改。 -
更改后的.bashrc文件
-
最后
env指令查看环境变量,确定已经配置完毕。
更改虚拟机内存配置
-
rocketmq/bin/runserver.sh
-
rocketmq/bin/runbroker.sh
这一行的配置如果在上面做的改动之后还是不能生效,那再改下面的这个第一行:
JAVA_HOME=写在环境变量里的路径
启动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
- 在conf/broker.conf下
-
先启动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
- The mqbroker(36695) is running...
- 关闭namesrv
sh bin/mqshutdown namesrv- The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
- The mqnamesrv(36664) is running...
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 | 架构模式 |
|---|---|---|
| 1 | IP1 | Master1、Slave2 |
| 2 | IP2 | Master2、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的进一步学习先到这里停下,以后有空学习完再回来补充。