分布式系统及Zookeeper 简介
分布式系统
一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
- 分布性
- 对等性。备份冗余
- 并发性
- 缺乏全局时钟
- 故障随时会发生
分布式系统带来的问题
- 通信异常
- 网络分区(脑裂)。
同一个问题有两个不同的答案。网络出现了故障,导致出现了两个决策者。使用一致性算法解决(zab,paxos等)。 - 三态。成功、失败、超时
- 节点故障
CAP 理论
- C 一致性:数据在分布式环境下的多个副本之间能否保持一致性,这里的一致性更多是指强一致性。
- A 可用性:分布式系统一直处于可用状态,对于请求总是能在有限的时间内返回结果致性。
- P 分区容错性:除非整个网络故障,分布式系统在任何网络或者单点故障时,仍能对外提供满足一致性和可用性的服务。
一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个基本需求,最多只能同时满足其中的两项。
架构师的精力往往就花在怎么样根据业务场景在 A 和 C 之间寻求平衡,P 必须满足。
BASE 理论:
即使无法做到强一致性,但分布式系统可以根据自己的业务特点,采用适当的方式来使系统达到最终的一致性。
- Basically Avaliable 基本可用:当分布式系统出现不可预见的故障时,允许损失部分可用性,保障系统的“基本可用”;体现在“时间上的损失”和“功能上的损失”。
比如部分用户双十一高峰期淘宝页面卡顿或降级处理(springcloud histrix)。服务雪崩:隔离、熔断、降级、限流。 - Soft state 软状态:允许系统中的数据存在中间状态,既系统的不同节点的数据副本之间的数据同步过程存在延时,并认为这种延时不会影响系统可用性。
比如12306网站卖火车票,请求会进入排队队列。 - Eventually consistent 最终一致性:所有的数据在经过一段时间的数据同步后,最终能够达到一个一致的状态。
比如理财产品首页充值总金额短时不一致。
分布式一致性算法
常见分布式一致性算法:2p,3p,paxos,zab算法
| 算法 | 功能 |
|---|---|
| 2p/3p | 2p两阶段提交,数据库分布式事务经常使用的一种分布式算法,算法简单,但有出现阻塞,数据再某情况不一致的问题。3p对2p进行了完善,完善了阻塞以及可用性 |
| paxos | 分布式一致性算法,也分两个阶段,遵循少数服从多数的原则,并不需要所有参与者都同意某一协议 |
| zab | 借鉴paxos思路,是zookeeper解决分布式一致性所使用的算法 |
Zookeeper 简介
ZooKeeper致力于提供一个高性能、高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoop和Hbase的重要组件。
设计目标
- 简单的数据结构:共享的树形结构,类似文件系统,存储于内存
- 可以构建集群:避免单点故障,3-5台(奇数台)机器就可以组成集群,超过半数正常工作就能对外提供服务
- 顺序访问:对于每个写请求,zk会分配一个全局唯一的递增编号,利用这个特性可以实现高级协调服务。分布式锁就用到这一特性。
- 高性能:基于内存操作,服务于非事务请求,适用于读操作为主的业务场景。3台zk集群能达到13w QPS
应用场景
- 数据发布订阅
- 负载均衡
由谁负载?服务端负载(Nginx)、客户端负载(注册中心,比如Zookeeper、Eurka) - 命名服务
id - Master 选举
- 集群管理
- 配置管理
阿波罗配置中心、spring cloud config、zookeeper - 分布式队列
- 分布式锁
Docker 中安装 Zookeeper
docker pull zookeeper
# 几种常见的启动方式汇总参考,详见上面给出的官方文档
docker run --privileged=true -d --name zookeeper --publish 2181:2181 zookeeper
docker run --name some-zookeeper --restart always -d zookeeper
docker run --name some-app --link some-zookeeper:zookeeper -d application-that-uses-zookeeper
docker run -it --rm --link some-zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
docker stack deploy -c stack.yml zookeeper
docker-compose -f stack.yml up
docker run --name some-zookeeper --restart always -d -v $(pwd)/zoo.cfg:/conf/zoo.cfg zookeeper
docker run -e "ZOO_INIT_LIMIT=10" --name some-zookeeper --restart always -d zookeeper
docker run --name some-zookeeper --restart always -e ZOO_CFG_EXTRA="metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7070" zookeeper
docker run --name some-zookeeper --restart always -e JVMFLAGS="-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory" zookeeper
docker run --name some-zookeeper --restart always -e JVMFLAGS="-Xmx1024m" zookeeper
docker run --name some-zookeeper --restart always -e ZOO_LOG4J_PROP="INFO,ROLLINGFILE" zookeeper
zk面试问题
- Zookeeper是什么框架
- 应用场景
- Paxos算法& Zookeeper使用协议
- 选举算法和流程
- Zookeeper有哪几种节点类型
- Zookeeper对节点的watch监听通知是永久的吗?
- 部署方式?集群中的机器角色都有哪些?集群最少要几台机器
- 集群如果有3台机器,挂掉一台集群还能工作吗?挂掉两台呢?
- 集群支持动态添加机器吗?zk本身不支持,需要第三方的框架支持。
zk的信息不是都存在内存中,还有持久化,比如日志文件、快照文件。

浙公网安备 33010602011771号