加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

程序员笔记 | 一次Zookeeper扩展之殇

发布时间:2019-05-30 00:48:28 所属栏目:教程 来源:毛正卫
导读:背景 基于公司发展硬性需求,生产VM服务器要统一迁移到ZStack 虚拟化服务器。检查自己项目使用的服务器,其中zookeeper集群中招,所以需要进行迁移。 迁移计划 为了使迁移不对业务产生影响,最好是采用扩容 - 缩容的方式进行。 说明: 原生产集群为VM-1,VM

第七、zkServer.sh里的nc命令有问题。

  1. 可能是机器上没有安装nc命令,还有种说法是在zkServer.sh里找到这句: 
  2. STAT=`echo stat | nc localhost $(grep clientPort “$ZOOCFG” | sed -e ‘s/.*=//’) 2> /dev/null| grep Mode` 
  3. 在nc与localhost之间加上 -q 1 (是数字1而不是字母l) 
  4.  
  5. zookeeper版本是3.4.6,zkServer.sh里根本没有这一句(获取状态的语句没有用nc命令) 
  6.  
  7. # -q is necessary on some versions of linux where nc returns too quickly, and no stat result is output 
  8.    clientPortAddress=`grep "^[[:space:]]*clientPortAddress[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'` 
  9.    if ! [ $clientPortAddress ] 
  10.    then 
  11.        clientPortAddress="localhost" 
  12.    fi 
  13.    clientPort=`grep "^[[:space:]]*clientPort[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'` 
  14.    STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"  
  15.             -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain  
  16.             $clientPortAddress $clientPort srvr 2> /dev/null     
  17.          | grep Mode` 
  18.    if [ "x$STAT" = "x" ] 
  19.    then 
  20.        echo "Error contacting service. It is probably not running." 
  21.        exit 1 
  22.    else 
  23.        echo $STAT 
  24.        exit 0 
  25.    fi 
  26.    ;; 

以下是自己排查的方式

目前现象老集群数据同步正常,也能进行leader选举(从日志获取),但是无法查看节点状态,同异常信息;进行集群扩容,数据不能同步。

解决方法:

1. 尝试进行foreground 模式启动,选择一台非主节点进行重启,可以前台查看启动日志。

  1. zkserver.sh start-foreground  
  2. 节点启动正常,无异常输出。 

2. 查看shell脚本:分析zkServer.sh。

"Error contacting service. It is probably not running." 这块日志出现以下脚本中。

  1. STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"  
  2.              -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain  
  3.              $clientPortAddress $clientPort srvr 2> /dev/null     
  4.           | grep Mode` 
  5.     if [ "x$STAT" = "x" ] 
  6.     then 
  7.         echo "Error contacting service. It is probably not running." 
  8.         exit 1 
  9.     else 
  10.         echo $STAT 
  11.         exit 0 
  12.     fi 
  13.     ;; 

截取其中一部分脚本内容:我们可以初步定为应该是 $STAT 获取存在异常 如果STAT变量为空,则会显示Error contacting service. It is probably not running.: OK,那就分析下这个$STAT到底是什么鬼?

  1.  if [ “x$STAT” = “x” ] 
  2. then 
  3. echo “Error contacting service. It is probably not running.” 
  4. exit 1 
  5. else 
  6. echo $STAT 
  7. exit 0 
  8. fi 

3. 尝试用shell的debug模式看下执行过程。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读