分布式系统架构理论与组件

文章目录

  • 1.分布式系统的发展
  • 2.分布式系统的挑战
  • 3.分布式系统基本理论
    • 3.1 CAP定理
    • 3.2 PACELC理论
    • 3.3 BASE模型
    • 3.4 一致性算法
  • 4.分布式架构组件
    • 4.1 主要组件
    • 4.2 辅助工具
    • 4.3 常用架构
  • 5.常用数据库
    • 5.1 数据库的发展
    • 5.2 OLTP和OLAP
    • 5.3 常用NoSQL数据库
    • 5.4 常用关系型数据库

1.分布式系统的发展

在计算机发展的早期,一直都是集中式计算,计算能力依赖大型计算机。随着互联网的发展,繁重的业务需要巨大的计算能力才能完成,而集中式计算无法满足要求,大型计算机的价格也非常昂贵。分布式计算将任务分解成更小的部分,分配给多台计算机处理,这样可以节约整体计算时间,大大提高计算效率。

互联网大型网站往往面临高并发访问、海量数据处理等问题,必须保证系统高可用、易伸缩等等。分布式架构采用多台机器协同工作,动态伸缩容量,使用冗余节点来消除单点故障,提高系统可用性。

2.分布式系统的挑战

软件开发没有银弹,任何系统结构都有利有弊,分布式系统的挑战有三点:

1)网络资源受限:节点间采用网络通信,而网络存在带宽限制和延时,任何一个节点都无法做到瞬间响应和高吞吐量。
2)节点管理成本:分布式系统节点可能膨胀到成千上万个,运维节点的成本非常高。
3)缺乏全局时钟:网络上计算机时钟同步的准确性受到极大的限制,没有一致的全局时间。计算机在空间随意分布,很难定义不同机器上事件先后发生顺序。

3.分布式系统基本理论

3.1 CAP定理

分布式系统的三个特性Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),最多只能同时满足其中两个,三者不可兼得。

Consistency (一致性):数据更新后,所有节点在同一时间的数据完全一致。客户端并发访问时,返回的数据是一致的。服务端尽快将数据复制到整个系统,以保证数据最终一致。
Availability (可用性):系统能够一直为用户服务,不出现操作失败或者超时等情况。在单位时间内的可用性常用N个9来衡量,比如99.999%的可用性。
Partition Tolerance (分区容错性):分布式系统内部由许多节点构成,外界看上去是一个整体。节点或网络分区遇到故障的时候,仍然能够对外提供满足一致性或可用性的服务。系统中少量机器宕掉,剩下的机器还能够正常运转,用户没有任何感知。
大型互联网应用的集群节点非常多,发生节点或者网络故障是常态。系统必须要满足分区容错性,最终只能在C和A之间取舍。

传统行业项目有所不同,以金融系统为例,涉及到金钱的操作,必须要满足数据一致性。出现网络故障宁可停止服务,也要保证C,最终只能在A和P之间取舍。

3.2 PACELC理论

CAP理论并不能很好的指导现实的系统架构。比如Availability (可用性),如果接口长时间才返回结果,固然可用,但是业务上不能接受。大部分情况下,系统分区都是平稳运行的,系统设计要权衡延迟与数据一致性的问题。为了保证数据一致性,读写的延迟必然升高。

在分区错误的情况下,在C和A中取舍,缩写为 PAC。分区正确的情况下,取 Latency(延迟)与 Consistency(一致性),缩写为LC。PACELC 中的 E 代表 Else,连起来就是PACELC。

很多存储软件实现了 PACELC 的策略,用户根据不同业务场景使用不同的配置。以MySQL主从复制为例,提供了三种模式:

异步模式:主库执行完客户端提交的事务,立即将结果返给客户端,不关心从库是否已经接收并处理。由于数据同步的延时,客户端在从库上可能读不到最新数据。这种模式对MySQL是性能最佳的,但是用户需要权衡,业务能否忍受这种延时。
全同步复制:主库执行完客户端提交的事务,所有的从库都执行了该事务才返回结果。这样保证强一致性,但是响应时间变长了。
半同步复制:主库在执行完客户端提交的事务后,等待至少一个从库接收到并写到 relay log 中,才返回给客户端。这样做延迟小了很多,相比于异步复制,数据更加不容易丢失。

3.3 BASE模型

BASE模型全称是Basically Available(基本可用)、Soft-state(软状态/柔性事务)、Eventually Consistent(最终一致性)。绝大部分分布式系统,实现分区容忍性是基本要求,因此要平衡一致性和可用性。BASE强调牺牲高一致性,获得可用性。允许数据在一段时间内不一致,只要保证最终一致就可以了。

3.4 一致性算法

分布式系统中的数据一致性问题,是系统设计中最关键、最有难度的领域,业界提出了很多成熟的一致性共识算法。

  • Paxios算法
    1998年,莱斯利·兰伯特(Leslie Lamport)在《The Part-Time Parliament》论文中首次公开Paxos协议。他使用希腊的小岛Paxos作为比喻,描述了Paxos小岛中通过决议的流程。2001年,Lamport重新发表了朴实的算法描述版本《Paxos Made Simple》。

  • Raft算法
    由于Paxos算法太难以理解和实现,斯坦福大学的 Diego Ongaro 和 John Ousterhout 提出了更容易理解的 Raft 算法。相比传统的 Paxos 算法,Raft 将大量的计算问题分解成简单的相对独立的子问题,并且和 Multi-Paxos 有同样的性能,

  • ZAB协议
    ZAB协议全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。分布式协调服务ZooKeeper设计了支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副本之间的数据一致性。从设计上看,ZAB 协议和 Raft 很相似。

4.分布式架构组件

4.1 主要组件

  • 服务注册与发现:
    Spring Cloud Eureka、Apache Nacos、Apache Zookeeper、ETCD
  • 服务调用:
    Spring Cloud Feign、Apache Dubbo、Motan、gRPC
  • 微服务网关:
    Spring Cloud Zuul、Spring Cloud Gateway、Apache ShenYu、Kong
  • 微服务熔断降级:
    Spring Cloud Hytrix、Alibaba Sentinel
  • 负载均衡器:
    Spring Cloud Ribbon、Spring Cloud LoadBalancer
  • 分布式监控:
    Spring Boot Admin、美团 CAT、Zabbix、Prometheus + Grafana + Alertmanager、Open-Falcon
  • 配置管理:
    Spring Cloud Config、Alibaba Nacos、百度Disconf、携程Apollo
  • 消息队列:
    RocketMQ、Kafka、RabbitMQ
  • 任务调度:
    Apache Dolphinscheduler、Apache ElasticJob、XXL-JOB
  • 分布式事务:
    Alibaba Seata
  • 调用链跟踪:
    Spring Cloud Sleuth + ZipKin、Apache Skywalking
  • 日志采集:
    Flume + Kafka + HDFS、Elasticsearch + Logstash + kafka + Kiabana
  • 分库分表:
    Apache ShardingSphere、MyCat 、美团DBProxy
  • 分布式锁:
    Redisson + Redis
  • 权限控制:
    Spring Security、Shiro + JWT
  • 文件系统:
    Fastdfs、Minio、HDFS
  • 反向代理:
    Nginx

4.2 辅助工具

Java应用诊断:Alibaba Arthas

4.3 常用架构

在这里插入图片描述

5.常用数据库

5.1 数据库的发展

数据库是一个悠久历史的行业,从诞生到现在也有接近五十年的历史了。数据库一直在技术、业务以及应用场景等方面不停地演进和发展。上世纪九十年代,针对个人办公、个人娱乐以及企业信息化的场景,基于X86服务器诞生了像MySQL、MS SQL Server这些著名的关系型数据库。

NoSQL数据库是由于互联网业务的诞生而产生的。2006年,谷歌引入了BigTable,后续出现了HBase、Cassandra、MongoDB和Redis,这些数据库都是由不同的底层数据组织形式去解决不同的问题。在2010年前后,谷歌又引入了以Spanner为代表的新产品,出现了F1、SequoiaDB、TiDB等NewSQL数据库,使用SQL解决应用性问题,也保留了NoSQL的可扩展性问题。

NoSQL数据库是为了解决传统关系型数据库的弊端,它有四个特点:

易扩展:NoSQL数据共同的特点是去掉关系数据库的关系型特性,数据之间无关系,这样就非常容易扩展,在架构的层面上带来了可扩展的能力。
高性能:NoSQL数据库都具有非常高的读写性能,尤其在大数据量下同样表现优秀。由于数据之间的无关系性,数据库的结构简单。
高可用:NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。
数据模型灵活:NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。

5.2 OLTP和OLAP

从业务场景来看,数据处理可以分为OLTP和OLAP。这两种场景采用何种数据库,取决于开发人员的技术水平和经验。通常来说,OLTP采用强一致性的关系型数据库,OLAP采用NoSQL或者列式数据库。

  • OLTP(on-line transaction processing)
    OLTP为联机事务处理,主要用来记录业务事件的发生。当行为产生后,系统记录事件是谁在什么时候什么地方做了什么事,在数据库中进行数据的增删改查,要求高实时性、强稳定性、数据一致性。

  • OLAP(On-Line Analytical Processing)
    OLAP为联机分析处理,侧重大数据量查询。当业务发展到一定程度,要利用离线数据做分析,为决策提供支持。

5.3 常用NoSQL数据库

  • MongoDB
    MongoDB是一个面向文档的数据库,以JSON格式存储数据。它主要用于网站的数据存储、内容管理与缓存应用。MongoDB支持全文检索,查询方式非常丰富,在数据处理与聚合等方面具有很强的灵活性,同时具备极高的扩展性和可用性。

  • Cassandra
    Cassandra是一套开源分布式数据库系统。最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。由于Cassandra良好的可扩展性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。

  • CouchDB
    CouchDB是一个面向文档的数据库,以JSON格式存储数据。CouchDB可以用于存储网站的数据与内容,以及提供缓存等。支持通过JavaScript在CouchDB上运行MapReduce查询。CouchDB还提供了一个非常方便的基于Web的管理控制台。

  • Redis
    Redis是一个内存中的键值数据库。Redis具备存储和操作高级数据类型的能力。这些数据类型是大多数开发人员熟悉的基本数据结构(列表、映射、集合)。Redis的读写数据的效率极高,远远超过常规数据库,常常用于大型项目的缓存层。

  • HBase
    HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。

  • Elasticsearch
    Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

  • ClickHouse
    ClickHouse 是俄罗斯的Yandex(类似百度)开源的列式存储数据库,主要用于在线分析处理查询,能够使用SQL查询实时生成分析数据报告。使用场景与Elasticsearch类似,甚至有更高的性能。

5.4 常用关系型数据库

  • Oracle
    Oracle是全球最大的信息管理软件及服务供应商,总部位于美国加州Redwoodshore。Oracle数据库产品为财富排行榜上的前1000家公司采用,是最知名、使用最广泛的企业数据库。

  • DB2
    DB2是IBM公司开发的关系数据库管理系统,主要用于大型应用系统,具有较好的可伸缩性 。DB2是IBM推出的第二个关系型数据库,所以称为DB2。它提供了高层次的数据利用性、完整性、安全性、并行性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令运行环境。可以同时在不同操作系统使用,包括Linux、UNIX 和 Windows。

  • Microsoft SQL Sever
    Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。

  • MySQL
    MySQL是使用最广泛的开源关系型数据库,由瑞典MySQL AB公司开发,现在已被 Oracle收购。MySQL与常用的主流数据库Oracle、SQL Server相比,特点就是免费,并且在任何平台上都能使用,占用的资源较小,受个人用户以及中小企业青睐。对于大型项目来说,MySQL的承载能力和安全性就略逊于Oracle数据库。

  • MariaDB
    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB名称来自创始人Michael Widenius的女儿Maria的名字。

  • PostgreSQL
    PostgreSQL 是一个强大的开源对象关系数据库系统,它使用并扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可以追溯到 1986 年作为加州大学伯克利分校POSTGRES项目的一部分。PostgreSQL的架构、可靠性、数据完整性、功能集、可扩展性得到充分的验证,开源社区也非常活跃。它是最接近工业标准SQL92的查询语言,至少实现了SQL:2011标准中要求的179项主要功能中的160项(注:目前没有哪个数据库管理系统能完全实现SQL:2011标准中的所有主要功能)。

  • TiDB
    TiDB是PingCAP公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing,HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和MySQL生态等重要特性,为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB适合高可用、强一致要求较高、数据规模较大等各种应用场景。

  • TBase
    TBase是腾讯在Postgres-XC基础上开发的数据库。Postgres-XC(eXtensible Cluster)是一个提供写可扩展、同步、对称的和透明的PostgreSQL群集解决方案的开源项目。相较于Postgres-XC,TBase的稳定性得到了较大提高,通过在内核中引入GROUP概念,提出了双Key分布策略,有效地解决了数据倾斜的问题。它根据数据的时间戳,将数据分为冷数据和热数据,分别存储于不同的存储设备中,有效地解决了存储成本的问题。

  • OceanBase
    OceanBase是由蚂蚁集团自主研发的企业级分布式关系数据库,始创于2010年。OceanBase在TPC-C和TPC-H测试上都刷新了世界纪录的国产原生分布式数据库。OceanBase具有数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系数据库、低成本等特点。

  • SequoiaDB
    SequoiaDB巨杉数据库是一款金融级分布式关系型数据库,主要面对高并发联机交易型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,以满足上层不同应用程序各自的需求。SequoiaDB 巨杉数据库支持 MySQL、MariaDB、PostgreSQL 和 SparkSQL四种关系型数据库实例、JSON文档类数据库实例、以及 S3对象存储的非结构化数据实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/152543.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何修改Hosts文件(Windows、Linux)本机配置域名解析

Hosts文件是一种在计算机网络中存储主机名与IP地址对应关系的文本文件。通过配置Hosts文件,可以避免在网络环境中DNS无法正常解析时,出现无法访问互联网的问题。 Windows修改hosts文件 1 以windows10系统为例,手指同时按住 windows 键和 X 键…

php-cli

//运行index.php ./php index.php//启动php内置服务器 ./php -S 0.0.0.0:8080//启动内置服务在后台运行,日志输出到本目录下的server.log nohup ./php -S 0.0.0.0:8080 -t . > server.log 2>&1 &# 查找 PHP 进程 ps aux | grep "php -S 0.0.0.0:…

【Python基础篇】运算符

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 格言: 大鹏一日同风起,扶摇直上九万里。 文章目录 一 Python中的运算符二 算术运算符1 Python所有算术运算符的说明2 Python算术运算符的所有操作…

EDMA的组成及其作用简介

EDMA是什么? 答:EDMA(Enhanced Direct Memory Access)是一种增强型的直接内存访问技术,用于高效地实现数据传输和处理。它是在传统的DMA(Direct Memory Access)基础上进行改进和扩展的。DMA是一…

windows的远程桌面服务RDS存在弱加密证书的漏洞处理

背景 漏洞扫描检测windows服务器的远程桌面服务使用了弱加密的ssl证书 思路 按照报告描述,试图使用强加密的新证书更换默认证书 解决 生成证书 通过openssl1.1.1生成(linux自带openssl,windows安装的是openssl1.1.1w)&#x…

外贸开发信主题怎么写?营销邮件标题推荐?

外贸开发信主题编写方法?如何用QQ邮件群发外贸邮件? 在外贸领域,写一封引人注目的开发信至关重要。外贸开发信主题应当吸引受众,引起兴趣,激发他们与您进一步合作的愿望。为了达到这个目标,蜂邮将探讨一些…

基于STM32设计的酒驾监控系统_优化升级版

与之前的酒驾检测的项目,优化了onenet网络上传代码,保证网络差的环境下也可以正常上传数据。 一、设计需求 1.1 设计需求总结 酒后驾车已经成为威胁人类生命安全的严重问题。为了严格控制酒后驾车,本文设计了一款针对道路行驶的酒后驾车监测系统。该系统采用STM32作为主控…

拖拽式万能DIY小程序源码系统 5分钟创建一个小程序,操作简单 带完整的部署搭建教程

随着移动互联网的发展,越来越多的企业开始使用可视化拖拽式小程序系统来开发和管理自己的应用程序。可视化拖拽式小程序系统为企业提供了一种更快捷、更简便的方式来开发和管理应用程序,这种方式能够大大提高企业的工作效率,使企业更加高效地…

Everything——检索神兵

相信在日常生活工作中,大家肯定会有这样的困惑:由于一时疏忽,自己下载或编写的文件保存的路径丢失,想再次在茫茫内存中找到会很麻烦。今天学长将带来一款软件——Everything,其拥有强大的搜索功能,可以帮助…

AIGC|实践探索Langflow集成AzureOpenAI

目录 一、背景 二、AzureOpenAI介绍 三、langflow集成支持AzureOpenAI langflow集成AzureOpenAI联通改造流程: 四、效果演示 一、背景 langflow是一个LangChain UI,它提供了一种交互界面来使用LangChain,通过简单的拖拽即可搭建自己的实…

时区、时间戳、时间点三者的关系

时区、时间戳、时间点这三个概念与Java的Date类和Calendar类紧密联系。分别说说区别。然后说一下Java的Date类和Calendar类 1. 时间戳 时间戳指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式&…

如何调整图片尺寸:简单实用的教程分享

报名事业编考试的时候,会发现上传照片时会提示图片大小尺寸应该为多少,如果不符合规定就无法提交报名,那么怎么才能修改图片大小呢?最简单的方法就是利用调整照片大小工具来对图片尺寸修改,本文分享一个在线图片处理工…

BLIP:统一视觉语言理解与生成的预训练模型

Li J, Li D, Xiong C, et al. Blip: Bootstrapping language-image pre-training for unified vision-language understanding and generation[C]//International Conference on Machine Learning. PMLR, 2022: 12888-12900. BLIP 是 Salesforce 在 2022 年的工作,文…

分布式锁~

分布式锁 分布式锁是在分布式系统中用于协调多个节点之间对共享资源的访问的一种机制。个人认为实现分布式锁,需要一个中间件例如数据库,redis等等这样的存储锁即可实现分布式锁。 分布式锁实现方案 基于数据库(唯一索引) 基于内存(redis,…

CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用

查看原文>>>最新CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术应用 气候变化对农业、生态系统、社会经济以及人类的生存与发展具有深远影响,是当前全球关注的核心议题之一。IPCC(Intergovernmental Panel on Climate Change&#…

太激动了!摄像头终于有画面了!

有了放弃的想法 摄像头APP在我这里好好的,到了老外那里就不能 用。反复试了几套源码,都没有画面。后来干脆把老外说通用的APK反编译后,新做了个APP,结果还是没画面。到了这个时候,我是真的有点沮丧,准备放弃…

七、Nacos和Eureka的区别

一、nacos注册中心 二、临时实例与非临时实例 三、区别 Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式临时实例心跳不正常会被剔除,非临时实例则不会被剔除Nacos支持服务列表变更的消息推送模式,服务…

软件外包开发文档需要注意的问题

编写软件开发文档时需要注意以下一些关键问题,以确保文档的质量、有效性和可维护性,通过关注这些问题,您可以确保软件开发文档更容易被理解、使用和维护,从而提高项目的成功几率。北京木奇移动技术有限公司,专业的软件…

3.5-构建自己的Docker镜像

首先介绍两个命令: 1.docker container commit,可以简写为:docker commit。这个命令是把一个修改后的container重新变成一个image。 2.docker image build,可以简写为:docker build 首先,演示一下docker c…

接口中的大事务,该如何进行优化?

作为后端开发的程序员,我们常常会的一些相对比较复杂的逻辑,比如我们需要给前端写一个调用的接口,这个接口需要进行相对比较复杂的业务逻辑操作,比如会进行,查询、远程接口或本地接口调用、更新、插入、计算等一些逻辑…