zookeeper

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

  1. persistent
  2. persistent_sequential (持久序列,如f00000001)
  3. ephemeral
  4. ephemeral_sequential
znode顺序标识

节点设置顺序标识后,父节点会维护子节点单调递增创建
通过顺序标识,易得事件发生顺序

zk客户端使用

cd /zk/bin/ 进入bin
执行 ./zkcli.sh 连接本机zk
执行 ./zkcli.sh server ip 连接其它机器zk

常用命令
  1. ls /显示根目录
  2. create path "data" 创建节点 path为路径 data为值
  3. get path 查看节点
    包含 节点值
    czxid 创建事务id
    ctime 创建时间
    mzxid 修改事务id
    mtime 修改时间
    pzxid
    cversion 创建版本号 如果创建子节点 ++
    dataVsersion 数据版本 如果set修改节点数据++
    aclvsersion 权限版本
    ephemeralOwn 临时拥有
    dataLength 数据长度
    numChildren 子节点数
  4. set path "data" 修改节点值
  5. watch 监听
    原理:当客户端发送watch命令时,会将自己的ip和等待端口(socket)发送给zkServer
    zkServer收到信息后会在内部创建监听者信息,当监听信息发生改变后,zk给监听者发送信息
    监听只会触发一次,如果要重复监听,在触发监听回调时再次监听
    5.1 get path watch 监听节点数据是否发生变化
    5.2 ls path watch 监听目录下子节点是否发生变化
    5.3 stat path watch 监听节点的状态是否发生变化
注:一台机器的zk节点创建,修改,会同时同步到其它机器

你可能感兴趣的:(zookeeper)