ZooKeeper笔记
ZooKeeper概述
背景:
现代企业对计算机系统的计算存储能力要求越来越高,单纯的高性能服务器已经无法满足要求。企业的IT架构从集中式向分布式过度。
所谓分布式,就是将一个计算任务分解成若干计算单元,分派到不同的计算机中去执行,然后汇总计算结果的过程。
ZooKeeper是开源的分布式协调服务,是 Google Chubby 的开源实现。是高性能的分布式一致性解决方案。它将那些复杂的、容易出错的分布式一致性服务封装起来,构成一个高效的原语集,并提供一系列简单易用的接口给用户使用。
分布式数据一致性问题,指的是:
顺序一致性:严格按照客户请求发起的顺序到ZooKeeper中进行任务执行
原子性:所有事务请求,在集群中的任意一台机器上的执行结果都是一致的
单一视图:看到的服务端数据都是一致的
可靠性:一旦服务端完成响应,则状态会保存下来
实时性:ZooKeeper保证在一定时间内,客户端一定能从服务端获取数据
ZooKeeper典型应用场景:
数据发布/订阅:一方把数据发布出来,一方通过某种手段得到这些数据。
负载均衡:举例:需要提供服务的数据库服务器注册在 ZooKeeper中(称为 ZooKeeper 的一个节点),如果挂了一台,会被移除 ZooKeeper 节点。请求的时候先访问 ZooKeeper,随机挑选一台“活着”的数据库服务器进行使用。因为是随机的,可以认为是负载均衡的
命名服务:举例:数据库表中的主键字段,如果使用 MySQL 中的自增,在分布式环境不好使,使用 UUID,不容易理解。可以使用 ZooKeeper 来生成一个顺序增长,可以在集群环境中使用
分布式协调/通知:心跳检测。
优势
开源
已被证实高性能、易用的工业级产品
应用广泛
——————————————————————————————————————————————————————
ZooKeeper的基本概念
集群角色:
Leader:Leader服务器是整个ZooKeeper集群工作机制中的核心
Follwer:Follower服务器是ZooKeeper集群状态的跟随者
Observer:Observer服务器充当一个观察者的角色
会话:
会话指客户端和ZooKeeper服务器的连接,ZooKeeper中的会话叫session,客户端与服务器建立一个TCP长连接来维持一个Session
客户端在启动的时候,首先会与服务器建立一个TCP长连接,通过这个连接,客户端能够通过心跳检测与服务器保持有效会话,也能向ZooKeeper服务器发生请求并获得响应。
- 数据节点
ZooKeeper有两种节点
1、集群中的一台机器称为一个节点
2、数据模型中的数据单元znode,分为持久节点和临时节点。ZooKeeper的数据模型是一棵树,树的节点就是Znode,Znode中可以保存信息
大多数的ZooKeeper开发,都是和树节点打交道
版本:
版本类型:
版本类型 | 说明 |
version | 当前数据节点内容的版本号【如果修改了某张表的数据,就将该表的version字段进行变更。如果version=1,表示创建以来被修改了一次】 |
cversion | 当前数据节点子节点的版本号 |
aversion | 当前数据节点 ACL 变更版本号 |
一般要修改一条数据是这么处理的,在修改前,先读取当前数据记录的version字段,如version=2,然后修改的时候,version=2作为修改条件。如果此时其他事务修改了此数据,则当前修改就会失败(因为version=2找不到了)
- 悲观锁和乐观锁
悲观锁:是数据库中一种非常严格的锁策略,具有强烈的排他性。在上一个事务完成之前,下一个事务不能访问相同的资源。适合数据更新竞争非常激烈的场景、
乐观锁:修改数据前,先读取其版本号,更新的时候,把版本号作为更新条件。如果在此过程中,其他事物对此数据进行了修改,版本号会发生变更,会导致本次修改失败。排除异常让客户端自行处理
watcher:
事件监听器,ZooKeeper允许用户在指定节点上注册一些watcher,当数据节点发生变化的时候,ZooKeeper服务器会把这个变化的通知发送给感兴趣的客户端
ACL权限控制:
Access Control Lists
权限类型:CREATE-创建子节点;READ-获取节点数和子节点列表;WRITE-更新节点数据;DELETE-删除子节点;ADMIN-设置节点ACL
——————————————————————————————————————————————————————
ZooKeeper环境搭建(集群、单机、伪集群)
集群
1、准备多台Linux机器、JRE环境
2、下载ZooKeeper
3、解压安装包到需要安装的机器上
4、进入解压后的文件夹,进入conf文件夹,复制一份配置文件:cp zoo_sample.cfg zoo.cfg
zoo_sample.cfg是ZooKeeper配置文件的样例,一般我们复制一份后,在新文件上修改就行了
5、配置说明
打开配置文件(这里是zoo.cfg)后,
dataDir:用来配置ZooKeeper服务器存储快照文件的目录,一般放到 /var/ZooKeeper 上(没有的话要自己创建)
clientPort:服务器对外提供服务的端口。默认是2181
配置服务器格式:server.id=ip:port:port 两个端口的含义是不一样的 1 表示机器标识。2181配置的是Leader和Follwer的通信端口,2182用于Leader选举投票过程中的通信。这两个端口可以使用任意闲置端口
server.1=192.168.1.101:2181:2182
server.2=192.168.1.102:2181:2182
server.3=192.168.1.103:2181:2182
6、将修改完后的配置文件拷贝到集群中所有机器上
scp zoo.cfg root@192.168.1.101:/opt/zookpeer/conf
7、myid
在dataDir指定的目录下,创建一个 myid 文件,写入当前机器的id(就是server.1,那么就写1)
注意:每台机器都有配置
8、启动
进入到bin目录下,有一个叫 zkserver.sh 的文件
./zkserver.sh start
./zkserver.stop
把集群中所有的机器都启动
验证是否启动成功:telnet 192.168.1.101 2181 执行 stat 命令 这个telnet的ip是本机的ip
如果只有一台服务器启动的话,是不会成功的。因为ZooKeeper中,当超过一半的机器成功启动的时候,才认为是成功的,能够向外提供访问
机器的角色,可以在telnet命令后,输入stat,查看其中的mode参数
伪集群
zoo.cfg的配置文件中
server.1=192.168.1.101:2181:2182
server.2=192.168.1.101:2183:2184
server.3=192.168.1.101:2185:2186
其实就是ip一样,端口不同
注意:我自己试了不行,应该还有其他配置,因为只有一台机器,那么myid上写什么,启动就一次够了?
正确的方式应该是在本地不同目录安装多套zk
单机
zoo.cfg的配置文件中
server.1=192.168.1.101:2181:2182
配置一台就是了
成功
——————————————————————————————————————————————————————