我们来聊聊分布式

会有一股神秘感。 提交于 2019-12-17 09:23:45

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

      大型主机时代已经井喷,集中式时代已经无法满足日益健壮复杂的业务和需求,互联网时代的到来,使得由集中式到分布式的革命犹然而生,网络化,微型化发展步伐迫切,分布式的需求越来越能适应需求,一线电商平台迈入分布式时代。

    分布式官方定义为:所谓分布式系统顾名思义就是利用多台计算机协同解决单台计算机所不能解决的计算、存储等。

问题一、 

将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得
分布式系统中的每台机器负责原问题的一个子集。

 

1.特点:

分布性:分布式多台计算机在空间上可随意分布,机器的分布情况可以随时调整

对等性:分布式系统的计算机没有主从之分,没有控制整个系统的主机,也没有被控制的从机,组成分布式系统的所有计算机节点都是对等的,每个节点都是用副本的形式来数据冗余的方式保证数据的持久化。

并发性:同一个分布式系统的的多个节点会操作一份共享的资源和数据的分布式存储,如何高效准确的协调控制分布式并发成为了一个难题。

缺乏全局时钟:典型的分布式系统由多台计算机在空间上随意分布的多个进程组成,进程之间通过消息来进行相互通信,很难保证一个次顺问题,比如分布式中的全局唯一ID如何生成等等问题。

2.环境:

通信异常:分布式可以说是多个节点之间依靠不稳定的网络进行通信,网络有可能会出现故障。

网络分区:由于网络异常,导致分布式节点通讯延时或者宕机,只有一部分节点还可以正常运行。

三态: 成功,失败,超时。

节点故障:分布式服务器节点有可能宕机,僵死等等情况。

 

3.异常处理的原则:
在设计、推导、验证分布式系统的协议、流程时,最重要的工作之一就是思考在执行流程的每
个步骤时一旦发生各种异常的情况下系统的处理方式及造成的影响。


例 1.2:某分布式协议实现一个 echo 功能,即由节点 A 向节点 B 发送一个消息,内容是一个整
数,节点 B 收到后返回相同的消息。节点 A 发送的消息每次递增加 1。
节点 A 的处理流程为:
1. 向节点 B 发送一个消息,消息内容为当前需要发送的整数;


2. 等待接收从节点 B 发回的响应消息;


3. 若 B 发回的消息等于当前需要发送的整数,


a) 将当前需要发送的整数加 1;


b) 否则返回 1;


上述简单的流程可能遇到各种异常且不能正确处理:

第一、当前需要发送的整数没有持久化,在上述流程中,一旦节点 A 宕机,节点 A 无法继续上述流程。

第二、节点 B 一旦宕机,节点 A 不会收到响应消息,流程将卡在第二步无法进行下去。

第三、若 A 发给 B 或 B 发回 A 的消息有一个丢失,节点 A 也不会收到响应消息。

在本节中,不讨论如何修改这个流程以处理上述异常,举这个例子是为了说明异常分析的基本方法。

 

被大量工程实践所检验过的异常处理黄金原则是:

任何在设计阶段考虑到的异常情况一定会在系统实际运行中发生,但在系统实际运行遇到的异常却很有可能在设计时未能考虑,所以,除非需指标允许,在系统设计时不能放过任何异常情况。

 

4.数据分布式:

哈希方式:

     哈希方式是最常见的数据分布方式,其方法是按照数据的某一特征计算哈希值,并将哈希值与
机器中的机器建立映射关系,从而将不同哈希值的数据分布到不同的机器上。所谓数据特征可以是
key-value 系统中的 key,也可以是其他与应用业务逻辑相关的值。例如,一种常见的哈希方式是按
数据属于的用户id计算哈希值,集群中的服务器按0到机器数减1编号,哈希值除以服务器的个数,
结果的余数作为处理该数据的服务器编号。工程中,往往需要考虑服务器的副本冗余,将每数台服务器组成一组,用哈希值除以总的组数,其余数为服务器组的编号。   

按数据范围分布:

按数据范围分布是另一个常见的数据分布式,将数据按特征值的值域范围划分为不同的区间,
使得集群中每台(组)服务器处理不同区间的数据。


例1 :已知某系统中用户 id 的值域范围是[1,100),集群有 3 台服务器,使用按数据范围划分
数据的数据分布方式。将用户 id 的值域分为三个区间[1, 33),,[33, 90),[90, 100)分别由 3 台服务器
负责处理。

值得注意的是,每个数据区间的数据大小和区间大小是没有关系的。例如,上例中按用户 id 划
分的三个区间,虽然从用户 id 的值域看来,不是等大小的,但三个区间中的数据量却有可能是差不
多的。这是因为可能有的用户 id 的数据量大,有些用户 id 数据量小。也有可能某些区间中实际存
在的用户 id 多,有些区间中实际存在的用户 id 少。工程中,为了数据迁移等负载均衡操作的方便,
往往利用动态划分区间的技术,使得每个区间中服务的数据量尽量的一样多。当某个区间的数据量
较大时,通过将区间“分裂”的方式拆分为两个区间,使得每个数据区间中的数据量都尽量维持在
一个较为固定的阈值之下。
与哈希分布数据的方式只需要记录哈希函数及分桶个数(机器数)不同,按数据范围分布数据
需要记录所有的数据分布情况。一般的,往往需要使用专门的服务器在内存中维护数据分布信息,
称这种数据的分布信息为一种元信息。甚至对于大规模的集群,由于元信息的规模非常庞大,单台
计算机无法独立维护,需要使用多台机器作为元信息服务器。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!