分布式是一个非常复杂且广泛的概念,几乎没有办法系统的学习,因为每一种办法都难以在所有的场景下通用,所以我打算从问题的角度来记录一些关于分布式的知识原理。并且我想要以我们之前设计的一个分布式键值存储系统为例,来说明一些分布式的东西。
FirstDB 项目地址:https://github.com/zmr961006/FirstDB
答:Middleware is computer software that connects software components and applications. The software consists of a set of enabling services that allow multiple processes running on one or more machines to interact across a network. This technology evolved to provide for interoperability in support of the move to coherent distributed architectures, which are used most often to support and simplify complex, distributed applications. It includes web servers, transaction monitors, and messaging-and-queueing software. 中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。 中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。在众多关于中间件的定义中,比较普遍被接受的是IDC表述的:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。 一般情况下,为了使种类各异的计算机和网络系统都呈现为单个的系统,分布式系统常常通过“软件层”组织起来,该“软件层”在逻辑上位于由用户和应用程序组成的高层与操作系统组成的底层之间,这样的“分布式式系统”有时也称之为“中间件”。
答:分布式系统的一大目标就是隐藏系统资源。这也正是分布式系统的透明性定义。透明一般具有以下的一些属性。 访问透明性:当访问一个分布式系统的时候,不同客户端例如JAVA /C++/C/python 等都可以和我们的数据存储系统来进行业务交互,我们将不同形式的请求,转化成统一的形式,隐藏了客户端的不一致性。 位置透明性:我们采用的是一致性哈希系统,用户并不能判定资源到底在我们的系统中的具体位置。 迁移透明性:当系统发生问题时数据的迁移对于用户来说是透明的。FDB这里“一致性哈希系统”采用的是一种异构恢复的技术,在数据迁移上是一种比较优秀的方式,并且这是可重定位的,每一个数据在迁移后完全不影响用户数据的使用。 复制透明性:隐藏同一个资源的多个副本的情形。实现资源共享。FDB是“键-值”存储的情形,其实暂时并不存在一个文件名多个值映射,或者多个副本的情况。 并发透明性:必须确保对共享资源的并发访问不会破坏资源的一致状态。一致性可以通过锁机制来保证,我们可以设计更加静止的事务处理机制来进行设计。ACID原则。FDB在这方面还没有相应的良好设计。 故障透明性:用户不会注意到某个资源无法正常工作,以及系统随后从故障中恢复的过程,屏蔽这种故障往往是很难的,首先一个最大的问题是,资源响应极慢和资源损毁有时很难界定。 持久性:对资源位于易失存储器中还是位于磁盘上的隐藏,FDB这里采用的是“内存+磁盘数据库”的方式保存数据。
答:首先,我们考虑第一种情况,当一个系统横跨大洋或大洲的时候,其间距离遥远,即使以光速计算,其实几十MS的延时是无法避免的,实际上这个延时还要更加的大,尤其是这种系统有故障时为了隐藏故障,假设一端会不停的请求,这样直接就白白消耗大量的时间,隐藏不了的。 其次,我们考虑这样一种情况,我们必须保证各大节点的某个资源在多个副本的时候都保持一致,例如一个文件被更改后,其它的副本都需要被修改,这样的更新将会花费大量的时间,这种更新对于用户来说都是几乎不能隐藏的。 在FDB中我们考虑的系统大多都是分布于机房内,或者最多跨机房,在延时上主要处理的应该是客户端和系统之间的延时。对于文件来说,缓存数据库大多存储的非常多的小文件,小记录,我们并不需要考虑这些。
答:分布式系统有一个重要的目标,就是开放性。一个开放的分布式系统根据一系列的准则来提供服务,这些准则描述了锁提供服务的语法和语义。一般分布式系统中是通过接口定义语言来实现描述的,在FDB中还没有定义统一的接口描述。例如PUT ,GET,UP,DOWN。
答:可扩展性一直也是分布式系统的一个重要指标,我们可以从三个方面描述下: 首先,规模上可扩展,其次,地域可扩展,最后,管理可扩展。 可扩展性的一般方法:集中式服务,集中式数据,集中式算法。 集中式服务:用来服务所有用户的机器。 集中式数据:维护一个全局共享的文件系统。 集中式算法:根据完整的信息来安排路由。 在FDB中我们使用的是集中式算法,就是“一致性哈希算法”但是这种算赋也由问题,在大型分布式系统中,所有的信息必须在多线路之间传送,对于数据传送来说,可以收集所有的状态来根据图论的算法来分配资源,但是获取所有的状态本身就是一种问题。如果是这样我们就需要使用分散式算法而不该使用集中式算法。 非集中式算法现在还没有明确的研究,基本都是根据不同的节点来使集体的所有决策更加正确。 但是它一般具有以下的一些特性: @没有任何计算机拥有关于系统状态的完整信息。 @计算机只根据本地信息做出决策。 @某台计算机故障不会使整个算法崩溃。 @没有这样的存在:存在全局性时钟。 在FDB中我们可以考虑实现一个非集中式算法完成一个选举系统或者一个集群决策系统。
异步通信技术,缓存技术,缓存技术其实包含应当是多级缓存技术,这样才能尽可能的加快速度。 FDB系统是允许多节点之间通信的,但是并没有添加缓存技术,因为缓存对于一个大型数据库系统来说只有“热点"数据有优势,我们首先需要做“热点数据分离”。 值的注意的一点是:事务型业务逻辑更加适合RPC,MPC这些远程过程/对象调用。