Zookeeper
本文介绍了ZooKeeper的核心概念和功能,包括其作为配置中心和注册中心的应用。阐述了如何安装和部署ZooKeeper,包括单机和集群的配置。还探讨了ZooKeeper集群中的不同角色(领导者、追随者和观察者),以及其选举机制。此外,文章也涵盖了客户端如何连接服务端、节点管理命令、节点事件监视器和权限控制。
本文介绍了ZooKeeper的核心概念和功能,包括其作为配置中心和注册中心的应用。阐述了如何安装和部署ZooKeeper,包括单机和集群的配置。还探讨了ZooKeeper集群中的不同角色(领导者、追随者和观察者),以及其选举机制。此外,文章也涵盖了客户端如何连接服务端、节点管理命令、节点事件监视器和权限控制。
Zookeeper简介
Zookeeper是一个开源的分布式协同服务系统,一般在服务器集群中用作配置中心或者注册中心,基于zookeeper的事件watcher系统,当服务器配置发生改变时可以第一时间通知所有订阅该节点的频道
配置中心
举个例子,假如我们有一个java应用需要实现基本的增删改查功能,那么我们就可以将数据库的ip,用户名和密码等信息存储在zookeeper的某个节点中,并且让java应用订阅这个节点;当配置发生变化时,java应用就能通过watcher监听器捕获到这个数据发生的变化,并重新来配置中心读取数据。
注册中心
注册中心有三种角色:
最后,RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Sever 发起调用。
举个例子,mysql主从复制中有master和slave的角色之分,master负责写操作,slave负责读操作,那么如何让其他的应用知道谁是master,谁是slave呢?这就是注册中心的作用了。
Zookeeper充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(Ip+端口)去访问具体的服务提供者。
如下图所示:
每当一个服务提供者部署后都要将自己的服务注册到zookeeper的某一路径上,如: /{service}/{version}/{ip:port}, 比如我们有两个服务profile和cart代表了用户个人信息功能和购物称功能,他们被分别部署到两台机器上,那么Zookeeper上就会创建两条目录:分别为/profile/1.0.0/100.19.20.01:16888 和 /cart/1.0.0/100.19.20.02:16888。
ZooKeeper是一个树状的存储结构,下面这张图更直观的表现了注册中心大概得样子:
在Zookeeper中,进行服务注册,实际上就是在Zookeeper中创建了一个Znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等.
该节点承担着最重要的职责,它由服务提供者(发布服务时)创建,以供服务消费者获取节点中的信息,从而定位到服务提供者真正IP,发起调用。
安装zookeeper
安装JDK
可以看这篇文章
安装zookeeper
下载zookeeper压缩包
解压缩
创建软连接
创建zookeeper数据目录
创建并修改zookeeper配置文件
在 conf/ 目录下提供了模板配置文件 zoosample.cfg ,将其复制为 zoo.cfg 即可。
修改目录路径
启动zookeeper
部署zookeeper集群
在安装单机zookeeper的基础上,还要执行以下步骤
为三个zookeeper实例创建服务器编号
要求存储编号的文件名为myid,且存放在数据目录中:
启动zookeeper
启动后应该可以发现系统在数据目录下自动生成了几个文件
修改配置文件,添加集群信息
为每个zookeeper实例的配置文件添加如下内容
格式:server.节点ID=ip:数据同步端口:选举端口
选举端口:主节点挂了,选举新的主节点的通信端口。
使用ansible-playbook一键部署zookeeper集群
ansible hosts配置:
ansible-playbook:
zookeeper集群中的角色
zookeeper集群中有三种角色,分别是:
Leader(领导者)
相当于主库,在集群中只能有一个Leader,其主要作用是:
所有的跟随者Follower与观察者Observer节点的写请求都会转交给领导者Leader执行。Leader接受到一个写请求后,首先会发送给所有的Follower,统计Follower写入成功的数量。当有超过半数的Follower写入成功后,Leader就会认为这个写请求提交成功,通知所有的Follower commit这个写操作,保证事后哪怕是集群崩溃恢复或者重启,这个写操作也不会丢失。
Follower(追随者)
Follower在集群中可以有多个,其主要作用是:
#Observer(观察者)
Observer是zookeeper集群中最边缘的存在。Observer的主要作用是提高zookeeper集群的读性能。通过leader的介绍我们可以zookeeper的一个写操作是要经过半数以上的Follower确认才能够写成功的。那么当zookeeper集群中的节点越多时,zookeeper的写性能就 越差。为了在提高zookeeper读性能(也就是支持更多的客户端连接)的同时又不影响zookeeper的写性能,zookeeper集群多了一个儿子Observer,只负责:
zookeeper选举机制
zookeeper客户端连接服务端
使用提供的客户端脚本 zkCli.sh
znode管理命令
节点事件watcher
zookeeper权限控制
主要是基于 setAcl 命令。
有以下几种权限:
权限可以像chmod命令一样组合使用。
world权限类型
world:anyone权限类型是允许任何用户对节点执行符合权限限制的操作(crwda)。
语法:
设置后所有用户对该节点只能执行read和write操作。
对delete权限的实验
创建一个三级结点
尝试删除父结点
失败了,因为我们没有删除这个节点的权限;
尝试删除该节点的子节点
可以发现我们没能删除test1这个二级结点,但是t1这个三级结点却消失了,这是因为二级结点test1受父结点的权限限制无法被删除,但是二级结点本身却是默认权限,即:
因此三级不受父结点的权限影响,是可以被删除的。
所以可以得出结论: 每一个节点的权限限制最多影响到自己下一级的子节点,而不会影响下下级的子节点。
Auth权限类型
Auth就是为节点指定那个用户才能执行操作。
语法: setAcl /node auth:username:password:权限位
实践
创建一个用于实验的节点
注册用户
设置Auth权限
需要重新启动客户端才能生效设置
尝试获得这个节点的value
被拒绝了,因为没有进行权限验证,验证的方式和注册用户是一样的方法,都是通过 addauth 命令。
ip权限类型
很明显,这个方法就是限定只允许特定ip对节点进行操作。
语法: setAcl /node ip:ipaddress:权限位
实践
创建节点并设置ip
使用另一台机器进行操作
无权限
Read Next
使用Terraform在Ubuntu中部署KVM虚拟机
使用Terraform部署KVM虚拟机的详细流程
MySQL/Redis相关面试题
数据库运维(MySQL和Redis)的面试题总结
事件源模式和传统数据库方法在数据管理上的优劣分析
对事件源模式和传统数据库方法在应用程序性能影响、性能、扩展性和可靠性的分析;以及云原生环境下数据管理的最佳实践
关于Metrics_server在自托管环境下无法使用的问题
修复kubernetes的metrics server在自托管环境下因缺少CA证书而无法运行的问题。