zookeeper
为分布式应用提供协调服务
工作机制
基于观察者模式设计的分布式管理框架
存储和管理大家都关心的数据
接收观察者的注册
zookeeper负责通知已经注册的观察者做出相应反应
从而实现主从管理模式master/slave
文件系统+通知机制
特点
分布式和集群区别
无论分布式还是集群都是很多人做事情
分布式:工作内容不同,但是都是为同一个项目服务
集群:工作内容相同
由一个leader和多个follower组成集群
集群中只要有半数以上节点存活,zookeeper就正常存活
全局数据一致性,每台数据都保存一份相同的数据副本
数据更新原子性,要么成功,要么失败
实时性,在一定时间范围内,client能够读取到最新数据
更新请求会按照顺序执行,会按照发送过来的顺序,逐一执行
数据结构
和linux文件系统很相似,整体看作一棵树,每个节点称作一个znode(zookeeper node)
每一个znode能够存取一个1mb的数据(元数据),路径是唯一的
元数据:中介数据,中继数据,描述数据的数据,主要是描述数据属性信息,如存储位置,历史数据,资源查找,文件记录等数据
应用场景
应用场景
统一命名服务
统一配置管理
软负载均衡
jps:查看是否运行
配置参数
tickTime:通信心跳数,单位毫秒,zookeeper服务器和客户端之间的心跳时间
initLimit:LF初始通信时限
leader和follower之间启动时能容忍的最多心跳数,多少个心跳时间,视为失效的连接,lf断开连接
syncLimit:lf通信时限
集群启动后能容忍的最多心跳数,视为已死掉,从服务器列表中删除
dataDir:数据文件目录+数据持久化路径
dataLogDir:日志文件目录
clientPort:客户端连接端口
内部原理
选举机制
半数机制:半数以上机器存活,集群可用,zookeeper适合奇数台服务器
配置无指定master和slave,通过选举临时产生
节点类型(目录节点,顺序编号目录节点)
持久型
短暂型
序号相当于自增长
监听器原理
创建zookeeper客户端同时创建两个线程,一个网络通信,一个监听
监听事件通过网络通信发送给zookeeper
zookeeper获得注册的监听事件后,将监听事件放到监听列表
zookeeper监听到数据变化或路径变化,将消息发送给监听线程
监听线程内部调用process线程
写数据流程
client向server1发送写的请求
如果server1不是leader,将请求转发给leader
leader将请求广播给各个server,server成功后会通知leader
leader收到半数以上server数据写成功,数据就写成功了
leader会告诉server1数据写成功了
server1反馈通知client数据写成功了
分布式部署安装
思路:先搞定一台,再克隆两台,形成集群
data中配置myid
配置zoo.cfg
配置其余服务器
复制.vmx和所有的vmdk
打开.vmx文件
选择已复制该虚拟机
修改ip,myid,zoo.cfg,
防火墙开放端口
客户端命令
help:所有命令
ls path
ls -s path 查看目录详情
创建节点:create path
多级创建目录:需要逐级创建,否则报“节点不存在”
临时节点 create -e path
顺序节点 -s
获取节点数据:get path
设置节点数据:set path data
监听节点:addWatch path
删除节点:delete path
递归删除:deleteall path
API
依赖:log4j-core,zookeeper包,版本需要和安装的版本一致,junit包
创建zk客户端,new Zookeeper(x,x,x);
集群ip:"ip:端口,ip:端口,ip:端口"
session超时的时间:int类型,毫秒为单位,不宜设置太小,60*1000
zookeeper会因为加载集群环境等原因延迟略高,如果时间太少,可能因为还没创建客户端就操作,报错
监听器:watcher,可以定义个内部类
节点创建
zkClient.create(path,data,授权ACL,类型[持久/临时CreateMode.xxx]);
ACL是一个id和permission对,五种权限:创建读写删除修改权限,Ids.xxx
获取节点的值
zkClient.getData(path,是否加监听,数据存放)
修改节点
zkClient.setData(path,data,version)
删除节点
zkClient.delete(path,version)
获取子节点
zkClient.getChildren(path,watcher)
监听
模拟美团
idea-run配置运行
分布式
分布式锁-商品秒杀
redis分布式锁相对性能更高
zookeeper分布式锁相对可靠性更高
1.zookeeper下创建临时顺序节点
2.判断是否最小临时节点
1.是;获得锁
2.否:监听前面小一级的节点
3.获得锁请求,处理完,释放锁(删除节点)
创建ssm工程
启动两次工程,使用ngix做负载均衡
jmeter模拟一秒钟多个请求
curator实现分布式锁,curator-recipes,4.2版本
创建CuratorFramework,工厂模式
创建内部互斥锁
最终释放锁
dubbo
分布式系统:若干独立计算机的集合
流动计算架构:
dubbo
分布式服务框架
rpc核心:通讯,序列化
节点角色
Provider
Consumer
Registry
Monitor 监控服务统计中心
Container
快速入门
推荐zookeeper注册中心
注册中心负责服务地址注册于查找
服务提供方
spring使用5.0.6版本,dubbo使用2.5.7,zookeeper使用3.4.6
配置标签:
服务提供方在zookeeper的别名
注册中心地址
扫描类(扫描什么包下的类作为服务)
dubbo监控中心
dubbo-admin-master.zip
mvn clean package
java -jar xxx.jar
监控统计中心
启动时检查机制
<dubbo:consumer check="true">默认true
tomcat方式启动不会初始化action,使用main方法执行+system.in.read();
超时机制
超时时间
dubbo:provider timeout= 默认为1秒
dubbo推荐provider上尽可能多配置consumer属性
服务提供方比使用方更了解属性
provider配置后,consumer如果不配置会默认使用consumer的属性
重试机制
冪等方法:适合设置重试次数
非冪等方法:不适合
多版本
一个借口,多个实现类,可以使用定义版本的方式引入
本地存根
先在消费者处处理一些业务逻辑,再提供者的过程,就叫做“本地存根”
本地创建 XxxServiceStub implements XxxService
以构造函数方式注入
consumer配置里指定存根stub
负载均衡
基于权重的随机
基于权重的轮询
最少活跃数-负载均衡机制(选择速度快的)
一致性hash-负载均衡机制
高可用
zookeeper注册中心宕机
zookeeper注册中心宕机,还可以消费dubbo暴露的服务
注册中心全部宕机后,服务提供者和消费者还能通过本地缓存通讯
服务降级
目的:防止分布式服务发生雪崩效应
实现方式:
在服务器端实现降级
屏蔽
容错
dubbo服务和事务冲突:Service注解中带上interfaceClass属性,annotation-driven的proxy-target-class="true"