think-about-cluster

分布式集群

分布式: 即拆分原有的功能,避免冗余和服务的耦合

集群: 提供多台服务避免单点故障

使用分布式集群好处很多 避免某个服务出问题服务不受影响,同时提供多台性能没那么强的数据也成本更低,数据的分块和副本也能最大程度减少数据的丢失,单机io瓶颈

坏处就是: 开发成本 超时等待,不同节点数据的同步,分布式事务,grpc接口的各种可能情况

通常会有3个以上的节点,数据过来会被分块和创建副本,同时会有选取机制或者是专门的服务负责协调数据的同步和客户端访问具体的数据节点

下面举出比较有特点的分布式服务

elasticsearch kafka hbase zookeeper
节点 datandoe coordinate数据 doc数据集 index数据分块 shard 节点 broke数据 message数据集 topic数据集分块 partition replica例外消费者comsumer生产者 producter消费者组 comsumer-group元数据保存在zookeeper上 节点 datanode数据 节点 node选举半数以上有个master,存储元数据leaderfollower
index:对外暴露的搜索单元,由一系列的shard组成。shard:es实际执行的单元,开始针对索引的写入和查询,都会拆分为segment:es里面完整的索引集合,由document和索引文件document:对应一天天数据translog: 事务日志 table:由多行数据组成region:由很多store组成,有多少个列族就有多少个storeStore: 由Memstore和StoreFile组成,一个列簇对应一个Store,包含在内存中的Memstore以及持久化到hdfs里的多个HFile,StoreFile的底层就是HFile,它是HFile的一个轻量级封装row, column, cell: 一个row由rowKey和多个column及其对应值组成,一张表的所有row都按rowkey的字典序由小到大排序,column由columnFamily和Qualifier组成,cell是row, column, timestamp, type, value等组成。HLog: 类似于ES的Translog,主要也是用于数据的恢复。
merge 索引 merge 分块 rebalance 消费者rebalance topic 的推送 为什么hbase会有列族 可以没有严格限定列的格式就是因为 hbase的

下面是补充

分布式系统常见异常问题

  • 通信异常:网络不可用(消息延迟或者丢失),会导致分布式系统内部无法顺利进行一次网络通信进行沟通协调,所以可能造成多节点数据丢失和 状态不一致,还有可能造成数据乱序。解决方案:重试机制

  • 网络分区:网络不连通,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域,分布式系统就会出现局 部小集群造成数据不一致。解决方案:把数据状态不是最新的给下线掉

  • 节点故障/机器宕机:服务器节点出现的宕机或”僵死”现象,这是常态,而不是异常。解决方案:数据副本协议,异步复制

  • 分布式三态:即成功、失败和超时,分布式环境中的网络通信请求发送和结果响应都有可能丢失,所以请求发起方无法确定消息是否处理成功。分 布式系统的可用性:在用户能忍受的时间范围内,一定给出响应!解决方案:超时处理

  • 存储数据丢失:对于有状态节点来说,数据丢失意味着状态丢失,通常只能从其他节点读取、恢复存储的状态。解决方案:副本协议

2.3 分布式系统性能指标

  • 性能:下面三个性能指标(吞吐,延迟,并发)往往会相互制约,追求高吞吐的系统,往往很难做到低延迟;系统平均响应时间较长时,也很难提高 QPS。系统的吞吐能力,指系统在某一时间可以处理的数据/请求总量,通常可以用系统每秒处理的总数据/总请求量来衡量; 系统的响应延迟,指系统完成某一功能需要使用的时间; 系统的并发能力,指系统可以同时完成某一功能的能力,通常也用QPS(query per second)来衡量。

  • 可用性:系统的可用性(availability)指系统在面对各种异常时可以正确提供服务的能力。系统的可用性可以用系统停服务的时间与正常服务的时间 的比例来衡量,也可以用某功能的失败次数与成功次数的比例来衡量。可用性是分布式的重要指标,衡量了系统的鲁棒性,是系统容错能力的体现。(5 个 9 的可靠性:一年只有 5 分钟的宕机时间!6 个 9 的可靠性,也就是 31 秒,99.9999%)

  • 可扩展性:系统的可扩展性(scalability)指分布式系统通过扩展集群机器规模提高系统性能(吞吐、延迟、并发)、存储容量、计算能力的特性。好 的分布式系统总在追求 “线性扩展性”,也就是使得系统的某一指标可以随着集群中的机器数量线性增长。最期望的情况:动态热部署

  • 一致性:分布式系统为了提高可用性,总是不可避免的使用副本的机制,从而引发副本一致性的问题。越是强的一致性的模型,对于用户使用来说使 用起来越简单。

ZooKeeper架构设计分析/