必须理解的分布式系统中雷同的集群技术及原理

写在前面

在当今信息爆炸的时代,单台计算机已经无法负载日益增长的业务发展,虽然也有性能强大的超级计算机,但是这种高端机不仅费用高昂,也不灵活,一般的企业是负担不起的,而且也损失不起,那么将一群廉价的普通计算机组合起来,让它们协同工作就像一台超级计算机一样地对外提供服务,就成了顺其自然的设想,但是这又增加了软件的复杂度,要求开发的软件需要具备横向扩展能力,比如:Kafka、Elasticsearch、Zookeeper等就属于这一类软件,它们天生都是"分布式的",即可以通过添加机器节点来共同地分摊数据存储和负载压力。

为什么需要集群?

分布在不同区域的计算机,彼此之间通过网络建立通信,相互协作作为一个整体对外提供服务,这就是集群,如果我们开发的系统具备这样的能力,那么理论上就具备无限横向扩容的能力,系统的吞吐量就会随着机器数增加而增长,那么未来当系统出现高负载的时候,就可以很好地应对这种情况。

为什么CAP不能同时满足?

通过上面分析,我们知道实现集群,其实就是采用多台计算机来共同承担和负载系统压力,那么就涉及到多台计算机需要参与一起处理数据,为了保证可用性,一般都会在每台计算机上备份一份数据,这样只要有一个节点保持同步状态,那么数据就不会丢失,比如kafka分区多副本、Elasticsearch的副本分片,由于同一数据块及其副本位于不用的机器,随着时间的推移,再加上不可靠的网络通信,所有机器上的数据必然会不完全一致,这个时候假如发生一种极端情况,所有的机器宕机了,又如何保证数据不丢失呢(其实只有两种方法)?

  1. 保证可用性:选择第一台恢复正常服务的机器(不一定拥有全部数据)作为可信的数据来源,快速恢复集群,即停机时间优于同步。
  2. 保证数据一致性:等待第一台拥有全部数据的机器恢复正常,再恢复集群,即同步优于停机时间,比如禁用kafka的unclean leader选举机制就是这种策略。

其实当大多数机器不可用时,就需要在可用性和一致性之间进行妥协了,所以另一个更符合分布式系统的Base理论又被创造出来了。

如何解决分布式存储问题?

当由多台计算机组成的集群对外提供服务时,其实就是对外提供读、写的能力。

数据块技术(data block)

为了将数据合理、均匀地写到各个机器上,提高集群写能力;为了将读请求负载均衡到不同的节点,提高集群的读能力;为了解耦数据存储和物理节点,提高分布式读写并行处理的能力,聪明的工程师引入了一个逻辑数据存储单位,统称为数据块,比如Kafka的分区(partion)、Elasticsearch的分片(shard),这样的虚拟化大大提高了集群读写的灵活性。

备注:所以啊,名字不重要,知其所以然最重要。

协调节点(coordination node)

实际上当集群作为一个整体处理数据时,可能每一个节点都会收到读写请求,但是数据又是分散在不同的节点上,所以就需要每个节点都清楚地知道集群中任意一个数据块的位置,然后再将请求转发到相应的节点,这就是“协调节点”的工作。比如:Elasticsearch的master节点管理集群范围内的所有变更,主分片管理数据块范围内的所有变更。

大多数投票机制(quorum)

百度百科:quorum,翻译法定人数,指举行会议、通过议案、进行选举或组织某种专门机构时,法律所规定的必要人数,未达法定人数无效。

由于网络分区的存在,这个机制被广泛地应用于分布式系统中,比如集群节点之间选举Master;数据块之间选举Header等;在分布式存储中,也被称为Quorum读写机制,即写入的时候,保证大多数节点都写入成功(一般的做法会选举一个主数据块(header),保证它写成功,然后再同步到冗余的副本数据块);读取的时候保证读取大多数节点的数据(一般的做法是由协调节点分发请求到不同的节点,然后将所有检索到的数据进行全局汇总排序后再返回);由于读写都是大多数,那么中间肯定存在最新的重叠数据,这样就能保证一定能读到最新的数据。

从上面分析可以得出,只要大多数节点处于活跃可用状态,那么整个集群的可用性就不会受到影响;只要大多数据块处于活跃可用的状态,那么就能持续地提供读写服务;只要有一个数据块完成了同步状态,那么数据就不会丢失;这其实就是通过一种冗余机制来尝试处理fail/recover模式的故障,通俗点讲就是容忍单点故障,至少需要部署3个节点;容忍2点故障,至少需要部署5个节点,机器节点越多分区容忍性就越强,即通过增加机器数来降低由于机器故障影响服务的概率,顿悟了吧,嘿嘿,所以保证集群可用的前提就是有奇数个节点、奇数个数据块保持活跃可用状态,不然就无法选举出master或header

大多数投票机制运用起来也非常灵活,当分布式系统追求强一致性时,需要等待所有的数据快及其副本全部写入成功才算完成一次写操作,即写全部(write all),可以理解一种事务保证,要么全部写入,要么一个都不写入,比如:kafka从0.11.0.0 版本开始, 当producer发送消息到多个topic partion时,就运用了这种机制,来保证消息交付的exactly-once语义,是不是很帅,而且这种情况下,从任意一个节点都能读到最新的数据,读性能最高;当分布式系统追求最终一致性时,只需等待主数据块(leader)写入成功即可,再由主数据块通过消息可达的方式同步到副本数据块。

为了能够满足不同场景下对数据可靠性和系统吞吐量的要求,最大化数据持久性和系统可用性,很多组件都提供了配置项,允许用户定义这个大多数的法定数量,下面我们就来谈谈一些常用组件的配置:

Elasticsearch
1082769-20180710111213498-1398083309.png
由上图可以看到,整个集群由三个运行了Elasticsearch实例的节点组成,有两个主分片,每个分片又有两个副分片,总共有6个分片拷贝,Elasticsearch内部自动将相同的分片放到了不同的节点,非常合理和理想。
当我们新建一个文档时

  • 1、客户端向 Node 1 发送新建文档的写请求。
  • 2、节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
  • 3、Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。

这就是Elasticsearch处理写请求的典型步骤顺序,同时每种业务场景对数据可靠性的要求和系统性能也不一样,所以Elasticsearch提供了Consistence配置项:

  • 1、one:主分片处于活跃可用状态就可以处理写请求。
    系统吞吐量最高,但数据可能会丢失,对数据可靠性要求不是很高的场景非常适合,比如实时的时序数据处理(日志)。
  • 2、all:主分片和所有副本分片处于活跃可用状态才允许处理写请求。
    系统吞吐量最低,但数据不会丢失。处理关键的业务数据非常合适。
  • 3、quorum:必须有大多数的分片拷贝处于活跃可用状态才允许处理写请求。
    平衡系统吞吐量和数据可靠性,一般业务系统都使用这个配置。

Kafka
当向Kafka 写数据时,producers可以通过设置ack来自定义数据可靠性的级别:

  • 0:不等待broker返回确认消息。
  • 1: leader保存成功返回。
  • -1(all): 所有备份都保存成功返回。

    备注:默认情况下,为了保证分区的最大可用性,当acks=all时,只要ISR集合中的副本分区写入成功,kafka就会返回消息写入成功。如果要真正地保证写全部(write all),那么我们需要更改配置transaction.state.log.min.isr来指定topic最小的ISR集合大小,即设置ISR集合长度等于topic的分区数

如果所有的节点都挂掉,还有Unclean leader选举机制的保证,建议大家下去阅读kafka《官方指南》设计部分,深入理解kafka是如何通过引入ISR集合来变通大多数投票机制,从而更好地保证消息交付的不同语义。

什么是集群脑裂?

对于分布式系统,自动处理故障的关键就是能够精准地知道节点的存活状态(alive)。有时候,节点不可用,不一定就是其本身挂掉了,极有可能是暂时的网络故障;在这种情况下,如果马上选举一个master节点,那么等到网络通信恢复正常的时候,岂不是同时存在两个master,这种现象被形象地称为“集群脑裂”,先留给大家下去思考吧。呵呵,明天要早起,碎觉了,大家晚安。

备注:设计一个正在高可用的分布式系统,需要考虑的故障情况往往会很复杂,大多数组件都只是处理了fail/recover模式的故障,即容忍一部分节点不可用,然后等待恢复;并没有处理拜占庭故障(Byzantine),即节点间的信任问题,也许区块链可以解决吧,大家可以下去多多研究,然后我们一起讨论,共同学习,一起进步。

写在最后

分享了这么多,请大家总结一下大多数投票机制的优点和缺点?欢迎评论区留言,哈哈,真的要睡觉了,晚安。

补充:大多数投票机制的优缺点

由于昨晚太晚了,第二天又要早起参加团建活动,对于最后就抛出的问题,希望大家下去总结一下大多数投票的优缺点,现在就来补充一下。

优点

大多数投票机制延迟取决于最快的服务器,即等待数据备份完成的等待时间取决于最快的follower,比如副本因子是3,header占据1位,再有1位最快的follower同步完成,就满足大多数了。

缺点

大多数(n+1)的节点挂掉就无法选举leader,从而整个集群彻底失去可用性,比如:为了冗余单点故障,通常需要三个节点备份数据,但是当其中两台挂掉时,整个集群就挂了。仅仅靠冗余数据来避免单点故障是不够,通常对磁盘空间需求量为2n+1倍,相应地也会导致写吞吐量下降2n+1倍,这种高昂的存储方式并不适合存储原始数据,这就是为什么quorum算法更适合共享集群配置数据,如zookeeper,这也是kafka为什么要引入一个同步状态备份集合(ISR),通过降低所需的备份数据而带来额外的吞吐量和磁盘空间,从而提高kafka处理海量实时数据的能力。

转载于:https://www.cnblogs.com/justmine/p/9275730.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何获取.then的返回值_仅仅知道如何终止XHR请求,或许对你来说是不够的!

TLDR:当我们需要的时候,我们可以通过AbortController接口来终止一个或者多个请求。前言到目前为止,我们有两个常用的基本的手段去发送请求进而局部刷新页面内容,其一是XMR(XMLHttpRequest),其二是fetch,我们一个个说XH…

Java - 常用工具类 - 集合框架

转载于:https://www.cnblogs.com/wnzhong/p/9309371.html

stunnel使用详解

http://www.stunnel.org/faq/args.htmlhttp://www.colasoft.com.cn/support/monitor_stunnel.php科来网络分析系统与stunnel结合使用科来网络分析系统是一款强大的网络检测分析工具,可对网络中未加密的数据传输进行检测分析并实时显示分析结果,包括用户的…

binlog日志_【删库跑路】使用Binlog日志恢复误删的MySQL数据

前言“删库跑路”是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路!开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你…

Java并发编程笔记之ThreadLocal内存泄漏探究

使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: /*** Created by cong on 2018/7/14.*/ public class ThreadLocalOutOfMemoryTest {static class LocalVariable {private L…

Res协议,专题

打造完美的IE网页木马 发表:2004-5-20 19:41:00 出处:你的博客网(yourblog.org) 打造完美的IE网页木马 icyfox (测试页面:http://www.godog.y365.com/runexe/icyfox.htm,此处所…

springboot中获取bean_最新Spring Boot干货总结(超详细,建议收藏)

前言:本文非常长,建议先mark后看,也许是最后一次写这么长的文章说明:前面有4个小节关于Spring的基础知识分别是:IOC容器、JavaConfig、事件监听、SpringFactoriesLoader详解它们占据了本文的大部分内容:虽然…

python全栈学习总结三:函数学习

一函数基本概念 1 函数定义 def 函数名(参数1,参数2,参数3,......): """ 功能: 参数1: 参数2: 参数3: ...... 返回值: """ 函…

街机模拟器联网简谈

Kawaks联网教程现在大多数模拟器的联网功能主要是靠"kaillera"来实现的,要想实现联网玩游戏,你必须有一个kaillera的客户端和一个服务器端的程序,客户端现在大多在模拟器中自带,而服务器端则是一个单独的程序.kaillera有多种操作系统,而大多是在windows下,好了废话不…

freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5

最近因为工作需要用到FreeRTOS,其实开始本人内心是拒绝的因为自己只学习过UCOSIII还没实际上过什么大又复杂的工程,但是谁让FreeRTOS他是Free的呢公司成本考虑肯定是不会选择USOS的,这个道理就像公司内心深处不想给你涨工资一样。好了跑偏了言…

破解静态WEP KEY全过程

破解静态WEP KEY全过程广州卓讯盟科技有限公司 黄超毅Email:huangchaoyigzpia.com/demonalexdark2s.org发现首先通过NetStumbler确认客户端已在某AP的覆盖区内,并通过AP信号的参数进行‘踩点’(数据搜集)。NetStumbler 下载地址 http://www.n…

apicloud项目怎么运行_Spring Boot教程(3) – 运行第一个项目

把项目运行起来是极具成就感的事情,不管是在学习新语言还是新框架的过程中。上一篇文章说明了如何使用Spring Initializr和IDE来创建项目,下面就看看项目能不能跑起来,我们通过IDE和命令行,直观地理解框架的作用。先来一张Intelli…

Matlab从入门到精通 Chapter5 数据可视化

5-1 图形绘制示例 >> x2-17:0.02:3;>> y21./((x23).^21)1./((x29).^24)5; >> subplot(2,2,2);>> plot(x2,y2,rp);>> axis([-17 3 5 6.5]);>> title(figure2);>> grid on subplot 子图表绘制函数 默认情况下,plot函数将绘…

破解WEP密钥过程全解 (下)

三、实战破解过程1、用Kismet进行网络探测Kismet是一个基于Linux的无线网络扫描程序,这是一个相当方便的工具,通过测量周围的无线信号来找到目标WLAN。虽说Kismet也可以捕获网络上的数据通信,但在还有其他更好的工具使用(如Airodump)&#xf…

mpAndroidchart 坐标和图表距离_【玩转图表系列】六步,美化你的图表,让老板刮目相看!...

近期隆重推出图表分析系列,包括销售分析、盈亏分析、费用分析、趋势分析、进度分析等,通过双坐标图、甘特图、瀑布图、双层饼图等系列图表精美展现,专业高效,让你从初级学到高级、从小白跨越专业。今天开启我们邦邦财玩转图表第一…

SpringBoot+FreeMarker开发word文档下载,预览

背景&#xff1a; 开发一个根据模版&#xff0c;自动填充用户数据并下载word文档的功能 使用freemarker进行定义模版&#xff0c;然后把数据进行填充。 maven依赖&#xff1a; <parent> <groupId>org.springframework.boot</groupId> <artifactId>…

使用 IPsec 与组策略隔离服务器和域-第 7 章 IPsec 疑难解答

本章提供有关如何对 Internet 协议安全性 (IPsec) 问题&#xff08;如服务器和域隔离方案中的安全性问题&#xff09;进行疑难解答的信息&#xff0c;这些信息依赖于 Microsoft 信息技术 (IT) 小组的经验和方法。 在有可能的时候&#xff0c;本章将引用现有的 Microsoft 疑难解…

单片机的单个IO口可以发送数据吗_关于51单片机各个引脚它的功能你了解多少?...

对于40引脚双列直插51单片机各个引脚功能情况分析。P0端口一默认是开漏准双向IO口&#xff0c;没有输出没有驱动能力&#xff0c;要做逻辑输出要在外部接上拉电阻。P0端口除了作为普通的输入输出功能&#xff0c;还可以用来当做数据总线接口或者地址总线&#xff0c;当外面扩展…

git merge用法_常用命令之git操作(进阶篇)

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作。有人把 Git 的分支模型称为必杀技特性&#xff0c;而正是因为它&#xff0c;将 Git 从版本控制系统家族里区分出来。不同的分支可以理解为…

2G内存刚刚好 浅谈4G内存对笔记本的影响

随着Intel P3x系列芯片组的发布&#xff0c;DDR3内存的普及日益临近&#xff0c;AMD K10系列处理器AM2规格也正式支持DDR3内存&#xff0c;明年即将面临淘汰的DDRII内存是越来越便宜了。很多笔记本用户在购买笔记本的时候都把是否支持4G内存作为一个总要的衡量标准。官方资料里…