java消息队列分布式事务RocketMQ

Rocketmq分布式消息队列的部署与监控(双master)

2017-07-25  本文已影响786人  弱水_穿云天

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

一、Rocketmq简介:

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

RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:

1、支持严格的消息顺序;

2、支持Topic与Queue两种模式;

3、亿级消息堆积能力;

4、比较友好的分布式特性;

5、同时支持Push与Pull方式消费消息;

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

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

二、服务器分布:

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

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

IP地址主机名机型角色架构模式

192.168.100.193rocketmq-master120Gnameserver、brokerserverMaster1(双Master模式)

192.168.100.194rocketmq-master220Gnameserver、brokerserverMaster2(双Master模式)

2、hosts信息添加

vi/etc/hosts

增加以下:

192.168.100.193rocketmq-master1192.168.100.194rocketmq-master2192.168.100.193mqnameserver1192.168.100.194mqnameserver2

3、系统环境

CentOS 6.3

4、总体架构

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

三、Rocketmq安装与配置

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

1、JDK安装:

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

mvalibaba-rocketmq alibaba-rocketmq-3.2.6

修改名字。

建立软连接:

ln-s alibaba-rocketmq-3.2.6rocketmq

## java env

export JAVA_HOME=/usr/java/jdk1.7.0_79

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

## rocketmq

exportROCKETMQ_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 的后面:

修改成如下:

sed-i'/HOSTNAME/d'/etc/sysconfig/networkecho'HOSTNAME=rocketmq-master1'>> /etc/sysconfig/networkhostnamerocketmq-master1

效果如下:

(2)、Master2服务器

vi/etc/hosts192.168.100.193rocketmq-master1192.168.100.194rocketmq-master2192.168.100.193mqnameserver1192.168.100.194mqnameserver2sed-i'/HOSTNAME/d'/etc/sysconfig/networkecho'HOSTNAME=rocketmq-master2'>> /etc/sysconfig/networkhostnamerocketmq-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 主从同步双写

#SLAVESlave

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 主从同步双写

#SLAVESlave

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

原始文件(一部分内容):

(2)、启动BrokerServer A【master1】

cd /usr/local/rocketmq/bin

nohupshmqbroker -c ../conf/2m-noslave/broker-a.properties  >/dev/null2>&1&

最好用绝对路径来执行:

nohupsh/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 -n500/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 -bbroker-a-n 192.168.100.193:9876

Master B:

sh mqadmin wipeWritePerm -bbroker-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/shSRV_PORT="9876"## 端口号

SRV_PROT="tcp"## 协议类型

SRV_NAME="rocketmq_nameserver"## 服务名ETH1_ADDR="192.168.100.194"PROT_OPT="S"SCAN_FLAG=0TMP_SRV_PROT=`echo${SRV_PROT} |tr'[A-Z]''[a-z]'`for((i=0; i<3; i++));doRETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} |grepopen`

[[-n"${RETVAL}"]] && SCAN_FLAG=1;break ||sleep10doneif[[ ${SCAN_FLAG} -ne1]];then[[-n `psaux |grepjava |grepnamesrv` ]] &&kill-9`psaux |grepjava |awk'/namesrv/{print $2}'`

cd/usr/local/rocketmq/bin && nohupshmqnamesrv &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

【注意:】

出现问题,不要慌,要找到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:

参考: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/shPATH=/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}'`doETH1_ADDR=`/sbin/ifconfig ${ETH_NAME} | awk -F ':' '/inet addr/{print $2}' | sed 's/[a-zA-Z ]//g'`      [[ -z "${ETH1_ADDR}" ]] && continue ||breakdoneTMP_SRV_PROT=`echo ${SRV_PROT} | tr '[A-Z]' '[a-z]'`  if [[ "${TMP_SRV_PROT}" == "tcp" ]]; thenPROT_OPT="S"elif [[ "${TMP_SRV_PROT}" == "udp" ]]; thenPROT_OPT="U"else      echo "未知的协议类型!" &&exit1fi## 最多扫描3次,成功一次即可,以避免网络抖动而导致误判for ((i=0; i<3; i++)); doRETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} | grepopen`      [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10done  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/shPATH=/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}'`doETH1_ADDR=`/sbin/ifconfig ${ETH_NAME} | awk -F ':' '/inet addr/{print $2}' | sed 's/[a-zA-Z ]//g'`      [[ -z "${ETH1_ADDR}" ]] && continue ||breakdoneTMP_SRV_PROT=`echo ${SRV_PROT} | tr '[A-Z]' '[a-z]'`  if [[ "${TMP_SRV_PROT}" == "tcp" ]]; thenPROT_OPT="S"elif [[ "${TMP_SRV_PROT}" == "udp" ]]; thenPROT_OPT="U"else      echo "未知的协议类型!" &&exit1fi## 最多扫描3次,成功一次即可,以避免网络抖动而导致误判for ((i=0; i<3; i++)); doRETVAL=`/usr/bin/nmap -n -s${PROT_OPT} -p ${SRV_PORT} ${ETH1_ADDR} | grepopen`      [[ -n "${RETVAL}" ]] && SCAN_FLAG=1;break || sleep 10done  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

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

上一篇 下一篇

猜你喜欢

热点阅读