分布式系统定义及⾯临的问题
leader && follower
-
follower接收到客户端发送过来的写请求后,会把该写请求转发到leader来处理
-
leader接收到flloower发送过来的写请求后,会把该写请求转换成带有各种状态的事务,会把该事务进行广播(发送prososal)
-
所有接收到proposal的follower就要进行投票,都需要向leader返回ACK,
-
当leader发现大部分都接受这个投票结果时,发送事务提交请求,发送给所有的follower
-
follwer接收到请求后,写日志,写请求
-
哪个follower接收的,就进行响应,返回到客户端
leader && follower && observer
-
observer接收到客户端发送过来的写请求后,会把该写请求转发到leader来处理
-
leader接收到observer发送过来的写请求后,会把该写请求转换成带有各种状态的事务,会把该事务进行广播(发送prososal)
-
所有接收到proposal的follower就要进行投票,都需要向leader返回ACK,但是observer 不进行投票,它只是投票结果的“听众”,减轻了投票压力
-
当leader发现大部分都接受这个投票结果时,leader就发送事务提交请求,发送给所有的follower
-
此时,observer也会接收到请求,接收到请求后,写日志,写请求
-
哪个observer接收的,就进行响应,返回到客户端
mirrors.tuna.tsinghua.edu.cn/apache/zook…
mirrors.tuna.tsinghua.edu.cn/apache/zook…
Zookeeper源码编译 3.5.4 IDEA启动
一、准备工作
-
下载Ant并安装 ant.apache.org/bindownload…
-
解压Ant,并且进行环境变量设置 解压目录
环境变量设置
输入ant -version验证:
3、下载Zookeeper源码
二、编译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
运行效果示意图