ZooKeeper是一个分布式服务框架,主要用来解决分布式应用中经常遇到的一些数据管理问题:命名服务、状态同步、配置中心、集群管理等
命名服务:通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者信息等。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或者远程对象等,都可以被称它们为名字,其中最常见的就是分布式框架(如RPC、RMI)中的服务地址列表
状态同步:每个节点除了存储数据内容和node节点状态信息之外,还存储了已经注册的APP状态信息。当有些节点或APP不可用,就将当前状态同步给其他服务。
配置中心:zookeeper采用推拉结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发生Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据
集群管理:包括集群监控、集群控制,前者侧重对集群运行时态的收集,后者会集群进程操作与控制。 集群中工作的机器数量、每台机器的运行状态数据收集、机器上下线操作
zookeeper具有两大特性:
1客户端如果对zookeeper的一个数据节点注册watcher监听,那么当该数据节点的内容或是其子节点列表发生变更时,zookeeper服务器就会向订阅的客户端发送变更通知
2对在zookeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也会被自动清除
1、生产者启动 2、生产者注册至zookeeper 3、消费者启动并订阅频道
4、zookeeper通知消费者事件 5、消费者调用生产者 6、监控中心负责统计和监控服务状态
单机环境:
先装openjdk的java环境,然后装zookeeper:https://archive.apache.org/dist/zookeeper
解压后,做软连接 ln -sv /usr/local/src/zookeeper-3.4.14 /usr/local/zookeeper
复制一个新的配置文件,cd /usr/local/zookeeper/conf/ && cp zoo_sample.cfg zoo.cfg
grep ^[a-Z] zoo.cfg
tickTime initLimit syncLimit dataDir clientPort(zookeeper的客户端端口,默认2181)
zookeeper适用于服务协调,不适合保存大量的业务数据,zookeeper的单条数据不超过1MB,数据使用kafka
zookeeper是复制集群
redis cluster 是分布式集群(槽位)
当用户写入数据时,直连的是leader节点时,直接写入并同步给其他节点,
当用户写入数据直连的是follower节点时,则由该节点将写入的数据路由给leader节点,然后leader节点同步给其他所有folower节点,来完成数据一致性
集群角色:
leader:1、事务请求的唯一调度和处理者,保证集群事务处理的顺序性 2、集群内部哥服务器的调度者
follower:1、处理客户端非事务请求,转发事务请求给leader服务器 2、参与事务请求proposal的投票 3、参与leader的投票
observer:follower 和observer唯一的区别在于observer机器不参与leader的选举过程,也不参与写操作的“过半写成功”策略,因此observer机器可以在不影响写性能的情况下提升集群的读性能
client:请求发起方
zookeeper集群的优势:
1、写入的数据顺序
2、数据一致性(redis是分片,zk是一致的)
3、集群可靠性
4、高性能
集群的配置文件zoo.cfg,配置完直接scp给其他服务器就可以
tickTime 毫秒,服务器之间的三次心跳检测时间间隔
initLimit 次数,leader与follower初始连接心跳次数,即多少个ticktime时间
syncLimit L与F初始链接完成后,检测发送和应答心跳的次数。如果F在设置的时间内(SYNC*TICK)不能与L进行通信,那此F将被视为不可用
dataDir 保存数据的目录(集群中节点设置的路径最好一致)
clientPort 接收客户端访问请求的接口
maxClientCnxns 单个客户端ip可以和zookeeper保持的连接数
autopurge.snapRetainCount 、autopurge.purgeinterval v3.4.0新增功能,保留设置快照的份数并删除多余的,多长事件清理一次默认单位是小时
server.1=10.0.0.12:2888:3888 server.服务器编号=服务器ip:LF数据同步端口:LF选举端口 (集群中有几台服务器就配置多少条,每台服务器都要配置相同内容)
集群id: echo "1" >/usr/local/zookeeper/data/myid 这个文件需要自己生成在配置文件中dataDir设置的目录下,服务器的唯一标识SID,集群中唯一
停止或启动服务,查看集群状态:安装目录 /usr/local/zookeeper/bin/zkServer.sh stop/start/status
在哪个目录下启动的zk日志就在哪个目录下,最好找一个固定的目录去启动
节点角色状态:
looking:寻找leader,处于该状态需要进入选举流程
leading:领导者状态,角色已经是leader
following:leader已经选举出来,当前角色是follower
observer:当前角色是observer
ZXID:zookeeper transaction id,每个改变zookeeper状态的操作都会形成一个对应的zxid
myid:服务器的唯一标识SID,通过配置myid文件指定集群中唯一
选举过程: 当集群中的zookeeper节点启动后,会根据配置文件中指定的zookeeper系欸但地址进行leader选举,
1、每个zookeeper都会发出投票,由于第一次选举,因此每个节点都会吧自己当作leader角色进行选举,投票中包含自己的myid和zxid,此时各节点myid为手动配置的数字,zxid为初始生成的值,后期会随着数据更新而自动变化
2、每个节点接受并检查对方的投票信息,比如投票时间、是否状态为LOOKING
3、对比投票,优先检查zxid,zxid大的作为leader;如果zxid相同则继续比较myid大的为leader
成为leader的必要条件: 具有最好zxid;集群中大多数的机器(n/2+1)得到相应并follow选出的leader
心跳机制:leader与follower利用ping来感知对方是否存活,当leader无法响应ping则重新发起leader选举