zookeeper与keepalived的区别
zookeeper比keepalived更加复杂,可以将master的状态返回
keeplived只是简单主备切换
zookeeper本身也是分布式的
zookeeper半数以上机器存活就可正常运行
zk本质功能:1.管理用户提交的数据 (用节点存储(内存数据库))
2.为用户程序提供节点监听
基于java 需要jre环境
特性:
1.一个leader多个follower组成的集群
2.全局一致性
3.分布式读写,更新请求转发由leader实施
4.顺序一致性
5.数据更新原子性(要么都成功,要么都失败)
6.更新速度快
主要职责watch
1.配置维护
2.集群选主
3.动态上下感知
4.主从监听
Zookeeper不能作为存储的原因:存储数据量小
一般配置为奇数台,企业中至少5台,原因是zookeeper的半数选举机制,用偶数台效率不如奇数台
主备切换
子机2个 状态 分别为leader 和 follower
用户通过zk访问leader
如果active挂了,zk发生节点减少事件,通知给follower
follower收到消息后将自己变为leader
主节点选取
多个子机,所有follower监听leader,存在servers
一旦zk主节点leader挂了,扫描servers,哪个节点id最大,选为新的主节点
分布式锁
子机设为sequential znode
谁访问将写入zk的locks,由于是znode 加入lock是递增的,谁最小谁有访问权限,当访问结束后,将自己从locks删除
这样可以保证永远只有一个子机访问
zookeeper安装
1.解压
2.进入文件,cd conf 修改配置文件
tickTime 心跳包时间
initLimit 初始化时间最大间隔心跳数
syncLimit 发送请求最大间隔心跳数
dataDir 默认放再tmp中可能以后会被删除,所以修改地址
clientPort 客户端访问端口号
server.1=ip:2888:3888 2888,3888一个用来监听心跳,一个监听选主,可以配置多个,但最好奇数台
wq
3.scp -r zookeeper/ root@ip:$pwd 将文件拷到另一个ip主机,$pwd保存在相同路径下
4.找到之前设置dataDir的路径,echo server后的序号 > dataDir后设置的文件名
5.进入每个zk/bin下 ./zkserver.sh start
此处我们发现第二台机器被设置为leader,原因是:1第一个开启,还没有集群,第二台开启,zk选主,由于第二台的序号大,所以被选为主机,而之后的主机开启虽然比第二台大,但是已经选主,所以,其它机器来都是follower
zk的数据也是遵循选举的,每次我们获取的数据,都是zk半数以上机器选主的结果
shell启动zk
如果有很多机器。。去每个机器里启动明显不靠谱,so在每个机器之间配好免密登陆,写一个群起的脚本
vi zkstart.sh
#!/bin/bash
for host in ip1 ip2 ...
do
echo "$host is starting"
##因为zk是java程序,而当脚本直接启动时没有java环境所以添加source /etc/profile
ssh $host "source /etc/profile;/path/zk/bin/zkServer.sh start"
done
esc :wq!
chmod u+x zkstart.sh
./zkstart.sh 群起成功
paxos一致性算法
zk的半数选举的,保持数据一致性的核心算法
zk的节点znode
zk可以创建子目录,子目录下还可以存储子目录,但是节点只能存储很少的数据,所以只用来存储核心的关键数据,如机器状态。一个节点不能超过1M,最好几十K就ok
znode的类型
1.短暂 ephemeral 断开连接自动删除 常用
2.永久 断开连接不删除
znode目录节点类型
默认为persistent
- persistent
- persistent_sequential (持久序列,如f00000001)
- ephemeral
- ephemeral_sequential
znode顺序标识
节点设置顺序标识后,父节点会维护子节点单调递增创建
通过顺序标识,易得事件发生顺序
zk客户端使用
cd /zk/bin/ 进入bin
执行 ./zkcli.sh 连接本机zk
执行 ./zkcli.sh server ip 连接其它机器zk
常用命令
- ls /显示根目录
- create path "data" 创建节点 path为路径 data为值
- get path 查看节点
包含 节点值
czxid 创建事务id
ctime 创建时间
mzxid 修改事务id
mtime 修改时间
pzxid
cversion 创建版本号 如果创建子节点 ++
dataVsersion 数据版本 如果set修改节点数据++
aclvsersion 权限版本
ephemeralOwn 临时拥有
dataLength 数据长度
numChildren 子节点数 - set path "data" 修改节点值
- watch 监听
原理:当客户端发送watch命令时,会将自己的ip和等待端口(socket)发送给zkServer
zkServer收到信息后会在内部创建监听者信息,当监听信息发生改变后,zk给监听者发送信息
监听只会触发一次,如果要重复监听,在触发监听回调时再次监听
5.1 get path watch 监听节点数据是否发生变化
5.2 ls path watch 监听目录下子节点是否发生变化
5.3 stat path watch 监听节点的状态是否发生变化