Java开发web架构设计原理与分布式系统浅

引言

今天,随着信息产业的快速发展,企业之间的竞争将更加激烈。随着规模的不断扩大和业务的不断更新,企业迫切需要完整的分布式解决方案来管理复杂的异构环境,实现不同硬件设备,软件系统,网络环境和数据库系统之间的完全集成。

Web分布式系统的一套设计原则

构建和运营可扩展的网站或应用程序意味着什么?在原始级别,这就是用户通过Internet连接到远程资源的方式 - 使系统可扩展的部分是跨多个服务器的资源分配或访问的资源。

像生活中的大多数事情一样,从长远来看,在构建Web服务时花时间提前计划是有帮助的;了解一些注意事项以及大型网站背后的权衡可以在创建小型网站时获得更多。一个明智的决定。以下是影响大型Web系统设计的一些关键原则。

可用性:对于许多公司来说,网站的正常运行时间是一个重要的声誉和功能,就像一些大型在线零售系统一样,即使一分钟的停机时间也可能花费数千或数百万美元,因此时间可用性和灵活的错误设计系统的处理机制既是基本业务,也是技术要求。高度可用的分布式系统需要仔细考虑关键组件的冗余,系统故障后的快速修复以及出现问题时的优雅降级。

性能:网站的性能正在成为大多数网站的重要方面。网站的速度影响正常使用和用户满意度,以及搜索的排名。这也是影响网站收入并保留用户的因素。因此,创建具有快速响应和低延迟的系统至关重要。

可靠性:系统需要可靠,例如对相同数据的请求总是返回相同的数据响应。如果数据更改或更新,相同的数据将返回新数据。用户需要知道某些内容已写入系统或存储在系统中,系统将保持不变,以后可以恢复到适当的位置。

可扩展性:当涉及到任何大型分布式系统时,大小只是考虑的一个方面,同样重要的是增强处理大规模负载性能的工作,这通常被称为系统可扩展性。可伸缩性可以表示系统的许多不同参数:额外流量的处理量,添加存储容量的便利性,甚至交易吞吐量。

可管理性:设计易于操作的系统是另一个重要的考虑因素。系统可管理性等同于操作可扩展性:维护和升级。可管理性:需要考虑的事项是能够在问题发生时进行诊断和理解,易于升级和修改,以及系统的简单性(即具有故障和异常的常规操作?)

成本:成本是一个重要因素。显然,这包括硬件和软件成本,但需要考虑的其他重要方面是部署和维护系统的成本。需要考虑开发人员在构建系统上花费的时间,部署时间,甚至培训时间,并且成本是总成本。

这些原则中的每一个都为设计分布式Web架构提供了基本决策。但是,它们也可以相互排斥,例如,实现某个目标将以牺牲另一个为目的。一个基本的例子:选择通过简单地添加更多服务器来增加地址容量(可扩展性)是以可管理性(您必须运行增加的服务器)和成本(服务器的价格)为代价的。

在设计任何Web应用程序时,重要的是要考虑这些关键原则,即认识到设计可能会牺牲其中的一个或多个。

二垒

在设计系统架构时,需要考虑以下几点:正确的部件是什么,如何使它们组合在一起,以及什么是妥协。在系统架构需要之前投资可扩展性并不总是明智的商业决策;然而,设计的远见可以在未来节省大量的时间和资源。

这部分重点是几乎所有大型Web应用程序中心的一些核心元素:服务,冗余,分区和错误处理。每个因素都包含选择和妥协,尤其是上一节中提到的设计原则。为了详细分析这些,最好从一个例子开始。

分布式存储系统:

1.结构化存储

2.非结构化存储

3.半结构化存储

4.内存存储

除了这四个子方向之外,分布式存储系统还受到一系列理论,算法和技术的支持:Paxos,CAP,ConsistentHash,Timing,2PC,3PC等,我们将在后面提到。现在,我们来看看上面四个子方向正在做什么。

结构化存储系统的历史非常悠久。典型的场景是事务处理系统或关系数据库(RDBMS)。传统的结构化存储始于一台机器,例如MySQL,每个人都很熟悉。有一种说法,MySQL增长的历史就是互联网的历史。这并不夸张。除MySQL之外,PostgreSQL近年来也是一个非常强大的RDBMS。我们发现传统的结构化存储系统强调:(1)结构化数据(如关系表)。 (2)强一致性(例如,银行系统,电子商务系统等)(3)随机访问(索引,添加,删除和修改,SQL语言)。但是,由于这些属性和限制,结构化存储系统的可扩展性通常不是很好,这在一定程度上限制了大数据环境中结构化存储的性能。由于摩尔定律面临瓶颈,传统的独立关系数据库系统面临着巨大的挑战。但是真的没办法吗?在这里,我们首先埋葬了一个预示:)

与非结构化存储系统不同,非结构化存储强调高可伸缩性,典型系统是分布式文件系统。分布式文件系统也是一个古老的研究课题,如20世纪70年代的Xerox Alto,20世纪80年代的NFS,20世纪90年代的AFS,xFS等等。但是,这些早期的分布式文件系统仅用作网络磁盘。最大的问题是他们不支持容错和故障恢复。谷歌的GFS(谷歌文件系统)于2003年推出SOSP是一个里程碑。其开源实现对应于HDFS。 GFS的主要思想包括:

(1)使用master来管理元数据。

(2)文件使用64MB块存储,多个副本保存在不同的服务器上。

(3)自动容错,自动错误恢复。

Google设计了gfs来存储大量日志文件和文本信息(如网页),并对它们进行批处理(例如,mapreduce为文档创建反向索引,计算页面PageRank等)。与结构化存储系统相比,尽管分布式文件系统具有出色的可扩展性和吞吐量,但它几乎不支持随机访问操作,并且通常只能执行文件附加操作。这些限制使得非结构化存储系统难以面对具有低延迟和实时性能的应用。

半结构存储系统的思想是解决非结构化存储系统的随机访问性能差的问题。我们通常会听到流行的术语,如NoSQL,Key-Value Store,甚至是对象存储,例如protobuf,thrift等等。这些都是半结构化存储研究领域,近年来NoSQL的发展势头尤其强劲。 NoSQL系统既具有分布式文件系统的可扩展性,又具有结构化存储系统的随机访问能力(例如随机更新,读取操作)。系统通常选择简单密钥(KV)进行存储,并在设计过程中丢弃。传统RDBMS中的复杂SQL查询和ACID事务。这允许系统的最大可扩展性和灵活性。 NoSQL中比较着名的系统包括:Google的Bigtable,亚马逊的Dynamo,以及开源世界中着名的HBase,Cassandra等。通常这些NoSQL系统基于更成熟的存储引擎,例如基于LevelDB的Bigtable(jeff dean),非常好的C ++源代码教程),底层数据结构使用LSM-Tree。除了LSM-Tree之外,B-Tree(B + Tree)也是一种非常成熟的存储引擎数据结构。

内存存储。随着服务的并发性增长,存储系统对低延迟的要求也在增长。与此同时,由于摩尔定律和内存价格的下降,基于内存的存储系统也变得很受欢迎。顾名思义,内存存储将数据存储在内存中,以便在读写时获得高性能。更着名的系统包括memcahed和Redis。这些基于K-V的密钥系统的主要目的是缓存基于磁盘的存储系统。还有一些系统支持内存计算,例如杰克逊亲王分发的早期研究工作,分布式共享内存(DSM),斯坦福大学的RamCloud以及最近基于时代的快子(Alluxio)项目(Spark Ecology)。系统子项目等。

NewSQL。我们介绍了结构化存储,独立的RDBMS系统在可伸缩性方面面临巨大挑战,但NoSQL不能很好地支持关系模型。是否有一个系统结合了RDBMS的功能(例如:完整的SQL支持,ACID事务支持),并且与NoSQL系统一样强大? 2012年由Google在OSDI上发布的Spanner和2013年在SIGMOD上发布的F1,为业界首次提供了关系模型和NoSQL在大型数据中心上合并的可能性。但是,由于这些系统过于黑暗和技术,因此没有大公司的支持是无法做到的。例如,Spanner使用诸如原子钟之类的黑色技术来解决时钟同步问题并打破光传输速度的限制。在这里你只能表达对谷歌的崇拜。

As we mentioned earlier, distributed storage systems are supported by a series of theories, algorithms, and technologies: Paxos, CAP, ConsistentHash, Timing, 2PC, 3PC, and so on. So how do you master these technologies? In my own experience, mastering these contents must understand the corresponding context. What does that mean? It is necessary to think about why a certain technology is needed in the current environment. If it is not feasible to replace this technology with other technologies, it is not blindly involved in a lot of details. For example: How to master Paxos? Paxos is essentially a three-phase commit, and a higher level is a distributed lock. Understanding paxos must start from the simplest scenario step by step. For example, starting from the simplest master-backup, it can't be found. It is derived from the majority of reading and writing. It is still not found, and then paxos. Then learn about its variants, such as fast paxos. Multi-paxos. For the same reason why Consistent Hash is needed, we can first think about what is wrong with dividing the data with a simple range partition. For example, when learning technologies such as 2pc and 3pc, you can think about their relationship with paxos and whether they can replace paxos.

Sancha Distributed Storage System Classification

Distributed storage systems need to store a variety of data, which can be roughly divided into: unstructured data, such as text files, pictures, video and audio formats; structured data, generally exist in relational databases, can use two-dimensional relationships The table structure indicates that the schema is separate from the content; semi-structured data, such as HTML documents, schema structure and content are put together.

Different distributed storage systems are suitable for storing different data.

1丶 Distributed File System

xxInternet应用程序需要存储大量非结构化数据对象,如图片,照片和视频。这些数据以对象的形式组织,并且对象之间没有关联。这种数据通常称为Blob(二进制大对象)数据。

分布式文件系统适用于存储Blob对象,通常是Google的GFS及其HDFS的开源实现。在系统实现级别,分布式文件系统根据块在内部组织数据。每个块都具有相同的大小。每个块可以包含我的Blob对象或固定长度块。大文件也可以拆分。进入多个数据块。

2丶分布式键值系统

分布式键值系统存储简单的半结构化数据,仅为主键提供CRUD功能,例如Dynamo,Redis和Memcache。从数据结构的角度来看,分布式键值系统类似于传统的哈希表。不同之处在于分布式系统支持将数据分发到群集中的多个存储节点。分布式键值系统是通常用作高速缓存的分布式表系统的简化实现。一致散列是分布式键值系统中常用的数据分发技术。

3丶分布式表系统

分布式表系统用于存储具有复杂关系的半结构化数据。与分布式键值系统相比,分布式表系统不仅支持简单的CRUD操作,还支持扫描某个主键范围。分布式表系统以表为单位组织数据。每个表包括多个行,并且一行由主键标识,并且支持根据主键和范围查找功能的CRUD功能。

分布式表系统利用了关系数据库的许多技术,例如支持某种程度的事务。典型的系统是Bigtable,HBase和DynamoDB。与分布式数据库相比,分布式表系统主要用于单个表的操作,不支持一些特别复杂的操作,如多表关联,多表连接和嵌套子查询。此外,在分布式表系统中,同一表的多个数据行不需要包含相同类型的列,这适用于半结构化数据。分布式表系统是一个很好的权衡。这样的系统可以是非常大规模的并且支持更多功能,但是实现通常是复杂的。

4丶分布式数据库

分布式数据库通常从独立的关系数据库扩展,用于存储结构化数据。分布式数据库使用二维表来组织数据,提供SQL关系查询语言,支持多表关联,嵌套子查询等复杂操作,并提供数据库事务和并发控制。典型的例子是MySQL数据库集群,Amazon RDS和Microsoft SQL Azure。

问题及其优化总结,与大家分享,感觉如果你收获,你可以关注收集和转发浪潮,谢谢你的支持!

最后,每位读到这里的网友都感谢您的耐心等待。我希望在成为更好的Java程序员的道路上,我们可以一起学习,共同进步!可以赢得白福美,走到建筑师生命的巅峰!

高级地址:

想了解学习Java的技术内容和Java技术视频的内容可以添加组:722040762(06必须通过)欢迎大家加入!

e2e1b8ce-50c4-4ab9-bcac-b12582489f80