zookeeper概念与部署

文章目录

  • 前言
  • 一、zookeeper服务
    • [1.1 zookeeper的概念](#1.1 zookeeper的概念)
    • [1.2 Zookeeper 数据结构](#1.2 Zookeeper 数据结构)
    • [1.3 Zookeeper 应用场景](#1.3 Zookeeper 应用场景)
    • [1.4 zookeeper原理](#1.4 zookeeper原理)
    • [1.5 Zookeeper 选举机制](#1.5 Zookeeper 选举机制)
      • [1.5.1 第一次启动选举机制](#1.5.1 第一次启动选举机制)
      • [1.5.2 非第一次启动选举机制](#1.5.2 非第一次启动选举机制)
  • 二、zookeeper配置实战
    • [2.1 配置环境](#2.1 配置环境)
    • [2.2 安装zookeeper](#2.2 安装zookeeper)
    • [2.3 编辑zookeeper配置文件](#2.3 编辑zookeeper配置文件)
    • [2.4 配置启动脚本](#2.4 配置启动脚本)
  • 总结

前言

一、zookeeper服务

1.1 zookeeper的概念

ZooKeeper 是 Apache 基金会旗下的一款分布式协调服务,专为分布式系统提供一致性、可靠性的核心支撑能力。它常用于分布式锁、配置管理、服务注册与发现、集群选举等场景,是 Hadoop、HBase、Kafka 等大数据框架的核心依赖组件,专门为分布式应用提供高效可靠的协调、同步、配置管理和故障恢复等功能。它的设计目的是简化分布式系统的管理,保证多个节点之间的数据一致性和协调工作。Zookeeper 提供了类似文件系统的层次化命名空间,用来存储和管理元数据,确保分布式应用的高可用性和强一致性。

1.2 Zookeeper 数据结构

Zookeeper 的数据结构类似于一个层次化的文件系统。

ZNode:是 Zookeeper 中存储数据的基本单元,每个 ZNode 都可以存储少量的数据,并且可以有子节点,形成树状结构。

持久节点:该类型的 ZNode 会一直存在,直到手动删除。

临时节点:客户端会话断开时,临时节点会自动删除,适用于实现分布式锁等功能。

顺序节点:在创建 ZNode 时,Zookeeper 可以自动为其添加递增的编号,常用于实现分布式队列或顺序任务处理。

1.3 Zookeeper 应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

统一命名服务

在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。

1、统一配置管理

(1)分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。

(2)配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。

2、统一集群管理

(1)分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。

(2)ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。

3、服务器动态上下线

客户端能实时洞察到服务器上下线的变化。

4、软负载均衡

在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

1.4 zookeeper原理

简单来说:zookeeper不仅可以存储文件数据也可以实时监控数据的变化并通知,如果数据发生改变,zookeeper就会发送数据改变通知给已经在zookeeper上注册了的用户。

1.5 Zookeeper 选举机制

1.5.1 第一次启动选举机制

票数过半者当选leader,过程中没有出现leader,则先前投票的节点可以继续进行投票,出现票数过半的情况则,先前投票的节点不可以继续更改投票对象(也就是投票固定)

投票规则:谁myid高投给谁,且每个节点第一次投票会投给自己。

投过一次票代表进行了一次事务。

轮流竞选(一个一个上台竞选)大致流程为:班级竞选班长,myid就比喻成人气值,一号选手先来投票并且投给自己,此时,1号选手票数为1没有过半,因此下一次投票还可以投,第二个选手来投票也投给自己,1号选手发现自己人气值没有2号选手高,因此1号选手也投2号,此时2号选手获得两票,投票数没过半,因此1、2号选手下次还要投票,三号选手进行投票并且投给自己,1、2号选手发现3号选手的人气值比自己高,所以也把票投给3号,此时3号获得3票,票数过半,1、2、3号选手不能更改投票,四号选手进行投票并且投给自己,虽然人气比3号高,但是票数只有1票,三号选手有3票,因此竞选失败,并且下次投票会把票投给3号,五号选手进行选举并把票投给自己,只有1票,3号有4票,因此3号最终成为leader。

同时竞选(全部选手站在台上,同时进行投票)大致流程为:班级竞选班长,myid比喻为人气值,五位选手会将票投给人气值最高的选手,因此五号选手当选leader。

1.5.2 非第一次启动选举机制

当ZooKeeper 集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

1、服务器初始化启动(重新竞选班长)

2、服务器运行期间无法和Leader保持连接(班长生病了,找其他同学当班长)

而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:

1、集群中本来就已经存在一个Leader。

对于已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对

于该机器来说,仅仅需要和 Leader机器建立连接,并进行状态同步即可。

2、集群中确实不存在Leader。

假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并

且此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。

选举Leader规则:

① EPOCH大的直接胜出(参加一次竞选EPOCH加1)

② EPOCH相同,事务id大的胜出(每投一次票事务id加1)

③ 事务id相同,服务器id大的胜出(服务器id为myid)

举例:班级竞选班长,3号选手为旧班长,五号选手和三号选手都生病,因此只有1、2、4号选手进行竞选,因为前面1号选手进行了5次投票,2号为4次,4号为2次,因此1号选手当选,如果三者的事务id相同,则人气值高的4号当选。

二、zookeeper配置实战

2.1 配置环境

10.0.0.100 一号zookeeper

10.0.0.3 二号zookeeper

10.0.0.4 三号zookeeper

第一步 关闭防火墙和网络增强服务

systemctl stop firewalld ------------------------关闭防火墙

setenforce 0 ------------------------关闭网络增强服务

第二步 安装java环境

rpm -ivh jdk-8u231-linux-x64.rpm -C /opt ------------------------将java压缩到opt下

第三步 配置jdk环境变量

vim /etc/profile.d/java.sh ------------------------------编辑java配置文件

export JAVA_HOME=/usr/java/jdk-8u91-linux

export CLASSPATH=.: J A V A H O M E / l i b / t o o l s . j a r : JAVA_HOME/lib/tools.jar: JAVAHOME/lib/tools.jar:JAVA_HOME/lib/dt.jar

export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

source /etc/profile.d/java.sh ------------------------------刷新配置文件

2.2 安装zookeeper

tar zxvf apache-zookeeper-3.5.7-bin.tar.gz ------------------------解压zookeeper压缩包

mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper ------------------------将apache-zookeeper-3.5.7-bin移动至/usr/local下并改名为zookeeper

cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg ---------------------------复制配置文件模板

2.3 编辑zookeeper配置文件

vim /usr/local/zookeeper/conf/zoo.cfg ------------------------------编辑zookeeper配置文件

tickTime=2000 ---------------------------通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒

initLimit=10 ------------------------------Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量),这里表示为10*2s

syncLimit=5 ------------------------Leader和Follower之间同步通信的超时时间,这里表示如果超过5*2s,Leader认为Follwer死掉,并从服务器列表中删除Follwer

dataDir=/usr/local/zookeeper-3.5.7/data ------------------------指定保存Zookeeper中的数据的目录,目录需要单独创建

dataLogDir=/usr/local/zookeeper-3.5.7/logs ---------------------指定存放日志的目录,目录需要单独创建

clientPort=2181 ------------------------------------------客户端连接端口

在文本末尾加上添加集群信息

server.1=10.0.0.100:3188:3288

server.2=10.0.0.2:3188:3288

server.3=10.0.0.3:3188:3288

(3188代表zookeeper之间的通信端口,3288代表选举端口)

mkdir /usr/local/zookeeper/data ------------------------穿建存放数据日志的目录

mkdir /usr/local/zookeeper/logs ------------------------创建存放日志文件的目录

分别在三台服务节点上输入,定义每个节点的myid

echo 1 > /usr/local/zookeeper-3.5.7/data/myid ------------------------10.0.0.100的myid=1

echo 2 > /usr/local/zookeeper-3.5.7/data/myid ------------------------10.0.0.2的myid=2

echo 3 > /usr/local/zookeeper-3.5.7/data/myid ------------------------10.0.0.3的myid=3

2.4 配置启动脚本

vim /etc/init.d/zookeeper ------------------------编辑脚本文件

#!/bin/bash

#chkconfig:2345 20 90

#description:Zookeeper Service Control Script

zk=/usr/local/zookeeper/bin

case a in ---------------------------------定义 a为第一个参数,执行脚本文件时可以输入一个参数包括(satrt、stop、restart、status)

start)

echo "---------- zookeeper 启动 ------------"

$zk/zkServer.sh start

;;

stop)

echo "---------- zookeeper 停止 ------------"

$zk/zkServer.sh stop

;;

restart)

echo "---------- zookeeper 重启 ------------"

$zk/zkServer.sh restart

;;

status)

echo "---------- zookeeper 状态 ------------"

$zk/zkServer.sh status

;;

*)

echo "Usage: $0 {start|stop|restart|status}" ------------------------参数必须选择里面四种

esac

chmod +x /etc/init.d/zookeeper ------------------------给脚本文件添加执行权限

chkconfig --add zookeeper

service zookeeper start ------------------------------开启zookeeper服务

service zookeeper status ------------------------------查看zookeeper服务信息

2号zk成为leader,实验成功,感兴趣的宝子们可以试试同时开启zookeeper服务,看看是不是3号节点成为leader。

总结

本文讲述了zookeeper的概念、选举原理以及配置操作,希望本文对您有所帮助,谢谢观看😜

相关推荐
✿ ༺ ོIT技术༻6 小时前
服务端高并发分布式结构演进之路
运维·服务器·redis·分布式·架构
码界奇点6 小时前
基于Spring Cloud Alibaba的分布式微服务权限管理系统设计与实现
分布式·spring cloud·微服务·架构·毕业设计·源代码管理
Query*7 小时前
分布式消息队列kafka【四】—— 消费者进阶提升
分布式·kafka·linq
Query*7 小时前
分布式消息队列kafka【三】—— 生产者进阶提升
分布式·kafka·linq
风跟我说过她7 小时前
基于Scrapy-Redis的分布式房产数据爬虫系统设计与实现
redis·分布式·爬虫·scrapy
嘻哈baby7 小时前
当云原生遇见VMware:容器化改造与混合部署实战
云原生
g***B7387 小时前
Java 服务端架构的本质:从单体到云原生的演进与思维模式变革
java·云原生·架构
骥龙7 小时前
4.14、云原生安全攻防:容器与 Kubernetes 的脆弱点
安全·云原生·kubernetes
hh.h.7 小时前
Flutter与鸿蒙实现分布式设备搜索(含类型识别与在线状态标注)
分布式·flutter·harmonyos