Windows Azure Storage 論文閱讀筆記

Windows Azure Storage (WAS) 是微軟提供的支持多種數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)云服務(wù)系谐,本文是 Windows Azure Storage: a highly available cloud storage service with strong consistency 論文閱讀筆記盏混,記錄閱讀論文的感受和啟發(fā)。

Global Partitioned Namespace

namespace 定義了數(shù)據(jù)的訪問方式许赃,包括 AccountName止喷、PartitionName 和 ObjectName 三個(gè)部分。不同的數(shù)據(jù)結(jié)構(gòu)的名字訪問方式有所不同:

  • Blob:PartitionName 對(duì)應(yīng)每一個(gè) blob 文件
  • Table: PartitionName + ObjectName 對(duì)應(yīng) table 每一行
  • Queue: PartitionName + ObjectName 對(duì)應(yīng) queue 每一個(gè) message

整體架構(gòu)

WAS 組件

整體架構(gòu)

WAS 架構(gòu)組件包括 Location Service 和若干 Storage Stamp弹谁,而 Storage Stamp 由可以劃分為 Front Ends预愤、Partition Layer 和 Stream Layer 三層咳胃。

Location Service

Location Service (LS) 管理所有的 storage stamp 及其 namespace,自身通過部署在不同地域?qū)崿F(xiàn)災(zāi)難恢復(fù)销睁。
LS 具備添加新的 region存崖、添加 location 到已有 region 以及添加 stamp 到已有 location 的能力。當(dāng)用戶請(qǐng)求一個(gè)寫入賬戶時(shí)冗栗,LS 在用戶指定的 location 內(nèi)根據(jù)磁盤供搀、網(wǎng)絡(luò)等負(fù)載情況選擇選擇合適的 storage stamp 提供服務(wù)葛虐,并更新相應(yīng)的路由信息。

Storage Stamp

一個(gè) storage stamp 是包括 N 個(gè)物理機(jī)架的存儲(chǔ)節(jié)點(diǎn)集群乒融,每個(gè)機(jī)架是一個(gè) fault domain,使用獨(dú)立的網(wǎng)絡(luò)和電力愧捕。fault domain 這個(gè)概念在 WAS 中很重要申钩,在 WAS 滾動(dòng)升級(jí)和復(fù)制等重要功能中也要發(fā)揮作用撒遣。為了利用 HDD 的 outer track 更快的訪問性能,從而得到更好的磁盤尋道時(shí)間和訪問吞吐量义黎,通常一個(gè) storage stamp 會(huì)保留 20% 的磁盤空間廉涕。

Stream Layer

stream layer 是一個(gè)類似于分布式文件系統(tǒng)的組件,提供類似文件系統(tǒng)的 namespace 和 API宠纯,不過所有的寫都是 append-only 的形式层释。

stream layer

stream layer 管理若干 stream贡羔,每個(gè) stream 包括若干個(gè) extent,每個(gè) extent 包含若干個(gè) block。每個(gè) stream 最新的 extent 是可寫的宵统,其余都是只讀的覆获。
block 是讀寫的基本單位弄息,每個(gè) block 保存了數(shù)據(jù)的 checksum。block 數(shù)據(jù)的驗(yàn)證在每次數(shù)據(jù)讀取和定期數(shù)據(jù)掃描時(shí)都會(huì)觸發(fā)涤伐。extent 是 Intra-Stamp Replication 的基本單位。 stream 對(duì)上層(partition layer)的表現(xiàn)類似于一個(gè)大文件祝迂,僅支持追加寫器净,但可支持隨機(jī)讀。stream 實(shí)際上是若干個(gè)排好序的 extent 指針纠俭,因此可以通過從已存在的 stream 中選取 extent 進(jìn)行組合構(gòu)建新的 stream冤荆。這與 WiscKey 中減小 LSM-tree 寫放大的思路頗為相似眷射。

Stream Layer Architecture

stream layer architechture

從組件構(gòu)成來看妖碉,stream layer 主要包括 Stream Manager (SM) 和 Extent Node (EN)。

Stream Manager

SM 是一個(gè)標(biāo)準(zhǔn)的 Paxos 集群坐榆,在用戶請(qǐng)求的關(guān)鍵路徑外冗茸,包括以下功能:

  1. namespace 和活躍 stream/extent 的狀態(tài)維護(hù)
  2. 監(jiān)控 EN 的健康狀態(tài)
  3. 創(chuàng)建/分配 extent 到 EN
  4. 惰性執(zhí)行由于硬件故障導(dǎo)致的數(shù)據(jù)再?gòu)?fù)制
  5. 垃圾 extent 回收
  6. 調(diào)度糾刪編碼任務(wù)

當(dāng)任意一個(gè) extent 副本數(shù)少于預(yù)期數(shù)量時(shí)夏漱,SM 會(huì)發(fā)起數(shù)據(jù)的再?gòu)?fù)制,在相同數(shù)據(jù)的副本分布在不同的 fault domain 的原則下屎篱,隨機(jī)選擇 EN 分配新的 extent葵蒂。由于數(shù)據(jù)寫入請(qǐng)求通常需要頻繁地分配新的 block践付,為了避免 SM 成為寫請(qǐng)求的關(guān)鍵路徑,SM 只關(guān)心 stream 和 extent隧土,并不理解 block 這一概念,如此也能夠?qū)?SM 占用的資源限制在一個(gè)較小的范圍內(nèi)关贵。

Extent Node

EN 管理 extent 的副本卖毁,每個(gè) extent 在 EN 上對(duì)應(yīng)的物理形式是一個(gè)文件亥啦,存儲(chǔ)若干個(gè) block 和保存每個(gè) block 對(duì)應(yīng)的文件偏移的 index。EN 在內(nèi)存中保存有其所有的 extent 的副本信息奴拦,這也是構(gòu)成 SM 管理的全局狀態(tài)信息的一部分届吁。EN 與其他節(jié)點(diǎn)通信主要完成兩個(gè)任務(wù):復(fù)制寫操作到數(shù)據(jù)對(duì)應(yīng)的副本疚沐;按照 SM 的指令創(chuàng)建已有數(shù)據(jù)的副本。

Append Operation and Sealed Extent

stream 支持多個(gè) block 以原子操作的形式執(zhí)行 append痴施。若因?yàn)楣收暇苛鳌⒊瑫r(shí)等原因?qū)е驴蛻舳宋词盏綌?shù)據(jù)寫入確認(rèn)芬探,客戶端通常需要進(jìn)行重試操作。而重試操作通常會(huì)導(dǎo)致重復(fù)數(shù)據(jù)條目哩簿。作為 stream layer 的客戶端炎疆,partition layer 針對(duì)不同的數(shù)據(jù)采取不同的處理方式:

  1. 針對(duì) metadata stream 和 commit log stream形入,每個(gè)寫入的記錄會(huì)有一個(gè)唯一的單調(diào)遞增的序號(hào)缝左,這里的 metadata stream 可以理解成是 LSM-tree 中的 manifest 文件,而 commit log stream 則對(duì)應(yīng) LSM-tree 中的 WAL 文件蛇数,可以通過以增量日志的方式保存數(shù)據(jù)耳舅。在重新啟動(dòng)等需要再次加載數(shù)據(jù)的場(chǎng)景下,唯一的序號(hào)可以避免不必要的操作重復(fù)執(zhí)行馏予。
  2. 針對(duì) table 行數(shù)據(jù)和 blob 數(shù)據(jù)流盔性,由于寫入的最小單位是 block冕香,只有最終寫入成功的 block 才會(huì)被引用,之前的重復(fù)寫入由于無任何引用屬于垃圾數(shù)據(jù)突那,會(huì)被 SM 發(fā)現(xiàn)后進(jìn)行垃圾回收焕襟。
    extent 有一個(gè)客戶端指定的目標(biāo)大小鸵赖,超過這一大小后該 extent 就被封存不再接受寫入。新的 extent 將會(huì)被創(chuàng)建并添加到 stream 中饵骨,接收該 stream 的寫入茫打。

Intra-Stamp Replication

Intra-Stamp Replication 是 stream layer 提供的同步復(fù)制機(jī)制老赤,保證數(shù)據(jù)的持久性。該復(fù)制機(jī)制確保數(shù)據(jù)在不同的 fault domain 中有足夠的副本弊予,主要用于避免單個(gè) fault domain 出現(xiàn)的硬件故障开财。由于是同步復(fù)制赠堵,因此該復(fù)制位于用戶寫請(qǐng)求的關(guān)鍵路徑上,任意副本的寫入失敗都會(huì)導(dǎo)致用戶寫請(qǐng)求異常嘀略。
為了實(shí)現(xiàn)對(duì)象級(jí)別的強(qiáng)一致乓诽,Intra-Stamp Replication 提供如下保證:

  1. 一旦數(shù)據(jù)寫入成功并返回,從任意副本均可讀取到一樣的數(shù)據(jù)
  2. 一旦 extent 歸檔后逮壁,從任意副本均只會(huì)讀取到一樣的 extent 內(nèi)容

數(shù)據(jù)復(fù)制流程

全新 stream 創(chuàng)建流程:

  1. SM 為 stream 的第一個(gè) extent 分配3個(gè)副本窥淆,隨機(jī)選擇分布在不同的 fault domain 和 upgrade domain 的機(jī)器巍杈;
  2. SM 選擇某一個(gè)副本作為 primary extent筷畦,用于協(xié)調(diào)數(shù)據(jù)在從節(jié)點(diǎn)的寫入。通常而言吼砂,primary extent 數(shù)量在機(jī)器之間盡量做到均勻以均衡負(fù)載鼎文。在 extent 未歸檔之前拇惋,任何角色的副本位置都不會(huì)改變;
  3. 副本的位置和角色信息以元信息的形式保存在 SM 上蓉坎,并在創(chuàng)建 stream 的請(qǐng)求響應(yīng)中返回給客戶端蛉艾,客戶端將緩存這些信息。如此,可以降低數(shù)據(jù)寫入對(duì)于 SM 的依賴罐监。

數(shù)據(jù)寫入流程:

  1. 客戶端向 primary extent 發(fā)起數(shù)據(jù) append 操作瞒爬;
  2. primary extent 確定新數(shù)據(jù)的寫入位置(offset)侧但,在此過程中可能需要對(duì)并發(fā)的寫入請(qǐng)求進(jìn)行排序;
  3. primary extent 將寫入請(qǐng)求發(fā)送到 secondary 副本屁药;
  4. 當(dāng)所有副本 append 操作成功持久化到磁盤后酿箭,向客戶端返回成功趾娃。所有副本都 commit 成功的 offset 稱之為 current commit length。
    primary extent 在指定后就保持不變妇蛀,而 append 的操作寫入位置和順序由 primary extent 決定评架,且在 append 出現(xiàn)錯(cuò)誤后對(duì) extent 副本進(jìn)行歸檔炕泳,由此我們可以認(rèn)為副本間的數(shù)據(jù)在比特級(jí)別保持一致喊崖。

數(shù)據(jù)寫入失敗處理流程:

  1. 客戶端寫入失敗,此時(shí) extent 副本所在的部分 EN 可能不可達(dá)或發(fā)生磁盤故障茁裙;
  2. 客戶端通知 SM 某個(gè) stream 寫入失斘钭丁;
  3. SM 歸檔發(fā)生故障的當(dāng)前活躍的 extent女轿;
  4. SM 在可用的 EN 上分配新的 extent壕翩,并返回給客戶端放妈;
  5. 客戶端開始在新的 extent 上寫入;
  6. SM 為之前歸檔的 extent 創(chuàng)建新的副本珍策,保證符合期望的數(shù)據(jù)副本數(shù)量攘宙。

extent 歸檔

SM 負(fù)責(zé)所有 extent 的歸檔操作拐迁。一旦歸檔操作完成后唠亚,commit length 不會(huì)再改變。在歸檔過程中祟蚀,SM 需要根據(jù)副本的 commit length 確定最終歸檔的 commit length:

  1. 如果所有副本 commit length 均相等前酿,那么最終 extent 的 commit length 就等于該值
  2. 如果因?yàn)椴糠指北静豢捎脤?dǎo)致 append 錯(cuò)誤鹏溯,從而導(dǎo)致副本 commit length 不完全相等丙挽,SM 選取最小的 commit length 作為最終的 commit length。這里我們簡(jiǎn)單展開一下討論平窘,我們假定最小的 commit length 為 cl0瑰艘,最大的 commit length 為 cl1。由于 Intra-Stamp Replication 是同步復(fù)制均蜜,那么 cl0 和 cl1 之間的數(shù)據(jù)意味著他們只會(huì)在部分副本上 append 成功囤耳,而 pending 在未寫入成功的 extent 上敲董,不會(huì)返回成功給客戶端腋寨。因此化焕,可以選擇 cl0 作為 commit length撒桨,并返回給客戶端已經(jīng)成功寫入的數(shù)據(jù)數(shù)量凤类,讓客戶端根據(jù)部分寫入情況進(jìn)行重試。

歸檔 extent 的糾刪編碼

為降低存儲(chǔ)成本佃延,利用 歸檔 extent 的不變性夷磕,WAS 對(duì)歸檔的 extent 進(jìn)行糾刪編碼坐桩,可將存儲(chǔ)空間占用從3副本的3倍磁盤空間下降到1.3-1.5倍。在一個(gè) stamp 內(nèi)膘螟,更增強(qiáng)了數(shù)據(jù)持久化能力萍鲸。不過應(yīng)當(dāng)看到的是擦俐,經(jīng)過糾刪編碼的數(shù)據(jù)讀取時(shí)的開銷相對(duì)于原數(shù)據(jù)更大。在部分延時(shí)敏感的讀場(chǎng)景下品擎,可采取將糾刪編碼后的數(shù)據(jù)進(jìn)行重建得到原數(shù)據(jù)的方式加速訪問备徐,類似于 RocksDB 的 uncompressed block cache 機(jī)制蜜猾。

避免自旋導(dǎo)致 IO 饑餓

HDD 通常傾向于達(dá)到最大吞吐量蹭睡,犧牲調(diào)度的公平性。當(dāng)磁盤應(yīng)付大數(shù)據(jù)量的連續(xù)數(shù)據(jù)讀取時(shí)脊串,其他非連續(xù)數(shù)據(jù)讀取可能會(huì)受到顯著影響琼锋,延時(shí)可能高達(dá)2300ms祟昭。WAS 為了規(guī)避這一問題篡悟,采用了新的磁盤調(diào)度策略保證調(diào)度的公平性恰力。對(duì)于需要面對(duì)多租戶的應(yīng)用場(chǎng)景的云服務(wù)來說,公平性是非常重要的停局。

  1. 當(dāng)有已經(jīng)被調(diào)度的 IO董栽,被調(diào)度之前 pending 時(shí)間超過100ms時(shí)企孩,不再調(diào)度新的 IO 進(jìn)入自旋狀態(tài)勿璃;
  2. 當(dāng)有已經(jīng)被調(diào)度的 IO,被調(diào)度后超過 200ms 未得到響應(yīng)歹撒,不再調(diào)度新的 IO 進(jìn)入自旋狀態(tài)诊胞。

持久化和 journal

WAS 的持久化通過同步復(fù)制寫入到至少3個(gè)位于不同的 fault domain 的副本完成撵孤。為了實(shí)現(xiàn)寫入高性能邪码,使用單獨(dú)的整磁盤作為 journal device。由于 journal 通常是順序?qū)懭敫馊停梢猿浞掷迷O(shè)備的 IO 帶寬。使用高性能的 journal device斧拍,寫入流程可以做如下優(yōu)化:

  1. 寫入所有待 append 的數(shù)據(jù)到 journal device肆汹,同時(shí)在 cache 中緩存數(shù)據(jù)副本予权。當(dāng)寫入 journal device 完成后扫腺,即可返回寫入成功。在數(shù)據(jù)盤寫入成功前攒至,用戶對(duì)于這部分的數(shù)據(jù)讀取請(qǐng)求都由 cache 負(fù)責(zé)迫吐;
  2. 提交待 append 的數(shù)據(jù)到數(shù)據(jù)盤的寫入隊(duì)列中志膀,由于 journal device 是順序?qū)懀覕?shù)據(jù)盤的性能通常會(huì)差一些奇颠,數(shù)據(jù)盤的寫入請(qǐng)求通常需要排隊(duì)等待烈拒。數(shù)據(jù)落盤成功后荆几,數(shù)據(jù)請(qǐng)求則可交由磁盤負(fù)責(zé)赊时。

采用單獨(dú)的 journal device 是一個(gè)簡(jiǎn)單粗暴的提升性能的方法吨铸,可根據(jù) journal 的數(shù)據(jù)寫入特點(diǎn),選擇適用的專門設(shè)備祖秒。

Partition Layer

Partition Layer 主要提供數(shù)據(jù)類型抽象诞吱、數(shù)據(jù)類型對(duì)應(yīng)的操作、可擴(kuò)展的 namespace竭缝、對(duì)象訪問的負(fù)載均衡以及對(duì)象訪問的事務(wù)排序和強(qiáng)一致性房维。

Partition Layer Architecture

Partition Layer Architecture

Partition Manger (PM)

PM 負(fù)責(zé)將 Object Table 劃分為若干個(gè) RangePartition,分配到 PS 中抬纸,并將 RangePartition 與 PS 的對(duì)應(yīng)關(guān)系記錄在 Partition Map Table 中。PM 保證每個(gè) RangePartition 只會(huì)分配給一個(gè) PS湿故,并 RangePartition 相互之間不會(huì)重疊阿趁。PM 是一個(gè)有多個(gè)實(shí)例的無狀態(tài)的服務(wù),通過 Lock Service 選擇主節(jié)點(diǎn)坛猪,在任期內(nèi)負(fù)責(zé) partition layer 的管控脖阵。

Partition Server (PS)

PS 負(fù)責(zé)響應(yīng)若干個(gè) RangePartition 的請(qǐng)求∈裕基于 Lock Service 的 lease 機(jī)制命黔,在任意時(shí)刻只會(huì)有一個(gè) PS 為一個(gè) RangePartition 服務(wù)。

當(dāng)出現(xiàn) PS 不可用時(shí)躁锁,該 PS 負(fù)責(zé)的所有 RangePartition 會(huì)被 PM 遷移到其他的 PS 上纷铣,在這過程中會(huì)考慮 PS 的負(fù)載情況。

RangePartition 數(shù)據(jù)結(jié)構(gòu)

RangePartition 數(shù)據(jù)結(jié)構(gòu)

每個(gè) RangePartition 可以看作是一個(gè) LSM-tree 數(shù)據(jù)結(jié)構(gòu)战转,可以方便地使用 RocksDB 的概念來進(jìn)行類比搜立。

  1. metadata stream:記錄 commit log 和 data stream 信息。當(dāng)發(fā)生 split 和 merge 操作時(shí)槐秧,metadata stream 也要相應(yīng)更新啄踊。作用類似于 RocksDB 的 manifest 文件忧设。
  2. commit log stream: 記錄最近的 checkpoint 以來的操作日志。作用類似于 RocksDB 的 WAL 文件颠通。
  3. row data stream:保存已經(jīng)持久化的數(shù)據(jù)和索引址晕。作用類似于 RocksDB 的 SST(Sorted Strings Table) 文件。
  4. blob data stream:專用于 blob table 數(shù)據(jù)存儲(chǔ)顿锰。
  5. memory table: commit log stream 的內(nèi)存鏡像谨垃。一個(gè)查詢通常會(huì)先查詢 memory table,再查詢 data stream硼控。
  6. index cache: 緩存持久化的 index 數(shù)據(jù)刘陶,與 row data cache 獨(dú)立是為了盡可能多地緩存 index。作用類似于 RocksDB 的 table cache牢撼。
  7. row data cache: row data page 的緩存匙隔,由于 row data stream 是只讀的,所以不需要考慮數(shù)據(jù)更新熏版,只需考慮數(shù)據(jù)的淘汰纷责。類似于 RocksDB 的 block cache,可以有 LRU撼短、Clock 等淘汰策略再膳。

數(shù)據(jù)流

RangePartition 的與常規(guī)的 LSM-tree 需要特別指出的是,在 blob data 這種單個(gè) value 較大的的場(chǎng)景阔加,為了避免 commit log stream 和 data stream 的重復(fù)寫饵史,在寫入過程中只執(zhí)行 commit log stream 的寫入满钟,只在 data stream 中記錄相應(yīng)的 commit log stream 的指針胜榔。在 checkpoint 過程中,通過對(duì) commit log stream 底層的 extent 進(jìn)行重組得到最終的 blob data stream湃番。

RangePartition 負(fù)載均衡

PM 會(huì)出于負(fù)載均衡的目的執(zhí)行以下3種操作:

  1. Load Balence:根據(jù) PS 負(fù)載情況夭织,對(duì) RangePartition 進(jìn)行再分配
  2. Split:對(duì)負(fù)載過重的單個(gè) RangePartition 進(jìn)行拆分
  3. Mege:對(duì)負(fù)載較輕的相鄰的 RangePartition 進(jìn)行合并

Load Balance

評(píng)估 RangePartition 的負(fù)載情況主要通過以下幾個(gè)指標(biāo):

  1. transaction/second
  2. transaction 平均掛起時(shí)間
  3. 限速速率
  4. CPU 使用率
  5. 網(wǎng)絡(luò)使用率
  6. 請(qǐng)求延遲
  7. 磁盤數(shù)據(jù)大小
    PM 維護(hù)與每個(gè) PS 的心跳信息,RangePartition 的負(fù)載情況在心跳信息中反饋給 PM吠撮。若 PM 發(fā)現(xiàn)某個(gè) RangePartition 負(fù)載過高時(shí)尊惰,PM 會(huì)對(duì) RangePartition 進(jìn)行 split 操作;當(dāng) PM 發(fā)現(xiàn)某個(gè) PS 負(fù)載過高時(shí)泥兰,PM 會(huì)發(fā)起 RangePartition 遷移弄屡。

Split Operation

PM 根據(jù) RangePartition 的負(fù)載和 data stream 的數(shù)據(jù)量決定是否執(zhí)行 split 操作,split 操作最重要的就是選擇 key ( AcountName + PartitionName):

  1. 基于 data stream 數(shù)據(jù)量的 split鞋诗,PM 選擇使得可以使得 RangePartition 被近似切分成兩等份的 key膀捷;
  2. 基于負(fù)載的 split,PS 動(dòng)態(tài)統(tǒng)計(jì)負(fù)載最重的 key 區(qū)間削彬,并以此來選擇切分的 key全庸。
    split 的流程如下:
  3. PM 命令 PS 對(duì) RangeParitiion B 執(zhí)行 split 操作秀仲,分為 C 和 D;
  4. 負(fù)責(zé) B 的 PS 執(zhí)行 checkpoint壶笼,然后 B 停止對(duì)外服務(wù)神僵;
  5. PS 為 C 和 D 創(chuàng)建新的 stream。這一步可以很快覆劈,因?yàn)?stream 只是 extent 的指針集合保礼;
  6. PS 恢復(fù) C 和 D 對(duì)外服務(wù);
  7. PS 通知 PM split 完成责语,PM 更新 Partition Map Table 及元信息氓英。通常,PM 會(huì)遷移 C 或 D 到另一個(gè) PS 上鹦筹。

Merge Operation

PM 會(huì)選擇兩個(gè)相鄰的負(fù)載較低的 PartitionName 區(qū)間的 PartitionRange 進(jìn)行合并:

  1. PM 遷移 C 和 D 到相同的 PS 上铝阐,并通知 PS 合并 C 和 D;
  2. PS 為 C 和 D 分別執(zhí)行 checkpoint 操作铐拐,然后停止他們的對(duì)外服務(wù)徘键;
  3. PS 為 E 創(chuàng)建 stream,新的 commit log stream 和 data stream遍蟋,都是按照先 C 后 D 的順序排列 extent吹害;
  4. PS 根據(jù)新的 commit log stream 和 data stream 構(gòu)建新的 metadata stream;
  5. E 重新加載 meta stream虚青,開始對(duì)外提供服務(wù)它呀;
  6. PM 更新 Partition Map Table 及元信息;

Partition Layer Inter-Stamp Replication

對(duì)于每個(gè)賬戶而言棒厘,LS 分配一個(gè) primary stamp 和多個(gè) secondary stamp纵穿。為了實(shí)現(xiàn) 數(shù)據(jù)中心級(jí)別的災(zāi)難恢復(fù),通過 geo-replication奢人,WAS 在一個(gè) account 的不同 stamp 之間執(zhí)行 Inter-Stamp Replication谓媒。Inter-Stamp Replication 是一種異步復(fù)制的機(jī)制,在災(zāi)難恢復(fù)過程中何乎,最近的數(shù)據(jù)可能會(huì)丟失句惯。另外,Inter-Stamp Replication 也可用于數(shù)據(jù)的遷移支救。

后記

WAS 是我完成的第二篇論文閱讀筆記抢野。論文閱讀是一個(gè)費(fèi)時(shí)費(fèi)力的過程。對(duì)于系統(tǒng)設(shè)計(jì)的文章各墨,涉及內(nèi)容多指孤、范圍廣,常驚嘆于頂層設(shè)計(jì)之精妙欲主,時(shí)沉靜細(xì)節(jié)考慮之優(yōu)雅邓厕。由于內(nèi)容較多逝嚎,形成一個(gè)總體意義上的結(jié)論,對(duì)于初出茅廬的我而言還尚有些吃力详恼。因而补君,論文閱讀筆記難免淪為論文翻譯。在本次閱讀過程中昧互,我嘗試了將論文打印下來挽铁,先進(jìn)行部分注解,再來撰寫論文讀書筆記的形式敞掘,相較之前還是有顯著的效果叽掘。

參考文獻(xiàn)

Windows Azure Storage: a highly available cloud storage service with strong consistency
WiscKey: Separating Keys from Values in SSD-Conscious Storage

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玖雁,隨后出現(xiàn)的幾起案子更扁,更是在濱河造成了極大的恐慌,老刑警劉巖赫冬,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓镜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡劲厌,警方通過查閱死者的電腦和手機(jī)膛薛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來补鼻,“玉大人哄啄,你說我怎么就攤上這事》绶叮” “怎么了咨跌?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乌企。 經(jīng)常有香客問我虑润,道長(zhǎng)成玫,這世上最難降的妖魔是什么加酵? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮哭当,結(jié)果婚禮上猪腕,老公的妹妹穿的比我還像新娘。我一直安慰自己钦勘,他們只是感情好陋葡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彻采,像睡著了一般腐缤。 火紅的嫁衣襯著肌膚如雪捌归。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天岭粤,我揣著相機(jī)與錄音惜索,去河邊找鬼。 笑死剃浇,一個(gè)胖子當(dāng)著我的面吹牛巾兆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虎囚,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼角塑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了淘讥?” 一聲冷哼從身側(cè)響起圃伶,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒲列,沒想到半個(gè)月后留攒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉嘀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年炼邀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剪侮。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拭宁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓣俯,到底是詐尸還是另有隱情杰标,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布彩匕,位于F島的核電站腔剂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驼仪。R本人自食惡果不足惜掸犬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绪爸。 院中可真熱鬧湾碎,春花似錦、人聲如沸奠货。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柔滔,卻和暖如春溢陪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睛廊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工嬉愧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喉前。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓没酣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卵迂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裕便,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345