【Linux】RocketMQ 部署

系统要求

系统要求
1、64位操作系统,推荐 Linux/Unix/macOS
2、64位 JDK 1.8+
3、官网文档

安装部署

下载

这里使用release免编译版本

1
2
3
4
# 解压
$ unzip rocketmq-all-5.1.0-source-release.zip
# 打开文件夹
$ cd rocketmq-all-5.1.0-source-release/

启动NameServer

1
2
3
4
5
6
### 启动namesrv
$ nohup sh bin/mqnamesrv &

### 验证namesrv是否启动成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

我们可以在namesrv.log 中看到 The Name Server boot success.., 表示NameServer 已成功启动。

启动Broker+Proxy

NameServer成功启动后,我们启动Broker和Proxy,5.x 版本下我们建议使用 Local 模式部署,即 Broker 和 Proxy 同进程部署。5.x 版本也支持 Broker 和 Proxy 分离部署以实现更灵活的集群能力。

1
2
3
4
5
6
### 先启动broker
$ nohup sh bin/mqbroker -n localhost:9876 --enable-proxy &

### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
$ tail -f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...

我们可以在 proxy.log 中看到The broker[brokerName,ip:port] boot success..,这表明 broker 已成功启动。

工具测试消息收发

1
2
3
4
5
$ export 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...

dashboard(非必须)

安装

安装 dashboard,需要编译源代码. 源码github 地址

下载之后,修改 application.yml 参数,我这里只修改了 Name Server 地址:

1
2
3
4
5
rocketmq:
config:
namesrvAddrs:
- 127.0.0.1:9876
- 47.xx.xx.xx:9876

然后执行 Maven 打包命令,打出 jar 包:

1
mvn clean package -Dmaven.test.skip=true

打好 jar 包后上传到服务器,执行下面命令启动:

1
java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar

测试

浏览器输入 http://127.0.0.1:8080/

Docker 部署

创建namesrv服务

拉取镜像

1
docker pull apache/rocketmq

创建namesrv数据存储路径

1
2
mkdir -p  /docker/rocketmq/data/namesrv/logs   /docker/rocketmq/data/namesrv/store

构建namesrv容器

1
2
3
4
5
6
7
8
9
10
docker run -d \
--restart=always \
--name rmqnamesrv \
-p 9876:9876 \
-v /docker/rocketmq/data/namesrv/logs:/root/logs \
-v /docker/rocketmq/data/namesrv/store:/root/store \
-e "MAX_POSSIBLE_HEAP=100000000" \
apache/rocketmq \
sh mqnamesrv

-restart=always| docker重启时候容器自动重启
-name rmqnamesrv | 把容器的名字设置为rmqnamesrv
-p 9876:9876| 把容器内的端口9876挂载到宿主机9876上面
-v /docker/rocketmq/data/namesrv/logs:/root/logs | 把容器内的/root/logs日志目录挂载到宿主机的 /docker/rocketmq/data/namesrv/logs目录
-v /docker/rocketmq/data/namesrv/store:/root/store | 把容器内的/root/store数据存储目录挂载到宿主机的 /docker/rocketmq/data/namesrv目录
rmqnamesrv | 容器的名字
-e “MAX_POSSIBLE_HEAP=100000000” | 设置容器的最大堆内存为100000000
apache/rocketmq | 使用的镜像名称
sh mqnamesrv | 启动namesrv服务

创建broker节点

创建broker数据存储路径

1
2
mkdir -p  /docker/rocketmq/data/broker/logs   /docker/rocketmq/data/broker/store /docker/rocketmq/conf

创建配置文件

注意修改 brokerIP1 = 172.18.88.54 中ip地址。

1
vi /docker/rocketmq/conf/broker.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = 172.18.88.54
# 磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full
diskMaxUsedSpaceRatio=95

构建broker容器

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -d  \
--restart=always \
--name rmqbroker \
--link rmqnamesrv:namesrv \
-p 10911:10911 \
-p 10909:10909 \
-v /docker/rocketmq/data/broker/logs:/root/logs \
-v /docker/rocketmq/data/broker/store:/root/store \
-v /docker/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "MAX_POSSIBLE_HEAP=200000000" \
apache/rocketmq \
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf

-name rmqbroker | 把容器的名字设置为rmqbroker
–link rmqnamesrv:namesrv | 和rmqnamesrv容器通信
-p 10911:10911 | 把容器的非vip通道端口挂载到宿主机
-p 10909:10909 | 把容器的vip通道端口挂载到宿主机
-e “NAMESRV_ADDR=namesrv:9876” | 指定namesrv的地址为本机namesrv的ip地址:9876
-e “MAX_POSSIBLE_HEAP=200000000” rocketmqinc/rocketmq sh mqbroker |指定broker服务的最大堆内存
rocketmqinc/rocketmq | 使用的镜像名称
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf | 指定配置文件启动broker节点

创建rockermq-console服务

拉取镜像

1
2
docker pull pangliang/rocketmq-console-ng

构建rockermq-console容器

需要替换192.168.52.136 为实际ip地址

1
2
3
4
5
6
7
docker run -d \
--restart=always \
--name rmqadmin \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.18.88.54:9876 \
-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 10010:8080 \
pangliang/rocketmq-console-ng

-restart=always| docker重启时候镜像自动重启
-name rmqadmin | 把容器的名字设置为rmqadmin
-e “JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.52.136:9876 | 设置namesrv服务的ip地址
-Dcom.rocketmq.sendMessageWithVIPChannel=false” | 不使用vip通道发送消息
–p 10010:8080 | 把容器内的端口8080挂载到宿主机上的9999端口

开放端口 9876/10911/10010

创建系统服务

1、 编写管理脚本命令,vi /etc/init.d/rocketmq
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh
#
# rocketmq - this script starts and stops the rocketmq daemon
#
# chkconfig: - 85 15

ROCKETMQ_HOME=/home/sys_wh/soft/rocketmq-5.1.4
ROCKETMQ_BIN=${ROCKETMQ_HOME}/bin
ADDR=192.168.0.75:9876
LOG_DIR=${ROCKETMQ_HOME}/logs

start() {
if [ ! -d ${LOG_DIR} ];then
mkdir ${LOG_DIR}
fi
cd ${ROCKETMQ_HOME}
nohup sh bin/mqnamesrv > ${LOG_DIR}/mqnamesrv.log 2>&1 &
echo -n "The Name Server boot success..."
nohup sh bin/mqbroker -c ${ROCKETMQ_HOME}/conf/broker.conf >${LOG_DIR}/broker.log 2>&1 &
echo -n "The broker[%s, ${ADDR}] boot success..."
}
stop() {
cd ${ROCKETMQ_HOME}
sh bin/mqshutdown broker
sleep 1
sh bin/mqshutdown namesrv
}
restart() {
stop
sleep 5
start
}


case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac

注意:

1.1 注: 复制这个脚本到Linux可能会丢失最上面的一部分,不知道为什么,通过xshell打开Linux,然后复制这些内容到文件中,会丢失一部分,自己复制过去以后检查清楚是否丢失一些内容。不然就算注册成一个服务也没法用。

1.2 ROCKETMQ_HOME的地址、利用nohup启动broker是指定启动的配置文件都要写对

2、将rocketmq服务添加为开机启动服务
1
2
3
chmod +x /etc/init.d/rocketmq

chkconfig --add rocketmq

再运行chkconfig –list查看是否出现以下内容,出现则代表加入成功了

注:若出现下图0-6都是关,那代表还不能开机自启,再运行 chkconfig rocketmq on,然后再运行chkconfig –list以后2-5都是开以后才行。

1
2
3
4
5
6
7
8
9
10
11
12
[root@host-172-20-42-212 rocketmq-5.1.2]# chkconfig --list

Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.

If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.

rocketmq 0:off 1:off 2:off 3:off 4:off 5:off 6:off

3、通过service命令来管理rocketmq
1
2
3
4
5
6
# 启动
service rocketmq start
# 关闭
service rocketmq stop
# 重启
service rocketmq restart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 启动namesrv
nohup sh /home/sys_wh/soft/rocketmq-5.1.4/bin/mqnamesrv > /home/sys_wh/soft/rocketmq-5.1.4/logs/mqnamesrv.log 2>&1 &
-- 验证是否成功
tail -f /home/sys_wh/soft/rocketmq-5.1.4/logs/mqnamesrv.log
-- 启动broker
nohup sh /home/sys_wh/soft/rocketmq-5.1.4/bin/mqbroker -c /home/sys_wh/soft/rocketmq-5.1.4/conf/broker.conf >/home/sys_wh/soft/rocketmq-5.1.4/logs/broker.log 2>&1 &
-- 验证是否成功
tail -f /home/sys_wh/soft/rocketmq-5.1.4/logs/broker.log

--停止broker
sh /home/sys_wh/soft/rocketmq-5.1.4/bin/mqshutdown broker
--停止 namesrv
sh /home/sys_wh/soft/rocketmq-5.1.4/bin/mqshutdown namesrv
-- 启动管理平台
nohup java -jar rocketmq-dashboard-1.0.0.jar > dashboard.log 2>&1 &

4、设置密码

4.1 开启acl控制

conf/broker.conf中开启aclEnable=true

1
2
3
vim conf/broker.conf
# 最下面增加下面一行
aclEnable=true

4.2 配置账号密码

修改conf/plain_acl.yml

accounts: 
    # 管理员账号/密码
    accessKey: catsicrocketmq
    secretKey: Catsic1qsx@WDC

4.3 配置面板中的密码

在dashboard.jar包同级目录创建config文件夹,将项目底下的application.properties上传到config文件夹下,将注释放开,设置对应的账号密码。修改后重启

rocketmq.config.accessKey=catsicrocketmq
rocketmq.config.secretKey=Catsic1qsx@WDC

4.4 当前,已经为RocketMQ设置了密码,但是,还存在问题,操作面板没有设置密码,操作面板没有设置密码,在实际应用中,也是很危险的。下面讲解面板设置密码:

4.5 开启账号密码访问

# 修改application.properties
# 是否开启账号密码验证
rocketmq.config.loginRequired= true
# 账号密码配置文件为:users.properties,将users.properties上传到config目录,修改内容为
# ,1 为管理员,不加为普通用户
catstiMQ=catsti1qaz@WSX,1
# 修改默认用户配置文件路径
vim application.properties
# 将其修改为:
rocketmq.config.dataPath=./config
# 重启dashboard