一. 分布式简介
1. 概念
一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统
2. 分布式&集群
集群:同一个业务,部署在多个服务器上。是一种物理形态,从物理上定义,解决高可用。
3. 分布式协作中的难点
a. 保证节点高可用(节点故障)
b. 数据的一致性
c. 通讯异常
d. 网络分区
二. zookeeper简介
1. 概念
ZooKeeper致力于提供一个高性能、高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoop和Hbase的重要组件。
2. 设计目标
简单的数据结构:共享的树形结构,类似文件系统,存储于内存;
可以构建集群:避免单点故障,3-5台机器就可以组成集群,超过半数正常工作就能对外提供服务;
顺序访问:对于每个读请求,zk会分配一个全局唯一的递增编号,利用这个特性可以实现高级协调服务;
高性能:基于内存操作,服务于非事务请求,适用于读操作为主的业务场景。3台zk集群能达到13w QPS;3. 应用场景
数据发布订阅: 发布者(producer)讲数据发布到zk节点上,供订阅者(consumer)动态获取
负载均衡:
命名服务:简单统一命名服务实现
Master选举:Master高可用(挂掉以后,谁来负责工作),保证唯一。
集群管理:Worker集群监控。
配置管理:统一把配置文件存放zk,由ZK统一分发
分布式队列:FIFO
分布式锁:分布式环境访问统一个资源,由第三方配锁实现。由zk统一进行协调,保证数据的一致性。
三. zookeeper安装与配置
1. 下载
$ tar xvzf zookeeper-3.4.9.tar.gz
$ mv ./zookeeper-3.4.9 /usr/local/
3. 修改配置文件
${ZOOKEEPER_HOME}/conf/zoo_sample.cfg
a. 配置文件详解
tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
clientPort:指定当前服务器服务器的端口
dataDir:指定当前服务器数据存放的路径(目录)
dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争
syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
server.1/server.2/server.3 指定服务器的集群情况(有几台服务器)
A是一个数字,表示这个是第几号服务器,myid
B是这个服务器的ip地址
C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口(通讯端口)
D是在leader挂掉时专门用来进行选举leader所用(选举端口)
myid必须手动建立且指定在zk数据目录,也就是dataDir指定的路径(不管真分布还是伪分布都需要指定)
$ echo 1 >>/home/hadoop/tmp/zookeeper/zk1/myid
$ echo 2 >>/home/hadoop/tmp/zookeeper/zk2/myid
$ echo 3 >>/home/hadoop/tmp/zookeeper/zk3/myid
b. 伪分布式部署(server zookeeper只有一份)
/conf/zoo1.cfg zoo2.cfg zoo3.cfg
zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk1(这个目录可以自行指定)
clientPort=2181
server.1=master:2888(通讯端口):3888(选举端口)
server.2=master:2889:3889
server.3=master:2890:3890
zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk2
clientPort=2182
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk3
clientPort=2183
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
c. 真分布式部署(配置文件一样,但部署在master、slave1、slave2 三台不同的服务器上)
server1..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server2..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server3..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
4. zeekeeper的启动(伪分布式)
停止Zookeeper
$ zkServer.sh stop /usr/local/zookeeper-3.4.6/conf/zoo1.cfg
$ zkServer.sh stop /usr/local/zookeeper-3.4.6/conf/zoo2.cfg
$ zkServer.sh stop /usr/local/zookeeper-3.4.6/conf/zoo3.cfg
启动Zookeeper
$ zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo1.cfg
$ zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo2.cfg
$ zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo3.cfg
查看zookeeper状态
$ zkServer.sh status /usr/local/zookeeper-3.4.6/conf/zoo1.cfg
$ zkServer.sh status /usr/local/zookeeper-3.4.6/conf/zoo2.cfg
$ zkServer.sh status /usr/local/zookeeper-3.4.6/conf/zoo3.cfg