分布式系統工程實現 系統可擴充套件性演化

2021-09-23 21:39:45 字數 1965 閱讀 4206

一般來說,只要多台機器通過互相協調共同執行某項任務,我們都會將這套系統稱為」分布式系統」,這樣顯得更有技術含量。從這個意義上講,memcache集群,mysql sharding集群,yahoo pnuts,google gfs&bigtable,amazon dynamo以及國內眾多專用的nosql系統都是分布式系統。分布式系統的難點主要在於可擴充套件性,隨著機器數量的增多,集群能力是否能夠接近線性擴充套件,因集群規模擴大而產生的容錯需求,負載的動態遷移,對系統的設計和實現是乙個巨大的挑戰。我們經常會講,nosql系統相比資料庫有更好的可擴充套件性,但我們很少**其中的原因,我們很少**資料庫和可擴充套件的分布式系統,比如gfs&bigtable之間的差距。本文就系統可擴充套件性問題拋乙個磚頭,希望有牛人能夠一起分享自己的經驗。

資料庫可以通過水平切分和垂直切分的方式實現可擴充套件性。垂直切分主要基於業務的角度,水平切分主要基於系統的角度。簡單來說,資料庫水平切分就是通過一系列切分規則將資料水平分布到不同的db和table中,再通過相應的db路由或者table路由定位到需要查詢的db或者table,進行query操作。可以引入乙個資料庫訪問中間層進行資料路由,讀寫分離並執行簡單的order by, group by, limit等操作,如**的tddl。

這個架構的可擴充套件性不好,根本原因是機器同構。假設資料庫服務的資料為1tb,線上資料拷貝限速20mb/s,那麼新機器上線拷貝資料的時間為1tb / 20mb/s = 50000s,大概是十幾個小時,這是不可接受的。因此,資料庫的架構一般會使用共享儲存,大大提高了系統成本,與可擴充套件分布式系統產生的初衷相違背。機器同構的問題不僅僅出現在資料庫系統,大多專用的nosql系統都有這樣的問題,比如,有的系統底層使用了berkerly db或者其它針對特定應用的key-value儲存引擎,上層仍然採用將機器分成多個組,組內的機器同構,通過replication同步保證可靠性,資料通過hash或者其它方法分布到不同的分組。這樣的nosql系統與資料庫在可擴充套件性上沒有本質的差別,不同點主要在於:nosql系統不需要支援一些view,外來鍵,多表join等大規模系統基本不用的功能,且為應用定製,往往很高效,系統規模較小,在工程上可控,開發人員對**熟悉,有利於人員培養,系統優化等。同構的系統雖然可擴充套件性不好,技術人員總會覺得缺少了什麼,不過仍然能夠解決大多數問題,後續章節將專門闡述。

高可擴充套件性系統設計的關鍵點就在於穩定可靠的地方儲存操作日誌大多數線上系統服務的資料都是很大的,如tb ~ 百tb之間,然而,動態的更新一般是比較少的,比如每天的更新只有幾百個gb。因此,穩定可靠的日誌儲存系統的設計變得相對簡單,比如yahoo pnuts採用訊息中介軟體的方式儲存操作日誌。根據公開的資料推斷,yahoo內部使用的訊息中介軟體yahoo message broker也是乙個同構的系統,然而,由於只需要儲存線上的更新資料,資料量很小,比如每天100gb,保留三天則資料量為300gb,假設採用10組同構的機器存放資料,每組服務的資料量為30gb,增加機器副本的資料拷貝時間為30gb / 20mb/s = 1500s,這是可以接受的。

amazon dynamo的思路就是通過犧牲一致性來避免複雜的操作日誌問題。amazon dynamo不保證同乙個時刻對於同乙份資料只有乙個寫節點,因此,多個節點的資料寫入順序可能不相同,dynamo中有一些nwr策略來權衡資料一致性及可用性,不過資料衝突是無法避免的,因此,需要引入vector clock等衝突處理方法。dynamo中可擴充套件性主要是通過虛擬節點的方式實現的,每台機器宕機時,資料和服務可以遷移到集群中的所有機器。由於不需要考慮資料一致性,事情變得相對簡單。

高可擴充套件性的系統有乙個優勢就是規模效應,隨著集群增大,成本優勢非常明顯,因此很適合提供雲服務,劣勢就是前期投入太大,開發及穩定週期太長,我們往往可以採取一些折衷的方案。比如我們可以將動態更新操作存放到單機記憶體中,靜態資料存放到多台機器的磁碟中,定期將靜態資料和動態資料合併,讀取操作同時讀取靜態資料和動態資料部分,由於動態資料存放在記憶體中,這樣的系統設計對於大多數應用效能不成問題,且極大地減低了系統整體複雜性。更為重要的是,只要我們理解了分布式系統可擴充套件性設計的關鍵點,提前制定好系統發展路線圖,經過一段時間積累後一定能夠設計和開發出可擴充套件的分布式系統。

系統的可擴充套件性

到底什麼是可擴充套件性?這年頭,作為軟體設計架構師如果系統沒有可擴充套件性對外交流時都不好意思。但是如何選擇可擴充套件性方案?水平擴充套件還是垂直擴充套件?是不是很矛盾呢,本文為你分析可擴充套件性的真實含義和實際專案中的取捨。每每和別人提及可擴充套件性的含義時,很多人開始討論提高效能,實施高可用性,...

TiDB,為SQL注入分布式可擴充套件性

時下,一大批新型資料庫急劇湧現,諸如google spanner faunadb cockroach以及timescaledb等等,這些資料庫都在專注解決影響標準sql的規模問題。現在,另一位來自中國北京的競爭者 pingcap開源的tidb專案,旨在維持acid事務的同時,使sql也具備nosql...

可擴充套件性的hash演算法和系統

hash演算法是計算機系統非常重要的演算法,它的目的就是要將任意型別的資訊均勻影射到乙個有限的連續空間上 它的用途可以用於資料的快速檢索 比如hashmap 也可以用於資料簽名 比如md5 也可用於安全系統 sha 也普遍用於p2p系統中的資訊檢索和路由 本文中提到的應用著重指資料檢索中使用的has...