搭建新RocketMQ服务
关闭老Broker写入权限
更换使用新的NameSrv地址
新Broker移除老NameSrv地址
迁移后状态
使用成品包可忽略本步骤
源码地址 rocketmq-all-4.1.0-incubating
使用成品包可忽略本步骤
1.1.2.1 在项目根目录下执行
mvn -Prelease-all -DskipTests clean install -U
1.1.2.2 获取产出可执行文件
distribution/target/apache-rocketmq.zip
将apache-rocketmq.zip
文件传到/home/mquser/app
路径下,并解压unzip apache-rocketmq.zip
。关注的文件路径如下:
/home/mquser/app/apache-rocketmq
├── bin
│ ├── mqadmin
│ ├── mqbroker
│ ├── mqnamesrv
│ ├── mqshutdown
│ └── ......
├── conf
│ ├── broker.conf
│ └── ......
├── lib
│ ├── rocketmq-broker-4.1.0-incubating.jar
│ ├── rocketmq-namesrv-4.1.0-incubating.jar
│ └── ......
└── ......
1.2.2.1 安装JDK
未安装JDK时需要
yum install java-1.8.0-openjdk.x86_64
1.2.2.2 编辑环境变量配置
vim /etc/profile
添加JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0
export CLASSPATH=.:/jre/lib/rt.jar:/lib/dt.jar:/lib/tools.jar
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin
添加ROCKETMQ_HOME
export ROCKETMQ_HOME=/home/mquser/app/apache-rocketmq
1.2.2.3 立即生效配置
source /etc/profile
部署两台NameSrv,流程完全相同
登录NameSrv
用的服务器,完成1.2 环境准备及配置
1.3.2.1. 进入脚本目录
cd /home/mquser/app/apache-rocketmq/bin
1.3.2.2. 启动NameSrv
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv > $ROCKETMQ_HOME/namesrv_nohup.out &
1.3.2.3. 验证启动进程
ps ax | grep -i 'org.apache.rocketmq.namesrv.NamesrvStartup' |grep java | grep -v grep
1.3.2.4. 验证日志
tail -200f ~/logs/rocketmqlogs/namesrv.log
1.3.2.5. 配置域名(可选)
内网环境用域名
按照双主无从部署,仅配置文件不同
登录Broker
用的服务器,完成1.2 环境准备及配置
1.4.2.1. 进入配置目录
cd /home/mquser/app/apache-rocketmq/conf
1.4.2.2. 编辑配置
1.4.2.2.1 创建配置文件
vim broker_c.conf
vim broker_d.conf
1.4.2.2.2 添加内容并保存
namesrvAddr
需要获取实际值填充 具体配置可以参考老Broker配置 属性含义查看Broker配置
brokerClusterName=DefaultClusterbrokerId=0deleteWhen=04fileReservedTime=168brokerRole=ASYNC_MASTERflushDiskType=ASYNC_FLUSH
NameSrv地址包括老的NameSrv地址和新的NameSrv地址:
namesrvAddr=NEW_NAMESRV_ADDR_1:9876;NEW_NAMESRV_ADDR_2.ltd:9876;OLD_NAMESRV_ADDR:9876
brokerName=broker-c
brokerName=broker-d
1.4.3.1. 进入脚本目录
cd /home/mquser/app/apache-rocketmq/bin
1.4.3.2. 启动Broker
nohup sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/broker_c.conf > $ROCKETMQ_HOME/broker_nohup.out &
nohup sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/broker_d.conf > $ROCKETMQ_HOME/broker_nohup.out &
1.4.3.3. 验证启动进程
ps ax | grep -i 'org.apache.rocketmq.broker.BrokerStartup' |grep java | grep -v grep
1.4.3.4. 验证日志
tail -f ~/logs/rocketmqlogs/broker.log
使用成品忽略本步骤
下载 源码rocketmq-console-1.0.0并解压,进入解压目录。
使用成品忽略本步骤
1.5.2.1 进入rocketmq-console
项目
cd rocketmq-console
1.5.2.2 打包
mvn -Prelease-all -DskipTests clean install -U
1.5.2.3 获取成品JAR包
target/rocketmq-console-ng-1.0.0.jar
上传成品包rocketmq-console-ng-1.0.0.jar
到新服务器的/home/mquser/app/apache-rocketmq
目录下。
可以部署在一台新NameSrv所在的服务器上
1.5.3.1 进入工作目录
cd /home/mquser/app/apache-rocketmq
1.5.3.2 启动控制台
NEW_NAMESRV_ADDR
修改为新的NameSrv的IP地址。
nohup java -Xmx256m -Xms256m -jar rocketmq-console-ng-1.0.0.jar --server.port=9800 --rocketmq.config.namesrvAddr=NEW_NAMESRV_ADDR:9876 > console.out &
OLD_NAMESRV_ADDR
一定要用老NameSrv的IP地址替换。
sh $ROCKETMQ_HOME/bin/mqadmin topicList -n 'OLD_NAMESRV_ADDR:9876' | grep -v '%RETRY%' | grep -v '%DLQ%' | grep -v 'BenchmarkTest' | grep -v 'TBW102' | grep -v 'rmq_sys_' | grep -v 'OFFSET_MOVED_EVENT' | grep -v 'DefaultCluster' | grep -v 'SELF_TEST_TOPIC' | grep -v 'broker-'
将上一步查出来的
Topic
,拼接到如下创建Topic
命令;
NEW_NAMESRV_ADDR
一定要配置为新的NameSrv的IP地址。
YOUR_TOPIC
修改为具体的Topic名称。因为新NameSrv下只有新的Broker,所以只会给所有新的Broker创建相同配置的Topic,不影响老Broker。
命令参数含义见参考文档-Topic相关
sh $ROCKETMQ_HOME/bin/mqadmin updateTopic -n NEW_NAMESRV_ADDR:9876 -c DefaultCluster -p 6 -r 4 -w 4 -t YOUR_TOPIC
OLD_NAMESRV_ADDR
要用老NameSrv的IP地址替换。
YOUR_TOPIC
修改为具体的Topic名称。命令参数含义见参考文档-Topic相关
1.6.3.1 查看Topic下所有消息队列
sh $ROCKETMQ_HOME/bin/mqadmin topicStatus -n 'OLD_NAMESRV_ADDR:9876' -t YOUR_TOPIC
1.6.3.2 查看Topic路由
sh $ROCKETMQ_HOME/bin/mqadmin topicRoute -n 'OLD_NAMESRV_ADDR:9876' -t YOUR_TOPIC
1.6.3.3 查看集群下各Broker吞吐信息
-i
刷新间隔秒数命令参数含义见参考文档-集群相关
sh $ROCKETMQ_HOME/bin/mqadmin clusterList -n 'OLD_NAMESRV_ADDR:9876' -i 5
sh $ROCKETMQ_HOME/bin/mqadmin clusterList -n 'OLD_NAMESRV_ADDR:9876' -i 5 -m
确认所有Topic已经在新的Broker中生成,保险起见再确保下消息有出入(以防网络不通等问题)。
OLD_BROKER_IP
为老Broker
的IP地址命令参数含义见参考文档-Broker相关
2.2.1 登录老Broker服务器
2.2.2 关闭老Broker
写权限
⚠️注意:执行这个命令会更新配置文件,把一些系统默认配置也写到配置文件中。
sh $ROCKETMQ_HOME/bin/mqadmin updateBrokerConfig -b 'OLD_BROKER_IP:10911' -k brokerPermission -v 4
2.3.2 验证老Broker
写权限关闭成功
sh $ROCKETMQ_HOME/bin/mqadmin getBrokerConfig -b 'OLD_BROKER_IP:10911' | grep brokerPermission
结果应该为4
。
2.3.3 业务异常,恢复Broker权限
sh $ROCKETMQ_HOME/bin/mqadmin updateBrokerConfig -b 'OLD_BROKER_IP:10911' -k brokerPermission -v 6
查看恢复写入操作正确性
sh $ROCKETMQ_HOME/bin/mqadmin getBrokerConfig -b 'OLD_BROKER_IP:10911' | grep brokerPermission
结果应该为6
。
2.3.4 观察老Broker
消息出入状况
必须确认老Broker无可消费消息。
没有找到比较好的mqadmin查询命令,人工排查
后来发现#2940丁威老师提的PR,方便查询生产者。
以下是运维大哥教的方法。
登录老NameSrv,查看访问NameSrv端口的网络IP,间接查找客户端应用(包括发送者和消费者)。
ss -natp |grep 9876
例如返回如下:
省略 [::ffff:198.0.0.0]:9876 [::ffff:198.0.0.1]:42430 省略
然后登录右边IP198.0.0.1
的服务器,执行命令查询42430
端口占用的进程ID:
ss -natp |grep 42430
例如返回如下:
省略 users:(("java",pid=12740,fd=61))
其中pid=12740
就是相应应用的进程ID,可执行以下命令查看进程信息:
ps -ef|grep 12740
返回结果就能定位到具体应用了。
更换应用中的NameSrv
地址为全部新的NameSrv
地址。
先发生产者,再发消费者。
cd /home/mquser/app/apache-rocketmq/conf
vim broker_c.conf
vim broker_d.conf
修改配置为:
namesrvAddr=NEW_NAMESRV_ADDR_1:9876;NEW_NAMESRV_ADDR_2.ltd:9876
关闭Broker
sh $ROCKETMQ_HOME/bin/mqshutdown broker
启动Broker及验证
登录老Broker服务器
关闭老Broker
sh $ROCKETMQ_HOME/bin/mqshutdown broker
验证
ps ax | grep -i 'org.apache.rocketmq.broker.BrokerStartup' |grep java | grep -v grep
登录老NameSrv服务器
关闭老Broker
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv
验证
ps ax | grep -i 'org.apache.rocketmq.namesrv.NamesrvStartup' |grep java | grep -v grep
将老控制台域名转移到新控制台服务上
登录老控制台服务器
查找进程
ps ax | grep -i 'rocketmq-console-ng' |grep java | grep -v grep | awk '{print $1}'
杀掉进程
kill 进程号