構(gòu)建一個(gè)企業(yè)級分布式存儲系統(tǒng)對于任何一個(gè)團(tuán)隊(duì)來說,都是一件極具挑戰(zhàn)性的工作。不僅需要大量的理論基礎(chǔ),還需要有良好的工程能力。SmartX 在分布式存儲領(lǐng)域已經(jīng)投入 5 年的時(shí)間,積累了很多寶貴的實(shí)踐經(jīng)驗(yàn)。我們將通過一系列文章,向大家詳細(xì)介紹 SmartX 如何構(gòu)建分布式塊存儲產(chǎn)品。本文是第一部分,整理自 SmartX 聯(lián)合創(chuàng)始人兼 CTO 張凱在 QCon 2018 大會上的演講,著重介紹相關(guān)背景和元數(shù)據(jù)服務(wù)。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括資中網(wǎng)站建設(shè)、資中網(wǎng)站制作、資中網(wǎng)頁制作以及資中網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,資中網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到資中省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
大家下午好,我今天跟大家分享的題目是『ZBS:SmartX 自研分布式塊存儲系統(tǒng)』。SmartX 是我們公司的名字,我本人是這個(gè)公司的聯(lián)合創(chuàng)始人兼 CTO。ZBS 是 SmartX 研發(fā)的分布式塊存儲產(chǎn)品的名字。
我畢業(yè)于清華計(jì)算機(jī)系,畢業(yè)以后加入百度基礎(chǔ)架構(gòu)部工作了兩年,主要從事分布式系統(tǒng)和大數(shù)據(jù)相關(guān)的工作。我本身也是開源社區(qū)的代碼貢獻(xiàn)者,參與的項(xiàng)目包括 Sheepdog 和 InfluxDB。其中 Sheepdog 是一個(gè)開源的分布式塊存儲項(xiàng)目,InfluxDB 是一個(gè)時(shí)序數(shù)據(jù)庫(Time Series Database,TSDB)項(xiàng)目。2013 年我從百度離職,和清華的兩個(gè)師兄一起創(chuàng)辦了 SmartX 公司。
SmartX 于 2013 年成立,是一個(gè)以技術(shù)為主導(dǎo)的公司,目前主要專注于分布式存儲及虛擬化這個(gè)兩個(gè)領(lǐng)域。我們的產(chǎn)品均為自己研發(fā),目前已經(jīng)運(yùn)行在數(shù)千臺物理服務(wù)器上,存儲了數(shù)十 PB 的數(shù)據(jù)。SmartX 跟國內(nèi)主流的硬件服務(wù)商、云服務(wù)商都有合作,我們的產(chǎn)品已經(jīng)服務(wù)了包括公有云、私有云以及金融業(yè)、制造業(yè)等核心領(lǐng)域的關(guān)鍵業(yè)務(wù),其中也包括核心應(yīng)用和核心數(shù)據(jù)庫等應(yīng)用場景。今天我將主要圍繞分布式塊存儲進(jìn)行介紹。
一般來說,我們根據(jù)存儲的訪問接口以及應(yīng)用場景,把分布式存儲分為三種類型,包括分布式塊存儲,分布式文件存儲,和分布式對象存儲。
其中,分布式塊存儲的主要應(yīng)用場景包括:
虛擬化:比如像 KVM,VMware,XenServer 等 Hypervisor,以及像 Openstack,AWS 等云平臺。塊存儲在其中的角色是支撐虛擬機(jī)中的虛擬盤的存儲。
數(shù)據(jù)庫:比如 MySQL,Oracle 等。很多 DBA 都將數(shù)據(jù)庫的數(shù)據(jù)盤運(yùn)行在一個(gè)共享的塊存儲服務(wù)上,例如分布式塊存儲。此外也有很多客戶直接把數(shù)據(jù)庫運(yùn)行在虛擬機(jī)中。
容器:容器最近幾年在企業(yè)中使用越來越廣泛。一般來說,容器中運(yùn)行的應(yīng)用都是無狀態(tài)的,但在很多應(yīng)用場景下,應(yīng)用也會有數(shù)據(jù)持久化的需求。應(yīng)用可以選擇將數(shù)據(jù)持久化到數(shù)據(jù)庫中,也可以選擇將數(shù)據(jù)持久化到一個(gè)共享虛擬磁盤上。這個(gè)需求對應(yīng)到 Kubernetes 中,就是 Persistent Volume 這個(gè)功能。
今天我將主要圍繞 SmartX 如何打造分布式塊存儲進(jìn)行介紹。SmartX 從 2013 年成立開始,到目前已經(jīng)積累了 5 年左右的分布式塊存儲的研發(fā)經(jīng)驗(yàn),所以今天我們除了分享 SmartX 如何實(shí)現(xiàn)我們自己研發(fā)的分布式塊存儲 ZBS 以外,還會詳細(xì)介紹我們在分布式塊存儲的研發(fā)過程中的一些思考和選擇。此外也將介紹一下我們產(chǎn)品未來的規(guī)劃。
從廣泛意義上講,分布式存儲中通常需要解決三個(gè)問題,分別是元數(shù)據(jù)服務(wù),數(shù)據(jù)存儲引擎,以及一致性協(xié)議。
其中,元數(shù)據(jù)服務(wù)提供的功能一般包括:集群成員管理,數(shù)據(jù)尋址,副本分配,負(fù)載均衡,心跳,垃圾回收等等。數(shù)據(jù)存儲引擎負(fù)責(zé)解決數(shù)據(jù)在單機(jī)上存儲,以及本地磁盤的管理,磁盤故障處理等等。每一個(gè)數(shù)據(jù)存儲引擎之間是隔離的,在這些隔離的存儲引擎之間,需要運(yùn)行一個(gè)一致性協(xié)議,來保證對于數(shù)據(jù)的訪問可以滿足我們期望的一致性狀態(tài),例如強(qiáng)一致,弱一致,順序一致,線性一致等等。我們根據(jù)不同的應(yīng)用場景,選擇一個(gè)適合的一致性協(xié)議,這個(gè)協(xié)議將負(fù)責(zé)數(shù)據(jù)在不同的節(jié)點(diǎn)之間的同步工作。
有了這三部分,我們基本上就掌握了一個(gè)分布式存儲的核心。不同的分布式存儲系統(tǒng)之間的區(qū)別,基本也都來自于這三個(gè)方面的選擇不同。
接下來我會分別從這三個(gè)方面介紹一下我們在做 ZBS 系統(tǒng)設(shè)計(jì)的時(shí)候是怎樣思考的,以及最終決定采用哪種類型的技術(shù)和實(shí)現(xiàn)方法。
首先我們來介紹一下元數(shù)據(jù)服務(wù)。我們先來談?wù)勎覀儗υ獢?shù)據(jù)服務(wù)的需求。
所謂元數(shù)據(jù)就是『數(shù)據(jù)的數(shù)據(jù)』,比如說數(shù)據(jù)放在什么位置,集群中有哪些服務(wù)器,等等。如果元數(shù)據(jù)丟失了,或者元數(shù)據(jù)服務(wù)無法正常工作,那么整個(gè)集群的數(shù)據(jù)都無法被訪問了。
由于元數(shù)據(jù)的重要性,所以對元數(shù)據(jù)的第一個(gè)需求就是可靠性。元數(shù)據(jù)必須是保存多份的,同時(shí)元數(shù)據(jù)服務(wù)還需要提供 Failover 的能力。
第二個(gè)需求就是高性能。盡管我們可以對 IO 路徑進(jìn)行優(yōu)化,使得大部分 IO 請求都不需要訪問元數(shù)據(jù)服務(wù),但永遠(yuǎn)都有一些 IO 請求還是需要修改元數(shù)據(jù),比如數(shù)據(jù)分配等等。為避免元數(shù)據(jù)操作成為系統(tǒng)性能的瓶頸,元數(shù)據(jù)操作的響應(yīng)時(shí)間必須足夠短。同時(shí)由于分布式系統(tǒng)的集群規(guī)模在不斷的擴(kuò)大,對于元數(shù)據(jù)服務(wù)的并發(fā)能力也有一定的要求。
最后一個(gè)需求是輕量級。由于我們產(chǎn)品大部分使用場景是私有部署,也就是我們的產(chǎn)品是部署在客戶的數(shù)據(jù)中心的,且由客戶自己運(yùn)維,而非我們的運(yùn)維人員運(yùn)維。這個(gè)場景和很多互聯(lián)網(wǎng)公司自己來運(yùn)維自己的產(chǎn)品是完全不同的場景。所以對于 ZBS 來說,我們更強(qiáng)調(diào)整個(gè)系統(tǒng),尤其是元數(shù)據(jù)服務(wù)的輕量級,以及易運(yùn)維的能力。我們期望元數(shù)據(jù)服務(wù)可以輕量級到可以把元數(shù)據(jù)服務(wù)和數(shù)據(jù)服務(wù)混合部署在一起。同時(shí)我們希望大部分的運(yùn)維操作都可以由程序自動(dòng)完成,或用戶只需要在界面上進(jìn)行簡單的操作就可以完成。如果大家了解 HDFS 的話,HDFS 中的元數(shù)據(jù)服務(wù)的模塊叫做 Namenode,這是一個(gè)非常重量級的模塊。Namenode 需要被獨(dú)立部署在一臺物理服務(wù)器上,且對硬件的要求非常高,且非常不易于運(yùn)維,無論是升級還是主備切換,都是非常重的操作,非常容易因操作問題而引發(fā)故障。
以上就是我們對元數(shù)據(jù)服務(wù)的需求。接下來我們來看一下具體有哪些方法可以構(gòu)造一個(gè)元數(shù)據(jù)服務(wù)。
談到存儲數(shù)據(jù),尤其是存儲結(jié)構(gòu)化的數(shù)據(jù),我們第一個(gè)想到的就是關(guān)系型數(shù)據(jù)庫,例如 MySQL,以及一些成熟的 KV 存儲引擎,例如 LevelDB,RocksDB 等。但這種類型的存儲大的問題就是無法提供可靠的數(shù)據(jù)保護(hù)和 Failover 能力。LevelDB 和 RocksDB 雖然非常輕量級,但都只能把數(shù)據(jù)保存在單機(jī)上。而盡管 MySQL 也提供一些主備方案,但我們認(rèn)為 MySQL 的主備方案是一個(gè)太過笨重的方案,且缺乏簡易的自動(dòng)化運(yùn)維方案,所以并不是一個(gè)十分好的選擇。
其次,我們來看一下一些分布式數(shù)據(jù)庫,例如 MongoDB 和 Cassandra。這兩種分布式數(shù)據(jù)庫都可以解決數(shù)據(jù)保護(hù)和提供 Failover 機(jī)制。但是他們都不提供 ACID 機(jī)制,所以在上層實(shí)現(xiàn)時(shí)會比較麻煩,需要額外的工作量。其次就是這些分布式數(shù)據(jù)庫在運(yùn)維上也相對復(fù)雜,不是很易于自動(dòng)化運(yùn)維。
也有一種選擇是基于 Paxos 或者 Raft 協(xié)議自己實(shí)現(xiàn)一個(gè)框架。但這樣實(shí)現(xiàn)的代價(jià)非常大,對于一個(gè)創(chuàng)業(yè)公司不是一個(gè)很劃算的選擇。并且我們創(chuàng)業(yè)的時(shí)間是 2013 年,當(dāng)時(shí) Raft 也只是剛剛提出。
第四種是選擇 Zookeeper。Zookeeper 基于 ZAB 協(xié)議,可以提供一個(gè)穩(wěn)定可靠地分布式存儲服務(wù)。但 Zookeeper 的大的問題是能夠存儲的數(shù)據(jù)容量非常有限。為了提高訪問速度,Zookeeper 把存儲的所有數(shù)據(jù)都緩存在內(nèi)存中,所以這種方案導(dǎo)致元數(shù)據(jù)服務(wù)所能支撐的數(shù)據(jù)規(guī)模嚴(yán)重受限于服務(wù)器的內(nèi)存容量,使得元數(shù)據(jù)服務(wù)無法做到輕量級,也無法和數(shù)據(jù)服務(wù)混合部署在一起。
最后還有一種方式是基于 Distributed Hash Table(DHT)的方法。這種方法的好處元數(shù)據(jù)中不需要保存數(shù)據(jù)副本的位置,而是根據(jù)一致性哈希的方式計(jì)算出來,這樣就極大地降低了元數(shù)據(jù)服務(wù)的存儲壓力和訪問壓力。但使用 DHT 存在的問題,就喪失了對數(shù)據(jù)副本位置的控制權(quán),在實(shí)際生產(chǎn)環(huán)境中,非常容易造成集群中的產(chǎn)生數(shù)據(jù)不均衡的現(xiàn)象。同時(shí)在運(yùn)維過程中,如果遇到需要添加節(jié)點(diǎn),移除節(jié)點(diǎn),添加磁盤,移除磁盤的情況,由于哈希環(huán)會發(fā)生變化,一部分?jǐn)?shù)據(jù)需要重新分布,會在集群中產(chǎn)生不必要的數(shù)據(jù)遷移,而且數(shù)據(jù)量往往非常大。而這種于運(yùn)維操作在一個(gè)比較大規(guī)模的環(huán)境中幾乎每天都會發(fā)生。大規(guī)模的數(shù)據(jù)遷移很容易影響到線上的業(yè)務(wù)的性能,所以 DHT 使得運(yùn)維操作變得非常麻煩。
以上介紹的方法都存在各種各樣的問題,并不能直接使用。最終 ZBS 選擇了使用 LevelDB(也可以替換成 RocksDB) 和 Zookeeper 結(jié)合的方式,解決元數(shù)據(jù)服務(wù)的問題。首先,這兩個(gè)服務(wù)相對來說都非常輕量級;其次 LevelDB 和 Zookeeper 使用在生產(chǎn)中也非常穩(wěn)定。
我們采用了一種叫做 Log Replication 的機(jī)制,可以同時(shí)發(fā)揮 LevelDB 和 Zookeeper 的優(yōu)點(diǎn),同時(shí)避開他們自身的問題。
這里我們簡單的介紹一下 Log Replication。簡單來說,我們可以把數(shù)據(jù)或者狀態(tài)看作是一組對數(shù)據(jù)操作的歷史集合,而每一個(gè)操作都可以通過被序列化成 Log 記錄下來。如果我們可以拿到所有 的 Log,并按照 Log 里面記錄的操作重復(fù)一遍,那么我們就可以完整的恢復(fù)數(shù)據(jù)的狀態(tài)。任何一個(gè)擁有 Log 的程序都可以通過重放 Log 的方式恢復(fù)數(shù)據(jù)。如果我們對 Log 進(jìn)行復(fù)制,實(shí)際上也就相當(dāng)于對數(shù)據(jù)進(jìn)行了復(fù)制。這就是 Log Replication 最基本的想法。
我們具體來看一下 ZBS 是如何利用 Zookeeper + LevelDB 完成 Log Replication 操作的。首先,集群中有很多個(gè) Meta Server,每個(gè) Server 本地運(yùn)行了一個(gè) LevelDB 數(shù)據(jù)庫。Meta Server 通過 Zookeeper 進(jìn)行選主,選出一個(gè) Leader 節(jié)點(diǎn)對外響應(yīng)元數(shù)據(jù)請求,其他的 Meta Server 則進(jìn)入Standby 狀態(tài)。
當(dāng) Leader 節(jié)點(diǎn)接收到元數(shù)據(jù)的更新操作后,會將這個(gè)操作序列化成一組操作日志,并將這組日志寫入 Zookeeper。由于 Zookeeper 是多副本的,所以一旦 Log 數(shù)據(jù)寫入 Zookeeper,也就意味著 Log 數(shù)據(jù)是安全的了。同時(shí)這個(gè)過程也完成了對 Log 的復(fù)制。
當(dāng)日志提交成功后,Meta Server 就可以將對元數(shù)據(jù)的修改同時(shí)提交到本地的 LevelDB 中。這里 LevelDB 中存儲的是一份全量的數(shù)據(jù),而不需要以 Log 的形式存儲。
對于非 Leader 的 Meta Server 節(jié)點(diǎn),會異步的從 Zookeeper 中拉取 Log,并將通過反序列化,將 Log 轉(zhuǎn)換成對元數(shù)據(jù)的操作,再將這些修改操作提交到本地的 LevelDB 中。這樣就能保證每一個(gè) Meta Server 都可以保存一個(gè)完整的元數(shù)據(jù)。
前面提到,由于 Zookeeper 存儲數(shù)據(jù)的容量受限于內(nèi)存容量。為了避免 Zookeeper 消耗過多內(nèi)存,我們對 Zookeeper 中的 Log 定期執(zhí)行清理。只要 Log 已經(jīng)被所有的 Meta Server 同步完, Zookeeper 中保存的 Log 就可以被刪除了,以節(jié)省空間。通常我們在 Zookeeper 上只保存 1GB 的 Log,已經(jīng)足夠支撐元數(shù)據(jù)服務(wù)。
Failover 的邏輯也非常簡單。如果 Leader 節(jié)點(diǎn)發(fā)生故障,其他還存活的的 Meta Server 通過 Zookeeper 再重新進(jìn)行一次選主,選出一個(gè)新的 Meta Leader。這個(gè)新的 Leader 將首先從 Zookeeper 上同步所有還未消耗的日志,并在提交到本地的 LevelDB 中,然后就可以對外提供元數(shù)據(jù)服務(wù)了。
現(xiàn)在我們總結(jié)一下 ZBS 中元數(shù)據(jù)服務(wù)實(shí)現(xiàn)的特點(diǎn)。
首先,這個(gè)原理非常容易理解,而且實(shí)現(xiàn)起來非常簡單。由 Zookeeper 負(fù)責(zé)選主和 Log Replication,由 LevelDB 負(fù)責(zé)本地元數(shù)據(jù)的存儲。背后的邏輯就是盡可能的將邏輯進(jìn)行拆分,并盡可能的復(fù)用已有項(xiàng)目的實(shí)現(xiàn)。
其次,速度足夠快。Zookeeper 和 LevelDB 本身的性能都不錯(cuò),而且在生產(chǎn)中,我們將 Zookeeper 和 LevelDB 運(yùn)行在 SSD 上。在實(shí)際測試中,對于單次元數(shù)據(jù)的修改都是在毫秒級完成。在并發(fā)的場景下,我們可以對元數(shù)據(jù)修改的日志做 Batch,以提高并發(fā)能力。
此外,這種方式支持 Failover,而且 Failover 的速度也非???。Failover 的時(shí)間就是選主再加上 Log 同步的時(shí)間,可以做到秒級恢復(fù)元數(shù)據(jù)服務(wù)。
最后說一下部署。在線上部署的時(shí)候,我們通常部署 3 個(gè)或 5 個(gè) Zookeeper 服務(wù)的實(shí)例以及至少 3 個(gè) Meta Server 服務(wù)的實(shí)例,以滿足元數(shù)據(jù)可靠性的要求。元數(shù)據(jù)服務(wù)對資源消耗都非常小,可以做到和其他服務(wù)混合部署。
以上是一些基本的原理,我們再來看一下 ZBS 內(nèi)部的對于元數(shù)據(jù)服務(wù)的具體實(shí)現(xiàn)。
我們將上述的 Log Replication 邏輯封裝在了一個(gè) Log Replication Engine 中,其中包含了選主、向 Zookeeper 提交 Log、向 LevelDB 同步數(shù)據(jù)等操作,進(jìn)一步簡化開發(fā)復(fù)雜度。
在 Log Replication Engine 的基礎(chǔ)之上,我們實(shí)現(xiàn)了整個(gè) Meta Sever 的邏輯,其中包含了 Chunk Manager,NFS Manger,iSCSI Manager,Extent Manager 等等很多管理模塊,他們都可以通過 Log Replication Engine,管理特定部分的元數(shù)據(jù)。RPC 模塊是 Meta Server 對外暴露的接口,負(fù)責(zé)接收外部的命令,并轉(zhuǎn)發(fā)給對應(yīng)的 Manager。例如創(chuàng)建/刪除文件,創(chuàng)建/刪除虛擬卷等等。此外,Meta Server 中還包含了一個(gè)非常復(fù)雜的調(diào)度器模塊,里面包含了各種復(fù)雜的分配策略,恢復(fù)策略,負(fù)載均衡策略,以及心跳,垃圾回收等功能。
以上就是關(guān)于 SmartX 超融合系統(tǒng)中 SMTX 分布式塊存儲元數(shù)據(jù)服務(wù)部分的介紹。
了解更多信息可訪問 SmartX 官網(wǎng):https://www.smartx.com
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文標(biāo)題:SmartX產(chǎn)品技術(shù)解析:SMTX分布式塊存儲--元數(shù)據(jù)篇-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://muchs.cn/article18/cesjdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、外貿(mào)建站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容