㈠ 分布式技术介绍
2.一致性模型
弱一致性
最终一致性(一段时间达到一致性)
强一致
1、2 异步冗余;3是同步冗余
数据分区: uid % 16
数据镜像:让多有的服务器都有相同的数据,提供相当的服务(冗余存储,一般3份为好)
4.两种方案的事务问题
A向B汇钱,两个用户不在一个服务器上
镜像:在不同的服务器上对同一数据的写操作如何保证一致性。
5. 解决一致性事务问题的技术
1. Master -Slave
读写请求由Master负责
写请求写到Master后,由Master同步到Slave上
由Master push or Slave pull
通常是由Slave 周期性来pull,所以是最终一致性
问题: 若在 pull 周期内(不是期间?),master挂掉,那么会导致这个时间片内的数据丢失
若不想让数据丢掉,Slave 只能成为 ReadOnly方式等Master恢复
若容忍数据丢失,可以让 Slave代替Master工作
如何保证强一致性?
Master 写操作,写完成功后,再写 Slave,两者成功后返回成功。若 Slave失败,两种方法
标记 Slave 不可用报错,并继续服务(等恢复后,再同步Master的数据,多个Slave少了一个而已)
回滚自己并返回失败
2. Master-Master
数据同步一般是通过 Master 间的异步完成,所以是最终一致
好处: 一台Master挂掉,另外一台照样可以提供读写服务。当数据没有被赋值到别的Master上时,数据会丢失。
对同一数据的处理问题:Dynamo的Vector Clock的设计(记录数据的版本号和修改者),当数据发生冲突时,要开发者自己来处理
3.两阶段提交 Two Phase Commit _ 2PC
第一阶段:针对准备工作
协调者问所有节点是否可以执行提交
参与者开始事务,执行准备工作:锁定资源(获取锁操作)
参与者响应协调者,如果事务的准备工作成功,则回应"可以提交",否则,拒绝提交
第二阶段:
若都响应可以提交,则协调者项多有参与者发送正式提交的命令(更新值),参与者完成正式提交,释放资源,回应完成。协调者收到所有节点的完成响应后结束这个全局事务.。若参与者回应拒绝提交,则协调者向所有的参与者发送回滚操作,并释放资源,当收到全部节点的回滚回应后,取消全局事务
存在的问题:若一个没提交,就会进行回滚
第一阶段:若消息的传递未接收到,则需要协调者作超时处理,要么当做失败,要么重载
第二阶段:若参与者的回应超时,要么重试,要么把那个参与者即为问题节点,提出整个集群
在第二阶段中,参与者未收到协调者的指示(也许协调者挂掉),则所有参与者会进入“不知所措” 的状态(但是已经锁定了资源),所以引入了三段提交
4. 三段提交:把二段提交的第一阶段 break 成了两段
询问
锁定资源(获取锁)
提交
核心理念:在询问的时候并不锁定资源,除非所有人都同意了,才开始锁定
好处:当发生了失败或超时时,三段提交可以继续把状态变为Commit 状态,而二段提交则不知所措?
5. Raxos 算法(少数服从多数)
解决的问题:在一个可能发生异常的分布式系统中如何就某个值达成一致,让整个集群的节点对某个值的变更达成一致
任何一个节点都可以提出要修改 某个 数据的提案,是否通过这个提案取决于这个集群中是否有超过半数的节点同意(所以节点数总是单数)—— 版本标记。虽然一致性,但是只能对一个操作进行操作啊??
当一个Server接收到比当前版本号小的提案时,则拒绝。当收到比当前大的版本号的提案时,则锁定资源,进行修改,返回OK. 也就是说收到超过一半的最大版本的提案才算成功。
核心思想 :
在抢占式访问权的基础上引入多个acceptor,也就是说当一个版本号更大的提案可以剥夺版本号已经获取的锁。
后者认同前者的原则:
在肯定旧epoch 无法生成确定性取值时,新的 epoch 会提交自己的valu
一旦 旧epoch形成确定性取值,新的 epoch肯定可以获取到此取值,并且会认同此取值,不会被破坏。
步骤
P1 请求Acceptor的 #1,Acceptor 这时并没有其他线程获取到锁,所以把锁交给 P1,并返回这时 #1 的值为null
然后 P1 向 第一个 Acceptor 提交 #1 的值,Acceptor 接受并返回 OK
这个时候,P2向Acceptor请求#1上的锁,因为版本号更大,所以直接抢占了 P1 的锁。这时 Acceptor 返回了 OK并且返回了 #1 的值
这时 P1 P向 后面两个 Acceptor 提交 #1 的值,但是由于中间的那个Acceptor 版本号已经更改为 2 了,所以拒绝P1。第三个 Acceptor 接受了,并且返回了 OK
由于后者认同前者的原则,这时 P1 已经形成确定性取值了 V1 了,这时新的 P2 会认同此取值,而不是提交自己的取值。所以,P2会选择最新的那个取值 也就是V1 进行提交。这时Acceptor 返回 OK
6.ZAB 协议 ( Zookeeper Atomic Broadcast) 原子广播协议:保证了发给各副本的消息顺序相同
定义 :原子广播协议 ZAB 是一致性协议,Zookeeper 把其作为数据一致性的算法。ZAB 是在 Paxos 算法基础上进行扩展而来的。Zookeeper 使用单一主进程 Leader用于处理客户端所有事务请求,采用 ZAB 协议将服务器状态以事务形式广播到所有 Follower 上,由于事务间可能存在着依赖关系,ZAB协议保证 Leader 广播的变更序列被顺序的处理,一个状态被处理那么它所依赖的状态也已经提前被处理
核心思想: 保证任意时刻只有一个节点是Leader,所有更新事务由Leader发起去更新所有副本 Follower,更新时用的是 两段提交协议,只要多数节点 prepare 成功,就通知他们commit。各个follower 要按当初 leader 让他们 prepare 的顺序来 apply 事务
协议状态
Looking:系统刚启动时 或者 Leader 崩溃后正处于选举状态
Following:Follower 节点所处的状态,Follower与 Leader处于数据同步状态
Leading:Leader 所处状态,当前集群中有一个 Leader 为主进程
ZooKeeper启动时所有节点初始状态为Looking,这时集群会尝试选举出一个Leader节点,选举出的Leader节点切换为Leading状态;当节点发现集群中已经选举出Leader则该节点会切换到Following状态,然后和Leader节点保持同步;当Follower节点与Leader失去联系时Follower节点则会切换到Looking状态,开始新一轮选举;在ZooKeeper的整个生命周期中每个节点都会在Looking、Following、Leading状态间不断转换。
选举出Leader节点后 ZAB 进入原子广播阶段,这时Leader为和自己同步每个节点 Follower 创建一个操作序列,一个时期一个 Follower 只能和一个Leader保持同步
阶段
Election: 在 Looking状态中选举出 Leader节点,Leader的LastZXID总是最新的(只有lastZXID的节点才有资格成为Leade,这种情况下选举出来的Leader总有最新的事务日志)。在选举的过程中会对每个Follower节点的ZXID进行对比只有highestZXID的Follower才可能当选Leader
每个Follower都向其他节点发送选自身为Leader的Vote投票请求,等待回复;
Follower接受到的Vote如果比自身的大(ZXID更新)时则投票,并更新自身的Vote,否则拒绝投票;
每个Follower中维护着一个投票记录表,当某个节点收到过半的投票时,结束投票并把该Follower选为Leader,投票结束;
Discovery:Follower 节点向准 Leader推送 FollwerInfo,该信息包含了上一周期的epoch,接受准 Leader 的 NEWLEADER 指令
Sync:将 Follower 与 Leader的数据进行同步,由Leader发起同步指令,最终保持数据的一致性
Broadcast:Leader广播 Proposal 与 Commit,Follower 接受 Proposal 与 commit。因为一个时刻只有一个Leader节点,若是更新请求,只能由Leader节点执行(若连到的是 Follower 节点,则需转发到Leader节点执行;读请求可以从Follower 上读取,若是要最新的数据,则还是需要在 Leader上读取)
消息广播使用了TCP协议进行通讯所有保证了接受和发送事务的顺序性。广播消息时Leader节点为每个事务Proposal分配一个全局递增的ZXID(事务ID),每个事务Proposal都按照ZXID顺序来处理(Paxos 保证不了)
Leader节点为每一个Follower节点分配一个队列按事务ZXID顺序放入到队列中,且根据队列的规则FIFO来进行事务的发送。
Recovery :根据Leader的事务日志对Follower 节点数据进行同步更新
同步策略:
SNAP :如果Follower数据太老,Leader将发送快照SNAP指令给Follower同步数据;
DIFF :Leader发送从Follolwer.lastZXID到Leader.lastZXID议案的DIFF指令给Follower同步数据;
TRUNC :当Follower.lastZXID比Leader.lastZXID大时,Leader发送从Leader.lastZXID到Follower.lastZXID的TRUNC指令让Follower丢弃该段数据;(当老Leader在Commit前挂掉,但是已提交到本地)
Follower将所有事务都同步完成后Leader会把该节点添加到可用Follower列表中;
Follower接收Leader的NEWLEADER指令,如果该指令中epoch比当前Follower的epoch小那么Follower转到Election阶段
7. Raft 算法
Raft 算法也是一种少数服从多数的算法,在任何时候一个服务器可以扮演以下角色之一:
Leader:负责 Client 交互 和 log 复制,同一时刻系统中最多存在一个
Follower:被动响应请求 RPC,从不主动发起请求 RPC
Candidate : 由Follower 向Leader转换的中间状态
在选举Leader的过程中,是有时间限制的,raft 将时间分为一个个 Term,可以认为是“逻辑时间”:
每个 Term中至多存在1个 Leader
某些 Term由于不止一个得到的票数一样,就会选举失败,不存在Leader。则会出现 Split Vote ,再由候选者发出邀票
每个 Server 本地维护 currentTerm
选举过程:
自增 CurrentTerm,由Follower 转换为 Candidate,设置 votedFor 为自身,并行发起 RequestVote RPC,不断重试,直至满足下列条件之一为止:
获得超过半数的Server的投票,转换为 Leader,广播 HeatBeat
接收到 合法 Leader 的 AppendEnties RPC,转换为Follower
选举超时,没有 Server选举成功,自增 currentTerm ,重新选举
当Candidate 在等待投票结果的过程中,可能会接收到来自其他Leader的 AppendEntries RPC ,如果该 Leader 的 Term 不小于本地的 Current Term,则认可该Leader身份的合法性,主动降级为Follower,反之,则维持 candida 身份继续等待投票结果
Candidate 既没有选举成功,也没有收到其他 Leader 的 RPC (多个节点同时发起选举,最终每个 Candidate都将超时),为了减少冲突,采取随机退让策略,每个 Candidate 重启选举定时器
日志更新问题:
如果在日志复制过程中,发生了网络分区或者网络通信故障,使得Leader不能访问大多数Follwers了,那么Leader只能正常更新它能访问的那些Follower服务器,而大多数的服务器Follower因为没有了Leader,他们重新选举一个候选者作为Leader,然后这个Leader作为代表于外界打交道,如果外界要求其添加新的日志,这个新的Leader就按上述步骤通知大多数Followers,如果这时网络故障修复了,那么原先的Leader就变成Follower,在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新。
流程:
Client 发送command 命令给 Leader
Leader追加日志项,等待 commit 更新本地状态机,最终响应 Client
若 Client超时,则不断重试,直到收到响应为止(重发 command,可能被执行多次,在被执行但是由于网络通信问题未收到响应)
解决办法:Client 赋予每个 Command唯一标识,Leader在接收 command 之前首先检查本地log
9. paxos 算法与 raft 算法的差异
raft强调是唯一leader的协议,此leader至高无上
raft:新选举出来的leader拥有全部提交的日志,而 paxos 需要额外的流程从其他节点获取已经被提交的日志,它允许日志有空洞
相同点:得到大多数的赞成,这个 entries 就会定下来,最终所有节点都会赞成
NWR模型
N: N个备份
W:要写入至少 w 份才认为成功
R : 至少读取 R 个备份
W+ R > N ——> R > N - W(未更新成功的) ,代表每次读取,都至少读取到一个最新的版本(更新成功的),从而不会读到一份旧数据
问题:并非强一致性,会出现一些节点上的数据并不是最新版本,但却进行了最新的操作
版本冲突问题:矢量钟 Vector Clock : 谁更新的我,我的版本号是什么(对于同一个操作者的同一操作,版本号递增)
㈡ 什么是分布式计算机网络
在这种网络中,不存在一个处理和控制中心,网络中任一结点都至少和另外两个结点相连接,信息从一个结点到达另一结点时,可能有多条路径。同时,网络中各个结点均以平等地位相互协调工作和交换信息,并可共同完成一个大型任务。分组交换网、网状形网属于分布式网络。这种网具有信息处理的分布性、可靠性、可扩充性及灵活性等一系列优点。因此,它是网络发展的方向。 分布式系统的平台已经成为一个链接某个组织的各个工作组、部门、分支机构和各个分部的企业网络。数据不是在一台服务器上,而是在许多台服务器上;这些服务器可能位于多个不同的地理区域,并用WAN链路相连接。 图D-26说明了从昂贵的集中式系统向可大批量安装的低成本的分布式系统发展的趋势。在20世纪80年代末、90年代初,分布式系统由数量庞大的桌面计算机组成,而如今,因特网和Web技术已经大大扩展了分布式系统的概念。根据3Com论文的说法,Web是一个“大规模分布的系统集合”,它由数不胜数的节点组成,这些节点范围从服务器到便携式计算机和无线PDA,更不用说那些无需人工干预基本上就能够彼此对话的嵌入式系统了。 TCP/IP提供了一个网络无关的传输层。 Web客户机和服务器消除了对平台和操作系统的依赖性。 组件软件(Java、ActiveX)消除了与购买和安装软件相关的争论。 XML使数据独立于软件。 用Web技术构建的网络(如内联网和因特网)是真正的高级分布式计算网络。Web技术为分布式计算添加了一个新的维度。Web服务器为具有Web浏览器的任何一台客户机提供了通用的访问方法。计算平台和操作系统的类型变得无关紧要,而无限制的通信和信息交换却占据了主导地位。 最近的分布式计算项目已经被用于使用世界各地成千上万位志愿者的计算机的闲置计算能力,通过因特网,您可以分析来自外太空的电讯号,寻找隐蔽的黑洞,并探索可能存在的外星智慧生命;您可以寻找超过1000万位数字的梅森质数;您也可以寻找并发现对抗艾滋病病毒的更为有效的药物。这些项目都很庞大,需要惊人的计算量,仅仅由单个的电脑或是个人在一个能让人接受的时间内计算完成是决不可能的。 分布式环境具有一些很有趣的特征。它利用了客户机/服务器计算技术和多层体系结构。它可将处理工作分布在多个不很昂贵的系统上,从而减轻了服务器处理许多任务的工作量。数据可以通过有线或无线网络从许多不同的站点上进行访问。可以将数据复制到其他系统以提供容错功能,并使其更接近于用户。对数据进行分布可以使数据免遭本地灾害的破坏。 分布式环境需要下列组件: 支持多供应商产品和通信协议的网络平台。TCP/IP成为实际使用的标准协议。 用于在客户机和服务器之间交换信息的应用程序接口,如RPC(远程过程调用)、消息传递系统或Web协议。 用来跟踪资源和信息及其所处位置的目录命名服务。 可支持分区和复制以便对数据进行分布并确保数据的可用性、可靠性和保护的文件系统和数据库。 用于使信息更接近于用户并使通过远距离链路传输信息所需时间最小化的高速缓存方案。 安全功能(如身份验证和授权)以及不同位置的系统之间的信任关系。 如前所述,Web是最基本的分布式计算机系统。您可以访问全世界的Web服务器,这些服务器提供了近乎无限的丰富内容。您可以利用目录服务来查找站点。搜索引擎对整个Web上的信息进行分类,并使您可以对其进行查询。高速缓存技术和“内容分布”正在使信息与用户的距离越来越近。 大规模分布系统 3Com有一篇论文,名为“Massively Distributed Systems”,是由Dan Nessett撰写的。该论文谈到了从高成本的集中式系统向低成本分布式的高单元容量的产品发展的趋势,向大规模分布的系统发展的趋势,这些大规模分布系统无处不在并且其运行常常超出人们的正常的知识范围。对于那些想了解分布式计算发展趋势的人们,建议最好阅读一下这篇论文。 Nessett探讨了两种分布式处理方法。一种方法是将数据移到边缘处理器,正如Web和基于Web的文件系统那样。另一种方法是先有处理过程再接收数据,正如活动联网和Java应用小程序那样(如对象在分布式系统中移动,同时携带代码和数据)。如果对象主要包含数据,则它会更接近于再进行处理。如果对象主要包含代码,则它更接近于先有处理过程再接收数据。然而,另一种方法是利用瘦客户机,这种方法是用户在与服务器连接的图形终端进行工作,这些服务器执行所有处理工作并存储用户的数据。 万维网是由欧洲粒子物理实验室(CERN)研制的基于Internet的信息服务系统。WWW以超文本技术为基础,用面向文件的阅览方式替代通常的菜单的列表方式,提供具有一定格式的文本、图形、声音、动画等。它是一个充满着对象的大规模分布的系统,其中各个Web站点所包含的文档都同时包含有对象和对其他对象的索引。 Nessett谈到了要使大规模分布的对象呈现给缺乏技术的用户为何需要新的接口。一个例子是在用户可浏览的虚拟空间中表示这些对象,就好像在三维世界中漫游一样。 分布式和并行处理 分布式计算技术的一个方面是能够在多台计算机上并行运行若干个程序。以分布式计算技术为基础,基于构件的系统体系结构将逐渐取代模块化的系统体系结构。现在主要有两种分布式计算技术的标准,一个是以OMG组织为核心的CORBA标准,另一个是以微软为代表的基于DCOM的ActiveX标准。近年来,OMG组织在CORBA 标准的制定和推广方面付出了巨大的努力,同时许多CORBA标准的产品也在逐渐成熟和发展;同时由于微软在操作系统方面的绝对统治地位,ActiveX标准在Windows系列平台上显得更加实用,相应的工具也更加成熟。 分布式并行处理技术是最适合于在通过LAN或因特网连接的计算机之间发生的多道处理技术;而专用并行处理则是最适合于在本地通过高速接口挂接的系统上发生的多道处理技术。 多个计算机系统间的分布式并行处理需要有一个权威性的调度程序,用来决定何时何地运行程序的一些部分。任务分布可以实时进行,也可以按比较缓和的任务安排来进行。例如,分布式处理已经在破译加密消息上得以使用。Distributed.net项目就是雇用数千名用户和他们的计算机来破译密码的。用户收到一个小程序,该程序可与Distributed.net的主系统进行通信,该系统向用户分布要解决的部分问题。当用户的计算机空闲时该程序即会运行。然后在完成后将其结果返回给主计算机。最后,主计算机对所有计算机提交的全部结果进行编译。Distributed.net宣称,它的用户网拥有“世界上最快的计算机”。 HTC(高吞吐量计算)环境是由许多工作站组成的大集合环境,通常称之为“网格环境”。Globus项目就是一个HTC项目,它可以帮助科研人员利用工作站和超级计算机池中的空闲周期。
㈢ 网络经常掉线怎么解决
1、根据您提供的信息,如果您是指宽带频繁掉线,影响您上网,建议可通过以下方式进行排障:
【1】如果有使用路由器则先断开路由器单机拨号测试;
【2】如果有modem设备,则需要留意该设备是否过热,可以关闭几分钟后再重启试试;
【3】如果单独运行程序时掉线(比如果玩游戏时掉线),建议重启电脑尝试或者重新安装该程序;
【4】如果是整个网络掉线,请检查接入线与网线是否松动或接触不良,重新拔插线路尝试;
【5】检查过滤电脑病毒引起的断线,全盘扫描;
【6】如果所运行程序有服务器选择,请选择中国联通。
2、如果经以上方式排障后,还是无法解决问题,建议您可联系归属地联通人工客服报障,我司将尽快为您核查处理。
同时您也可关注“中国联通”微信公众号,点击“客户服务>宽带报障>常见故障指引“,查看对应故障的处理方式。
如仍无法解决,可通过以下方式自助报障:
【方式一】关注“中国联通”微信公众号,点击“客户服务>宽带报障>在线报障”;
【方式二】登录中国联通手机营业厅APP,点击“服务>宽带>宽带办理服务>宽带报障”。
㈣ 分布式编程系统有哪些不足
对于学习编程语言来说,分布式编程开发系统是很多人比较熟悉的。但是分布式系统存在的缺陷和问题很多人都不了解,学习编程语言需要对分布式编程系统非常熟悉,分布式系统存在哪些不足呢?下面电脑培训为大家具体介绍分布式编程系统的不足之处。
一、网络不可靠
很多人都知道,分布式系统中的不同节点之间的通信是基于网络的。网络能够很好的使他们结合在一起,但是如果光缆出现问题,也是非常频繁的。此外,由网卡异常、交换机故障、恶意攻击等引起的网络拥塞、网络中断和数据包丢失所造成的网络拥塞、网络中断和消息丢失,所以IT培训发现网络在任何时候都可能无法正常运行,并且是非常不可靠的。
二、不同节点之前的通讯延迟
网络将不同物理位置的节点连接起来。在学习物理和数学之后,你就会了解很多这方面的知识。在两个点之间,我们的分布式系统必须传输关于这个距离的数据,这基本上就是物质的传输。同时,北大青鸟昆明计算机学院认为你也要知道,重要性不会比光移动得更快。
三、宽带的上限问题
关于宽带问题相信很多人都非常熟悉,在使用聊天软件的过程中,下载和传输文件会存在上限问题,这个上限是由网络宽带决定的。但是很多人还是会进入这个陷阱中,因为很多人对传输数据的大小和频率认识不充分,北大青鸟发现这就导致出现上限的问题,这是一个非常久远的事情。
对于这些问题最重要的是对理论的认识,学习编程需要有充分的认识,并且认识到使用的环境,这样对解决分布式编程系统问题有很大的帮助。
㈤ Java分布式系统处理分布式事务有哪些经典解决方
当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题:
1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。
2)我们总是害怕我们的这台服务器停机,造成服务不可用或是数据丢失。
于是我们不得不对我们的服务器进行扩展,加入更多的机器来分担性能上的问题,以及来解决单点故障问题。 通常,我们会通过两种手段来扩展我们的数据服务:
1)数据分区:就是把数据分块放在不同的服务器上(如:uid % 16,一致性哈希等)。
2)数据镜像:让所有的服务器都有相同的数据,提供相当的服务。
对于第一种情况,我们无法解决数据丢失的问题,单台服务器出问题时,会有部分数据丢失。所以,数据服务的高可用性只能通过第二种方法来完成——数据的冗余存储(一般工业界认为比较安全的备份数应该是3份,如:Hadoop和Dynamo)。 但是,加入更多的机器,会让我们的数据服务变得很复杂,尤其是跨服务器的事务处理,也就是跨服务器的数据一致性。这个是一个很难的问题。 让我们用最经典的Use Case:“A帐号向B帐号汇钱”来说明一下,熟悉RDBMS事务的都知道从帐号A到帐号B需要6个操作:
从A帐号中把余额读出来。
对A帐号做减法操作。
把结果写回A帐号中。
从B帐号中把余额读出来。
对B帐号做加法操作。
把结果写回B帐号中。
为了数据的一致性,这6件事,要么都成功做完,要么都不成功,而且这个操作的过程中,对A、B帐号的其它访问必需锁死,所谓锁死就是要排除其它的读写操作,不然会有脏数据的问题,这就是事务。那么,我们在加入了更多的机器后,这个事情会变得复杂起来:
1)在数据分区的方案中:如果A帐号和B帐号的数据不在同一台服务器上怎么办?我们需要一个跨机器的事务处理。也就是说,如果A的扣钱成功了,但B的加钱不成功,我们还要把A的操作给回滚回去。这在跨机器的情况下,就变得比较复杂了。
2)在数据镜像的方案中:A帐号和B帐号间的汇款是可以在一台机器上完成的,但是别忘了我们有多台机器存在A帐号和B帐号的副本。如果对A帐号的汇钱有两个并发操作(要汇给B和C),这两个操作发生在不同的两台服务器上怎么办?也就是说,在数据镜像中,在不同的服务器上对同一个数据的写操作怎么保证其一致性,保证数据不冲突?
同时,我们还要考虑性能的因素,如果不考虑性能的话,事务得到保证并不困难,系统慢一点就行了。除了考虑性能外,我们还要考虑可用性,也就是说,一台机器没了,数据不丢失,服务可由别的机器继续提供。 于是,我们需要重点考虑下面的这么几个情况:
1)容灾:数据不丢、节点的Failover
2)数据的一致性:事务处理
3)性能:吞吐量 、 响应时间
前面说过,要解决数据不丢,只能通过数据冗余的方法,就算是数据分区,每个区也需要进行数据冗余处理。这就是数据副本:当出现某个节点的数据丢失时可以从副本读到,数据副本是分布式系统解决数据丢失异常的唯一手段。所以,在这篇文章中,简单起见,我们只讨论在数据冗余情况下考虑数据的一致性和性能的问题。简单说来:
1)要想让数据有高可用性,就得写多份数据。
2)写多份的问题会导致数据一致性的问题。
3)数据一致性的问题又会引发性能问题
这就是软件开发,按下了葫芦起了瓢。
一致性模型
说起数据一致性来说,简单说有三种类型(当然,如果细分的话,还有很多一致性模型,如:顺序一致性,FIFO一致性,会话一致性,单读一致性,单写一致性,但为了本文的简单易读,我只说下面三种):
1)Weak 弱一致性:当你写入一个新值后,读操作在数据副本上可能读出来,也可能读不出来。比如:某些cache系统,网络游戏其它玩家的数据和你没什么关系,VOIP这样的系统,或是网络搜索引擎(呵呵)。
2)Eventually 最终一致性:当你写入一个新值后,有可能读不出来,但在某个时间窗口之后保证最终能读出来。比如:DNS,电子邮件、Amazon S3,Google搜索引擎这样的系统。
3)Strong 强一致性:新的数据一旦写入,在任意副本任意时刻都能读到新值。比如:文件系统,RDBMS,Azure Table都是强一致性的。
从这三种一致型的模型上来说,我们可以看到,Weak和Eventually一般来说是异步冗余的,而Strong一般来说是同步冗余的,异步的通常意味着更好的性能,但也意味着更复杂的状态控制。同步意味着简单,但也意味着性能下降。 好,让我们由浅入深,一步一步地来看有哪些技术:
Master-Slave
首先是Master-Slave结构,对于这种加构,Slave一般是Master的备份。在这样的系统中,一般是如下设计的:
1)读写请求都由Master负责。
2)写请求写到Master上后,由Master同步到Slave上。
从Master同步到Slave上,你可以使用异步,也可以使用同步,可以使用Master来push,也可以使用Slave来pull。 通常来说是Slave来周期性的pull,所以,是最终一致性。这个设计的问题是,如果Master在pull周期内垮掉了,那么会导致这个时间片内的数据丢失。如果你不想让数据丢掉,Slave只能成为Read-Only的方式等Master恢复。
当然,如果你可以容忍数据丢掉的话,你可以马上让Slave代替Master工作(对于只负责计算的节点来说,没有数据一致性和数据丢失的问题,Master-Slave的方式就可以解决单点问题了) 当然,Master Slave也可以是强一致性的, 比如:当我们写Master的时候,Master负责先写自己,等成功后,再写Slave,两者都成功后返回成功,整个过程是同步的,如果写Slave失败了,那么两种方法,一种是标记Slave不可用报错并继续服务(等Slave恢复后同步Master的数据,可以有多个Slave,这样少一个,还有备份,就像前面说的写三份那样),另一种是回滚自己并返回写失败。(注:一般不先写Slave,因为如果写Master自己失败后,还要回滚Slave,此时如果回滚Slave失败,就得手工订正数据了)你可以看到,如果Master-Slave需要做成强一致性有多复杂。
Master-Master
Master-Master,又叫Multi-master,是指一个系统存在两个或多个Master,每个Master都提供read-write服务。这个模型是Master-Slave的加强版,数据间同步一般是通过Master间的异步完成,所以是最终一致性。 Master-Master的好处是,一台Master挂了,别的Master可以正常做读写服务,他和Master-Slave一样,当数据没有被复制到别的Master上时,数据会丢失。很多数据库都支持Master-Master的Replication的机制。
另外,如果多个Master对同一个数据进行修改的时候,这个模型的恶梦就出现了——对数据间的冲突合并,这并不是一件容易的事情。看看Dynamo的Vector Clock的设计(记录数据的版本号和修改者)就知道这个事并不那么简单,而且Dynamo对数据冲突这个事是交给用户自己搞的。就像我们的SVN源码冲突一样,对于同一行代码的冲突,只能交给开发者自己来处理。(在本文后后面会讨论一下Dynamo的Vector Clock)
Two/Three Phase Commit
这个协议的缩写又叫2PC,中文叫两阶段提交。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。
㈥ IT编程开发分布式系统都存在哪些不足之处
分布式编程开发系统相信大家应该不陌生了吧。而关于分布式的缺陷或者说问题大家是否有去研究呢?今天我们就一起来了解一下,关于分布式系统中存在的几个问题吧。
网络并不是可靠的
你应该明白,分布式系统中不同节点间的通信是基于网络的。网络使得它们连接起来共同协作。
然而,光缆被挖断的事件相信你也看到过不是一两次了。除此之外,网卡异常、交换机故障、遭受恶意攻击等导致的网络拥塞、网络中断、报文丢失的种种迹象皆意味着网络随时可能无法正常运作,是不可靠的。
此时,需要在你的系统设计中,尽可能地考虑到:当前节点所依赖的其他节点由于各种原因无法与之正常通信时,该如何保证其依然能够提供部分或者完整的服务。这个概念在软件域被定义为“鲁棒性”。
不同节点之间的通信是存在延迟的
网络连接的是处于不同物理位置上的节点,学过物理和数学你的应该明白,两点之间是存在“距离”的,而我们的分布式系统需要在这个距离之上进行数据的传递,本质上就是物质的传递。同时应该你也知道,物质的运动速度不会超过光速。所以,不同节点之间的通信是需要经过一段时间的,也就意味着会存在延迟。具体的延迟是由所用的传输介质、节点当前的负载大小所决定的。
带宽是有上限的
这个点,我相信你是知道的,因为当你通过QQ、钉钉之类的工具传输或者下载一个大文件时候,就发现它是存在上限的,这个上限是根据你的网络带宽大小决定的。但是,为什么你还是有可能会掉入这个陷阱里呢?电脑培训http://www.kmbdqn.cn/发现这往往由于你对所传输的数据的大小和频率没有充分的认识,导致了你觉得达到上限是一个很久远的事情,不用考虑它。
分布式并不直接意味着是“敏捷”了
可能你曾经有过这样的想法,当在规模较大的集中式系统中工作的时候,每次和许多人在一个代码库里提交代码,老是遇到冲突、排队等待上游模块先开发等等。这时你会想,如果改造成分布式系统,这些问题都没了,工作效率高多了。
㈦ 谁能告诉我分布式系统的具体应用环境,还有其优缺点
一种计算机硬件的配置方式和相应的功能配置方式。它是一种多处理器的计算机系统,各处理器通过互连网络构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散给相应的处理器,实现不同功能的各个处理器相互协调,共享系统的外设与软件。这样就加快了系统的处理速度,简化了主机的逻辑结构优点:容易访问文件 分布式文件系统使用户可以更容易地访问文件。即使文件可能在物理上分布于多个服务器上,用户也只需转到网络上的一个位置即可访问文件。而且,当您更改目标的物理位置时,不会影响用户访问文件夹。因为文件的位置看起来相同,所以用户仍然以与以前相同的方式访问文件夹。用户不再需要多个驱动器映射即可访问他们的文件。 最后,计划的文件服务器维护、软件升级和其他任务(一般需要服务器脱机)可以在不中断用户访问的情况下完成。这对 Web 服务器特别有用。通过选择网站的根目录作为 DFS 根目录,您可以在分布式文件系统中移动资源,而不会断开任何 HTML 链接。可用性 域 DFS 以两种方法确保用户可以保持对文件的访问:首先,Windows Server 2003 操作系统自动将 DFS 映射发布到 Active Directory。这可确保 DFS 名称空间对于域中所有服务器上的用户是可见的。第二,作为管理员,您可以复制 DFS 根目录和目标。复制指您可在域中的多个服务器上复制 DFS 根目录和目标。这样,即使在保存这些文件的某个物理服务器不可用的情况下,用户仍然可以访问他们的文件。服务器负载平衡 DFS 根目录可以支持物理上分布在网络中的多个目标。如果您知道您的某个文件将被用户频繁访问,这一点将很有用。与所有用户都在单个服务器上以物理方式访问此文件从而增加服务器负载的情况不同,DFS 可确保用户对该文件的访问分布于多个服务器。然而,在用户看来,该文件是驻留在网络的同一位置。 文件和文件夹安全 因为共享的资源 DFS 管理使用标准 NTFS 和文件共享权限,所以您可使用以前的安全组和用户帐户以确保只有授权的用户才能访问敏感数据。缺点: 系统开销大。系统开销主要包括硬件开销、通信开销、数据冗余的潜在开销,以及为保证数据库全局并行性、并行操作的可串行性、安全性和完整性等的开销。 数据安全性和保密性较难处理。每个场地的数据安全不能保证全局的数据是安全的,安全性问题是分布式系统的固有问题。分布式系统是通过网络实现分布控制的,而通信网络本身在保证数据安全方面存在弱点,数据很容易被窃取。
㈧ 如果局域网遇上网络中断的时候,你是怎么处理的
ls说的很正确,不过本着“自己动手丰衣足食”的优良传统,我们应该具备基本的网络故障排除解决能力。
局域网经常出现的问题有:
1.若是自动获取IP,则DHCP服务down掉将导致中断;
2.IP冲突;
3.若是固定IP,则可能是掩码配置不正确,或是忘记配置默认网关;
4.ARP风暴,病毒等,这种情况可以逐台电脑排查“元兇”;
5.硬件方面的故障,比如交换机宕掉,网卡接口问题等,这种情况就得花钱解决了。