一、分布式环境
1.特点
a.分布性
b.并发性
程序运行过程中,并发性操作是很常见的。比如同一个分布式系统中的多个节点,同时访问一个共享资源。数据库、分布式存储
c.无序性
进程之间的消息通信,会出现顺序不一致问题
2.分布式环境下面临的问题
a.网络通信
网络本身的不可靠性,因此会涉及到一些网络通信问题
b.网络分区(脑裂)
当网络发生异常导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式架构的所有节点,只有部分节点能够正常通信
c.三态
在分布式架构里面,除了成功、失败、超时
3.分布式事务
ACID(原子性、一致性、隔离性、持久性)
4.中心化和去中心化
冷备或者热备
分布式架构里面,很多的架构思想采用的是:当集群发生故障的时候,集群中的人群会自动“选举”出一个新的领导。
最典型的是: zookeeper / etcd
5.经典的CAP/BASE理论
a.CAP理论
一致性(Consistency): 所有节点上的数据,时刻保持一致
可用性(Availability):每个请求都能够收到一个响应,无论响应成功或者失败
分区容错 (Partition-tolerance):表示系统出现脑裂以后,可能导致某些server与集群中的其他机器失去联系
CP / AP
CAP理论仅适用于原子读写的Nosql场景,不适用于数据库系统
b.BASE理论:
基于CAP理论,CAP理论并不适用于数据库事务(因为更新一些错误的数据而导致数据出现紊乱,无论什么样的数据库高可用方案都是
徒劳) ,虽然XA事务可以保证数据库在分布式系统下的ACID特性,但是会带来性能方面的影响;
eBay尝试了一种完全不同的套路,放宽了对事务ACID的要求。提出了BASE理论
Basically available : 数据库采用分片模式, 把100W的用户数据分布在5个实例上。如果破坏了其中一个实例,仍然可以保证80%的用户可用。
soft-state: 在基于client-server模式的系统中,server端是否有状态,决定了系统是否具备良好的水平扩展、负载均衡、故障恢复等特性。
Server端承诺会维护client端状态数据,这个状态仅仅维持一小段时间, 这段时间以后,server端就会丢弃这个状态,恢复正常状态。比如用户支付,成功或失败,中间会有一个处理中的状态。
Eventually consistent:数据的最终一致性
二、初步认识zookeeper
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby。
1.zookeeper是什么
分布式数据一致性的解决方案
作用:zookeeper并不是用来存储数据的,通过监控数据状态的变化,达到基于数据的集群管理。
2.zookeeper能做什么
数据的发布/订阅(配置中心:disconf) 、 负载均衡(dubbo利用了zookeeper机制实现负载均衡) 、命名服务、
master选举(kafka、hadoop、hbase)、分布式队列、分布式锁
3.zookeeper的特性
a.顺序一致性
从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中
b.原子性
所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的所有机器都成功应用了某一事务,要么全都不应用
c.可靠性
一旦服务器成功应用了某一个事务数据,并且对客户端做了响应,那么这个数据在整个集群中一定是同步并且保留下来的
d.实时性
一旦一个事务被成功应用,客户端就能够立即从服务器端读取到事务变更后的最新数据状态;(zookeeper仅仅保证在一定时间内,近实时)
e.单一视图
无论客户端连接到哪个服务器,所看到的模型都是一样
三、zookeeper安装
单机环境安装
1.下载zookeeper的安装包
http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.10.tar.gz
2.解压zookeeper
tar -zxvf zookeeper-3.4.10.tar.gz
3.cd 到 ZK_HOME/conf , copy一份cfg
cp zoo_sample.cfg zoo.cfg
4.sh zkServer.sh
{start|start-foreground|stop|restart|status|upgrade|print-cmd}
5.sh zkCli.sh -server ip:port
四、集群环境
1.zookeeper集群, 包含三种角色: leader / follower /observer
leader角色:
a. 事务请求的唯一调度和处理者,保证集群事务处理的顺
序性
b. 集群内部各服务器的调度者
follower
1. 处理客户端非事务请求、转发事务请求给 leader 服务器
2. 参与事务请求 Proposal 的投票(需要半数以上服务器
通过才能通知 leader commit 数据; Leader 发起的提案,
要求 Follower 投票)
3. 参与 Leader 选举的投票
observer
observer 是一种特殊的zookeeper节点。可以帮助解决zookeeper的扩展性(如果大量客户端访问我们zookeeper集群,需要增加zookeeper集群机器数量。从而增加zookeeper集群的性能。 导致zookeeper写性能下降, zookeeper的数据变更需要半数以上服务器投票通过。造成网络消耗增加投票成本)。observer服务器只提供非事物请求服务,通常在于不影响集群事务处理能力的前提下提升集群非事务处理的能力
- observer不参与投票。 只接收投票结果。
- 不属于zookeeper的关键部位。

2.集群的搭建
a.修改cfg
129/135/136
server.id=ip:port:port
server.1=192.168.11.129:2888:3181 2888表示follower节点与leader节点交换信息的端口号 3181 如果leader节点挂掉了, 需要一个端口来重新选举。
server.2=192.168.11.135:2888:3181
server.3=192.168.111.136:2888:3181
b.cfg中有一个dataDir = /tmp/zookeeper
$dataDir/myid 添加一个myid文件。
c.启动服务
注:
如果需要增加observer节点
zoo.cfg中 增加 :peerType=observer
同时,对应的配置后面添加对应的observer服务:server.3=192.168.111.136:2888:3181:observer
3.zoo.cfg配置文件分析
tickTime=2000 zookeeper中最小的时间单位长度 (ms)
initLimit=10 follower节点启动后与leader节点完成数据同步的时间
syncLimit=5 leader节点和follower节点进行心跳检测的最大延时时间
dataDir=/tmp/zookeeper 表示zookeeper服务器存储快照文件的目录
dataLogDir 表示配置 zookeeper事务日志的存储路径,默认指定在dataDir目录下
clientPort 表示客户端和服务端建立连接的端口号: 2181
五、zookeeper中的一些概念
1.数据模型
zookeeper的数据模型(树形结构)和文件系统类似,每一个节点称为:znode. 是zookeeper中的最小数据单元。每一个znode上都可以保存数据和挂载子节点。 从而构成一个层次化的属性结构。
节点特性:
持久化节点 : 节点创建后会一直存在zookeeper服务器上,直到主动删除
持久化有序节点 :每个节点都会为它的一级子节点维护一个顺序
临时节点 : 临时节点的生命周期和客户端的会话保持一致。当客户端会话失效,该节点自动清理
临时有序节点 : 在临时节点上多勒一个顺序性特性
2.会话
四种会话状态:没有连接、连接中、已连接、关闭

3.Watcher
zookeeper提供了分布式数据发布/订阅,zookeeper允许客户端向服务器注册一个watcher监听。当服务器端的节点触发指定事件的时候
会触发watcher。服务端会向客户端发送一个事件通知
watcher的通知是一次性,一旦触发一次通知后,该watcher就失效。如果需要永久监听,则需要反复注册。
4.ACL
zookeeper提供控制节点访问权限的功能,用于有效的保证zookeeper中数据的安全性。避免误操作而导致系统出现重大事故。
CREATE /READ/WRITE/DELETE/ADMIN
六、zookeeper的命令操作
1. create [-s] [-e] path data acl
-s 表示节点是否有序
-e 表示是否为临时节点
默认情况下,是持久化节点
2. get path [watch]
获得指定 path的信息
3.set path data [version]
修改节点 path对应的data
version的作用有一个乐观锁的概念:数据库里面有一个 dataversion 字段去控制数据行的版本号,每次修改对应节点,version会加1
4.delete path [version]
删除节点
七、stat信息
cversion = 0 子节点的版本号
aclVersion = 0 表示acl的版本号,修改节点权限
dataVersion = 1 表示的是当前节点数据的版本号
czxid 节点被创建时的事务ID
mzxid 节点最后一次被更新的事务ID
pzxid 当前节点下的子节点最后一次被修改时的事务ID
ctime 创建时间
mtime 修改时间
cZxid = 0x500000015
ctime = Sat Aug 05 20:48:26 CST 2017
mZxid = 0x500000016
mtime = Sat Aug 05 20:48:50 CST 2017
pZxid = 0x500000015
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0 创建临时节点的时候,会有一个sessionId 。 该值存储的就是这个sessionid
dataLength = 3 数据值长度
numChildren = 0 子节点数
八、Zookeeper的使用:
java API的使用:
1.jar包依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
2.权限控制模式
schema:授权对象
ip : 192.168.1.1
Digest : username:password
world : 开放式的权限控制模式,数据节点的访问权限对所有用户开放。 world:anyone
super :超级用户,可以对zookeeper上的数据节点进行操作
3.连接状态
KeeperStat.Expired 在一定时间内客户端没有收到服务器的通知, 则认为当前的会话已经过期了。
KeeperStat.Disconnected 断开连接的状态
KeeperStat.SyncConnected 客户端和服务器端在某一个节点上建立连接,并且完成一次version、zxid同步
KeeperStat.authFailed 授权失败
4.事件类型
NodeCreated 当节点被创建的时候,触发
NodeChildrenChanged 表示子节点被创建、被删除、子节点数据发生变化
NodeDataChanged 节点数据发生变化
NodeDeleted 节点被删除
None 客户端和服务器端连接状态发生变化的时候,事件类型就是None
zkclient

curator
1.概述:
Curator本身是Netflix公司开源的zookeeper客户端;
curator提供了各种应用场景的实现封装
curator-framework 提供了fluent(流式)风格api
curator-replice 提供了实现封装
2.curator连接的重试策略
ExponentialBackoffRetry() 衰减重试
RetryNTimes 指定最大重试次数
RetryOneTime 仅重试一次
RetryUnitilElapsed 一直重试知道规定的时间
九、zookeeper数据存储
1.概述:
zookeeper中数据分为:内存数据和磁盘数据,zookeeper会定时把数据存储在磁盘上(配置文件中的配置)。
2.两个路径
DataDir路径下存储的是数据的快照
快照: 存储某一个时刻全量的内存数据内容
DataLogDir 存储事务日志
事务日志的文件格式:log.zxid
查看事务日志的命令
java -cp :/mic/data/program/zookeeper-3.4.10/lib/slf4j-api-1.6.1.jar:/mic/data/program/zookeeper-3.4.10/zookeeper-3.4.10.jar org.apache.zookeeper.server.LogFormatter log.200000001
3.zookeeper的三种日志
zookeeper.out //运行日志
快照 存储某一时刻的全量数据
事务日志 事务操作的日志记录