ZK迁移引发的血案

ZooKeeper为分布式应用系统提供了高性能服务,在很多常见的集群服务中被广泛使用,最常见的当属HBase集群了,其它的还有Solr集群,Hadoop-2中的HA自动故障转移等。本文主要介绍了为HBase集群部署ZooKeeper集群的过程,并说明了部署过程中遇到的问题。

    默认情况下,由HBase管理ZooKeeper的启动和停止,要想修改这一默认行为,需要将hbase-env.sh中的export HBASE_MANAGES_ZK=true改为export HBASE_MANAGES_ZK=false,并在启动HBase之前先启动ZooKeeper集群。在${ZOOKEEPER_HOME}/conf中复制zoo_sample.cfg为zoo.cfg,并修改dataDir为用于保存ZooKeeper数据的目录,默认为/tmp/zookeeper。然后添加用于集群的服务器,格式为:server.1=hostname1:连接端口:选举端口,其中的1为myid文件中的值。比如对于拥有三个节点的ZooKeeper集群,示例配置可能为:

[java]  view plain copy print ?

server.1=CentOS-1:2888:3888  

server.2=CentOS-2:2888:3888  

server.3=CentOS-3:2888:3888  

    对于ZooKeeper集群配置,需要在启动集群之前在${ZOOKEEPER_HOME}/${dataDir}下创建myid文件,文件内容与server.x中的x对应,比如myid位于上述示例中的CentOS-1中,则内容必须为1。CentOS-2、CentOS-3上的myid文件内容分别为2、3。如果在集群启动之前没有创建myid文件,在启动时会报如下的错误:

[java]  view plain copy print ?

2015-07-03 15:37:40,877 [myid:] - ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally  

org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /home/search/zookeeper-3.4.6/bin/../conf/zoo.cfg  

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:123)  

at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101)  

at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)  

Caused by: java.lang.IllegalArgumentException: /HData/zookeeper/myid file is missing  

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:350)  

at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:119)  

... 2 more  

Invalid config, exiting abnormally  

    在每台ZooKeeper节点对ZooKeeper进行修改完毕后,由于ZooKeeper没有start-hbase或者start-dfs类似的启动所有节点的脚本,所以必须在每台服务器上分别执行${ZOOKEEPER_HOME}/bin/zkServer.sh start启动ZooKeeper。启动完毕后可以执行${ZOOKEEPER_HOME}/bin/zkServer.sh status检查状态,比如:

[java]  view plain copy print ?

JMX enabled by default  

Using config: /application/search/zookeeper/bin/../conf/zoo.cfg  

Mode: follower  

    ZooKeeper集群成功启动后,需要修改hbase-site.xml中的参数hbase.zookeeper.quorum,使其值包含所有ZooKeeper节点,比如CentOS-1,CentOS-2,CentOS-3,之间用逗号分隔。

    而对于单节点的ZooKeeper来说,则不需要在配置文件zoo.cfg中设置服务器相关的信息,即不需要设置server.x,因而也就无需创建对应的myid文件。对于单节点的ZooKeeper还有一个问题需要注意,该问题属于ZooKeeper本身的一个Bug,但已经在版本3.4.7, 3.5.2, 3.6.0中修复,具体可参考ZOOKEEPER-832,异常信息如下:

[java]  view plain copy print ?

2015-07-22 13:00:23,286 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@213] - Accepted socket connection from /10.10.32.223:15489  

2015-07-22 13:00:23,286 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:ZooKeeperServer@811] - Refusing session request for client /10.10.32.223:15489 as it has seen zxid 0x210d711 our last zxid is 0x26ca client must try another server  

2015-07-22 13:00:23,287 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1000] - Closed socket connection for client /10.10.32.223:15489 (no session established for client)  

    该问题是由于修改了ZooKeeper的${dataDir}目录到新目录或者删除目录中的文件引起的。

    在部署ZooKeeper时还遇到了日志输出的问题,在不做任何与日志有关的修改时,会将ZooKeeper日志输出到单一的zookeeper.out文件,如果长时间运行,将导致该文件非常巨大,对其查看将非常不方便,因此需要修改zkEnv.sh、log4j.properties。对zkEnv.sh做如下的修改,分别指定日志保存的目录,日志输出的级别及输出的地方:

[java]  view plain copy print ?

if [ "x${ZOO_LOG_DIR}" = "x" ]  

then  

    #ZOO_LOG_DIR="." #默认值为当前目录  

    ZOO_LOG_DIR="/HData/log/zookeeper/"  

fi  

if [ "x${ZOO_LOG4J_PROP}" = "x" ]  

then  

    #ZOO_LOG4J_PROP="INFO,CONSOLE"  

    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"  

fi  

    然后修改log4j.properties文件,注释部分为原有值,新增部分取代了原有值:

[java]  view plain copy print ?

#zookeeper.root.logger=INFO, CONSOLE  

zookeeper.root.logger=INFO.ROLLINGFILE #日志输出的级别及输出的地方  

#log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender  

log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender #日志文件的appender  

# Max log file size of 10MB  

#log4j.appender.ROLLINGFILE.MaxFileSize=10MB #禁用该属性  

# uncomment the next line to limit number of backup files  

#log4j.appender.ROLLINGFILE.MaxBackupIndex=10  

    做完上述部分的修改后,ZooKeeper将日志输出到${ZOO_LOG_DIR}/zookeeper.log中,每天都会生成新的日志文件,并将之前的文件重命名为zookeeper.log.2015-07-22。即使做了上述修改依然会生成zookeeper.out,尽管此时该文件的内容为空,但对于不喜欢该文件的用户来说,则需要修改zkServer.sh文件,将下面的行替换如下,这样就不会在日志目录中存在zookeeper.out文件。

[java]  view plain copy print ?

nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \  

-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &  


nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \  

    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > /dev/null 2>&1 < /dev/null &  

    本文简要描述了ZooKeeper集群的部署安装,并分析了安装过程中遇到的问题,最后说明了如何修改ZooKeeper的默认日志配置,以使日志输出到指定目录和文件中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • Zookeeper--Zookeeper是什么博客借鉴http://www.cnblogs.com/yuyijq/...
    Albert陈凯阅读 6,022评论 1 36
  • 该文档是用Hbase默认配置文件生成的,文件源是Hbase-default.xml hbase.rootdir 这...
    我是嘻哈大哥阅读 4,727评论 0 7
  • 过小年,让我想起了很多小时候的事。说来是三十多年前,小时候没上过幼儿园什么的,上学之前就在农村的姥姥家,草甸上有牛...
    觉醒年代2阅读 265评论 0 2
  • 秋天的午后,也许是东北最舒服的时候。他正站在三楼望向窗外。十三年以前,他在教室里曾无数次幻想着能有此刻的惬意。没想...
    张斯令阅读 316评论 2 5
  • 01 回到昨天的微笑 你说你已无力偿还 任多情的小雨 缠绵地将你包围 你流着泪诉说你的迷惘 告诉我世界不在需要感动...
    安小左阅读 350评论 4 3