二.zookeeper应用场景和集群

一. 核心应用场景

1.1 分布式配置中心

原理很简单

  1. 节点数据用JSON存储配置
  2. 客户端启动时监听节点数据的变更

1.2 分布式锁

1.2.1 非公平锁

每个线程都创建系统的节点,创建成功的获取锁,执行完成后删除节点。 其他线程监听节点的状态。一旦删除继续尝试获取锁


该实现方式在并发问题比较严重的情况下,性能会下降的比较厉害,主要原因是,所有的连接 都在对同一个节点进行监听,当服务器检测到删除事件时,要通知所有的连接,所有的连接同时 收到事件,再次并发竞争,这就是羊群效应

1.2.2 公平锁

公平锁时利用顺序节点特性。每个线程在相同容器节点下创建顺序节点,创建完成直接获取所有的子节点,序号最小的获取到锁。 其他线程依次监听上一个序号的节点。


image.png

1.2.3 读写锁

读共享,读写互斥。 实现原理同样利用顺序节点特性。读写分别创建不同前缀的子顺序节点。
对于读请求:
1.如果自己之前的都是读节点。则获取到锁
2.如果自己之前存在写节点,则监听离自己最近的节点。

对于写请求:直接监听自己的上一个节点。


image.png

1.3 注册中心

核心原理:
1.服务端:相同服务使用同一个父目录
2.每个服务创建一个节点,并放置自己的节点数据——ip,端口等
3.客户端监听父目录的状态,监听子节点的增加,删除事件。

实际的注册中心实现还是很复杂的。市面上常用的RPC框架 dubbo和Spring-cloud已经支持。

二. 集群

2.1. 主要配置说明(zoo.cfg)

  • tickTime:用于配置Zookeeper中最小时间单位的长度,很多运行时的时间间隔都是使用tickTime的倍数来表示的。
  • initLimit:该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时间。
    - Follower服务器再启动过程中,会与Leader建立连接并完成数据的同步,从而确定自己对外提供服务的起始状态。
    - Leader服务器允许Follower再initLimit 时间内完成这个工作。
  • -syncLimit:Leader 与Follower心跳检测的最大延时时间
  • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将 写数据的日志文件也保存在这个目录里。
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
  • server.A=B:C:D:E
    • A 是一个数字,表示这个是第几号服务器;
    • B 是这个服务器的 ip 地址;
    • C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
    • D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新 的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配 置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给 它们分配不同的端口号。
    • E 如果需要通过添加不参与集群选举以及事务请求的过半机制的 Observer节点,可以在E的位置,添加observer标识。

2.2 集群搭建

zookeeper集群搭建还是很简单的,下面搭建伪集群即所有节点在一个机器上。

1. 下载解压

2. 复制重命名zoo.cfg 文件

分别命名,如 zoo1.cfg,zoo2.cfg,zoo3.cfg,zoo4.cfg

3. 修改服务端口和数据目录信息

clientPort:四个不同端口,例如2181,2182,2183,2184
dataDir : 修改数据存储,如
/usr/local/data/zookeeper1
/usr/local/data/zookeeper2
/usr/local/data/zookeeper3
/usr/local/data/zookeeper4

4. 增加集群信息

// participant 可以不用写
server.1=127.0.0.1:2001:3001:participant
server.2=127.0.0.1:2002:3002:participant 
server.3=127.0.0.1:2003:3003:participant  
server.4=127.0.0.1:2004:3004:observer

5. 标识Server ID

这个很重要,和选举有关。在每个目录中创建文件 myid 文件,写入当前实例的server id,即1,2,3,4 ,依次启动所有服务就好。

集群动态配置

Zookeeper 3.5.0 以前,Zookeeper集群角色要发生改变的话,只能通过停掉所有的 Zookeeper服务,修改集群配置,重启服务来完成,这样集群服务将有一段不可用的状态,为了 应对高可用需求,Zookeeper 3.5.0 提供了支持动态扩容/缩容的 新特性。但是通过客户端API 可以变更服务端集群状态是件很危险的事情,所以在zookeeper 3.5.3 版本要用动态配置,需要 开启超级管理员身份验证模式 ACLs。如果是在一个安全的环境也可以通过配置 系统参数 - Dzookeeper.skipACL=yes 来避免配置维护acl 权限配置。具体参见官方文档。

你可能感兴趣的:(二.zookeeper应用场景和集群)