一、Zookeeper简单介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
二、Zookeeper的工作机制
Zookeeper从设计模式的角度来理解:是一个基于观察者模式的分布式服务管理框架,它负责存储和管理重要的数据,然后接受观察者的注册,一旦这些被观察的数据状态发生变化,Zookeeper就负责通知已经在Zookeeper上注册的那些观察者让他们做出相应的反应。
CAP 理论是针对分布式数据库而言的,它是指在一个分布式系统中,一致性(Consistency, C)、可用性(Availability, A)、分区容错性(Partition Tolerance, P)三者不可兼得。
三、Zookeeper特点
【1】Zookeeper是存在一个领导者(Leader)和多个跟随者(Follower) 组成的集群。
【2】集群中若存在半数以上的(服务器存活数量必须大于一半,小于等于一半都不行)节点存活,就能正常工作。
【3】数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪一个Server获取的数据都是一样的。
【4】更新请求按发送的顺序依次执行。
【5】数据更新原子性原则,要么一次更新成功,要么失败。
【6】实时性,Client能够读取到最新的数据。
四、Zookeeper的选举机制
【1】半数机制:集群中半数以上的机器存活,集群就可以正常工作,所以Zookeeper适合安装奇数台服务器。
【2】ZooKeeper虽然在配置中没有指定Master和Slave,但是Zookeeper在工作时会有一个节点成为Leader,其他的则为Follower,Leader是通过内部的选举机制临时产生的。
一致性(C)
一致性是指“all nodes see the same data at the same time”,即更新操作成功后,所有节点在同一时间的数据完全一致。
一致性可以分为客户端和服务端两个不同的视角:
从客户端角度来看,一致性主要指多个用户并发访问时更新的数据如何被其他用户获取的问题;
从服务端来看,一致性则是用户进行数据更新时如何将数据复制到整个系统,以保证数据的一致。
一致性是在并发读写时才会出现的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。
可用性(A)
可用性是指“reads and writes always succeed”,即用户访问数据时,系统是否能在正常响应时间返回结果。
好的可用性主要是指系统能够很好地为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。在通常情况下,可用性与分布式数据冗余、负载均衡等有着很大的关联。
分区容错性(P)
分区容忍性(Partition Tolerance,简称P)只有两个可选参数:不容忍和容忍。
CAP定理(核心)
C、A、P三者最多得二,因为是分布式系统,所以P必须满足,所以CA不可能同时满足。
比如两台机器A,B存放着一样的数据,满足P(分区容忍)。
如果要满足一致性,假如多个请求同时访问一个数据,其中一个请求修改了A中的数据data,此时有请求访问机器B,那么必然要通过信息传输将A机器中的data同步到机器B,这样就不是完全的可用性(访问B的时延为0)。
如果满足时延为0(可用性),那么返回的data一定不是最新的data。
所以一般会根据不同的场景做折中。比如要求你在一定时延内返回正确的数据。
相互关系
CAP 理论认为分布式系统只能兼顾其中的两个特性,即出现 CA、CP、AP 三种情况,如图所示。
CA without P
如果不要求 Partition Tolerance,即不允许分区,则强一致性和可用性是可以保证的。其实分区是始终存在的问题,因此 CA 的分布式系统更多的是允许分区后各子系统依然保持 CA。
CP without A
如果不要求可用性,相当于每个请求都需要在各服务器之间强一致,而分区容错性会导致同步时间无限延长,如此 CP 也是可以保证的。很多传统的数据库分布式事务都属于这种模式。
AP without C
如果要可用性高并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了实现高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。
安装zookeeper
1. 解压之后进入到conf目录,配置cfg文件;
cp zoo_sample.cfg zoo.cfg
// 默认存在的是zoo_sample.cfg,而启动时找的时zoo.cfg文件;
# 通信心跳时间;毫秒;客户端与服务器或者服务器与服务器之间维持心跳
tickTime=2000
# 集群中follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
initLimit=10
# 集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数。
syncLimit=5
# 数据目录
dataDir=/data/zookeeper/dataDir
# 日志目录,如果没有此项,默认与dataDir一致
dataLogDir=/data/zookeeper/logs
# 客户端默认端口号
clientPort=2181
# 管理控制台端口号,没有此项默认8080端口;
# 也可以用禁用管理控制台的方法解决8080端口占用问题,不过这里直接修改端口号比较简单
admin.serverPort=12181
- 进入bin目录,cmd后缀的是windows启动文件,sh是Linux启动服务端,找到 zkServer.*文件,
linux启动后台启动
./zkServer.sh start
非后台启动
./zkServer.sh start-foreground
启动客户端,找到zkCli.* 文件;
默认链接端口2181
** 可以指定链接服务器**
./zkCli.sh -server localhost:2181
tar 解压
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令, 压缩解压都要用到其中一个, 可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数-f是必须的
-f: 使用档案名字, 切记, 这个参数是最后一个参数, 后面只能接档案名。
# tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包, -f指定包的文件名。
# tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
# tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件, -u是表示更新文件的意思。
# tar -tf all.tar
这条命令是列出all.tar包中所有文件, -t是列出文件的意思
# tar -xf all.tar
这条命令是解出all.tar包中所有文件, -x是解开的意思
压缩
tar –cvf jpg.tar *.jpg #将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg #将目录里所有jpg文件打包成jpg.tar后, 并且将其用gzip压缩, 生成一个gzip压缩过的包, 命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg #将目录里所有jpg文件打包成jpg.tar后, 并且将其用bzip2压缩, 生成一个bzip2压缩过的包, 命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg #将目录里所有jpg文件打包成jpg.tar后, 并且将其用compress压缩, 生成一个umcompress压缩过的包, 命名为jpg.tar.Z
rar a jpg.rar *.jpg #rar格式的压缩, 需要先下载rar for linux
zip jpg.zip *.jpg #zip格式的压缩, 需要先下载zip for linux
解压
tar –xvf file.tar # 解压 tar包
tar -xzvf file.tar.gz # 解压tar.gz
tar -xjvf file.tar.bz2 # 解压 tar.bz2
tar –xZvf file.tar.Z # 解压tar.Z
unrar e file.rar # 解压rar
unzip file.zip # 解压zip
总结
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz 和 *.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2 用 tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用 tar –xZf 解压
8、*.rar 用 unrar e 解压
9、*.zip 用 unzip 解压