Zookeeper

350 阅读4分钟

分布式系统定义及⾯临的问题

leader && follower

  1. follower接收到客户端发送过来的写请求后,会把该写请求转发到leader来处理

  2. leader接收到flloower发送过来的写请求后,会把该写请求转换成带有各种状态的事务,会把该事务进行广播(发送prososal)

  3. 所有接收到proposal的follower就要进行投票,都需要向leader返回ACK,

  4. 当leader发现大部分都接受这个投票结果时,发送事务提交请求,发送给所有的follower

  5. follwer接收到请求后,写日志,写请求

  6. 哪个follower接收的,就进行响应,返回到客户端

leader && follower && observer

  1. observer接收到客户端发送过来的写请求后,会把该写请求转发到leader来处理

  2. leader接收到observer发送过来的写请求后,会把该写请求转换成带有各种状态的事务,会把该事务进行广播(发送prososal)

  3. 所有接收到proposal的follower就要进行投票,都需要向leader返回ACK,但是observer 不进行投票,它只是投票结果的“听众”,减轻了投票压力

  4. 当leader发现大部分都接受这个投票结果时,leader就发送事务提交请求,发送给所有的follower

  5. 此时,observer也会接收到请求,接收到请求后,写日志,写请求

  6. 哪个observer接收的,就进行响应,返回到客户端

mirrors.tuna.tsinghua.edu.cn/apache/zook…

mirrors.tuna.tsinghua.edu.cn/apache/zook…

Zookeeper源码编译 3.5.4 IDEA启动

一、准备工作

  1. 下载Ant并安装 ant.apache.org/bindownload…

  2. 解压Ant,并且进行环境变量设置 解压目录

环境变量设置

输入ant -version验证:

3、下载Zookeeper源码

下载地址:github.com/apache/zook…

二、编译Zookeeper源码

进入到zookeeper源码目录,进行编译

ant eclipse

此时会发现下载一个ant-eclipse-1.0.bin.tar.bz2的时一直卡主了,此时要对地址进行替换

将bulild.xml中的

get src="https://downloads.sourceforge.net/project/ant-eclipse/ant-eclipse/1.0/ant-eclipse-1.0.bin.tar.bz2"

替换为:

get src="http://ufpr.dl.sourceforge.net/project/ant-eclipse/ant-eclipse/1.0/ant-eclipse-1.0.bin.tar.bz2"

再次编译,则编译成功,输出 Build Success

三、运行Zookeeper

运行服务端

1、将conf目录下的zoo_sample.cfg复制为zoo.cfg

2、配置zoo.cfg

设置dataDir 和 dataLogDir两个值。其他的值可默认。(本地运行,不是集群模式)

3.新建Run Configurations,配置相关参数

  • Main Class:启动服务端类
org.apache.zookeeper.server.quorum.QuorumPeerMain
  • Program arguments :将zoo.cfg全路径导入Program arguments中
D:\lagou\zookeeper-release-3.5.4\conf\zoo.cfg
  • VM Options :配置相关log4j配置
-Dlog4j.configuration= D:\lagou\zookeeper-release-3.5.4\conf\log4j.properties

4、【异常点】在编译时找不到符号 Info

Error:(21, 61) java: 找不到符号
  符号:   类 Info
  位置: 程序包 org.apache.zookeeper.version

解决方法:

在org.apache.zookeeper.version.util包里有个VerGen.java文件,运行这个文件来生成Info.Java,这个是用来在Zookeeper每次发布版本的时候用来固定生成版本号和日期的。

这里需要把 org.apache.zookeeper.version.util.VerGen.java 的main方法上添加三个运行参数,args[] ,并且把自动编译删除,要不然运行main方法时,整个项目都会编译

配置Vergen上面的configuration

重新编译这个类文件

生成的类文件在 org.apache.zookeeper.version 这个包下

把Info.java 丢到 VerGen的上一级目录即可,此时,整个错误就不会报了

5、【异常点】编译项目时,发现缺少slfj日志的依赖,所有的log4j相关代码报红,需要在Project Structure-> modules--> dependencies中添加slfj-api-xxx.jar的相关依赖即可解决

启动时报错

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

原来这是因为sl4j和log4j的不兼容导致的,具体处理方案如下:

1、首先看看你工程中的sl4j-api的版本(比如我的是1.7.21)

2、然后在mvnrepository.com/ 搜索slf4j-log4j12,会出现SLF4J LOG4J 12 Binding

3、点击进入,会有很多版本的slf4j-log4j12,我们点击1.7.21版本的slf4j-log4j12进入详细信息页面查看依赖的log4j

4、这个版本的slf4j-log4j12依赖的是1.2.71版本的log4j。

所以,我们在我们的工程中添加1.7.21版本的slf4j-log4j12和1.2.14版本的log4j,问题完美解决。

添加jar 包

然后对项目进行编译,控制台就正常输出了

可以发现,绑定的是本机端口号

运行客户端

  • Main Class
org.apache.zookeeper.ZooKeeperMain
  • VM Options
-Dlog4j.configuration=file:D:/lagou/zookeeper-release-3.5.4/conf/log4j.properties
  • Program arguments
-server 127.0.0.1:2181

运行效果示意图