• (原创)Rocketmq分布式消息队列的部署与监控


    --------------------------------------------------------------------------------------------

    一、Rocketmq简介:

    --------------------------------------------------------------------------------------------

    RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:
    1、支持严格的消息顺序;
    2、支持Topic与Queue两种模式;
    3、亿级消息堆积能力;
    4、比较友好的分布式特性;
    5、同时支持Push与Pull方式消费消息;

    (本文采用双Master架构模式。

    --------------------------------------------------------------------------------------------

    二、服务器分布:

    --------------------------------------------------------------------------------------------

    1、2台服务器信息(我用的虚拟机)

    IP地址 主机名 机型 角色 架构模式
     192.168.100.193  rocketmq-master1 20G nameserver、brokerserver  Master1(双Master模式) 
      192.168.100.194  rocketmq-master2 20G  nameserver、brokerserver  Master2(双Master模式)

     2、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

    3、系统环境

    CentOS 6.3

    4、总体架构

    --------------------------------------------------------------------------------------------

    三、Rocketmq安装与配置

    --------------------------------------------------------------------------------------------

     1、JDK安装:

    tar包解压,然后在/etc/profile中加入如下的环境变量:

    生效:source /etc/profile

    具体可以参考我的另一篇博客:http://www.cnblogs.com/gmq-sh/p/4328843.html

    2、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

    )

    3、环境变量设置(其中ROCKETMQ_HOME是否需要设置,待观察,目前设置与否都可以,因为暂时未在其他地方用到

    在 /etc/profile 文件中追加一下配置:

    vi /etc/profile

     3.1、如果是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.2、如果是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)

    目前这个命令已经根据刚才的博文改好了,貌似还是一直在执行,不知道要执行多久,有大神可以指导下?

    4、主机名设置

    (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

    5、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"

     

    6、服务启动


    启动两台机器的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.2、防火墙配置

    最后要配置一下防火墙:

    nameserver端口为9876

    broker端口为10911

    或者如果测试,可以直接关掉防火墙。


    (1)、启动NameServer【master1、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

    7、服务关闭

    启动两台机器的NameServer:先启动两台机器的NameServer,再启动两台机器的Borker,关机的时候顺序相反,先关闭两台机器的Broker,再关闭两台机器的Nameserver。

    7.1、关闭broker

    7.1.1、直接关闭

    sh /usr/local/rocketmq/bin/mqshutdown broker

    7.1.2、优雅关闭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.2、关闭nameserver:

    sh mqshutdown namesrv

    --------------------------------------------------------------------------------------------

    四、Rocketmq服务健康监控(根据本人实践修正的,可用的监控)

    --------------------------------------------------------------------------------------------

    1、依赖组件安装

    yum -y install nmap

    2、创建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修改。

    3、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来写。

    4、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')

    解决: 

    1、sh 命令改为 source /etc/profile;/bin/sh 即可解决。

    2、设置JAVA_HOME

    2.1、如果是tar包安装的jdk,则只要/etc/profile中设置了JAVA_HOME即可。

    2.2、如果是rpm安装,则必须也要在/etc/profile中设置JAVA_HOME,cron任务才能正确执行

    附:

    1、cron命令可以参考:

    http://www.cnblogs.com/gmq-sh/p/6971588.html

    2、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

    --------------------------------------------------------------------------------------------

    五、Rocketmq服务健康监控(网上找的,不能直接用,太多bug,可用的请参考上面的,近供参考)

    --------------------------------------------------------------------------------------------

    1、依赖组件安装

    yum -y install nmap

    2、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--》要根据自己网卡来写。

    3、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--》要根据自己网卡来写。

    4、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编辑器里输入即可。








  • 相关阅读:
    toggleClass
    CSS实现文字旋转/实现角标
    vs直接IP访问运行项目
    移除页面蓝色层
    JS防止页面被其他网站iframe使用方法
    JS执行保存在数据库中的JS代码
    JavaScript中函数是不能重载原因
    jquery 根据文内内容获取dom
    IIS无法加载字体文件(*.woff,*.svg)的解决办法
    MySQL 的 RowNum 实现
  • 原文地址:https://www.cnblogs.com/gmq-sh/p/6958312.html
Copyright © 2020-2023  润新知