------------ 本文来自 阿P官方博客
思考1:Zookeeper能解决大数据什么问题?
一、概述
Apache提供的开源的、分布式的用于服务协调的一套框架
这里可以不用懂,随着深入学习,我们就知道Zookeeper到底有什么用。此处只是让大家有这个概念,后面会深入理解。
早期是根据Google关于Chubby Lock的论文来实现的。
二、Zookeeper分布式下的问题
什么是分布式?
一个集群中,多个节点共同组成一个系统。或者说是本来需要一个节点去处理的问题,现在分成了很多个节点协同处理。
分布式下,若每个结点都发送自己的指令,造成逻辑混乱怎么办?
故需提供对外接收请求提供统一的操作的管理节点。
若管理节点出现单点故障怎么办?
为了避免管理节点出现单点故障,需要设置管理节点的集群
怎么确定管理节点?
管理集群需要设置一个主节点,需要确定一套选举算法,选出一个主节点。
管理集群中,节点出现问题,怎么恢复、处理?
管理集群需要进行崩溃恢复
在从节点中重新选择主节点
管理集群消息不统一怎么办?
管理集群之间各个节点需要进行实时共享
四、Zookeeper特点
zookeeper树状结构存储 - Znode树
根节点为 /
每一个子节点称之为znode节点
所有的节点路径,必须以根节点为起始
每一个持久节点下可以挂载节点
Znode存在磁盘和内存中
Znode存在内存中的目的:查询速度更快
Znode存在磁盘中的目的:崩溃恢复
Znode磁盘中的存储位置由dataDir路径决定
Zookeeper存在事务概念
对每一次的写操作创建一个递增的事务ID(Zxid)
五、Zookeeper-Client命令
查看节点目录:ls 节点
创建:create /节点名
-e:临时节点
-s:创建顺序节点
删除:delete /节点【必须删除空节点】
递归删除:rmr /节点
查看:get /节点
-s:查看节点详细信息
修改:set /节点 '内容'
六、节点信息详解
命令:get -s Znode
返回值:
cZxid:创建事务ID
ctime:创建时间
mZxid:修改事务ID
mtime:修改时间
pZxid:子节点的增删事务ID,全局
cversion:子节点的增删次数
dataVersion:数据版本,修改次数
aclVersion:权限修改次数
ephemeralOwner:是否是临时节点。持久节点固定为0。临时节点为sessionid
dataLength:数据字节个数
numChildren:子节点个数
七、Zookeeper节点类型
节点持久性划分
持久节点(默认节点)
临时节点
客户端退出,该结点删除。
节点顺序类型
顺序节点
非顺序节点
八、选举机制(以leader节点挂了为例)
第一个阶段:数据恢复阶段
每个节点会找寻当前节点中的最大事务id
第二个阶段:选举阶段
刚开始时,在集群中每个节点都会推荐自己做leader。
将自己的信息发送给其他节点,最后胜出的为leader,失败的做follower。
节点信息:
最大事务ID:mzxid
选举编号:myid
逻辑时钟值:保证所有选举在同一轮次上
比较原则
事务ID谁大谁胜出
事务ID一致时,myid谁大谁胜出
选举的过半性:当某个结点胜过1半的节点(包括宕机的)时,就会成为leader
当集群中已经选举出leader,后续添加的节点,不再考虑被选举成leader。【一个集群中,只需要启动一半节点,就会选举出leader】
九、节点状态
looking/voting:选举状态
follower:追随者
leader领导者
observer:观察者
十、脑裂
什么是脑裂?
在集群中出现多leader时,这种情况称之为脑裂
产生脑裂的原因
网络隔离导致多leader
ledaer主机宕机后重启。
解决手段:
过半存活性
在zookeeper集群中,只有半数以上的节点存活,才会对外提供服务。
Tips:zookeeper节点一般是奇数个。
十一、安装方式
单机安装:只在一个节点上安装,只能提供部分功能。
伪分布式:只在一个节点上模拟集群环境
完全分布式:在集群环境中安装【本文列出三节点集群安装方式】
十二、单机安装(过程仅供有经验开发人员参考)
下载安装JDK1.8
下载并解压zookeeper
复制./conf/zoo_sample.cfg为zoo.cfg
修改zoo.cfg里的dataDir内容为你想要的存储路径
启动zookeeper:./bin/zkServer.sh start
注意:
3.5.0(一说3.5.5)以后的官方版本,需要下载.bin.xxx的文件
启动状态查询:./bin/zkServer.sh status
十三、三节点zookeeper完全分布式搭建流程【傻瓜式】
虚拟机安装配置
利用vmware创建虚拟机(略)
配置:centos7 + 1core + 1G内存 + 20G硬盘 + NAT模式
centos7镜像地址(如果下载慢,可以使用NeatDownload Manager开启多线程下载):http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso
注意:
实际的内存、硬盘分配看你物理机的情况。
配置镜像源
参考:https://blog.csdn.net/qq_43054078/article/details/83275042
配置静态IP
mac版本配置参考:https://blog.csdn.net/p01114245/article/details/94382979
计划三节点静态ip分别为
节点1:172.16.172.197(目前操作的节点)
节点2:172.16.172.196
节点3:172.16.172.195
配置主机名(需要重新登录,才会生效)
hostnamectl set-hostname zk01
配置hosts文件:
vim /etc/hosts:加入以下内容
172.16.172.197 zk01
172.16.172.196 zk02
172.16.172.195 zk03
配置ssh免密登录
生成秘钥:ssh-keygen
拷贝秘钥到本机:ssh-copy-id root@zk01
注意
虚拟机安装时,很多可用命令未下载。例如:wget、ifconfig(net-tools)、vim等。此时可先配置静态ip,配完后用scp命令,将下载好的镜像源手动导入服务器。再利用yum安装必要的服务。
下载安装 JDK1.8
yum install -y java-1.8.0-openjdk.x86_64
yum install -y java-1.8.0-openjdk-devel.x86_64
Tips:查看jdk安装目录命令:ls -lrt /etc/alternatives/java
Zookeeper安装、解压、配置
下载:wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8.bin.tar.gz
解压安装:
tar -zxvf apache-zookeeper-3.5.8.bin.tar.gz -CP /usr/local
mv /usr/local/apache-zookeeper-3.5.8 /usr/local/zookeeper
配置命令:
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg:加入或修改以下四行
dataDir=/data/zookeeper/tmp
server.1=zk01:2888:3888
server.2=zk02:2888:3888
server.3=zk03:2888:3888
vim /data/zookeeper/tmp/myid:加入以下内容
1
测试:
启动:../bin/zkServer.sh start
jps
查看是否有QuorumPeerMain进程出现。
注意:
请记住这个url(https://www.apache.org/),如果你记不住这个地址,请不要再继续学了,赶紧回家种地吧。
3.5.5及以后的版本,必须下载.bin.tar.gz才能使用。下载的.tar.gz只是源码。
克隆三台虚拟机
zk01 关机。完全克隆
修改节点2、3的网卡配置
分别修改两节点 /etc/sysconfig/network-scripts/ifcfg-ens33 里的IPADDR 为我们刚刚计划的ip(略)
重启网卡:systemctl restart network
修改节点2、3的Zookeeper配置
只需要修改 /data/zookeeper/tmp/myid文件下的对应编号为本机器编号
分别启动节点2、3的zookeeper(略)
修改节点2、3的主机名为zk02、zk03
hostnamectl set-hostname 主机名
exit:退出用户重新登录
关闭三台机器的防火墙(有条件的,可以配置防火墙策略)
systemctl stop firewalld
测试
/usr/local/zookeeper/bin/zkServer.sh status
会看到三节点哪个是follower和leader
在节点1上操作
/usr/local/zookeeper/bin/zkCli.sh
create /zoo_test
在节点2或者节点3上操作
/usr/local/zookeeper/bin/zkCli.sh
ls /
会看的节点2、3都有 zoo_test