1 Zookeeper概述
1.1 简介
- Zookeeper 是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目
- 从设计模式来理解:Zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接手观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相关的反应。
- Zookeeper=文件系统+通知机制
1.2 特点
- 1个领导者leader,多个跟随着follower
- 集群中只要有半数以上的节点存活,集群就能正常服务
- 全局数据一致:每个server保存一份相同的数据副本,Client无论连接到哪个server,数据都是一致的
- 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
- 数据更新原子性,一次数据更新要么成功,要么失败
- 实时性,在一定事件范围内,Client能读到最新数据
1.3 数据结构
- Zookeeper数据模型的结构与Unix文件系统很类似,整体上可以看作一棵树,每个节点乘坐一个ZNode。每个ZNode默认能够存储==1MB==的数据,每个ZNode都可以==通过其路径唯一标识==
1.4 应用场景
1.4.1 统一命名服务
- 在分布式环境下,经常需要对
应用/服务
进行统一命名,便于识别
1.4.2 统一配置管理
分布式环境下,配置文件同步非常常见
- 一般要求一个集群中,所有节点的配置信息是一致的,如kafka
- 对配置文件修改后,希望能够快速同步 到各个节点上
配置管理可由Zookeeper实现
- 可将配置信息写入Zookeeper上的一个ZNode
- 各个客户端服务器监听这个ZNode
- 一旦ZNode中的数据被修改,Zookeeper将通知各个客户端服务器
1.4.3 统一集群管理
分布式环境中,实时掌握每个节点的状态是必要的
- 可根据节点实时状态做出一些调整
Zookeeper可以实现实时监控节点状态变化
- 可将节点信息写入Zookeeper上的一个Znode
- 监听这个Znode可获取它的实时状态变化
1.4.4 服务器动态上限
- 客户端能够实时洞察到服务器上下线的变化
1.4.5 软负载均衡
- 在Zookeeper中记录每台服务器的访问数,让访问最少的服务器去处理最新的客户端请求
2 Zookeeper的安装
2.1 分布式安装部署
2.1.1 集群规划
- 在hadoop102、hadoop103、hadoop104上部署Zookeeper
2.1.2 解压安装
- 解压安装(102机器)
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
- 分发同步至其他两台机器(
/opt/module/
)
xsync zookeeper-3.4.10/
2.1.3 配置服务器编号
- 配置服务器编号 (
/opt/module/zookeeper-3.4.10/
),在此目录下创建zkData
文件夹
mkdir -p zkData
- 在
/opt/module/zookeeper-3.4.10/zkData
中创建myid
文件,并==编辑内容为2==,此为server编号
vi myid
- 分发至其他服务器中(
/opt/module/zookeeper-3.4.10/zaData
),==修改myid内容分别为3和4==
xsync myid
2.1.4 配置zoo.cfg文件
- 重命名
/opt/module/zookeeper-3.4.10/conf
目录下的zoo_sample.cfg
为zoo.cfg
mv zoo_sample.cfg zoo.cfg
- 修改
zoo.cfg
中的数据存储路径配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
- 增加配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
- 同步至其他两台机器
xsync zoo.cfg
2.1.5 'server.A=B:C:D' 配置解读
- A:是一个数字,表示这个是第几号服务器;集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与
zoo.cfg
里面的配置信息比 较从而判断到底是哪个 server。 - B:这个服务器的 ip 地址
- C:这个服务器与集群中的 Leader 服务器交换信息的端口
- D:万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来==执行选举==时服务器相互通信的端口
2.2 ZK集群启动停止脚本
- 在
/home/ruki/bin
目录下创建脚本
vim zk.sh
- 内容如下
#!/bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh start "
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh stop "
done
};;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "/opt/module/zookeeper-3.4.10/bin/zkServer.sh status "
done
};;
esac
- 增加运行权限
chmod 777 zk.sh
- 启动停止命令
#启动
zk.sh start
#停止
zk.sh stop
#查看状态
zk.sh status
3 项目经验之Linux环境变量
- 修改
/etc/profile
文件:用来设置系统环境参数,比如$PATH
. 这里面的环境变量是对==系统内所有用户生效==。
#使配置文件生效
source /etc/profile
- 修改
~/.bashrc
文件:针对==某一个特定的用户==,环境变量的设置只对该用户自己有效。 使用 bash 命令,只要以==该用户身份运行命令行就会读取该文件==。 - 把
/etc/profile
里面的环境变量追加到~/.bashrc
目录
cat /etc/profile >> ~/.bashrc
注意:
- 登录式 Shell,采用用户名比如 ruki 登录,会自动加载
/etc/profile
- 非登录式 Shell,采用 ssh 比如
ssh hadoop103
登录,不会自动加载/etc/profile
,会自动 加载~/.bashrc
。
- 登录式 Shell,采用用户名比如 ruki 登录,会自动加载
- 因此,我们先前创建的
/etc/profile.d/env.sh
用以配置环境变量是为ssh非登录shell提供便利的
One comment
看的我热血沸腾啊https://www.jiwenlaw.com/