ITDSD - 4. 分布式软件的定量分析





5.00/5 (1投票)
分布式系统设计简介 - 4. 分布式软件的定量分析
引言
这是关于分布式架构的第五篇文章。本文主要介绍如何在分布式系统中计算单个请求的成功率和重复请求的稳定性率,以获得系统的稳定性评估。基于软件架构评估性能和冗余。通过系统分析识别潜在的性能瓶颈。它为分布式系统的设计提供了数据支持。
您可以点击以下链接找到前四篇文章
具有共享数据的网络必须是异步网络
当多个任务尝试同时使用一份数据时。任务通常需要排队轮流使用这份数据。因为同时使用数据会导致数据损坏,所以通常会为每个任务单独修改部分数据,从而导致整体数据损坏。多个任务不能同时在单个数据上运行的情况称为数据原子性。此时,数据是多个任务之间具有一致性功能的协议,因此它在多个任务的运行关系中发挥着不可替代的作用。数据的交替使用通过数据的地址确保任务之间的信息交换。异步模型和同步模型描述了任务在使用数据时的执行状态。例如,一个任务正在使用数据,而另一个任务正在等待。等待的任务称为同步执行。
在分布式环境中,客户端和服务器通过消息触发相关任务的执行。客户端的任务发送请求触发服务器的任务执行。通常,客户端会阻塞任务的执行并等待返回,直到服务器执行请求并返回。客户端的阻塞确保客户端的状态在服务器返回之前不会改变。这允许服务器在返回后继续处理当前客户端。我们称之为客户端同步执行请求的时间。服务器异步执行请求。因为服务在处理此请求后不会阻塞并等待客户端的其他指令。这确保了服务可以依次处理其他客户端请求。通过连接或通过处理请求等待是同步和异步的重要区别。
为了证明由具有共享数据的单线程服务器组成的网络必然是异步的,首先,假设客户端和服务器在创建链接后都使用同步,并且可以与其他客户端共享数据。也就是说,任何一方处理完消息后,都会阻塞并等待另一方发送新消息。这种链接方式称为全同步模式。在全同步模式下,只要客户端保持链接,服务器就不能处理其他客户端请求。假设客户端的链接时间是无限的,则服务器所需的时间是无限的。那么服务器将无法在无限时间内处理其他客户端请求。如图3所示。
服务器在无限时间内一定无法与其他客户端共享数据。这与我们的假设相矛盾。所以我们得到定理1。
定理1. 由共享数据的单线程服务器组成的网络必然是异步网络。
具有共享数据的异步网络的特点是基于延迟时间t的一致性。延迟时间t的一致性是指任何获取信息的一方所获得的信息都是延迟时间t之后的信息。换句话说,任何接收方获得的信息都是发送方时间t之前的信息。消息的发送方不保证信息在此期间会改变。延迟时间t是基于能量守恒的推论。因为服务器硬件遵守容量守恒定律。因此,服务器硬件上任何信息的传输也遵守容量守恒定律。所以我们得到推论1。
推论1,任意两点之间的信息同步都会有延迟时间T。
推论1表明任何点获得的数据在名义上都是较旧的。例如,用户在服务器上查询的游戏分数。当用户看到数据时,服务器可能已经更新为不同的分数。如果为了确保用户在使用过程中看到的数据保持一致。那么锁定服务器就是使链接同步模式。定理1表明同步模式下的网络不能共享数据。推论1也表明信息的传输是定向的。这种传输触发任务的执行,并且产生的信息是定向的。沿着这个方向,分布式网络定量分析的基础就出现了。因为在任务执行的方向上,所涉及的硬件和软件构成了一个分布式系统。
序列化和并发的概率
当客户端向分布式系统发送请求时,分布式系统在一系列服务器上执行请求。将这些服务器标记为1到n,其中n是任意整数。假设每个服务器都有出错的概率。此错误包括硬件停机、软件崩溃等。如果我们记录错误概率为x1,我们可以从概率公式中得知多个服务器串行执行成功的概率是x1*x2*x3... Xn,我们得到公式1。例如,有一个任务请求需要通过网关服务器、web服务器、内存数据库和硬盘数据库返回给客户端。假设这四个服务器的可用性分别是99%、90%、96%和96%,则成功请求的概率是0.99 * 0.9 * 0.96 * 0.96 = 0.82。
虽然单个请求失败的概率很高,但当用户重复请求时,可以通过并发概率公式得知。独立事件重复请求成功的概率是1 - ((1-x1)* (1-x2)* (1-x3)... (1-xn)。我们得到公式2。两次重复请求在任何时候通过的概率计算为1-(1-0.82)*(1-0.82) = 0.97,因此这种重复请求使概率增加了大约15个百分点。可以看出,重复请求的成功率增加了,这抵消了系统串行执行成功率的下降。虽然它与数学中的幂等性概念非常相似。但根据定理1,分布式系统是一个动态系统,所以这两个请求从结果或过程来看是独立的。
当一个系统是由多个连续请求和并发请求组成的复杂系统时。例如,一个由三个s1、s2和s3服务器组成的系统。成功请求的概率分别为90%、95%和99%。运行带有三个r1、r2、r3请求的软件系统。R1调用服务器s1,s3是r1(s1,s3)。另外两个请求是r2(s1,s2,s3)和r3(s2,s3)。那么我们可以得到r1的成功概率(0.9*0.99)=0.89,r2(0.9*0.95*0.99)=0.85,r3(0.95*0.99)=0.94,系统运行概率为1-((1-0.89)*(1-0.85)*(1-0.94)=99.9%。也就是说,系统所有服务停止响应的概率是0.1%。这在图4中显示。
内存数据库和硬盘数据库的特点
虽然连续请求增加了系统响应的概率,但系统的整体稳定性并不取决于成功响应的概率。因为如果数据库无法使用,就会导致数据丢失。数据丢失会使系统完全失去服务能力。假设一个系统中只有内存数据库而没有硬盘数据库。内存数据库正常运行的概率是96%。一旦内存数据库运行失败并丢失数据,系统将完全失去运行能力。所以系统整体稳定性的上限是96%。内存数据库就像木桶里最短的木板。它决定了系统整体稳定性的低点。
因为硬盘数据库可以确保服务重启后一定时间内数据不丢失。所以硬盘数据库成为系统稳定性的上限。只要硬盘没有损坏到无法使用并丢失数据,即使系统重启,也不会导致系统无法使用。数据备份厂商backblaze提供的一份硬盘故障率报告[1]指出。最常用硬盘的故障率为2.22%。通过使用RAID0,双硬盘备份的数据丢失率为0.05%。并且可以通过更多的备份进一步降低数据丢失的概率。那么使用硬盘数据库后,系统的稳定性将大大提高。
虽然内存数据库的稳定性远低于硬盘数据库。但内存数据库的运行速度比硬盘数据库快得多。随机读取可以达到千倍的差距,而顺序读写也有10倍的差距。稳定性从高到低的顺序是硬盘数据库、内存数据库和服务容器。从响应速度来看,从快到慢分别是服务容器、内存数据库和硬盘数据库。响应速度是指对用户请求的响应。如果服务容器不使用内存数据库和硬盘数据库,则处理速度最快。因为处理请求的响应速度更快,支持的并发量最高。当然,这里的稳定性是相对的,即使是最差的服务器容器。开发中的服务容器被人为频繁更新。任何更新行为都可能导致潜在的停机。妥善管理的服务容器可以确保95%以上的平稳运行。考虑任何硬件有1%到5%的损坏可能性。软件稳定性率非常接近硬件稳定性率。所以主内存数据库作为临时数据备份功能。在服务容器更换期间保存数据使用情况。
模糊性
当分布式系统中有多个数据时,例如内存数据库和硬盘数据库同时存储用户账户信息,这称为数据模糊性。从推论1可知,这种模糊性存在延迟时间t的一致性。分布式系统中的模糊性可能导致不可调和的数据错误。假设有一个系统,它在服务器容器中接收用户数据并返回,然后依次将数据传播到内存数据库和硬盘数据库。如图5所示。
假设在传播过程中写入硬盘数据库失败,并且操作已成功返回给用户。当用户离线退出时,内存数据库被删除。用户再次上线时会发现数据丢失。这是用户返回和实际存储之间的模糊性。
另一种可能是硬盘数据库写入成功,内存数据库失败。用户查询数据总是错误的,这导致用户重复操作,进一步放大了错误的影响。
在从服务容器传输到内存数据库和硬盘数据库的过程中。由于延迟时间t的存在,在此期间发生错误,导致某些设备写入成功,而某些设备写入失败时发生歧义。因为异步系统在写入过程中可能会伴随其他异步操作。这使得删除错误操作变得极其困难。分布式系统中的这种歧义错误是由于我们试图改变延迟时间t一致性的传播方向而引起的。原始的传输方向是从服务容器到内存数据库再到硬盘数据库。我们试图使用内存或硬盘数据库中的数据来恢复服务器容器错误。延迟时间t和分布的可用性概率必然会导致数据错误的风险。高性能伴随着更高的风险,而高稳定性伴随着更低的风险。只有风险不能完全消除。
通过分布式系统,可以进一步降低系统的风险。例如,多个系统被拆分,不同的请求被单独处理。
此时,我们有了一种新的方式来处理系统的风险。公式2表明,分布式系统可以大大降低整个系统无法使用的概率。那么,当我们有更高的系统风险时,如果我们需要更高的性能。如果它是分布式的,整个系统的风险将大大降低。也就是说,受系统影响的用户数量减少到1/n,其中n是分布式用户的数量。例如,一个网站被设计成一个服务容器、一个内存数据库和一个硬盘数据库结构。有一天,大量意外用户涌入促销活动,导致高峰半小时内硬盘IO写入阻塞。该网站采用部分性能设计,忽略了硬盘数据库写入失败。在半小时内,除用户无法登录外,所有已登录用户的操作均未受影响。如果堵塞时间超过1小时,内存数据库数据将被清除,这将导致用户在此期间的操作丢失。受堵塞影响的部分是10部分分布式系统中的两部分。因此,所有用户中有十分之二的用户可能丢失。
在计算机系统中,也存在一个基于延迟时间t一致性的传播过程。CPU中的缓存到内存再到硬盘是一个传播过程。这个过程中也存在数据不一致的概率,只是由于时间很短所以概率很低。
导致模糊性的另一个常见情况是为主服务器创建的备份服务器。当主服务器的数据没有及时更新到备份服务器时,主服务器的停机导致数据丢失。此时,备份服务器的启动将导致旧数据覆盖新数据。这种情况的发生与两个因素有关。发起同步的次数和同步的时间。假设在同步过程中必然会发生服务器停机。同步越多,同步时间越长,影响越大。互联网上的同步次数可以近似地用每单位时间的访客数代替。同步中断的影响可以用公式3表示。
每单位时间在线人数 / (同步时间/单位时间)
例如,当前在线人数为3000人,同步时间为1毫秒。受中断影响的人数为3000 / (1/1000) = 30。当发生中断时,受影响的人数为30。公式3表明,在线人数越少,同步时间越短,受错误数据影响的人数越少。
当服务器容易停机时,我们会尝试使用多个备份来消除停机的影响。这违反了常识,因为服务器之间的备份时间远长于磁盘备份时间。因为它需要通过网络和各种软件来实现。这导致我们拥有的备份越多,所需时间就越长。公式3表明,消耗的时间越多,受错误影响的人越多。这反而导致由于备份数量的增加而大大增加了模糊性错误。所以建议尽可能使用硬件解决方案进行备份,可以大大减少同步时间造成的损害。
AP-Tree结构的传播
数据从发生变化的地方传输到其他硬件的过程称为AP方法或AP关系。因为将数据只放在一个硬件中会导致其他硬件在使用此硬件时被阻塞。这种传播导致读取数据不是最新的或绝对一致的,而是基于延迟时间t的一致性。因此,AP关系下传播的数据不能用于具有原子关系的操作。也就是说,AP网络中的数据不能写回AP网络。因为延迟时间t的存在会用旧数据覆盖新数据。如图8所示。
服务器的备份可能导致旧数据覆盖新数据的情况。当主服务器离线而备用服务器在线时,备用服务器中的旧数据与新请求叠加,这可能导致数据混乱。例如,商品主服务器记录库存0件,而备用服务器记录1件。当备用服务器在线时,会导致用户购买不存在的商品。
AP关系使我们能够在几乎任何情况下都不会被阻塞地访问。并且可以通过树形传播进行扩展。这种扩展带来了几乎无限的流量和硬件支持。这是分布式领域中一个非常重要的设计方法。它用于内容分发、DNS、ZooKeeper等重要的分布式工具。其分发形式也多种多样,如gossip、路由协议等。我们也可以使用阻塞方法来确保数据不受延迟时间t的影响。或者使用比特币等竞争算法来消除延迟时间t的影响。
在ZooKeeper(一个树状发散网络)中,有两种不同的操作:读和写。公式2可以直接用于计算读取成功的概率。写入的概率分为不同的阶段。写入原始源的概率是源可用的概率。当源扩散到下一层时,通过对当前层中的所有节点使用公式2来获得再次成功扩散的概率。也就是说,如果任何节点的扩散成功,扩散行为将继续。可以看出,一旦写入行为开始在AP关系中传播,成功扩散的节点越多,成功完成所有扩散的概率就越高。并且读取的成功率出奇地高。如图9所示。
协议和数据
定理1表明分布式网络是围绕异步网络中的共享数据构建的。当外部请求到达网络时,它会找到相应的数据集并触发任务操作数据集。当一个数据集在分布式网络中有多个备份时,需要选择一个数据集进行写入,然后扩散到其他数据备份。这个选择写入的数据集在分布式网络中必须是唯一的。否则,会产生数据模糊性。一旦选择了数据集,对数据集的多个操作就被固定了。这个选定的点成为处理指定数据集的硬件和软件交点。这个点成为指定数据集操作的协议。请注意,这不限于数据。当分布式系统中存在多个数据备份时,这个选定的协议必须是唯一的。也就是说,分布式系统是围绕数据协议构建的。这个协议的实体是存储数据的硬件。不成为协议的数据被称为备份数据或只读数据。在备份或只读数据上写入是无效的。
当分布式集群中的一台计算机根据计算生成结果数据集时,这些数据已经存在。我们可能不会在将其存储在内存数据库或硬盘数据库中之前返回给客户端报告执行成功。但是是否返回报告不影响数据的稳定性。因为硬盘也有数据丢失的情况,但这种可能性相对较低。数据从一开始就生成,然后扩散到其他硬件。源是任务和数据连接的点。这个协议不仅是任务之间的协议,也是任务和数据之间的协议。例如,它可能被命名为“用户信息”用于数据和注册任务。
既然称之为协议,它就是有方向的。也就是说,任务被处理直到发布以写入数据。写入的数据然后通过分布式系统中的AP关系扩散。
读写数据是两个操作,但对于任务来说,它们是执行的输入和执行的输出。所以写入数据是判断任务之间原子关系的重要依据。在异步网络中,任何任务都将在任何时间执行,所以任意两个任务共同写入的数据构成写入冲突。也就是说,这两个任务构成原子关系。
异步网络中的原子关系是一个有趣的概念。例如,我妻子和我喜欢吃牛排,所以我们都可以随时做牛排。所以煎锅的使用应该排队。否则,可能会发生我拿着煎锅却没有牛肉,而我妻子拿着牛肉却没有煎锅,导致谁也做不了牛排的尴尬。所以每次想做牛排的时候,都要查看日历看看煎锅是否空闲。事实是我已经一年没做牛排了,只有我妻子在用煎锅。这个例子揭示了潜在冲突与发生频率有关。当频率较低时,冲突的概率较低。假设这个煎锅是我们社区唯一的煎锅。社区的任何居民只能用这个煎锅做牛排。那么我认为这更符合异步网络中原子关系的定义。我与所有邻居就煎锅拥有原子关系。
分布式系统设计中的性能分析
在一个只有一个服务容器和一个硬盘数据库的小型系统中,一个请求的完成,从服务容器到数据库,必须经过 (a) 服务软件,(b) 服务容器,(c) 网络链接,(d) 数据库软件,(e) 硬盘。成功请求的概率是 (a)*(b)*(c)*(d)*(e) = F。如果数据直接存储在硬盘上,请求将经过 (a) 服务软件,(b) 服务容器,(e) 硬盘,成功请求的概率是 (a)*(b)*(e) = G。因为 0 < (c)*(d) < 1,F < G,所以服务容器和硬盘数据库的小型系统请求成功率低于单个服务容器。因为系统可以无限次重试以提高请求的成功率。所以系统的整体稳定性取决于硬盘的稳定性。F和G都使用硬盘,所以整体稳定性相同。当多个服务容器一起使用中央数据库时。如图11所示。
我用社区共享煎锅作为例子。假设其中一个服务容器正在使用煎锅,另一个请求煎锅的服务容器将等待。那么并行系统退化为串行系统。系统将服从阿姆达尔定律。也就是说,系统并行化的部分性能得到了提高,而序列化的部分阻塞在数据库中。如果序列化导致数据库处理性能下降,从而影响数据分发功能和并行处理能力,那么将导致系统整体处理能力下降。假设每个服务容器由于序列化而受到相同的X影响,N个链接所花费的时间是x*x*x... x^n,也就是说,数据库的序列化可能导致整体处理能力呈指数下降。出现的问题越多,对性能的要求就越高,问题就越严重。序列化部分尚未得到很好的解决。例如,锁定表1请求表2和锁定表2请求表1两个任务可以形成死锁。如图12所示。
在互联网软件系统中,80%的数据是不活跃的。这些数据存储在硬盘上,无需计算。而20%的数据是目前需要计算的数据。硬盘数据库的位置是为了管理80%的数据并提供多维大数据分析功能。当数据因用户使用而激活时,需要传输到服务容器进行处理。假设硬盘阵列有288T容量,系统需要56T内存才能运行。一台服务器无法提供如此多的运行内存,所以系统需要分布式服务器。
数据集集中和剥离的方式有助于分发并行部分。它有助于优化分布式系统的性能,例如降低硬盘数据库的计算能力。但它对序列化部分没有帮助。它的本质是软件的AP,即数据的可用性和协议。如图11所示,数据可用性的提高仅限于分布式性能的提高。升级到一定水平将受限于序列化部分。因为系统的串行部分高度集中在数据库中。即使是两个不交互的序列化也必须在数据库中完成。因为数据库无法知道软件系统如何使用数据和建立原子关系。对于数据库来说,任何表之间都可能存在序列化。由于为无限可能性做准备,即任何表都可以序列化。数据库只能将所有表放在一起。这种集中导致无法分解数据库承担的功能。因为序列化部分必须放在单个线程中以确保处理的原子性。这由阿姆达尔定律证实。软件的并行部分可以尽可能多地利用计算能力来支持访问压力。也就是说,并行部分的性能与提供的硬件数量呈线性关系。串行部分只能在单独的服务容器中运行。所以串行部分不能因为硬件的增加而提高性能。所以串行部分的性能将是系统中的一个固定值。例如,前面例子中的中央数据库,因为整个系统的串行部分都在数据库中执行。那么串行部分的计算需求与它的服务容器的计算能力之比就是整个分布式系统的性能比。例如,当前中央数据库的CPU利用率为50%,因为所有串行操作都在中央数据库中,所以整个分布式系统的计算能力已经使用了50%。
假设我们有两个中央数据库来处理序列化部分。其中一个的CPU使用率为100%,另一个为50%。那么我们的总使用率是75%吗?显然不是,因为100%的服务器存在大量潜在的计算需求,无法处理接近崩溃。如果小于100%可以近似认为需求得到满足,如果任何服务器已经大于100%,则超出正常使用范围。
可见,在分布式系统中,系统的性能是由串行部分决定的,即具有原子关系的部分。也就是说,RP方法中存在读写数据或只写数据的任务。串行部分不是完整且不可分割的。它可以根据写入的不同数据进行划分。考虑两个在同一组硬件上运行的阿姆达尔系统。
如果将两个串行部分放在同一个硬件中,整体性能会很低,如果将它们放在两个不同的硬件中,整体性能会提高。一个复杂的软件系统可能有多个阿姆达尔系统。找到这些阿姆达尔系统并将它们放入单独的硬件中可以大大提高分布式系统的处理上限。RP方法就是找到这些隐藏的阿姆达尔系统。从根本上提高分布式系统处理能力的上限。
当我们找到所有软件系统中隐藏的阿姆达尔系统时,通过将阿姆达尔系统的数量乘以所使用的硬件,我们可以得到分布式系统的承载能力上限。例如,我们有两个阿姆达尔系统用于支付和购买,每个系统处理单个用户请求大约需要0.001秒。然后将这两个阿姆达尔系统放入两台服务器。每秒并发支付和购买的上限是2,000。
结论
软件系统由并行部分和串行部分组成。串行部分由若干串行部分组成。根据阿姆达尔定理,并行部分的性能与硬件数量成正比。串行部分与硬件性能成正比。因为串行部分通常只占软件系统的20%,所以分布式系统通常只解决80%的并行部分。加起来占软件系统80%的部分不会导致高强度的并发访问。所以只有大约4%的分布式系统涉及高强度访问。而且只有极少数顶级公司关注这4%的串行问题。所以串行问题可能带来的各种问题经常被忽视。甚至这些串行问题被简单地视为系统bug。这并不是说普通公司和系统不需要分布式系统。因为问题只是一种较低的概率。一旦出现问题,将对公司的技术团队造成致命打击。技术人员应该关注任何可能的系统缺陷。
在下一章中,我将使用网上购物商场的网站来演示如何创建一个分布式系统。如何平衡分片、缓存和硬盘?