--------------------------------------------------------------------------------------------html
1、Rocketmq简介:java
--------------------------------------------------------------------------------------------linux
RocketMQ是一款分布式、队列模型的消息中间件,具备如下特色:
一、支持严格的消息顺序;
二、支持Topic与Queue两种模式;
三、亿级消息堆积能力;
四、比较友好的分布式特性;
五、同时支持Push与Pull方式消费消息;git
(本文采用双Master架构模式。)github
--------------------------------------------------------------------------------------------web
2、服务器分布:shell
--------------------------------------------------------------------------------------------json
一、2台服务器信息(我用的虚拟机)centos
IP地址 | 主机名 | 机型 | 角色 | 架构模式 |
192.168.100.193 | rocketmq-master1 | 20G | nameserver、brokerserver | Master1(双Master模式) |
192.168.100.194 | rocketmq-master2 | 20G | nameserver、brokerserver | Master2(双Master模式) |
二、hosts信息添加安全
vi /etc/hosts
增长如下:
192.168.100.193 rocketmq-master1 192.168.100.194 rocketmq-master2 192.168.100.193 mqnameserver1 192.168.100.194 mqnameserver2
三、系统环境
CentOS 6.3
四、整体架构
--------------------------------------------------------------------------------------------
3、Rocketmq安装与配置
--------------------------------------------------------------------------------------------
一、JDK安装:
tar包解压,而后在/etc/profile中加入以下的环境变量:
生效:source /etc/profile
具体能够参考个人另外一篇博客:http://www.cnblogs.com/gmq-sh/p/4328843.html
二、RocketMq安装
下载rocketmq的release版:
https://github.com/alibaba/RocketMQ/releases
文件我放到了/data目录下。
执行一下命令:
tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C /usr/local/ mv alibaba-rocketmq alibaba-rocketmq-3.2.6 ln -s alibaba-rocketmq-3.2.6 rocketmq ll /usr/local
(
如下是分开执行的以及效果:
tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C /usr/local/
mv alibaba-rocketmq alibaba-rocketmq-3.2.6
修更名字。
创建软链接:
ln -s alibaba-rocketmq-3.2.6 rocketmq
)
三、环境变量设置(其中ROCKETMQ_HOME是否须要设置,待观察,目前设置与否均可以,由于暂时未在其余地方用到)
在 /etc/profile 文件中追加一下配置:
vi /etc/profile
3.一、若是是tar包安装jdk,则以下配置:
## java env
export JAVA_HOME=/usr/java/jdk1.7.0_79
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
## rocketmq
export ROCKETMQ_HOME=/usr/local/rocketmq
PATH=$JAVA_HOME/bin:$ROCKETMQ_HOME/bin:$PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
3.二、若是是rpm安装,则须要配置JAVA_HOME
在 /etc/profile 文件中添加JAVA_HOME,而且加入到export 的后面:
生效:
source /etc/profile
进入rocketmq的bin目录:
cd /usr/local/rocketmq/bin
(centos系统优化:慎用,我虚拟机老是卡死,还不明白为啥
执行 os.sh的系统优化,原始的sh文件须要修改,否则会致使出问题:
-- sh os.sh -- 未找到错误缘由,先不要执行这个命令
(详情参考本人另外一篇博文:http://www.cnblogs.com/gmq-sh/p/6957741.html)
(目前这个命令已经根据刚才的博文改好了,貌似仍是一直在执行,不知道要执行多久,有大神能够指导下?)
)
四、主机名设置
(1)、Master1服务器
vi /etc/hosts
以下:
192.168.100.193 rocketmq-master1 192.168.100.194 rocketmq-master2 192.168.100.193 mqnameserver1 192.168.100.194 mqnameserver2
网络:
vi /etc/sysconfig/network
修改为以下:
sed -i '/HOSTNAME/d' /etc/sysconfig/network echo 'HOSTNAME=rocketmq-master1' >> /etc/sysconfig/network hostname rocketmq-master1
效果以下:
(2)、Master2服务器
vi /etc/hosts 192.168.100.193 rocketmq-master1 192.168.100.194 rocketmq-master2 192.168.100.193 mqnameserver1 192.168.100.194 mqnameserver2 sed -i '/HOSTNAME/d' /etc/sysconfig/network echo 'HOSTNAME=rocketmq-master2' >> /etc/sysconfig/network hostname rocketmq-master2
五、RocketMQ配置
(1)、Master1服务器
vi /usr/local/rocketmq/conf/2m-noslave/broker-a.properties
内容以下:
---------------------start-----------------------------------------------------
#启动MessageFilterServer进程
#filterServerNums=1
#Broker所属集群
brokerClusterName=AdpMqCluster
brokerName=broker-a
#0:Master >0:Slave
brokerId=0
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876
defaultTopicQueueNums=4
#线下开启,线上关闭
autoCreateTopicEnable=FALSE
#自动建立订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=FALSE
#是否拒绝事务消息接入
rejectTransactionMessage=FALSE
#是否从web服务器获取NameServer地址,针对大规模的Broker集群建议使用这种方式
fetchNamesrvAddrByAddressServer=FALSE
listenPort=10911
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=50000000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
diskMaxUsedSpaceRatio=88
#日志根路径
storePathRootDir=/data/rocketmq/store
#commitLog存储路径
storePathCommitLog=/data/rocketmq/store/commitlog
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#ASYNC_MASTER 主从异步复制
#SYNC_MASTER 主从同步双写
#SLAVE Slave
brokerRole=ASYNC_MASTER
#刷盘方式
#ASYNC_FLUSH:异步刷盘
#SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH
checkTransactionMessageEnable=false
sendMessageThreadPoolNums=128
pullMessageThreadPoolNums=128
#是否开启消息索引功能
messageIndexEnable=TRUE
#是否提供安全的消息索引机制,索引保证不丢
messageIndexSafe=FALSE
#磁盘满、且无过时文件状况下 TRUE 表示强制删除文件,优先保证服务可用; FALSE 标记服务不可用,文件不删除
cleanFileForciblyEnable=TRUE
#Topic持久化文件
topicConfigPath=/data/logs/rocketmq/store/config/topics.json
#ConsumerOffset持久化文件
consumerOffsetPath=/data/logs/rocketmq/store/config/consumerOffset.json
#subscriptionGroup 持久化文件
subscriptionGroupPath=/data/logs/rocketmq/store/config/subscriptionGroup.json
---------------------end-----------------------------------------------------
(2)、Master2服务器
vi /usr/local/rocketmq/conf/2m-noslave/broker-b.properties
内容以下:
---------------------start-----------------------------------------------------
#启动MessageFilterServer进程
#filterServerNums=1
#Broker所属集群
brokerClusterName=AdpMqCluster
brokerName=broker-b
#0:Master >0:Slave
brokerId=0
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876
#在发送消息时,自动建立服务器不存在的topic,默认建立的队列数
defaultTopicQueueNums=4
#线下开启,线上关闭
autoCreateTopicEnable=FALSE
#自动建立订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=FALSE
#是否拒绝事务消息接入
rejectTransactionMessage=FALSE
#是否从web服务器获取NameServer地址,针对大规模的Broker集群建议使用这种方式
fetchNamesrvAddrByAddressServer=FALSE
listenPort=10911
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=120
#commitLog每一个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每一个文件默认存30W条,根据业务状况调整
mapedFileSizeConsumeQueue=300000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#日志根路径
storePathRootDir=/data/rocketmq/store
#commitLog存储路径
storePathCommitLog=/data/rocketmq/store/commitlog
#限制的消息大小
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#ASYNC_MASTER 主从异步复制
#SYNC_MASTER 主从同步双写
#SLAVE Slave
brokerRole=ASYNC_MASTER
#刷盘方式
#ASYNC_FLUSH:异步刷盘
#SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH
checkTransactionMessageEnable=false
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
pullMessageThreadPoolNums=128
#是否开启消息索引功能
messageIndexEnable=TRUE
#是否提供安全的消息索引机制,索引保证不丢
messageIndexSafe=FALSE
#磁盘满、且无过时文件状况下 TRUE 表示强制删除文件,优先保证服务可用; FALSE 标记服务不可用,文件不删除
cleanFileForciblyEnable=TRUE
#Topic持久化文件
topicConfigPath=/data/logs/rocketmq/store/config/topics.json
#ConsumerOffset持久化文件
consumerOffsetPath=/data/logs/rocketmq/store/config/consumerOffset.json
#subscriptionGroup 持久化文件
subscriptionGroupPath=/data/logs/rocketmq/store/config/subscriptionGroup.json
---------------------end-----------------------------------------------------
(3)、修改启动脚本(JVM参数调优)
由于咱们以前将nameServer和broker放在了同一台机器上,因此须要分别对nameServer和broker进行jvm的性能调优。生产环境默认便可不要修改。
1)broker的调优(目前是默认配置)
vi /usr/local/rocketmq/bin/runbroker.sh
runbroker.sh须要根据内存大小进行适当地调整
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g - XX:PermSize=128m -XX:MaxPermSize=320m"
2)nameserver的调优(目前是默认配置)
vi /usr/local/rocketmq/bin/runserver.sh
runserver.sh须要根据内存大小进行适当地调整
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g - XX:PermSize=128m -XX:MaxPermSize=320m"
六、服务启动
(启动两台机器的NameServer:先启动两台机器的NameServer,再启动两台机器的Borker,关机的时候顺序相反,先关闭两台机器的Broker,再关闭两台机器的Nameserver。)
0.1:日志文件目录自定义
①、建立日志目录
(/data/rocketmq/store/commitlog -->对应的是commitlog日志; /data/logs -->对应的是mq运行及启动等日志目录)
mkdir -p /data/rocketmq/store/commitlog /data/logs
②、替换rocketmq/conf/目录下的*log.xml文件中的路径
cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/data#g' *.xml
原始文件(一部份内容):
替换以后:
log目录替换好了。
0.二、防火墙配置
最后要配置一下防火墙:
nameserver端口为9876
broker端口为10911
或者若是测试,能够直接关掉防火墙。
(1)、启动NameServer【master一、master2】
cd /usr/local/rocketmq/bin
nohup sh /usr/local/rocketmq/bin/mqnamesrv &
验证nameserver是否启动:
tail -f -n 500 /data/logs/rocketmqlogs/namesrv.log
(
另外一种启动,
nohup sh /usr/local/rocketmq/bin/mqnamesrv >/var/log/ns.log &
验证启动:
tail -f /var/log/ns.log
)
(2)、启动BrokerServer A【master1】
cd /usr/local/rocketmq/bin nohup sh mqbroker -c ../conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
最好用绝对路径来执行:
nohup sh /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
验证mqbroker是否启动:
jps 查看进程
tail -f -n 500 /data/logs/rocketmqlogs/broker.log
(
另外一种启动指定启动日志的,
nohup sh /usr/local/rocketmq/bin/mqbroker -c ../conf/2m-noslave/broker-a.properties >/var/log/mq.log &
校验:
tail -f /var/log/mq.log
)
(3)、启动BrokerServer B【master2】
nohup sh /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &
校验:
tail -f -n 500 /data/logs/rocketmqlogs/broker.log
netstat -ntlp
jps
七、服务关闭
(启动两台机器的NameServer:先启动两台机器的NameServer,再启动两台机器的Borker,关机的时候顺序相反,先关闭两台机器的Broker,再关闭两台机器的Nameserver。)
7.一、关闭broker
7.1.一、直接关闭
sh /usr/local/rocketmq/bin/mqshutdown broker
7.1.二、优雅关闭broker
(
Broker重启可能会致使正在发往这台机器的的消息发送失败,RocketMQ提供了一种优雅关闭Broker的方法,经过执行如下命令会清除Broker的写权限,过40s后,全部客户
端都会更新Broker路由信息,此时再关闭Broker就不会发生发送消息失败的状况,由于全部消息都发往了其余Broker。
)
格式以下:
sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr
本broker对应的命令以下:
Master A:
sh mqadmin wipeWritePerm -b broker-a -n 192.168.100.193:9876
Master B:
sh mqadmin wipeWritePerm -b broker-b -n 192.168.100.194:9876
此时在关闭broker:
sh mqshutdown broker
7.二、关闭nameserver:
sh mqshutdown namesrv
--------------------------------------------------------------------------------------------
4、Rocketmq服务健康监控(根据本人实践修正的,可用的监控)
--------------------------------------------------------------------------------------------
一、依赖组件安装
yum -y install nmap
二、建立nameserver监控:(修改后的sh)
vi /data/scripts/check_nameserver_health.sh
#!/bin/sh SRV_PORT="9876" ## 端口号 SRV_PROT="tcp" ## 协议类型 SRV_NAME="rocketmq_nameserver" ## 服务名 ETH1_ADDR="192.168.100.194" PROT_OPT="S" SCAN_FLAG=0 TMP_SRV_PROT=`echo ${SRV_PROT} | tr '[A-Z]' '[a-z]'` for ((i=0; i<3; i++)); do RETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} | grep open` [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10 done if [[ ${SCAN_FLAG} -ne 1 ]]; then [[ -n `ps aux | grep java | grep namesrv` ]] && kill -9 `ps aux | grep java | awk '/namesrv/{print $2}'` cd /usr/local/rocketmq/bin && nohup sh mqnamesrv & fi
【注意:】以上的变量:
ETH1_ADDR: 要根据部署的机器的ip修改。
三、brokerserver监控(修改后的sh)
vi /data/scripts/check_brokerserver_health.sh
#!/bin/sh
SRV_PORT="10911" ## 端口号
SRV_PROT="tcp" ## 协议类型
SRV_NAME="rocketmq_brokerserver" ## 服务名
ETH1_ADDR="192.168.100.194" ## 服务器IP地址
PROT_OPT="S" ## 协议类型
## 是否已正确扫描
SCAN_FLAG=0
## 最多扫描3次,成功一次便可,以免网络抖动而致使误判
for ((i=0; i<3; i++)); do
RETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} | grep open`
[[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10
done
if [[ ${SCAN_FLAG} -ne 1 ]]; then
[[ -n `ps aux | grep java | grep broker` ]] && kill -9 `ps aux | grep java | awk '/broker/{print $2}'`
cd /usr/local/rocketmq/bin && nohup sh mqbroker -c ../conf/2m-noslave/broker-b.properties &
fi
【注意】
i: 以上红色标注部分,在master2上的名称为“broker-b.properties”
ii: ETH1_ADDR--》要根据所在服务器的ip来写。
四、crontab信息添加(修正后的可用的cron)
touch /var/run/check_rocketmq_nameserver.lock
touch /var/run/check_rocketmq_brokerserver.lock echo 'touch /var/run/check_rocketmq_nameserver.lock' >> /etc/rc.d/rc.local echo 'touch /var/run/check_rocketmq_brokerserver.lock' >> /etc/rc.d/rc.local crontab -e
## 文本编辑中点i输入一下编辑
*/30 * * * * (flock --timeout=0 /var/run/check_rocketmq_nameserver.lock -c 'source /etc/profile;/bin/sh /data/scripts/check_nameserver_health.sh >>/var/log/check_rocketmq_nameserver.log')
*/15 * * * * (flock --timeout=0 /var/run/check_rocketmq_brokerserver.lock -c 'source /etc/profile;/bin/sh /data/scripts/check_brokerserver_health.sh >>/var/log/check_rocketmq_brokerserver.log')
【注意:】
(
出现问题,不要慌,要找到log,多试试。还出现了,tar包安装jdk,显示所属的用户组是个uucp,这个还不知道是什么缘由致使的,最后我又设置了jdk目录的所属改为了root。
问题1:直接在命令行执行:
flock --timeout=0 /var/run/check_rocketmq_nameserver.lock -c 'sh /data/scripts/check_nameserver_health.sh >>/var/log/check_rocketmq_nameserver.log'
能够执行,可是cron任务则一直报错误:
这个错误来源于/rocketmq/bin/runserver.sh:
以此作出推断,是在cron执行启动脚本的时候,环境变量没有读取到JAVA_HOME。通过多方调查,须要再cron中添加环境须要的变量:
*/30 * * * * (flock --timeout=0 /var/run/check_rocketmq_nameserver.lock -c 'source /etc/profile;/bin/sh /data/scripts/check_nameserver_health.sh >>/var/log/check_rocketmq_nameserver.log')
解决:
一、sh 命令改成 source /etc/profile;/bin/sh 便可解决。
二、设置JAVA_HOME
2.一、若是是tar包安装的jdk,则只要/etc/profile中设置了JAVA_HOME便可。
2.二、若是是rpm安装,则必须也要在/etc/profile中设置JAVA_HOME,cron任务才能正确执行
)
附:
一、cron命令能够参考:
http://www.cnblogs.com/gmq-sh/p/6971588.html
二、linux使用flock文件锁解决crontab冲突问题
使用linux flock 文件锁实现任务锁定,解决冲突
格式:
flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command
选项
-s, --shared: 得到一个共享锁 -x, --exclusive: 得到一个独占锁 -u, --unlock: 移除一个锁,一般是不须要的,脚本执行完会自动丢弃锁 -n, --nonblock: 若是没有当即得到锁,直接失败而不是等待 -w, --timeout: 若是没有当即得到锁,等待指定时间 -o, --close: 在运行命令前关闭文件的描述符号。用于若是命令产生子进程时会不受锁的管控 -c, --command: 在shell中运行一个单独的命令 -h, --help 显示帮助 -V, --version: 显示版本
参考:http://blog.csdn.net/fdipzone/article/details/38284009
--------------------------------------------------------------------------------------------
5、Rocketmq服务健康监控(网上找的,不能直接用,太多bug,可用的请参考上面的,近供参考)
--------------------------------------------------------------------------------------------
一、依赖组件安装
yum -y install nmap
二、nameserver监控
vi /data/scripts/check_nameserver_health.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin SRV_PORT="9876" ## 端口号 SRV_PROT="tcp" ## 协议类型 SRV_NAME="rocketmq_nameserver" ## 服务名 ## 是否已正确扫描 SCAN_FLAG=0 for ETH_NAME in `/sbin/ifconfig | grep eth0 | awk '{print $1}'` do ETH1_ADDR=`/sbin/ifconfig ${ETH_NAME} | awk -F ':' '/inet addr/{print $2}' | sed 's/[a-zA-Z ]//g'` [[ -z "${ETH1_ADDR}" ]] && continue || break done TMP_SRV_PROT=`echo ${SRV_PROT} | tr '[A-Z]' '[a-z]'` if [[ "${TMP_SRV_PROT}" == "tcp" ]]; then PROT_OPT="S" elif [[ "${TMP_SRV_PROT}" == "udp" ]]; then PROT_OPT="U" else echo "未知的协议类型!" && exit1 fi ## 最多扫描3次,成功一次便可,以免网络抖动而致使误判 for ((i=0; i<3; i++)); do RETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} | grep open` [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10 done if [[ ${SCAN_FLAG} -ne 1 ]]; then [[ -n `ps aux | grep java | grep namesrv` ]] && kill -9 `ps aux | grep java | awk '/namesrv/{print $2}'` cd /usr/local/rocketmq/bin && nohup sh mqnamesrv & fi
注意:
eth0--》要根据本身网卡来写。
三、brokerserver监控
vi /data/scripts/check_brokerserver_health.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin SRV_PORT="10911" ## 端口号 SRV_PROT="tcp" ## 协议类型 SRV_NAME="rocketmq_brokerserver" ## 服务名 ## 是否已正确扫描 SCAN_FLAG=0 for ETH_NAME in `/sbin/ifconfig | grep eth0 | awk '{print $1}'` do ETH1_ADDR=`/sbin/ifconfig ${ETH_NAME} | awk -F ':' '/inet addr/{print $2}' | sed 's/[a-zA-Z ]//g'` [[ -z "${ETH1_ADDR}" ]] && continue || break done TMP_SRV_PROT=`echo ${SRV_PROT} | tr '[A-Z]' '[a-z]'` if [[ "${TMP_SRV_PROT}" == "tcp" ]]; then PROT_OPT="S" elif [[ "${TMP_SRV_PROT}" == "udp" ]]; then PROT_OPT="U" else echo "未知的协议类型!" && exit1 fi ## 最多扫描3次,成功一次便可,以免网络抖动而致使误判 for ((i=0; i<3; i++)); do RETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} | grep open` [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10 done if [[ ${SCAN_FLAG} -ne 1 ]]; then [[ -n `ps aux | grep java | grep broker` ]] && kill -9 `ps aux | grep java | awk '/broker/{print $2}'` cd /usr/local/rocketmq/bin && nohup sh mqbroker -c ../conf/2m-noslave/broker-a.properties & fi
【注意】
i: 以上红色标注部分,在master2上的名称为“broker-b.properties”
ii: eth0--》要根据本身网卡来写。
四、crontab信息添加(有不少坑,具体请用下面新的信息添加)
# touch /var/run/check_rocketmq_nameserver.lock
# touch /var/run/check_rocketmq_brokerserver.lock # echo 'touch /var/run/check_rocketmq_nameserver.lock' >> /etc/rc.d/rc.local # echo 'touch /var/run/check_rocketmq_brokerserver.lock' >> /etc/rc.d/rc.local # crontab -e */2 * * * * (flock --timeout=0 /var/run/check_rocketmq_nameserver.lock /data/scripts/check_nameserver_health.sh >/dev/null 2>&1) */2 * * * * (flock --timeout=0 /var/run/check_rocketmq_brokerserver.lock /data/scripts/check_brokerserver_health.sh >/dev/null 2>&1)
注意:
crontab -e
而后在vi编辑器里输入便可。