分散式系統架構理論與元件

2022-07-27 15:01:31

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 有同樣的效能,

有興趣的朋友,可以看看Raft演演算法的動畫演示

  • 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

TiDB是騰訊在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物件儲存的非結構化資料範例。

6.參考

https://www.yisu.com/zixun/323416.html
https://blog.csdn.net/qq_16933229/article/details/109729522
https://www.jianshu.com/p/794ba6b42dcc
https://www.cnblogs.com/lidabo/p/15822815.html
https://blog.csdn.net/qq_31960623/article/details/116308332
https://www.cnblogs.com/lidabo/p/15822815.html
https://blog.csdn.net/qq_43413788/article/details/119171555
https://blog.csdn.net/yuhaiyang_1/article/details/80862914
https://blog.csdn.net/TJtulong/article/details/106510970
https://blog.51cto.com/u_14637492/5260036