Longhorn全解析及快速入門指南

Longhorn項目現已正式發佈!這是一個基於雲和容器部署的分佈式塊存儲新方式。Longhorn遵循微服務的原則,利用容器將小型獨立組件構建爲分佈式塊存儲,並使用容器編排來協調這些組件,造成彈性分佈式系統。前端

Why Longhorn?

現在,基於雲和容器的部署規模日益擴大,分佈式塊存儲系統也正變得愈來愈複雜,單個存儲控制器上的volume數量在不斷增長。2000年代初,存儲控制器上的volume數量只有幾十個,但現代雲環境卻須要數萬到數百萬的分佈式塊存儲卷。存儲控制器變成了高度複雜的分佈式系統。node

分佈式塊存儲自己比其餘形式的分佈式存儲(如文件系統)更簡單。不管系統中有多少volume,每一個volume只能由單個主機進行裝載。正因如此,咱們設想,是否能夠將大型塊存儲控制器分割成多個較小的存儲控制器?若想要如此分割,咱們須要保證這些volume仍然是從公共磁盤池構建的,而且咱們須要有辦法來編排這些存儲控制器,讓它們能夠協同工做。git

爲了將這一想法發揮到極限,咱們建立了Longhorn項目。這是一個咱們認爲值得探索的方向,每一個控制器上只有一個volume,這將大大簡化存儲控制器的設計。由於控制器軟件的故障域僅限於單個volume,因此控制器若崩潰,也只會影響一個volume。github

Longhorn充分利用了近年來關於如何編排大量的容器和虛擬機的核心技術。例如,Longhorn並無構建一個能夠擴展到100,000個volume的高度複雜的控制器,而是出於讓存儲控制器簡單輕便的考慮,建立了100,000個單獨的控制器。而後,咱們能夠利用像Swarm、Mesos和Kubernetes這樣的最早進的編排系統來調度這些獨立的控制器,共享一組磁盤中的資源,協同工做,造成一個彈性的分佈式塊存儲系統。golang

Longhorn基於微服務的設計還有不少其餘優點。由於每一個volume都有本身的控制器,在升級每一個volume的控制器和replica容器時,是不會致使IO操做明顯的中斷的。 Longhorn能夠建立一個長期運行的工做來編排全部live volume的升級,同時確保不會中斷系統正在進行的操做。爲確保升級不會致使意外的問題,Longhorn能夠選擇升級一小部分volume,並在升級過程當中出現問題時回滾到舊版本。這些作法在現代微服務應用中已獲得普遍應用,但在存儲系統中並不常見。咱們但願Longhorn能夠助力於微服務在存儲領域的更多應用。算法

Longhorn功能概述

  • 將本地磁盤或安裝在計算或專用存儲主機中的網絡存儲造成共享資源池。docker

  • 爲容器和虛擬機建立塊存儲卷。你能夠指定volume的大小,IOPS的需求,以及你想要的跨主機的同步replica的數量(這裏的主機是指那些爲volume提供存儲資源的主機)。replica是在底層磁盤或網絡存儲上精簡配置的。編程

  • 爲每一個volume建立一個專用的存儲控制器。這多是與大多數現有的分佈式存儲系統相比,Longhorn最具特點的功能。大多數現有的分佈式存儲系統一般採用複雜的控制器軟件來服務於從數百到數百萬不等的volume。但Longhorn不一樣,每一個控制器上只有一個volume,Longhorn將每一個volume都轉變成了微服務。ubuntu

  • 跨計算或存儲主機調度多個replica。Longhorn會監測每個replica的健康情況,對問題進行維修,並在必要時從新生成replica。bash

  • 以Docker容器的形式操做存儲控制器和replica。例如,一個volume有三個replica,就意味着有四個容器。

  • 爲每一個volume分配多個存儲「前端」。常見的前端包括Linux內核設備(映射到/ dev / longhorn)和iSCSI目標。Linux內核設備適用於支持Docker volume,而iSCSI目標更適合支持QEMU / KVM和VMware volume。

  • 建立volume快照(snapshot)和AWS EBS風格的備份。您能夠爲每一個volume建立多達254個快照,這些快照能夠逐個備份到NFS或S3兼容的輔助存儲中。只有更改的字節會在備份操做期間被複制和存儲。

  • 指定按期快照和備份操做的計劃。您能夠指定這些操做的頻率(每小時,天天,每週,每個月和每一年)、執行這些操做的確切時間(例如,每一個星期日凌晨3:00),以及保留多少個循環快照和備份集。

快速入門指南

Longhorn易於安裝和使用。您只需確保Docker已安裝,而且安裝了open-iscsi軟件包,就能夠在單個Ubuntu 16.04服務器上設置運行Longhorn所需的一切。

運行如下命令在單個主機上設置Longhorn:

git clone https://github.com/rancher/longhorncd longhorn/deploy
./longhorn-setup-single-node-env.sh

該腳本將拉起並啓動多個容器,包括etcd鍵值存儲區、Longhorn volume管理器、Longhorn UI和Longhorn docker volume插件容器。此腳本完成後,將生成如下輸出:

Longhorn is up at port 8080

您能夠經過鏈接到http:// <hostname或IP>:8080來使用UI。如下是有關volume詳細信息的屏幕圖:

圖片描述

您如今能夠從Docker CLI建立持久的Longhorn volume:

docker volume create -d longhorn vol1
docker run -it --volume-driver longhorn -v vol1:/vol1 ubuntu bash

在同一主機上運行單主機Longhorn安裝程序etcd和全部volume副本,所以不適合在生產環境中使用。 Longhorn GitHub頁面有更多關於如何設置生產級別多主機使用說明:,多主機將使用單獨的etcd服務器、Docker swarm mode集羣和用於存儲備份的單獨NFS服務器。

Longhorn和其餘存儲系統

做爲一項實驗,咱們編寫了Longhorn,藉助容器和微服務,Longhorn構建了一個分佈式塊存儲系統,Longhorn既不是爲了與現有存儲軟件和存儲系統競爭,也並不是爲替代現有存儲軟件和存儲系統,緣由以下:

  • Longhorn只關注分佈式塊存儲。從另外一個角度來講,分佈式文件存儲更難創建。如Ceph、Gluster、Infinit(由Docker收購)、Quobyte、Portworx和StorageOS以及來自NetApp、EMC等的存儲系統,提供了分佈式文件系統、統一存儲體驗、企業數據管理以及許多Longhorn不支持的其餘企業級功能。

  • Longhorn須要NFS共享或S3兼容的對象用以存儲volume備份。所以,它必須與來自NetApp、EMC Isilon或其餘供應商的網絡文件存儲器以及來自AWS S三、Minio、SwiftStack、Cloudian等的S3兼容的對象存儲端點配合使用。

  • Longhorn缺乏企業級存儲功能,例如重複數據刪除、壓縮和自動分層以及將大容量條帶化爲較小塊的能力。所以,Longhorn volumes受到單個磁盤的大小和性能的限制。 iSCSI目標以用戶級進程運行。咱們在分佈式存儲產品(如Dell EqualLogic,SolidFire和Datera)中能夠看到,它缺少企業級 iscsi 系統的性能、可靠性和多路徑支持。

咱們創建了Longhorn,使其簡單易行,但願它能夠測試咱們的想法——使用容器和微服務來構建存儲。它徹底由Go(一般稱爲golang)編寫,是現代系統編程的首選語言。

下面咱們將繼續詳細描述Longhorn,讓你們能對Longhorn現階段的功能設計有個大體的預覽。當前,儘管所描述的功能還未所有實現,但咱們將會繼續努力,使Longhorn項目的願景變爲現實。

做爲微服務的volume

Longhorn volume管理器容器在Longhorn集羣中的每一個主機上運行。使用Rancher或Swarm術語,Longhorn管理器容器是一項全球性服務。若是您使用Kubernetes,Longhorn volume管理器則被視爲DaemonSet。Longhorn volume管理器處理從UI中或Docker和Kubernetes的卷插件中執行API調用。您能夠在這裏找到Longhorn API的說明。下圖展現了Longhorn在Docker Swarm和Kubernetes中的控制路徑。

圖片描述

當Longhorn管理器被要求建立一個volume時,它將在該volume所附的主機以及放置副本的主機上建立一個控制器容器。副本應放置在不一樣的主機上,以確保最大可用性。

在下圖中,有三個容器有Longhorn volumes。每一個Docker volume都有一個做爲容器運行的專用控制器。每一個控制器有兩個副本,每一個副本都是一個容器。圖中的箭頭表示Docker volume、控制器容器、副本容器和磁盤之間的讀/寫數據流。經過爲每一個volume建立單獨的控制器,若是某個控制器發生故障,也不會影響其餘volums的功能。

圖片描述

例如,在大規模部署100,000個Docker volumes的過程當中,每一個volume具備兩個副本,意味着將存在100,000個控制器容器和20萬個複製容器。爲了安排、監視、協調和修復全部這些控制器和副本,須要一個存儲編排系統。

存儲編排

存儲編排負責調度控制器和副本,監視各類組件,並從錯誤中恢復。Longhorn volume管理器執行管理volume生命週期所需的全部存儲編排操做。您能夠在這裏找到Longhorn volume管理器執行存儲編排的詳細信息。

控制器的功能相似於典型的鏡像RAID控制器,對其副本進行讀寫操做並監控副本的健康情況。全部寫入操做都被同步複製。由於每一個volume都有本身的專用控制器,而且控制器駐留在volume所附加的同一主機上,因此咱們不須要控制器的高可用性(HA)配置。

Longhorn volume管理器負責挑選副本所在的主機。而後檢查全部副本的健康情況,在必要時,執行相應操做重建錯誤的副本。

複製操做

Longhorn replicas是經過Linux分散的文件構建的,它支持精簡配置。目前,咱們不保留額外的元數據來指示使用哪些block。block大小爲4K。

拍攝快照時,您將建立一個差別磁盤。隨着快照數量的增加,差別磁盤鏈可能會至關長。爲了提升讀取性能,Longhorn保留了一個讀取索引,記錄了該差別磁盤保存的每一個4K block的有效數據。在下圖中,該volume有八個block。讀取索引有八個條目,而且在讀取操做發生時被惰性填充。寫操做會重置讀取索引,使其指向實時數據。

圖片描述

讀取保存在內存中的索引時,每4K block消耗一個字節。字節大小的讀取索引意味着您能夠爲每一個volume獲取多達254個快照。

爲每一個副本讀取索引將會消耗必定量的內存數據結構。例如,1TB卷消耗256MB的內存讀取索引。所以,咱們將來會考慮將讀取的索引放在內存映射文件中。

副本重建

當控制器檢測到某個副本出現故障時,它會將副本標記爲處於錯誤狀態。Longhorn volume管理器負責啓動和協調重建錯誤副本,過程以下所示:

  • Longhorn volume管理器建立一個空白副本,並調用控制器將空白副本添加到其副本集中。

  • 要添加空白副本,控制器須執行如下操做:

    暫停全部讀寫操做
    在WO(只寫)模式下添加空白副本
    獲取全部現有副本的快照,即刻會有一個空白的差別磁盤
    Unpauses所有讀取寫入操做,僅將寫入操做發送到新添加的副本
    啓動後臺進程,將全部(除最新的之外)差別磁盤從好的副本同步到空白副本
    同步完成後,全部副本的數據都具備一致性,volume管理器將新副本設置爲RW(讀寫)模式
  • Longhorn volume管理器調用控制器從其副本集中刪除錯誤的副本。

從新構建副本並非頗有效。咱們能夠經過嘗試從新使用故障副本中剩餘的分散文件來提升重建性能。

備份快照

我喜歡Amazon EBS的工做方式——每一個快照都自動備份到S3。主存儲中沒有任何內容。可是,咱們決定讓Longhorn的快照和備份更靈活一些。將快照和備份操做分開執行。經過拍攝快照、備份此快照與上一個快照之間的差別以及刪除上一個快照來模擬EBS風格的快照。咱們還開發了一種按期的備份機制,以幫助您自動執行此類操做。

經過檢測和傳輸快照之間的被更改的block, 咱們實現了高效的增量備份。這個任務相對來講比較容易, 由於每一個快照都是一個差別文件, 只用存儲最後一個快照中的更改。爲了不存儲大量的小block,咱們使用2MB block執行備份操做。這意味着,若是2MB邊界中的任何4K block改變,咱們將不得不備份整個2MB block。但咱們認爲這在可管理性和效率之間提供了平衡。

在下圖中,咱們已經備份了snap2和snap3。每一個備份保留本身的一組2MB block,兩個備份共享一個綠色block和一個藍色block。每一個2MB block僅備份一次。這意味着當咱們從二級存儲中刪除備份時,不能刪除它所使用的全部block。相反,咱們會按期執行垃圾回收,以便從二級存儲中清理未使用的block。

圖片描述

Longhorn將給定的volume的全部備份存儲在公用目錄下。如下是描述Longhorn如何存儲volume的備份的簡單視圖。volume級元數據存儲在volume.cfg中。每一個備份的元數據文件(例如snap2.cfg)相對較小,由於它們只包含備份中全部2MB block的偏移量和校驗和。屬於同一volume的全部備份的2MB block都存儲在公用目錄下,所以能夠跨多個備份進行共享。2MB block(.blk文件)被壓縮。因爲使用了校驗和來處理2MB block,因此咱們刪除了同一volume的2MB block中必定程度的重複數據。

圖片描述

兩種部署模式

Longhorn volume管理器執行調度副本到節點的任務。咱們能夠調整調度算法,以不一樣的方式放置控制器、複製副本。控制器要始終放置在鏈接volume的主機上。另外一方面,副本能夠在運行控制器的同一組計算服務器上或在一組專用存儲服務器上進行。前者構成了超聚合部署模型, 後者則構成專用存儲服務器模型。

圖片描述

堅信開源纔是技術的將來,始終秉承開源理念的Rancher Labs,這次推出的Longhorn依然是100%的開源軟件。您能夠經過在GitHub上下載Longhorn:。

相關文章
相關標籤/搜索