分布式系统设计理念

下面详细阐述笔者理解的几个分布式系统设计理念:

1. 分布式系统对服务器硬件要求很低

这一点主要现在如下两个方面:

对服务器硬件可靠性不做要求,允许服务器硬件发生故障,硬件的故障由软件来容错。所以分布式系统的高可靠性是由软件来保证。

对服务器的性能不做要求,不要求使用高频CPU、大容量内存、高性能存储等等。因为分布式系统的性能瓶颈在于节点间通讯带来的网络开销,单台服务器硬件性能再好,也要等待网络IO。

一般而言,互联网公司的大型数据中心都是选用大量廉价的PC服务器而不是用几台高性能服务器搭建分布式集群,以此来降低数据中心成本。比如,Google对于数据中心的成本控制做到了极致:所有服务器一律不要机箱;主板完全定制,只要最基本的组件,早期的定制主板连电源开关和USB接口都不要;在主板上加装隔离带把CPU单独隔出来,让冷风只吹CPU,不吹内存、硬盘等不需要降温的组件,最大限度降低冷却电力消耗。

2. 分布式系统强调横向可扩展性

横向可扩展性(Scale Out)是指通过增加服务器数量来提升集群整体性能。纵向可扩展性(Scale Up)是指提升每台服务器性能进而提升集群整体性能。纵向可扩展性的上限非常明显,单台服务器的性能不可能无限提升,而且跟服务器性能相比,网络开销才是分布式系统最大的瓶颈。横向可扩展性的上限空间比较大,集群总能很方便地增加服务器。而且分布式系统会尽可能保证横向扩展带来集群整体性能的(准)线性提升。比如有10台服务器组成的集群,横向扩展为100台同样服务器的集群,那么整体分布式系统性能会提升为接近原来的10倍。

互联网公司的数据中心,一般一个分布式系统横向扩展的上限在万台服务器左右。Google数据中心的基本单元,CELL,由两万台左右服务器组成,每个CELL由一套分布式管理系统,BORG,统一管理,每个数据中心都由多个CELL组成。

3. 分布式系统不允许单点失效(No Single Point Failure)

单点失效是指,某个应用服务只有一份实例运行在某一台服务器上,这台服务器一旦挂掉,那么这个应用服务必然也受影响而挂掉,导致整个服务不可用。例如,某网站后台如果只在某一台服务器上运行一份,那这台服务器一旦宕机,该网站服务必然受影响而不可用。再比如,如果所有数据都存在某一台服务器上,那一旦这台服务器坏了,所有数据都不可访问。

因为分布式系统的服务器都是廉价的PC服务器,硬件不能保证100%可靠,所以分布式系统默认每台服务器随时都可能发生故障挂掉。同时分布式系统必须要提供高可靠服务,不允许出现单点失效,因此分布式系统里运行的每个应用服务都有多个运行实例跑在多个节点上,每个数据点都有多个备份存在不同的节点上。这样一来,多个节点同时发生故障,导致某个应用服务的所有实例都挂掉、或某个数据点的多个备份都不可读的概率大大降低,进而有效防止单点失效。

通常情况,不要让服务器满负荷运行,服务器长时间满负荷运行的话,出故障的概率显著升高。所以分布式系统采用一大堆中低性能的PC服务器,尽可能把负载均摊到所有服务器上,让每台服务器的负载都不高,保证集群整体稳定性。

4. 分布式系统尽可能减少节点间通讯开销

如前所述,分布式系统的整体性能瓶颈在于内部网络开销。目前网络传输的速度还赶不上CPU读取内存或硬盘的速度,所以减少网络通讯开销,让CPU尽可能处理内存的数据或本地硬盘的数据,能显著提高分布式系统的性能。典型的例子就是Hadoop MapReduce,把计算任务分配到要处理的数据所在的节点上运行,从而避免在网络上传输数据。

5. 分布式系统应用服务最好做成无状态的

应用服务的状态是指运行时程序因为处理服务请求而存在内存的数据。分布式应用服务最好是设计成无状态。因为如果应用程序是有状态的,那么一旦服务器宕机就会使得应用服务程序受影响而挂掉,那存在内存的数据也就丢失了,这显然不是高可靠的服务。把应用服务设计成无状态的,让程序把需要保存的数据都保存在专门的存储上,这样应用服务程序可以任意重启而不丢失数据,方便分布式系统在服务器宕机后恢复应用服务。

比如,在设计网站后台的时候,对于用户登陆请求,可以把登陆用户的session相关信息保存在Redis或Memcache等缓存服务中,这样每个网站的后台实例不保存用户登录状态,这样即使重启网站后台程序也不丢失用户的登录状态信息;如果把用户的session相关信息保存在网站后台程序的内存里,那一旦受理用户登录的网站后台程序实例挂掉,必然有用户的登录状态信息会丢失。

总而言之,分布式系统是大数据时代企业级应用的首选平台,它有良好的可扩展性,尤其是横向可扩展性(Scale Out),使得分布式系统非常灵活,能应对千变万化的企业级需求,而且降低了企业客户对服务器硬件的要求,真正能做到应用服务层面的弹性扩展(auto-scaling)。

时间: 2024-10-01 02:56:00

分布式系统设计理念的相关文章

分布式系统的特点以及设计理念

分布式系统并不是什么新鲜词,在上个世纪七八十年代就已经有各种分布式系统出现.只是在互联网时代,分布式系统才大放异彩,尤其是Google更是把分布式系统运用到了极致.Google整个的软件构架都是基于各种各样的分布式系统,诸如Borg.MapReduce.BigTable等.正是这些分布式系统,使得Google可以处理高并发请求响应以及海量数据处理等.Apache旗下的Hadoop.Spark.Mesos等分布式系统,把大数据处理相关技术变得非常亲民,让更多企业客户体会到了分布式系统的便利. 一.

ActiveMQ-为什么需要消息中间件?

消息中间件的优势 UNIX的进程间通信就开始运用消息队列技术,一个进程将数据写入某个特定的队列中,其它进程可以读取队列中的数据,从而实现异步通信.对于如今的分布式系统,消息队列已经演变为独立的消息中间件产品,相比于RPC同步通信的方式来说有几个明显的优势: 低耦合,不管是程序还是模块之间,使用消息中间件进行间接通信. 消息的顺序性,消息队列可以保证消息的先进先出. 消息可靠传输,持久化的存储使得消息只有在被消费之后才会删除. 异步通信能力,相对于RPC来说,异步通信使得生产者和消费者得以充分执行

Kubernetes的系统架构与设计理念

Kubernetes与云原生应用简介 随着Docker技术的发展和广泛流行,云原生应用和容器调度管理系统也成为IT领域大热的词汇.事实上,云原生应用的思想,在Docker技术火爆之前,已经由云计算技术的领导者和分布式系统架构的推广者广泛传播,例如云原生应用的12要素早在2011年就由Heroku的工程师提出了:只不过以虚拟机技术作为云原生应用的基础实施,由于虚拟机镜像大.镜像标准不统一以及打包流程和工具不统一,无法业界广泛接受的云原生应用标准,限制了云原生应用的流行.而Docker的出现正好解决

分布式系统

Distributed systems: for fun and profit (http://book.mixu.net/distsys/index.html) 链接:https://www.zhihu.com/question/23645117/answer/124708083 这篇文章主要试图回答以下两个个问题:1. 近些年分布式系统领域都在做些什么.2. 为什么现在投入分布式系统的学习和研究是值得的.我会尽可能多的去介绍更 "实用" 的分布式系统知识. 什么是实用?例如:Pax

分布式系统的BASE理论

一.BASE理论 eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency). BASE是指基本可用(Basically Available).软状态( Soft State).最终一致性( Eventual Consistency

分布式系统阅读笔记(八)-----分布式对象和组件

一.介绍 在分布式系统中,一个完整的中间件需要展现一定的对于上层程序语言的以及底层的物理设施的抽象性.而分布式对象和分布式组件恰恰是2种重要的实现方式. 1.分布式对象包集成了面向对象的语言的特征和优点.能够使用户用类似面向对象的语言调用的层次上去实现远程的方法调用. 2.分布式对象有下面的一些优点:1.包装性.2.他将一个对象的实现和对象本身分离了.3.具有动态性和扩展性. 3.分布式组件是为了克服分布式对象的一些缺点而发展而来的,他解决了在分布式系统中出现的下面的一些问题:1.不完全的独立性

Spring技术内幕:设计理念和整体架构概述

程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决. 一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断总结,积累了很多经验. 相信大家都使用过Spring,有些人了解它的核心:IOC和AOP,但只是了解它们的基本概念.使用了反射和动态代理,关于如何管理对象.代理的具体实现了解的比较浅. 有些人使用Spring MVC,使用Spring集成数据库.事务.消息队列以简化操作,但对集成的具体设计思路和实现

企业级JAVA大型分布式电商项目实战高并发集群分布式系统架构

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. "高可用性"(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性. 一. 设计理念 空间换时间 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回bo

朱晔的互联网架构实践心得S2E3:品味Kubernetes的设计理念

Kubernetes(k8s)是一款开源的优秀的容器编排调度系统,其本身也是一款分布式应用程序.虽然本系列文章讨论的是互联网架构,但是k8s的一些设计理念非常值得深思和借鉴,本人并非运维专家,本文尝试从自己看到的一些k8s的架构理念结合自己的理解来分析 k8s在稳定性.简单.可扩展性三个方面做的一些架构设计的考量. 稳定性:考虑的是系统本身足够稳定,用户使用系统做的一些动作能够稳定落地,系统本身容错性足够强可以应对网络问题,系统本身有足够的高可用等等. 简单:考虑的是系统本身的设计足够简单,组件