初步认识zookeeper

zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby。
Zookeeper 高可用、高性能且一致的开源协调服务,它提供了一项基本服务:统一命名服
务、、布式协调、存储数据、监听与通知等功能
官网:http://zookeeper.apache.org/
源码:https://github.com/apache/zookeeper

zookeeper是什么

分布式数据一致性的解决方案

zookeeper能做什么

数据的发布/订阅(配置中心:disconf) 、 负载均衡(dubbo利用了zookeeper机制实现负载均衡) 、命名服务、
master选举(kafka、hadoop、hbase)、分布式队列、分布式锁

zookeeper的特性

  • 顺序一致性
    从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中
  • 原子性
    所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的所有机器都成功应用了某一事务、要么全都不应用
  • 可靠性
    一旦服务器成功应用了某一个事务数据,并且对客户端做了响应,那么这个数据在整个集群中一定是同步并且保留下来的
  • 实时性
    一旦一个事务被成功应用,客户端就能够立即从服务器端读取到事务变更后的最新数据状态;(zookeeper仅仅保证在一定时间内,近实时)

安装环境
centos7
jdk8

因为zookeeper需要依赖jdk所以必须安装好jdk环境

jdk安装

首先下载jdk 不用说了,可以官网(需要注册账号)也可以 自己直接下载,

  • 解压jdk
tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local/java
  • 环境变量配置
vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_251
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
  • 执行profile文件
source /etc/profile

使配置文件生效

  • 检查新安装的
jdk java -version

zookeeper基础学习之二: 单机安装和集群安装_java


安装完成

zookeeper 单机安装

下载

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

解压

tar -zxf zookeeper-3.4.14.tar.gz

进入conf目录,复制zoo_sample.cfg一份zoo.cfg,修改配置文件

cp zoo_sample.cfg zoo.cfg

查看配置信息

zookeeper基础学习之二: 单机安装和集群安装_linux_02

# tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。(以毫秒为单位)
tickTime = 2000
# dataDir ZooKeeper的状态存储位置,看名字就知是数据目录。在你的系统中检查这个目录是否存在,如果不存在手动创建,并且给予可写权限。
dataDir = /path/to/zookeeper/data
# 这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;
clientPort = 2181
# initLimit这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
# 当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10秒。
initLimit = 5
# syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是2*2000=4秒
syncLimit = 2
# 日志存放的位置
dataLogDir=/path/to/zookeeper/log

启动

启动服务端

./zkServer.sh start

{start|start-foreground|stop|restart|status|upgrade|print-cmd}

启动客户端

zkCli.sh -server  ip:port

运行zookeeperd后显示启动成功:

JMX enabled by default
Using config: /data/programfiles/zookeeper-3.4.5/bin/…/conf/zoo.cfg
Starting zookeeper … STARTED

但用zkServer.sh status查看,反馈如下:

JMX enabled by default
Using config: /data/programfiles/zookeeper-3.4.5/bin/…/conf/zoo.cfg
Error contacting service. It is probably not running.

可能有以下几个原因:

第一,zoo.cfg文件配置出错:dataLogDir指定的目录未被创建;

第二,myid文件中的整数格式不对,或者与zoo.cfg中的server整数不对应

第三,防火墙未关闭;

第四,2181端口被占用;

第五,zoo.cfg文件中主机名出错;

第六,hosts文件中,本机的主机名有两个对应,只需保留主机名和ip地址的映射

zookeeper集群安装

理论

zookeeper集群, 包含三种角色: leader / follower /observer

zookeeper基础学习之二: 单机安装和集群安装_大数据_03

observer
observer 是一种特殊的zookeeper节点。可以帮助解决zookeeper的扩展性(如果大量客户端访问我们zookeeper集群,需要增加zookeeper集群机器数量。从而增加zookeeper集群的性能。 导致zookeeper写性能下降, zookeeper的数据变更需要半数以上服务器投票通过。造成网络消耗增加投票成本
1. observer不参与投票。 只接收投票结果。
2. 不属于zookeeper的关键部位。

Zookeeper 特性:

Zookeeper是一个由多个server组成的集群
一个leader,多个follower
每个server保存一份数据副本
全局数据一致
分布式读follower,写由leader实施
更新请求转发,由leader实施
更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
数据更新原子性,一次数据更新要么成功,要么失败
全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的
实时性,在一定事件范围内,client能读到最新数据

现在我同样还是先使用一个虚拟机先做下,如果后面再跑不起来还是开3台电脑去跑:所以还先复制3份配置文件:

准备工作

先把相应的目录建好:zookeeper 根目录:data_1,data_2,data_3,logs_1,logs_2,logs_3

zookeeper基础学习之二: 单机安装和集群安装_linux_04

创建myid文件

echo "1" >> ./data_1/myid
echo "2" >> ./data_2/myid
echo "3" >> ./data_3/myid

复制配置文件

cd conf/
cp zoo.cfg zoo1.cfg
cp zoo.cfg zoo2.cfg
cp zoo.cfg zoo3.cfg

配置文件内容分别为:
zoo1.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.4.14/data_1
clientPort=2181
dataLogDir=/usr/local/zookeeper-3.4.14/logs_1
server.1=192.168.43.232:2887:3887
server.2=192.168.43.232:2888:3888
server.3=192.168.43.232:2889:3889

zoo2.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.4.14/data_2
clientPort=2182
dataLogDir=/usr/local/zookeeper-3.4.14/logs_2
server.1=192.168.43.232:2887:3887
server.2=192.168.43.232:2888:3888
server.3=192.168.43.232:2889:3889

zoo3.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.4.14/data_3
clientPort=2183
dataLogDir=/usr/local/zookeeper-3.4.14/logs_3
server.1=192.168.43.232:2887:3887
server.2=192.168.43.232:2888:3888
server.3=192.168.43.232:2889:3889
# 2888,3888 are election port
# 2888端口是zookeeper服务之间的通讯的端口,3888是zookeeper与其他应用程序通讯的端口。
# server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。
server.1=localhost:2888:3888

启动与验证

zookeeper基础学习之二: 单机安装和集群安装_zookeeper_05

./zkServer.sh start ../conf/zoo1.cfg 
./zkServer.sh start ../conf/zoo2.cfg
./zkServer.sh start ../conf/zoo3.cfg
./zkServer.sh status ../conf/zoo1.cfg
./zkServer.sh status ../conf/zoo2.cfg
./zkServer.sh status ../conf/zoo3.cfg

分别开启三个客户端

./zkCli.sh -server 192.168.43.232:2181
./zkCli.sh -server 192.168.43.232:2182
./zkCli.sh -server 192.168.43.232:2183

zookeeper基础学习之二: 单机安装和集群安装_大数据_06

observer 配置

  1. 在zoo.cfg里面增加
    peerType=observer

server.1=192.168.11.129:2181:3181:observer