分布式系统及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 中 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的信息不是都存在内存中,还有持久化,比如日志文件、快照文件。

posted @ 2021-01-08 11:02  qianbuhan  阅读(176)  评论(0)    收藏  举报