收入啤酒88 发表于 2019-1-8 09:03:52

zookeeper群集

  环境:建议3-5台服务器
  ip                      hostname      id
  10.100.11.13            z1            1
  10.100.11.14            z2            2
  10.100.11.17            z3            3
  绑定 ip hostname到 /etc/hosts
  1 java环境部署
  1.1 下载jdkjdk-8u77-linux-x64.tar.gz http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-linux-x64.tar.gz
  把 jdk-8u77-linux-x64.tar.gz 解压为 /usr/local/jdk
  添加环境变量
  /etc/profile 文件中添加
  ## JAVA
  export JAVA_HOME=/usr/local/jdk
  export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  并把 /usr/local/jdk/bin添加到 PATH中
  . /etc/profile重载 profile配置
  2 zookeeper安装
  以z1为例:
  把zookeeper-3.4.8.tar.gz (www.apache.org下载)解压到到 /usr/local/zookeeper
  /usr/local/zookeeper/bin添加到PATH环境变量中
  2.1 配置zoo.cfg
  /usr/local/zookeeper/conf/zoo.cfg
  ######
  tickTime=2000
  dataDir=/var/lib/zookeeper
  clientPort=2181
  initLimit=5
  syncLimit=2
  server.1=z1:2888:3888
  server.2=z2:2888:3888
  server.3=z3:2888:3888
  #####
  注意server.后面的号要与myid号对应上,范围0-255
  snapshot、log文件将保存在dataDir目录下,配置dataLogDir=/var/lib/zookeeper/logs,log将生成于dataLogDir目录下
  2.2 创建 myid 文件,保存id号。存放在zoo.cfg文件中指定的dataDir目录下
  echo 1 > /var/lib/zookeeper/myid
  2.3 zookeeper启动脚本
  先在 /usr/local/zookeeper/bin/zkEnv.sh 在#!/usr/bin/env bash行下添加下面这行
  export JAVA_HOME=/usr/local/java/jdk
  vi /etc/init.d/zk
  ##############
  #!/bin/sh
  #
  # Startup script for the ZooKeeper daemon
  #
  # processname: ZooKeeper
  # pidfile: /var/run/ZooKeeper.pid
  # config: /usr/local/zookeeper/conf/zoo.cfg
  # chkconfig: - 21 79
  # description: Start and stop ZooKeeper
  # Source function library
  . /etc/rc.d/init.d/functions
  RETVAL=0
  prog="ZooKeeper"
  prog_bin=/usr/local/zookeeper/bin/zkServer.sh
  start() {
  echo -n $"Starting $prog: "
  daemon $prog_bin start
  #/usr/local/zookeeper/bin/zkServer.sh start
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
  }
  stop() {
  echo -n $"Stopping $prog: "
  daemon $prog_bin stop
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
  }
  status() {
  $prog_bin status
  }
  # See how we were called.
  case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  stop
  start
  ;;
  status)
  status
  ;;
  *)
  echo "Usage: $0 {start|stop|restart|status}"
  exit 1
  esac
  exit $RETVAL
  ##############
  chmod +x /etc/init.d/zk
  2.3.2 CentOS 7 zookeeper启动脚本
  vi /usr/lib/systemd/system/zk.service
  ##############
  
  Description=Startup script for the ZooKeeper daemon
  Documentation=http://zookeeper.apache.org/
  After=network.target remote-fs.target nss-lookup.target
  
  Type=forking
  ExecStart=/usr/local/zookeeper/bin/zkServer.sh start
  ExecReload=/bin/kill -HUP $MAINPID
  ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
  PrivateTmp=true
  
  WantedBy=multi-user.target
  ##############
  systemctl enable zk
  systemctl start zk
  z2, z3参照z1,注意myid文件内容的 ID号要与配置文件中的 server.x对应上
  PS:
  zkServer.sh status      查看状态
  zkCli.sh -server ip:2181      # zk cli操作
  ls /            # 列出节点
  create /web1'webgroup'      # 创建节点
  默认情况,启动脚本启动zookeeper失败原因:
  首先需要知道 交互式shell和非交互式shell、登录shell和非登录shell是有区别的
  在登录shell里,环境信息需要读取/etc/profile和~ /.bash_profile, ~/.bash_login, and ~/.profile按顺序最先的一个,并执行其中的命令。除非被 --noprofile选项禁止了; 在非登录shell里,环境信息只读取 /etc/bash.bashrc和~/.bashrc
  手工执行是属于登陆shell,脚本执行数据非登陆shell,而我的linux环境配置中只对/etc/profile进行了jdk1.7等环境的配置,所以脚本执行/usr/local/zookeeper/bin/zkServer.sh start 启动zookeeper失败了
  解决方法(下面3个方法任选1):
  1、脚本代码中添加“source /etc/profile;” 改为:ssh crxy$i "source /etc/profile;/usr/local/zookeeper/bin/zkServer.sh start"
  2、把profile的配置信息echo到.bashrc中echo 'source /etc/profile' >> ~/.bashrc
  3、在/zookeeper/bin/zkEnv.sh的中开始位置添加 export JAVA_HOME=/usr/local/jdk1.7.0_45(就像hadoop中对hadoop-env.sh的配置一样)
  若其中一个节点故障,如突然停电、磁盘故障再修复,导致zk启动失败,
  ```

  zkServer.sh status
  ZooKeeper JMX enabled by default
  Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  Error contacting service. It is probably not running.
  查看zookeeper.out
  2018-02-23 14:10:29,993 - INFO - Reading configuration from: /usr/local/zookeeper/bin/../conf/zoo.cfg
  2018-02-23 14:10:30,003 - INFO - Resolved hostname: 192.168.1.75 to address: /192.168.1.75
  2018-02-23 14:10:30,004 - INFO - Resolved hostname: 192.168.1.69 to address: /192.168.1.69
  2018-02-23 14:10:30,004 - INFO - Resolved hostname: 192.168.1.68 to address: /192.168.1.68
  2018-02-23 14:10:30,004 - INFO - Resolved hostname: 192.168.1.214 to address: /192.168.1.214
  2018-02-23 14:10:30,004 - INFO - Resolved hostname: 192.168.1.213 to address: /192.168.1.213
  2018-02-23 14:10:30,004 - INFO - Defaulting to majority quorums
  2018-02-23 14:10:30,006 - INFO - autopurge.snapRetainCount set to 3
  2018-02-23 14:10:30,006 - INFO - autopurge.purgeInterval set to 0
  2018-02-23 14:10:30,007 - INFO - Purge task is not scheduled.
  2018-02-23 14:10:30,014 - INFO - Starting quorum peer
  2018-02-23 14:10:30,021 - INFO - binding to port 0.0.0.0/0.0.0.0:4180
  2018-02-23 14:10:30,025 - INFO - tickTime set to 2000
  2018-02-23 14:10:30,025 - INFO - minSessionTimeout set to -1
  2018-02-23 14:10:30,026 - INFO - maxSessionTimeout set to -1
  2018-02-23 14:10:30,026 - INFO - initLimit set to 5
  2018-02-23 14:10:45,543 - ERROR - Unable to load database on disk
  java.io.IOException: Transaction log: /data/zookeeper/logs/version-2/log.24f7000209f2 has invalid magic number 1331917856 != 1514884167
  at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.inStreamCreated(FileTxnLog.java:584)
  at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.createInputArchive(FileTxnLog.java:600)
  at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.goToNextLog(FileTxnLog.java:566)
  at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.next(FileTxnLog.java:648)
  at org.apache.zookeeper.server.persistence.FileTxnSnapLog.restore(FileTxnSnapLog.java:158)
  ```
  加载数据数据失败
  处理方法:
  删除 dataDir 目录下除文件myid外的其他文件或目录,然后重启zk



页: [1]
查看完整版本: zookeeper群集