ZooKeeper安装配置笔记

ZooKeeper概述

================================================================================================

1. 分布式环境下数据一致的基本问题

  • 分布式环境下,为了保证数据的可靠或分布式的处理,数据往往具有多个副本,而当数据发生变化时,如何保证数据一致就成了问题.这是分布式环境下数据分布式存储和处理的最基本的问题之一.

2. Zookeeper概述

  • Zookeeper能够在分布式环境下实现数据的一致.
  • 利用这样的特性,Zookeeper可以实现集群环境中的分布式协调服务。
  • 所谓的分布式协调服务,本质上就是在集群的节点中进行可靠的消息传递,来协调集群的工作。
  • 这样的分布式协调服务,包括:
  • 数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能
  • zookeeper基于优良的设计,成为了分布式环境下最重要的分布式协调工具之一.

3. Zookeeper特点

  • a. 顺序一致性 - 按照顺序发生
  • 从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到zookeeper中
  • b. 原子性 - 要变都变 要不变都不变
  • 所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会出现集群中部分服务器接收了事物,而另一部分服务器拒绝事务的情况。
  • c. 单一视图 - 找谁都一样
  • 无论客户端连接的是哪个zookeeper服务器,其看到的服务端数据模型都是一致的。
  • d. 可靠性 - 说话算数
  • 一旦服务端成功的应用了一个事务,并完成对客户端的响应, 那么该事务所引起的服务端状态变更将会一直保留下来,除非有另一个事务又对其进行了改变。
  • e. 实时性 - 说成了就是成了,绝对成了,但仍可能需要点时间 - 伪实时zookeeper并不能做到真正的实时性,当zk告知客户端操作成功   时,可以确信数据最终必然一致,但是zk集群仍需要一定的时间同步数据来达成最终一致的效果,所以其实Zookeeper只能保证数  据的顺序一致和最终一致,做不到实时的一致,只有伪实时的特性.

================================================================================================

起到的作用(解决的问题)

  1. 集群的管理问题,能够通过一定机制来检测到集群中节点的变化状态,是正常工作还是宕机,比如通过RPC心跳机制
  2. 集群的统一的排至文件管理
  3. 实现主备切换,避免单点问题
  4. 统一的命名服务,即确保每台服务器的名字唯一
  5. 分布式锁
  6. ZooKeeper集群的选举问题
  7. ZooKeeper集群的分布式数据一致性问题

================================================================================================

ZooKeeper原理

1.不能是一台机器

  • zookeeper为了保证可靠性,不能用一台机器,而应该是一个集群

2.多台机器必须有一个机器充当leader

  • 为了保证zookeeper集群数据能够一致,必须有一个拍板说了算的人,这就是leader,其他的是follower。
  • 某一时刻集群里只能有且仅有一个leader。                           
  •  leader可以执行增删改和查询操作,而follower只能进行查询操作。所有的更新操作都会被转交给leader来处理,leader批准的任务, 再发送给follower去执行来保证和leader的一致性。
  • 由于网络是不稳定的,为了保证执行顺序的一致,所有的任务都会被赋予一个唯一的顺序的编号,一定是按照这个编号来执行任务, 保证任务顺序的一致性。

3. 那么什么时候leader可以认为一个客户端的请求可以算是处理成功了呢?

    a. *

  • 只要leader写入成功就认为成功.
  • 这种方式,如果恰好在leader写入成功follower尚未同步时,leader宕机,则新选出的leader不知道最新的数据,则违反zookeeper的可靠性.
  • 这种方案不可以

    b. *

  • 在leader收到写入请求后,要将该请求组成提案发送给所有的follower,只有leader和所有的follower都同意该提案后,才可以完成写入,告知客户端写入成功.
  • 这种方案一旦任意一台follower宕机,则无法通过提案,造成整个
  • zookeeper无法写入任何数据,相当于仍然存在单节点故障风险.
  • 此方案不可以

    c. 过半同意机制

  • Zookeeper:用于分布式环境下的服务协调的框架。一般需要奇数台服务器 --- 为了满足过半
  • 过半:
  • 过半选举:只有当一台服务器满足超过一半的服务器的时候才能选举为leader
  • 过半存活:当集群中有一半的服务器宕机,那么整个集群会停止向外提供服务
  • 过半服务:在Zookeeper集群中,任何一个请求都需要超过半数的节点同意才能执行
  • 在leader收到写入请求后,要将该请求组成提案尽力的发送给尽量多的follower,只要过半的机器(包括leader)同意提案,则leader认为写入成功,并告知客户端.
  • 这种机制下,只要在leader宕机时,选举新的leader时选择具有最新提案的follower称为leader就可以保证数据不丢.
  • 因为最少只要过半的机器同意就可以提交一个提案,所以只要过半的机器宕机就有可能存在存活着的机器没有任何一个知道最新的提案的情况,所以只要过半的机器宕机,zookeeper就无法再保证数据的可靠性.
  • zookeeper采用的就是这种方案 -- 过半同意,过半存活
  • 提交提案时,只要过半的机器(包括leader)同意就可以提交一个提案,但只要过半的机器宕机,则集群提供提供服务.

    d. zookeeper集群中机器的数量最好是奇数个

  • 因为过半的机器宕机,zookeeper就会停止工作,所以:
  • 3-->1
  • 4-->1
  • 5-->2
  • 6-->2
  • 7-->3
  • 8-->3
  • 通过观察发现,奇数个机器和奇数+1个机器所能容忍的宕机的数量是相同的,所以为了减少浪费,最好保证集群的数量是奇数个.

4. zookeeper中的选举机制

  • 最开始集群启动时,会选择最先达到过半条件的机器作为leader。当leader挂掉后,follower开始进入选举阶段,互相发送自己所持有的数据的最高编号,进行投票,投票给最高的版本持有者,任何一个follower只要收到超过一半的票就自动成为新的leader,由于每个
  • follower都只有一票,所以最多只有一个follower可以收到过半的票从而成为新的leader.

================================================================================================

安装配置单机模式

  • 0、关闭虚拟机的防火墙,执行service iptables stop
  • 1、准备虚拟机,连接XShell,安装并配置jdk,1.6以上

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

ZooKeeper安装配置笔记

配置示例:

JAVA_HOME=/home/software/jdk1.8

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME PATH CLASSPATH
  • 2.上传zookeeper的安装包 3.4.7版
  • 3.解压安装 tar -xvf …………
  • 4. 进入zookeeper安装目录下的conf目录,有一个zoosample.cfg的文件,复制一份,并重命名为zoo.cfg文件,这个名字固定写死,因为zookeeper启动会检查这个文件,根据这个配置文件里的信息来启动服务
  • 5. 进入bin目录执行:./zkServer.shstart 启动zookeeper
  • 6.进入zookeeper客户端,操作zookeeper 执行:./zkCli.sh
  • 7、进入成功

ZooKeeper安装配置笔记

================================================================================================

安装配置

  • 提示:要关闭虚拟机的防火墙,执行:service iptables stop
  • 1.准备虚拟机,安装并配置jdk,1.6以上
  • 2.上传zookeeper的安装包 3.4.7版本3.解压安装tar -xvf …………
  • 4.配置zookeeper。
  • 5.配置集群模式

①切换到zookeeper安装目录的conf目录,其中有一个zoo_sample.cfg的配置文件,这个一个配置模板文件,我们需要复制这个文件,并重命名为 zoo.cfg。zoo.cfg才是真正的配置文件

ZooKeeper安装配置笔记

②配置zoo.cfg=》vim zoo.cfg 更改如下几个参数配置:

dataDir。这个参数是存放zookeeper集群环境配置信息的。这个参数默然是配置在/tmp/zookeeper下的 。但是注意,tmp是一个临时文件夹,这个是linux自带的一个目录,是linux本身用于存放临时文件用的目录。但是这个目录极有可能被清空,所以,重要的文件一定不要存在这个目录下。

所以改成:/home/work/zkdata

注意:这个路径是自定义的,所以目录需要手动创建

ZooKeeper安装配置笔记

clientport。客户端连接服务器的端口,默认是2181,一般不用修改在 配 置 文 件 里 , 需 要 在 加 上 如 下 的 配 置 : server.1=192.168.234.10:2888:3888 server.2=192.168.234.11:2888:3888 server.3=192.168.234.12:2888:3888

①server是关键字,写死

②后面的数字是选举id,在zk集群的选举过程中会用到。

补充:此数字不固定,但是需要注意选举id不能重复,相互之间要能比较大小然后保存退出

③192.168.234.10:2888:3888

说明:2888原子广播端口,3888选举端口

zookeeper有几个节点,就配置几个server,

ZooKeeper安装配置笔记

③配置文件配置好,需要在dataDir目录下创建一个文件

即在:/home/work/zkdata 目录下,创建myid

vim myid

给当前的节点编号。zookeeper节点在启动时,就会到这个目录下去找myid文件,得知自己的编号

ZooKeeper安装配置笔记

保存退出

  • 6. 配置集群环境的其他节点

scp -r 目录 远程ip地址:存放的路径

scp -r /home/software/zookeeper 192.168.234.151: /home/

①更改节点的ip

②更改myid的id号

③关闭防火墙 ,执行:service iptables stop;

  • 7. 启动zookeeper

进入到zookeeper安装目录的bin目录

执行:./zkServer.sh start

ZooKeeper安装配置笔记

然后可以输入jps命令,查看有哪些java进程, 执行:jps

ZooKeeper安装配置笔记

  • 8. 其他两台节点启动zookeeper服务
  • 9. 执行:./zkServer.shstatus 查看当前zookeeper节点状态
配置说明:

tickTime: zookeeper中使用的基本时间单位, 毫秒值.

dataDir: 数据目录. 可以是任意目录.

dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.

clientPort: 监听client连接的端口号

initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.

syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.

================================================================================================

08安装配置

1. 下载Zookeeper

           zookeeper托管在apache中,可以访问如下地址下载zookeeper的安装包http://zookeeper.apache.org

2. 安装zookeeper

          zookeeper可以在多平台下安装,但主要工作在Linux环境下. zookeeper本身是基于java开发的,工作需要jdk的支持

              a. 安装jdk

                        下载jdk安装包

                        上传到Linux中进行解压

             b. 修改主机名

                         hostname xxx

             c. 配置Hosts

                         vim /etc/hosts

ZooKeeper安装配置笔记

               d. 配置SSH免密登录

                           原理:非对称加密,实现免密登录

ZooKeeper安装配置笔记

  • 生成本机公钥秘钥:ssh-******
  • 将本机公钥发送给模板主机:ssh-copy-id 主机名
  • 远程ssh登录:ssh 主机名

              e. 安装zookeeper

                        i. 上传并解压zookeeper的安装包

**可以从本地上传下载好的zookeeper安装包
**也可以通过wget命令直接从apache下载
**也可以从第三方软件源通过wget下载,我们已经提前在云上准备好了安装包,如果使用的是云平台,请通过如下命令下载
wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/zookeeper-3.4.8.tar.gz

                        ii. 配置Zookeeper

                               进入conf目录,复制zoo-sample.cfg为zoo.cfg,通过修改zoo.cfg来对zookeeper 进行配置

                               修改1 - 修改zk存储路径:

                                     配置dataDir 指定zookeeper数据保存的位置

                                     如果不修改,默认在/tmp下,而/tmp是Linux的临时目录,内容随时可能被清空, 所以此选项必须修改.

                               修改2 - 修改zk服务器列表:

                                     i) 单机模式在zoo.cfg中只配置一个server.id就是单机模式了

                                    ii) 伪分布式

                                            在zoo.cfg中配置多个server.id,其中ip都是当前机器,而端口各不相同,启动时就是伪集群模式了,就相当于在一台机器中启动了若干个进程来模拟Zookeeper集群工作模式

                                    iii) 完全分布式

                                           多台机器各自配置的选项server.1=xxx.xxx.xxx.xxx:2888:3888 server.2=xxx.xxx.xxx.xxx:2888:3888 server.3=xxx.xxx.xxx.xxx:2888:3888

                                修改3 - 指定当前服务器编号:到之前配置的zookeeper的dataDir目录下创建一个文件叫myid,文件的内容为一个数字,表明当前机器是哪一个编号的机器

                    iii. 在其他节点安装好zk

                            可以直接将安装好的zk进行拷贝,分发到足够多的节点

3. 操作zookeeper

启动ZK服务: bin/zkServer.sh start

停止ZK服务: bin/zkServer.sh

stop 重启ZK服务: bin/zkServer.shrestart

查看ZK服务状态: bin/zkServer.sh status

================================================================================================

ZooKeeper的基本结构

一、基本结构

1、根节点是/

2、Zookeeper是一个树状结构 --- Znode树

3、每一个Zookeeper节点称之为是Znode节点

4、每一个Znode节点都必须存储数据

5、在Zookeeper中,所有的路径计算都是从根路径开始

6、在Zookeeper中,任意一个持久节点都可以挂载子节点

7、Znode树是维系在内存中,为了快速查询

8、Zookeeper不适合存储大量数据:①对数据量进行了限制,每一个节点的数据量默认不超过1M,②管理 --- 协调服务

9、将每一次的写操作当做一个事务,每次会为当前的事务来分配一个递增的id --- Zxid

二、Zookeeper中的节点类型:

1、持久节点:重启之后不会丢失

2、临时节点:重启之后就会消失

3、持久顺序节点

4、临时顺序节点

三、Zookeeper的命令:

ZooKeeper安装配置笔记

四、节点信息

ZooKeeper安装配置笔记

观察者

Observer --- 观察者 --- 不参与投票,仅仅是对投票结果进行监听以及执行 --- 适用于网络情况不稳定的场景

在zoo.cfg中添加peerType=observer,然后在要设置为observer的地址后边添加:observer

Observer不影响集群的运行状态