1 Zookeeper概述

1.1 简介

  • Zookeeper 是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目
  • 从设计模式来理解:Zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接手观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相关的反应。
  • Zookeeper=文件系统+通知机制

1.2 特点

  1. 1个领导者leader,多个跟随着follower
  2. 集群中只要有半数以上的节点存活,集群就能正常服务
  3. 全局数据一致:每个server保存一份相同的数据副本,Client无论连接到哪个server,数据都是一致的
  4. 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
  5. 数据更新原子性,一次数据更新要么成功,要么失败
  6. 实时性,在一定事件范围内,Client能读到最新数据

1.3 数据结构

  • Zookeeper数据模型的结构与Unix文件系统很类似,整体上可以看作一棵树,每个节点乘坐一个ZNode。每个ZNode默认能够存储==1MB==的数据,每个ZNode都可以==通过其路径唯一标识==

1.4 应用场景

1.4.1 统一命名服务

  • 在分布式环境下,经常需要对应用/服务进行统一命名,便于识别

1.4.2 统一配置管理

  1. 分布式环境下,配置文件同步非常常见

    1. 一般要求一个集群中,所有节点的配置信息是一致的,如kafka
    2. 对配置文件修改后,希望能够快速同步 到各个节点上
  2. 配置管理可由Zookeeper实现

    1. 可将配置信息写入Zookeeper上的一个ZNode
    2. 各个客户端服务器监听这个ZNode
    3. 一旦ZNode中的数据被修改,Zookeeper将通知各个客户端服务器

1.4.3 统一集群管理

  1. 分布式环境中,实时掌握每个节点的状态是必要的

    1. 可根据节点实时状态做出一些调整
  2. Zookeeper可以实现实时监控节点状态变化

    1. 可将节点信息写入Zookeeper上的一个Znode
    2. 监听这个Znode可获取它的实时状态变化

1.4.4 服务器动态上限

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

1.4.5 软负载均衡

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

2 Zookeeper的安装

2.1 分布式安装部署

2.1.1 集群规划

  1. 在hadoop102、hadoop103、hadoop104上部署Zookeeper

2.1.2 解压安装

  1. 解压安装(102机器)
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
  1. 分发同步至其他两台机器(/opt/module/)
xsync zookeeper-3.4.10/

2.1.3 配置服务器编号

  1. 配置服务器编号 (/opt/module/zookeeper-3.4.10/),在此目录下创建zkData文件夹
mkdir -p zkData
  1. /opt/module/zookeeper-3.4.10/zkData中创建myid文件,并==编辑内容为2==,此为server编号
vi myid
  1. 分发至其他服务器中(/opt/module/zookeeper-3.4.10/zaData),==修改myid内容分别为3和4==
xsync myid

2.1.4 配置zoo.cfg文件

  1. 重命名 /opt/module/zookeeper-3.4.10/conf目录下的zoo_sample.cfgzoo.cfg
mv zoo_sample.cfg zoo.cfg
  1. 修改zoo.cfg中的数据存储路径配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
  1. 增加配置
#######################cluster########################## 
server.2=hadoop102:2888:3888 
server.3=hadoop103:2888:3888 
server.4=hadoop104:2888:3888
  1. 同步至其他两台机器
xsync zoo.cfg

2.1.5 'server.A=B:C:D' 配置解读

  1. A:是一个数字,表示这个是第几号服务器;集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比 较从而判断到底是哪个 server。
  2. B:这个服务器的 ip 地址
  3. C:这个服务器与集群中的 Leader 服务器交换信息的端口
  4. D:万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来==执行选举==时服务器相互通信的端口

2.2 ZK集群启动停止脚本

  1. /home/ruki/bin目录下创建脚本
vim zk.sh
  1. 内容如下
#!/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
  1. 增加运行权限
chmod 777 zk.sh    
  1. 启动停止命令
#启动
zk.sh start
#停止
zk.sh stop
#查看状态
zk.sh status

3 项目经验之Linux环境变量

  1. 修改/etc/profile 文件:用来设置系统环境参数,比如$PATH. 这里面的环境变量是对==系统内所有用户生效==。
#使配置文件生效
source /etc/profile
  1. 修改~/.bashrc 文件:针对==某一个特定的用户==,环境变量的设置只对该用户自己有效。 使用 bash 命令,只要以==该用户身份运行命令行就会读取该文件==。
  2. /etc/profile 里面的环境变量追加到~/.bashrc 目录
cat /etc/profile >> ~/.bashrc
  1. 注意:

    1. 登录式 Shell,采用用户名比如 ruki 登录,会自动加载/etc/profile
    2. 非登录式 Shell,采用 ssh 比如 ssh hadoop103 登录,不会自动加载/etc/profile,会自动 加载~/.bashrc

  1. 因此,我们先前创建的/etc/profile.d/env.sh用以配置环境变量是为ssh非登录shell提供便利的
Last modification:May 5th, 2020 at 09:28 pm