CSE_lecture4:Distributed System

Scalability in Practice: a Highly scalable web app

互联网应用需要支撑的三个能力:

  • 处理海量的请求
  • 存储海量的数据
  • 透明化的可拓展性(transparent scale)

因此我们需要构建一个scalable的系统

case study: an e-commerce web application

一次点击可能需要上千的服务器处理

远古时代使用单个服务器架构:应用层、文件系统、数据库集成在一起,但这也导致了一些问题

问题一:存储容量无法满足要求

step 1 for scalability: disaggregating application & data

使用大公司提供的数据库和文件系统来存储海量数据,当需要存储更多数据时购买额外的服务即可

但是每次访问数据都既要访问磁盘,又要网络请求,因此会非常慢

step 2 avoid the slow data accesses? caching

使用缓存来加速访问数据,这是考虑到大部分访问都是在访问那少部分数据

但问题在于内存很小,只能放下很少的数据,因此使用多台server来存放cache

memcached是一种distributed cache server,它使用key-value来标记,从而找到数据存放在个caching server;同时使用路由(routing)来实现key和ip的映射

使用hash来根据key计算address,公式为 $address = Hash(key);%;#server$,使用consistent hashing来保证增加新的server时miss不会太多

问题二:应用层使用CPU处理,但单个CPU的拓展能力有限,这是由于moore’s law和dennard scaling导致了无法通过提升硬件来解决问题

step 3 for scalability: more app servers

这对于stateless(即没有上下文)的请求效果良好,而对于stateful的请求效果较差(这是因为其他app server没有context),当然也可以使用一些手段来将stateful转换为stateless(比如将context存储在用户端)

为了让多个app server的请求流量比较平均,使用load balance,如round-robin, random, hashing等等,好的balance能够考虑到不同请求的时间长短和各个server的不同处理能力

step 4 for scalability: distributed databases

远古时代使用一个数据库只读,一个数据库只写的方法,但这样无法保证正确性

因此现在使用将数据均匀地分配在不同的机器上,上层使用算法来保证多台机器和单台机器等价,即complex consistency management

step 5 for scalability: distributed file system

经过前五步架构,当一个请求来了之后,先进行load balance来防止排队,从而抵达应用层;数据和文件分布在多台机器上,从而按需拓展;缓存层来加速数据访问。因此一次访问需要经过多台服务器

不同的任务需要不同的scale方法

step 6 for scalability: using CDN

网络服务商上使用CDN来缓存一些数据,在应用层之前就获取到数据,这样离用户更近

step 7 for scalability: separate different applications

使用容器来打包应用,使用k8s来管理多个容器

复杂的请求需要复杂的计算,因此需要使用distributed computing,根据不同的计算场景使用不同的计算框架

因此每一个应用层后面接一个计算框架,从而提供针对性的服务

现在我们构成了一个并行与分布式系统,这是在现代数据中心的支持下实现的,这些数据中心都是有备份的

challenge: fault handling

三种出错方式:

  • fault: 可以是潜在的或激活的,可以是软件层面的,也可以是硬件层面的,这是很常见的
  • error: 是激活fault的结果
  • failure: 发生在错误没有被检测和屏蔽时

总结一下:Fault(缺陷) -> 激活 -> Error(错误) -> 未被检测/屏蔽 -> Failure(失效)

分布式系统的规模实在太大,导致fault频发,然而,即使有少部分遇到failure,对外依然能够正确运行,而partial failure难以侦测

以unreliable network为例,请求未响应的原因很多:

  • 远程服务器挂了
  • 请求包丢失了
  • 请求在队列里排队,导致不能及时响应
  • 垃圾回收的耗时导致远程服务器暂停响应
  • 响应丢失
  • 响应延迟

另一个常见的fault为network partition,即组内能通信,但组与组之间不能,这可能是因为机器或者交换机宕机,也可能是因为物理损坏

而分布式系统需要处理fault来提供always-on的状态

可用性是建立在以极快的速度处理fault的基础上,即提升可靠性

为了达到高可用性,可以使用replications,即冗余,这样只要保证其中之一响应就好,但这样带来了consistency问题;或者使用retry,对于stateless的情况不会有一致性问题,而有些请求会有一致性问题

CAP: Consistency, availability, partition tolerance

无法在网络分区的情况下同时保证一致性和高可用性,需要牺牲其中之一

总而言之,分布式系统需要trade-off以下特性:scalability, performance, fault tolarance, consistency, ease of programming


CSE_lecture4:Distributed System
http://example.com/2025/09/28/CSE-lecture4-Distributed-System/
作者
jietiDdd
发布于
2025年9月28日
许可协议