分布式协调服务-zookeeper

2020-03-31  本文已影响0人  猿日记

分布式环境的特点

分布式环境下面临的问题

中心化和去中心化

经典的CAP/BASE理论

CAP

C(一致性Consistency):所有节点上的数据,时刻保持一致
A(可用性Availability):每个请求都能够收到一个响应,无论响应成功或者失败
P(分区容错Partition-tolerance):表示系统出现脑裂以后,可能导致某些server与集群中的其他机器失去联系
CP/AP
CAP理论仅适用于原子读写的Nosql场景,不适用于数据库系统

BASE

初步认识zookeeper

zookeeper安装

  1. 下载zookeeper的安装包
    http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.10.tar.gz
  2. 解压zookeeper
    tar -zxvf zookeeper-3.4.10.tar.gz
  3. cd 到 ZK_HOME/conf , copy一份zoo.cfg
    cp zoo_sample.cfg zoo.cfg
  4. sh zkServer.sh
    {start|start-foreground|stop|restart|status|upgrade|print-cmd}
  5. sh zkCli.sh -server ip:port
  1. observer不参与投票,只接受投票结果
  2. 不属于zookeeper的关键部位
image.png
  1. 在zoo.cfg里面增加
    peerType=observer
    server.1=192.168.11.129:2181:3181:observer
    server.2=192.168.11.131:2181:3181
    server.3=192.168.11.135:2181:3181

第一步: 修改配置文件
server.id=host:port:port
id的取值范围: 1~255; 用id来标识该机器在集群中的机器序号
2181是zookeeper的端口; //3306
3181表示leader选举的端口
server.1=192.168.11.129:2181:3181
server.2=192.168.11.131:2181:3181
server.3=192.168.11.135:2181:3181

第二步:创建myid
在每一个服务器的dataDir目录下创建一个myid的文件,文件就一行数据,数据内容是每台机器对应的server ID的数字

第三步:启动zookeeper

192.168.11.129
192.168.11.131
192.168.11.135

zoo.cfg配置文件分析

zookeeper中的一些概念

数据模型

zookeeper的数据模型和文件系统类似,每一个节点称为:znode 是zookeeper中的最小数据单元,每一个znode上都可以保存数据和挂载子节点,从而构成一个层次化的属性结构

节点特性

会话

image.png

zookeeper的命令操作

  1. create [-s] [-e] path data acl
    -s 表示节点是否有序
    -e 表示是否为临时节点
    默认情况下,是持久化节点

  2. get path [watch]
    获得指定 path的信息

  3. set path data [version]
    修改节点 path对应的data
    乐观锁的概念
    数据库里面有一个 version 字段去控制数据行的版本号

  4. delete path [version]
    删除节点
    stat信息
    cversion = 0 子节点的版本号
    aclVersion = 0 表示acl的版本号,修改节点权限
    dataVersion = 1 表示的是当前节点数据的版本号
    czxid 节点被创建时的事务ID
    mzxid 节点最后一次被更新的事务ID
    pzxid 当前节点下的子节点最后一次被修改时的事务ID
    ctime = Sat Aug 05 20:48:26 CST 2017
    mtime = Sat Aug 05 20:48:50 CST 2017
    cZxid = 0x500000015
    ctime = Sat Aug 05 20:48:26 CST 2017
    mZxid = 0x500000016
    mtime = Sat Aug 05 20:48:50 CST 2017
    pZxid = 0x500000015
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0 创建临时节点的时候,会有一个sessionId 。 该值存储的就是这个sessionid
    dataLength = 3 数据值长度
    numChildren = 0 子节点数

java api的使用

zkclient

image.png

curator

Curator本身是Netflix公司开源的zookeeper客户端;

curator连接的重试策略

zookeeper的实际应用场景

zookeeper能够实现哪些场景
订阅发布
watcher机制
统一配置管理(disconf)
分布式锁
redis
zookeeper
数据库

负载均衡
ID生成器
分布式队列
统一命名服务
master选举

分布式锁

master选举

数据发布订阅/ 配置中心

实现配置信息的集中式管理和数据的动态更新

实现配置中心有两种模式:push 、pull。
长轮训
zookeeper采用的是推拉相结合的方式。 客户端向服务器端注册自己需要关注的节点。一旦节点数据发生变化,那么服务器端就会向客户端
发送watcher事件通知。客户端收到通知后,主动到服务器端获取更新后的数据

  1. 数据量比较小
  2. 数据内容在运行时会发生动态变更
  3. 集群中的各个机器共享配置

负载均衡

请求/数据分摊多个计算机单元上

分布式锁

通常实现分布式锁有几种方式

  1. redis。 setNX 存在则会返回0, 不存在
  2. 数据方式去实现
    创建一个表, 通过索引唯一的方式
    create table (id , methodname …) methodname增加唯一索引
    insert 一条数据XXXdelete 语句删除这条记录
    mysql for update
  3. zookeeper实现

实现共享锁,使用java api的方式

命名服务

master选举

7*24小时可用, 99.999%可用

master-slave模式

使用zookeeper解决

curator 提供应用场景的封装

LeaderLatch

写一个master
LeaderSelector
每一个应用都写一个临时有序节点,根据最小的节点来获得优先权

zookeeper集群角色

leader
leader是zookeeper集群的核心

  1. 事务请求的唯一调度者和处理者,保证集群事务处理的顺序性
  2. 集群内部各个服务器的调度者

follower

  1. 处理客户端非事务请求,以及转发事务请求给leader服务器
  2. 参与事务请求提议(proposal)的投票(客户端的一个事务请求,需要半数服务器投票通过以后才能通知leader commit;leader会发起一个提案,要求follower投票)
  3. 参与leader选举的投票

observer

zookeeper的集群组成

zookeeper一般是由2n+1台服务器 组成

leader选举

上一篇 下一篇

猜你喜欢

热点阅读