是啥
Zookeeper是一个分布式的协调服务框架,Zookeeper可以解决分布式环境常见的问题:统一命名服务,
信息配置管理,数据一致性,集群管理,分布式锁等等
解决问题
- 容易出现死锁
- 容易活锁,处于活锁的线程都是非阻塞的,而且每个线程都抢不到资源,会造成cpu的耗费。线程在执
行过程中产生了碰撞——再执行——再碰撞,如此循环往复,形成活锁。 - 集群的管理问题,比如某台的宕机需要能够检测到
zookeeper概述 - 集群配置文件的统一管理问题
- 集群中信息状态的更新通知问题
- 管理集群的选举问题
- 分布式锁的实现,这需要用新的机制和技术来实现
安装步骤:
- 关闭虚拟机的防火墙 ,执行:service iptables stop
- 准备虚拟机,安装并配置jdk,1.6以上
配置示例:
JAVA_HOME=/home/software/jdk1.8
CLASSPATH=.: JAVAHOME/lib/dt.jar: J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/tools.jar
PATH= JAVAHOME/bin: J A V A H O M E / b i n : PATH
export JAVA_HOME PATH CLASSPATH - 上传zookeeper的安装包 3.4.7版本
- 解压安装 tar -xvf …………
- 进入zookeeper安装目录下的conf目录,有一个zoosample.cfg的文件
复制一份,并重命名为zoo.cfg文件,这个名字固定写死,因为zookeeper启动会检查这个文
件,根据这个配置文件里的信息来启动服务 - 进入bin目录
执行:./zkServer.sh start 启动zookeeper - 进入zookeeper客户端,操作zookeeper
执行:./zkCli.sh
集群搭建
配置伪集群模式
1. 切换到zookeeper安装目录的conf目录,其中有一个zoo_sample.cfg的配置文件,这个一
个配置模板文件,我们需要复制这个文件,并重命名为 zoo.cfg。zoo.cfg才是真正的配置文
件
2. 配置zoo.cfg=》vim zoo.cfg 更改如下几个参数配置:
dataDir。这个参数是存放zookeeper集群环境配置信息的。这个参数默然是配置在
/tmp/zookeeper下的 。但是注意,tmp是一个临时文件夹,这个是linux自带的一个目录,是
linux本身用于存放临时文件用的目录。但是这个目录极有可能被清空,所以,重要的文件一定
不要存在这个目录下。
所以改成:/home/work/zkdata
注意:这个路径是自定义的,所以目录需要手动创建
clientport。客户端连接服务器的端口,默认是2181,一般不用修改
在配置文件里,需要在加上如下的配置:
server.1=192.168.234.10:2888:3888
server.2=192.168.234.11:2888:3888
server.3=192.168.234.12:2888:3888
①server是关键字,写死
②后面的数字是选举id,在zk集群的选举过程中会用到。
补充:此数字不固定,但是需要注意选举id不能重复,相互之间要能比较大小
然后保存退出
③192.168.234.10:2888:3888
说明:2888原子广播端口,3888选举端口
zookeeper有几个节点,就配置几个server
配置说明
tickTime: zookeeper中使用的基本时间单位, 毫秒值.
dataDir: 数据目录. 可以是任意目录.
dataDir: 数据目录. 可以是任意目录.
dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同设置.
clientPort: 监听client连接的端口号
initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为
follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参
数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.
syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该
参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.
Zookeeper的选举机制:
分两个阶段。
阶段一:数据恢复阶段。每台zk启动时,会从dataDir目录找到 最大事务id (Zxid)
阶段二:选举阶段。每台zk服务都会推荐自己当Leader,并且会提交选举协议,协议的内容:
①自己拥有的最大事务id
②自己的选举id
③逻辑时钟值。作用是确保每台zk在同一轮选举中
④当前的状态:
Looking(选举)
Follower
Leader
Observer(观察者)
pk原则:
①先比较最大事务id,谁大谁当Leader。因为事务id越大,事务越新。
②如果最大事务id比较不出来,就比较选举id,谁大谁当Leader。
但是注意:pk最基本的原则要满足过半性
补充:过半性是zookeeper是一大特点。有:①过半选举 ②过半存活
所以,一般搭建zk集群,都是奇数台服务器,比如11、25等。因为可以更好的满足过半性。