分散式系統學習路線?

有python,java,C++基礎,剛要入門分散式系統的學習,希望大牛能夠提供一些入門和之後進階的學習建議,可以說一說書籍,學習路線,實踐項目,經典論文等等,謝謝~


謝邀,分散式系統的學習涵蓋面非常廣泛,在此推薦幾個相關的不同類型的開源項目給題主,希望對您的學習有所幫助,也供大家一起交流學習。

1. 項目名稱:分散式爬蟲系統

項目簡介:項目目標 在力所能及的情況下,最大限度的提高 Web 爬蟲開發人員的生產力,爬蟲框架里的一股清流。主要功能基於 WebMagic 開發的完整的分散式爬蟲框架,該框架特點如下:

  • 完全分散式:由管理端(Admin)、調度端(Master)和多個 Worker 組成,各個組件通過 Http 協議通信。
  • 完全配置化:通過 Admin 端的頁面配置規則就可以爬取任何網站的數據,當然不同網站的難度不一樣,會有不同的組件分別針對處理登錄、驗證碼、封 IP 等問題。
  • 可擴展的任務隊列:任務隊列由 Redis 實現,根據任務的狀態有四種不同的任務隊列:初始、執行中、成功、失敗。您也可以擴展不同的任務調度演算法,默認是公平調度。
  • 可定義持久化方式:爬取結果中,屬性數據默認持久化到 MonogoDB,圖片會被下載到文件伺服器,當然您可以擴展更多的存儲類型。
  • 穩定和容錯:任何一個爬蟲任務都會重試和記錄,只有任務真正成功了才會被移到成功隊列,失敗會有失敗的原因描述。

項目地址:https://gitee.com/shentong_012/YayCrawler

2. 項目名稱:輕量級分散式 RPC 框架

項目簡介:RPC,即 Remote Procedure Call(遠程過程調用),說得通俗一點就是:調用遠程計算機上的服務,就像調用本地服務一樣。

RPC 可基於 HTTP 或 TCP 協議,Web Service 就是基於 HTTP 協議的 RPC,它具有良好的跨平台性,但其性能卻不如基於 TCP 協議的 RPC。會兩方面會直接影響 RPC 的性能,一是傳輸方式,二是序列化。

本項目通過 Spring + Netty + Protostuff + ZooKeeper 實現了一個輕量級 RPC 框架,使用 Spring 提供依賴注入與參數配置,使用 Netty 實現 NIO 方式的數據傳輸,使用 Protostuff 實現對象序列化,使用 ZooKeeper 實現服務註冊與發現。使用該框架,可將服務部署到分散式環境中的任意節點上,客戶端通過遠程介面來調用服務端的具體實現,讓服務端與客戶端的開發完全分離,為實現大規模分散式應用提供了基礎支持。

項目地址:https://gitee.com/huangyong/rpc

3. 項目名稱:分散式高效ID生產

項目簡介:高效 GUID 產生演算法(sequence),基於 Snowflake 實現64位自增 ID 演算法。Twitter-Snowflake 演算法產生的背景相當簡單,為了滿足 Twitter 每秒上萬條消息的請求,每條消息都必須分配一條唯一的 id,這些 id 還需要一些大致的順序(方便客戶端排序),並且在分散式系統中不同機器產生的 id 必須不同。

性能測試數據:

項目地址:https://gitee.com/yu120/sequence

4、項目名稱:分散式消息推送服務

項目簡介:分散式消息推送服務,可以用於客服、推送、聊天等諸多系統的核心組件服務!其技術架構圖如下所示:

項目地址:https://gitee.com/openWolf/gopush

5. 項目名稱:分散式緩存管理平台 XXL-CACHE

項目簡介:XXL-CACHE 是一個分散式緩存管理平台,其核心設計目標是「讓分散式緩存的接入和管理的更加的簡潔和高效」。現已開放源代碼,開箱即用。

XXL-CACHE 核心思想:將分散式緩存抽象成公共 RPC 服務,對外提供公共 API 進行緩存操作; 提供緩存公共的管理和監控平台:方便的查詢、管理和監控線上緩存數據.其特性如下:

  • 多種緩存支持:支持 Redis、Memcached 兩種緩存在線的查詢和管理;
  • 分散式緩存管理:支持分散式環境下,集群緩存服務的查詢和管理,自動命中緩存服務節點;
  • 方便:支持通過 Web 界管理緩存模板,查詢和管理緩存數據;
  • 透明:集群節點變動時,緩存命中的分片邏輯保持線上一致,自動命中緩存數據;
  • 查看序列化緩存數據:通常緩存中保存的是序列化的 Java 數據,因此當需要查看緩存鍵值數據非常麻煩,本系統支持方便的查看緩存數據內容,反序列化數據;
  • 查看緩存數據長度:直觀顯示緩存數據的長度;
  • 查看緩存 JSON 格式內容:支持將緩存數據轉換成 JSON 格式,直觀查看緩存數據內容;

項目地址:https://gitee.com/xuxueli0323/xxl-cache

碼雲 http://Gitee.com

發現更多優質開源項目:最新推薦 - 碼雲 - 開源中國

團隊流暢、高效開發:碼雲企業版 - 碼雲 - 開源中國


有關分散式系統學習阿里雲大學今天剛剛上線一款課程,期望對關注這裡的同學有所幫助:

【阿里雲大學課程】分散式技術第一彈:分散式調度系統

本章知識針對分步式系統中的調度技術進行闡述,比較Hadoop MR,Yarn等系統見的區別,並指出阿里雲伏羲系統在任務調度和資源調度時的處理方法。

點擊免費學:分散式系統開發--調度技術 - 阿里雲大學

講師簡介:

陶陽宇,阿里巴巴高級專家,主要從事大型分散式系統和高並發系統的開發,在系統架構設計,性能優化等方面有豐富積累,參與研發了阿里雲」飛天」分散式平台,支持5000節點大規模集群,主持研發了在線服務框架FuxiService、實時計算系統FuxiOnlinejob等多個線上產品,2015年帶領團隊在世界排序大賽SortBenchmark』2015中奪得冠軍,打破兩項世界紀錄。曾在國際會議VLDB、CSDN等雜誌發表過多篇技術文章,作為教師講授清華大學大數據課程。

課程目錄:

課時1:分散式調度系統現狀
課時2:任務調度
課時3:資源調度
課時4:容錯機制和規模挑戰
課時5:安全與性能隔離
課時6:未來發展方向

更多技術優質課程,請點擊關註:阿里雲大學 - 知乎專欄 以及 阿里雲大學開發者課堂


分散式系統是一個比較大的領域,可以先看看一些課程,比如 15-440/640, Fall 2016: Distributed Systems CMU 15-721

然後看自己對哪個方面感興趣,再深入學習。


如果想快速上手的話,找機會實踐做這麼一兩個項目,然後就明白一二了。

如果是想系統的學習的話,各種資料我就不多說了,我這裡就班門弄斧說下一些學習思想吧。

首先需要明白非分散式場景下系統是如何實現的,如果非分散式系統cover不住,就需要明白問題在哪裡,你需要用分散式解決的問題是啥?

拿搜索為例,索引數據太大,就需要上分散式,於是數據就需要水平或垂直拆分,這時候你就需要想好系統該怎麼設計:

  • 如何選擇合適的分片(Shard),副本(Replica)的數量
  • 如何做路由,即怎麼在所有Shard里找到一份完整的數據(找到對應的機器列表)
  • 如何做負載均衡
  • 如果提高服務的可擴展性
  • 如何提高服務的服務能力(QPS),當索引和搜索並發量增大時,如何平滑解決
  • 如何更新索引,全量和增量索引的更新解決方法
  • 如果提高服務的穩定性,單台服務掛掉怎麼不影響整體服務等等

等等,同時根據系統架構的不同,如Master-Slave模型,就需要明白leader選舉的作用,如何做leader選舉,有哪些解決方法?同理,為了保持數據一致性,就需要取捨一致性解決方法,如是選擇最終一致性還是選擇強一致性。

同時分散式雖然能解決很多問題,但是系統運維成本也變高了,是不是該編寫一些tools來改善這種情況?

第二就是方向的細分,存儲、計算還有調度系統它們的設計肯定是不完全相同的,這個時候就需要多了解下行業內其他系統是怎麼做的,基本上常用的解決方案就那麼幾種,剩下的都是根據自身的業務特點做不同的優化罷了。

比如,我做搜索的,我就簡單研究了下其他一些系統是怎麼做的,看別人怎麼做的,也可以給自身系統設計多些靈感,這裡發個鏈接以便參考:

說說常見搜索引擎的分散式解決方法


可以從這幾個角度去學習

  • 負載均衡
  • 分散式緩存
  • 分散式文件系統/CDN
  • 分散式RPC
  • 分散式資料庫/Nosql
  • 分散式消息中間件
  • 分散式session問題

具體的可以百度查查,裡面很多的。


整理的Hadoop的學習資料,一個月的成果,希望對你有所幫助吧。【Hadoop學習路線】Hadoop集群環境搭-檸檬學院社區


推薦MIT的 6.824 Distributed System

6.824 Home Page: Spring 2017

如果能夠把lab全部做出來感覺就入門了


https://pdos.csail.mit.edu/6.824/schedule.html mit的分散式課程,目標是實現一個分散式的kv存儲。


以下是我自己對於這個問題的理解。

關於分散式系統的知識,可以從大學教科書上找到很多,比如許多人都知道的Andrew S. Tanenbaum等人在2002年出版的《分散式系統原理與范型》(Distributed Systems: Principles and Paradigms)這本書。其實,分散式系統的理論出現於上個世紀70年代,「Symposium

on Principles of Distributed Computing(PODC)」和「InternationalSymposium on Distributed Computing (DISC)」這兩個分散式領域的學術會議分別創立於1982年和1985年。然而,分散式系統的廣泛大規模應用卻是最近幾年的事情,其中的一個原因就是大數據的出現,另外一個原因,其實也是一個可悲的事實,那就是分散式環境下的編程十分困難。與單機環境下的編程相比,分散式環境下的編程有兩個明顯的不同:首先,分散式環境下會出現一部分計算機工作正常,另一部分計算機工作不正常的情況,程序需要在這種情況下儘可能地正常工作,這個挑戰非常大。其次,單機環境下的函數調用常常可以在微秒級內返回,所以除了少數訪問外部設備(例如磁碟、網卡等)的函數採用非同步方式調用外,大部分函數採用同步調用的方式,編譯器和操作系統在調用前後自動保存與恢復程序的上下文;在分散式環境下,計算機之間的函數調用(遠程調用,即RPC)的返回時間通常是毫秒或亞毫秒(0.1~1.0毫秒)級,差不多是單機環境的100倍,使用同步方式遠遠不能發揮現代CPU處理器的性能,所以分散式環境下的RPC通常採用非同步調用方式,程序需要自己保存和恢復調用前後的上下文,並需要處理更多的異常。

實際上,最近這些年是互聯網公司在推動著(大規模)分散式核心技術的演變。隨著社交網路、移動互聯網、電子商務等技術的不斷發展,互聯網的使用者貢獻了越來越多的內容。為了處理這些內容,每個互聯網公司在後端都有一套成熟的分散式系統用於數據的存儲、計算以及價值提取。Google是全球最大的互聯網公司,也是在分散式技術上相對成熟的公司,其公布的Google分散式文件系統GFS、分散式計算系統MapReduce、分散式表格系統Bigtable都成為業界競相模仿的對象,此外,Google的全球資料庫Spanner更是能夠支持分布在世界各地上百個數據中心的上百萬台伺服器。Google的核心技術正是後端這些處理海量數據的分散式系統。和Google類似,國外的亞馬遜、微軟以及國內互聯網三巨頭阿里巴巴、百度和騰訊的核心技術也是其後端的海量數據處理系統。

大數據存儲技術的演變最初源於互聯網公司的大規模分散式存儲系統。與傳統的高端伺服器、高端存儲器和高端處理器不同的是,互聯網公司的分散式存儲系統由數量眾多的、低成本和高性價比的普通PC伺服器通過網路連接而成。互聯網的業務發展很快,而且注重成本,這就使得存儲系統不能依靠傳統的縱向擴展的方式,即先買小型機,不夠時再買中型機,甚至大型機。互聯網後端的分散式系統要求支持橫向擴展,即通過增加普通PC伺服器來提高系統的整體處理能力。普通PC伺服器性價比高,故障率也高,需要在軟體層面實現自動容錯,保證數據的一致性。另外,隨著伺服器的不斷加入,需要能夠在軟體層面實現自動負載均衡,使得系統的處理能力得到線性擴展。

分散式存儲和當今同樣備受關注的雲存儲和大數據又是什麼關係呢?分散式存儲是基礎,雲存儲和大數據是構建在分散式存儲之上的應用。移動終端的計算能力和存儲空間有限,而且有在多個設備之間共享資源的強烈的需求,這就使得網盤、相冊等雲存儲應用很快流行起來。然而,萬變不離其宗,雲存儲的核心還是後端的大規模分散式存儲系統。大數據則更近一步,不僅需要存儲海量數據,還需要通過合適的計算框架或者工具對這些數據進行分析,抽取其中有價值的部分。如果沒有分散式存儲,便談不上對大數據進行分析。仔細分析還會發現,分散式存儲技術是互聯網後端架構的「九陽神功」。

雖然分散式系統研究了很多年,但是大規模分散式存儲系統是在近幾年才流行起來,而且起源於以Google為首的企業界而非學術界。絕大部分分散式系統的原理和各大互聯網公司的系統范型相關的論文都是比較複雜的,無論是理解還是實踐起來具有一定的門檻。

如果是從初學者的角度看,可以考慮如下的知識點結構:

1. 基礎概念與原理。包含兩個部分:單機存儲系統以及分散式系統。其中,單機存儲系統的理論基礎是資料庫技術,包括數據模型、事務與並發控制、故障恢復、存儲引擎、數據壓縮等;分散式系統涉及數據分布、複製、一致性、容錯、可擴展性等分散式技術。另外,分散式存儲系統工程師還需要一項基礎訓練:性能預估。

2.實際系統的學習。包括學習Google、亞馬遜、微軟、阿里巴巴等各大互聯網公司的大規模分散式存儲系統,例如:分散式文件系統、分散式鍵值系統、分散式表格系統以及分散式資料庫等。特別是Hadoop開源生態系統,上面提到的例子幾乎都有開源系統的對應,是難得的學習材料。

希望我的回答能幫助到你。


學習分散式系統需要怎樣的知識? - 馬超的回答 - 知乎


著作權歸作者所有。

商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

作者:fightingKing

鏈接:分散式學習--基礎概念篇 - CSDN博客

來源:CSDN博客

概述

最近這段時間一直在看分散式有關的東西,但是關於分散式自己還是不能很好的理解,所以本文對分散式基礎概念進行下學習.

分散式處理

首先先了解一下分散式處理,分散式處理和集中式處理正好是相反的的體系架構,集中傳輸集中到式處理顧名思義就是將所有的信息都一個統一的信息中心進行處理;分散式處理就是將不同地點的,或具有不同功能的,或擁有不同數據的多台計算機利用通信網路連接起來,讓各個計算機各自承擔同一個工作任務的不同部分,在控制中心的管理下,同時運行,共同完成同一個工作任務。

提到分散式處理就不能不提到並行處理,並行處理就是多個計算機同時工作,讓計算機並行的來工作。進一步說,集中在同一個機櫃內或同一個地點的緊密耦合地點多處理機系統或大規模處理系統是並行處理系統,而用區域網或廣域網連接的計算機系統是分散式處理系統。所以廣義上的說,分散式處理也可以認為是一種並行處理的形式。

分散式系統

分散式處理介紹完以後,分散式系統也就應運而生了,分散式軟體系統定義很好理解,就是跟該軟體系統有關的某些內容可以用分散式處理,這樣的軟體系統就是分散式軟體系統.

上面提到的跟該軟體系統有關的某些內容,這個某些內容都包括了什麼了呢,如分散式計算機系統、分散式程序設計、分散式文件系統和分散式資料庫系統等。

分散式計算機系統

分散式計算機系統是由多個分散的計算機經互連網路構成的一個統一的計算機系統,即由物理上的多個分散的計算機經過互聯網路組成邏輯上的一個計算機,每個物理上的計算機就相當於一個結點,而互聯網就起將多個結點進行聯通,讓各個結點間可以做到相互通信,也就構成了一個統一的邏輯上的計算機了。

邏輯上的計算機統一管理多個分散的物理計算機,來動態的管理資料、實現任務分配或者功能分配,即強調資源、任務、功能和控制的全面分布。

分散式程序設計

可在分布計算機系統的幾台計算機上同時協調執行的程序設計方法就是分散式程序設計語言。分散式程序設計語言與常用的程序設計語言主要區別就是,分散式程序設計語言具有程序分布和通信的功能。

採用分散式程序設計方法設計程序時,一個程序由若干個可獨立執行的程序模塊組成,這些程序模塊分布於在不同的計算機同時執行,分布在各台計算機上的程序模塊是相互關聯的,它們在執行中需要交換數據,即通信,只有通過通信,各程序模塊才能協調的完成一個共同的計算任務。

分散式文件系統

了解了分散式計算機系統以後,學習分散式文件系統就簡單多了,分散式文件系統就是將固定於某個地點的某個文件系統,擴展到任意多個地點,眾多的的物理上的分散的計算機結點組成一個文件系統網路。每個結點可以分布在不同的地點,通過網路進行結點間的通信和數據傳輸。人們在使用分散式文件系統時,無需關心數據是存儲在哪個節點上、或者是從哪個節點從獲取的,只需要像使用本地文件系統一樣管理和存儲文件系統中的數據。所以分散式文件系統有效的解決了數據的存儲和管理難題,分散式文件系統除了改變了數據的存儲和管理方式,也擁有了本地文件系統所無法具備的數據備份、數據安全等優點。

分散式資料庫系統

分散式資料庫系統就是物理上是分布的,但邏輯上卻是集中的。應用程序使用時,對資料庫的操作都是透明的也就是當做一個資料庫來操作就可以,實際上資料庫中的數據分別在不同的局部資料庫中存儲、由不同的DBMS進行管理、在不同的機器上運行、由不同的操作系統支持、被不同的通信網路連接的。

從用戶的角度看,一個分散式資料庫系統在邏輯上和集中式資料庫系統一樣,用戶可以在任何一個場地執行全局應用。就好像那些數據是存儲在同一台計算機上,有單個資料庫管理系統(DBMS)管理一樣,用戶並沒有什麼感覺不一樣。

最後

關於分散式的一些基本概念,本篇文章就先介紹這麼多,後續會繼續介紹關於分散式的深入的學習。


分散式,主要核心,如大數據:jvm,classloader,rpc。等,具體參考。

http://mp.weixin.qq.com/s/nlNLWs0imniBSQTAgrw74A


同樣剛剛入門,自己的學習計劃是項目為主,爭取機會參與一些企業的分散式系統設計項目,沒有機會的話就了解學習一些開源的分散式項目,同時學習一些分散式理論方面的東西,比如分散式演算法等等。


推薦閱讀:

深度學習GPU訓練代碼初學者,在寫神經網路代碼時,遇到了GPU計算結果與CPU計算結果不一致的問題?

TAG:分散式計算 | Hadoop | 分散式系統 | 大數據處理 | 大規模機器學習 |