分布式协调技术

分布式协调技术

1、分布式协调技术主要用来解决分布式环境中多个进场之间的同步控制,让他们有序的去访问某种临界资源,方式早餐"脏数据的后果"。

2、为了防止分布式系统中各个进程之间相互干扰,我们需要一种分布式协调技术进行调度,这个分布式协调的核心是分布式锁技术

分布式锁应该具有的特性

1、在分布式环境中应该能保证一个方法在同一时间只能被一个线程执行。

2、高可用的获取和释放锁。

3、高性能的获取和释放锁。

4、具备可重入的特性。

5、具备锁失效机制,防止死锁。

6、具备非阻塞特性,即没有获取到锁则直接返回获取锁失败。

什么是ZooKeeper?

1、zookeeper是一种分布式协调服务,用于管理大型主机。他能是开发人员可以专注于实现逻辑,而不用担心实现特性。

2、数据模型很想数据结构中的二叉树,也很想文件系统中的目录。

3、树是由节点所组成,zookeeper也是基于节点,名称为znode。

4、但是不同于树,而是使用路径来访问,类似目录 如 /动物/猫

5、znode的组成

  • data:znode存储的信息。
  • ACL:控制的权限。即那些人或者那些ip可以访问到。
  • child:当前节点的子节点引用。
  • stat:包含znode的各种元数据。如时间戳、事务id、版本号等。

6、zookeeper规定,每个节点最多只能存储1Mb数据。

7、zookeeper操作

  • 创建节点 create
  • 删除节点 delete
  • 是否存在 exist
  • 获取数据 getData
  • 获取节点 getChild

8、事务实现,时间通知,watch,类似观察者模式。发生操作的时候,会触发客户端的异步通知。

Zookeeper的事件通知

可以把Watch看成是特定操作的事件通知,当我们执行zookeeper的操作命令时,会自动触发反馈。

具体的操作如下,如调用 getData方法,watch参数是true,服务端接收到请求,并且获取相关数据,在哈希表中插入相应的路径。

Zookeeper的数据一致性

1、为了防止单机模式宕机的风险,集群的Zookeeper采用的一主多从的工作模式。在更新数据时,请求首先会更新到主节点,然后再同步到各个子节点。

2、Zookeeper采用ZAB(Zookeeper Atomic Broadcast)的方式进行数据同步。

3、ZAB模式下的三种状态

  • following:从节点所处的状态
  • looking:选举状态
  • leading:主节点所处的转改

4、最大ZXID:节点本地最大的事务编号。包含epoch和计数两部分。

5、ZAB的奔溃恢复。假如主节点奔溃了,Zookeeper会自动选举新的主节点。此时集群中的节点处于Looking状态,它们会各自发起投票,投票中包含自己的服务器ID和最新的事务ZXID。节点会将接收到的ZXID与自己的ID进行比较,如果比自己大,说明对方的数据比较新,然后继续进行投票。投给目前自己已知的最大节点ID。每次投票完了之后,Zookeeper会自动统计票数,得到票数至少达到一半以上,则选择其成为准Leader。只有超过半数的子节点回复已经知道ACK的信息,正式确认准Leader为Leader。

ZAB数据写入

  • 首先客户端发送写入数据给任意一个Follower。

  • Follower请求写入数据转发给Leader。

  • Leader 采用二阶段提交的方式,发送purpose广播给Follower。

  • Follower接收到 Purpose,写入日志,发送ACK给Leader。

  • Leader接收到半数以上的ACK,返回成功给客户端,并且广播Commit请求给Follower。

什么是临时顺序节点

Znode分为四种节点,包括临时节点、临时顺序节点、持久节点、持久顺序节点。顺序节点的意思是自动给节点添加一个编号,使之有序。

Zookeeper的部署

Zookeeper有三种部署方式,包括单机部署、集群部署、伪集群部署。

注:集群伪大于等于三个节点,如3,5,7,9,为奇数。

单机模式

docker-compose.yml

version: '3.1'

services: 
	zoo1: 
		image: zookeeper
		restart: always
		hostname: zoo1
		ports: 
			- 2181:2181
		environment:
			ZOO_MY_ID: 1
			ZOO_SERVERS: server.1=zoo1:2888:3888

伪集群模式

version: '2'
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
 
    zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
 
    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

验证是否安装成功

# docker exec -it zookeeper_zoo1_1 /bin/bash

查看当前节点的状态

# cd bin/
# ls -al
# ./zkServer.sh status
Mode: follower

基本配置

1 、配置文件路径 /conf/zoo.cfg

clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
  • clientPort:这个端口是客户端连接Zookeeper服务器端的端口,Zookeeper会监听这个端口,接收客户端发送的请求。
  • dataDir:Zookeeper保存数据的目录。
  • dataLogDir:Zookeeper存放日志的目录。
  • tickTime:Zookeeper心跳检查的时间间隔。每个tickTime会发送一次心跳。

Zookeeper集群模式

配置文件路径 /con/zoo.cfg

clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purInterval=0
maxClientCnxns=60
server.1=192.169.0.1:2888:3888
server.2=192.169.0.2:2888:3888
server.3=192.169.0.3:2888:3888
  • initLimit:客户端接受客户端初始化连接的初始能够忍受接受的时间间隔。
  • Leader与Follower交换信息时间长度最多不能超过的时间间隔。指定保留的个数,purgeInterval表示不清理。

客户端连接服务端命令

# zkCli.sh -server localhost:2181

你可能感兴趣的:(分布式)