Netflix Data Benchmark:雲數據存儲基準測試
Netflix 已經擁有了超過 83000000 名遍布全球的會員,他們使用著數千個多樣的微服務。這些服務由多個團隊分別負責,每個服務有自己的構建和發布周期,服務產生的複雜多樣的數據被存儲在不同類型的數據存儲系統中。雲數據工程團隊(CDE)負責管理數據存儲系統,他們通過運行基準測試來驗證這些系統的更新、進行容量規劃,還會在不同的失敗場景下和多種工作負載下測試我們的雲實例。我們希望有這樣一個工具,它可以評估和比較在市場上或開源領域出現的新的數據存儲系統的性能特徵和缺陷,可以預估它們是否可以用在相關的產品中。有了以上需求,創作了 Netflix Data Benchmark(NDBench),一個用於各種數據存儲系統的可插拔雲端基準測試工具。NDBench 為我們使用的各種主要的數據存儲系統提供了插件支持,包括 Cassandra(Thrift 和 CQL)、Dynomite(Redis)和 Elasticsearch。它也可以被擴展連接其他客戶端的 API。
簡介
由於 Netflix 運行著數以千計的微服務,工程師並不是總能感知到在我們的後端系統中捆綁的微服務可能產生的流量。了解後端系統中的新的微服務的潛在性能同樣是個困難的任務。所以我們需要一個框架,它可以協助工程師,在不同的工作負載、維護操作和示例類型的情形下幫助我們決定數據存儲系統的行為。我們想要在不同的工作負載和在一些例如節點失敗、網路分區等的情況下及時地動態配置它們、橫向(通過添加節點)或縱向(通過更新實例的類型)地動態擴展它們和操作它們。
如今,出現在市場上的新的數據存儲系統,趨向於只是基於經過優化的硬體和基準測試配置來報告「好看的」的性能數字。作為一個雲原生的數據團隊,希望能夠確認我們的系統可以在多種故障場景中提供高可用的服務,同時做到以最佳方式使用實例資源。有很多其他因素會影響部署在雲端的資料庫的性能,例如實例的類型、負載模式和部署的類型(孤立和全局)。NDBench 可以通過模擬性能基準測試來提供幫助,原理是通過模仿數個生產用例。
還有一些額外的需求,例如,由於升級了數據存儲系統(比如升級 Cassandra),團隊希望在部署系統到生產環境之前進行一次系統測試。對於那些開發的內部系統,例如 Dynomite,我們希望功能測試流程能夠自動化,在多種條件和不同存儲引擎下了解 Dynomite 的性能。因此,我們需要一個可以集成到之前的流水線的負載生成器來將 AWS AMI 轉變為一個生產完備的 AMI。
在調研了各種基準測試工具之後,包括基於 REST 的性能工具,我們發現一些工具只是擁有我們需求的子集,對達到以下目標的工具有興趣:
在測試過程中動態調整基準測試配置,這樣才能和我們的生產環境的微服務一起進行測試。
集成到平台雲服務,例如動態配置、發現、權值等等。
運行無限時長,這樣才能引入故障場景來測試長時間運行的維護,例如資料庫維修。
提供插拔模式和負載,
支持不同客戶端的 API。
從單一入口部署、管理和監控多個實例。
基於以上這些原因,Netflix 創造了 Netflix Data Benchmar(NDBench)。我們將 NDBench 引入到了 Netflix 的開源生態系統中,將它集成到了一些組件中,例如作為配置工具的 Archaius、用來度量指標的 Spectator和作為發現服務的Eureka。
NDBench 的架構
下面的圖表展示了 NDBench 的架構。主要由三個組件構成:
Core:負載生成器
API:允許基於 NDBench 開發多種插件
WEB:UI 和 servlet 上下文監聽器
目前為止,NDBench 提供了如下幾種客戶端插件—— Datastax Java Driver(CQL)、C* Astyanax(Thrift)、Elasticsearch API 和 Dyno(Jedis support)。 也可添加其他插件,或者用戶可以使用如 Groovy 這樣的動態語言來添加新的工作負載。每個驅動都是一個驅動插件介面的實現。
NDBench-Core 是 NDBench 的核心組件,用戶可以通過它調整負載設置。
圖1:NDBench 架構
NDBench 可以通過命令行(使用 REST 調用)或基於 WEB 的 UI 來操作。
NDBench Runner UI
圖2:NDBench Runner UI
圖2是 NDBench Runner UI 的截圖。通過這個 UI,用戶可以選擇集群、連接驅動、修改設置、設置一個負載測試模式(隨機或滑動窗口),然後運行負載測試。在負載測試運行時選擇一個實例,用戶同樣可以看到實時更新的數據統計,例如讀寫延遲、每秒請求數、緩存命中率等等。
負載參數
NDBench 提供了大量輸入參數,它們會被動態載入並可以在工作負載測試運行中動態修改。下列參數可以基於每個節點進行配置:
numKeys:用於存儲隨機生成鍵的樣本空間
numValues:用於存儲隨機生成值的樣本空間
dataSize: 每個值的大小
** numWriters/numReaders**:每個 NDBench 節點的寫/讀線程數
writeRateLimit/readRateLimit:每秒寫/讀數
userVariableDataSize:控制開關隨機生成負載功能的布爾值
工作負載的類型
NDBench 能夠進行可插拔的負載測試。目前它有兩種模式——隨機流量和滑動窗口流量。滑動窗口測試是一個更加精細的測試,它可以並發地使用在窗口中的重複數據,從而提供時間本地數據和空間本地數據的組合數據。尤其是當我們想要同時測試數據存儲系統提供的緩存層和磁碟的 IOPS(每秒輸入/輸出操作數)時,它非常重要。
負載的生成
可以單獨為應用的每個節點生成負載,也可以同時為所有節點生成讀寫操作。更妙的是,NDBench 提供了使用「回填」特性的能力,因此我們可以使用熱數據才啟動負載測試。這幫我們減少了基準測試的爬升時間。
Netflix 使用 NDBench
NDBench 在 Netflix 內部已經被廣泛使用了。在接下來的一節里,我們來討論下能夠證明 NDBench 是個有用的工具的用例。
基準測試工具
幾個月前,我們將 Cassandra 從 2.0 遷移到了 2.1。遷移之前,我們想要知道能將性能提升多少,在升級我們的 Cassandra 實例期間性能會下降到什麼地步。圖 3 和圖 4 展示了 p99 和 p95 使用了 NDBench 前後讀操作延遲的變化。在圖 3 中,我們高亮顯示了 Cassandra 2.0(藍色線條) 和 2.1(棕色線條) 不同的部分。
圖3:記錄 Cassandra 的 OPS 和 延遲百分比
去年,我們將 Cassandra 實例從老舊的 Red Hat 5.10 操作系統遷移到了 Ubuntu 14.04(值得信賴的塔爾羊)。我們使用 NDBench 來在新操作系統中測試性能。在圖 4 中,我們使用了 NDBench 的長時間運行基準測試的能力展示了遷移過程的三個階段。用 Cassandra 實例的滾動終端在新的操作系統中更新 AMI,使用 NDBench 來驗證在遷移期間不會受到客戶端的影響。NDBench 同時也允許我們驗證了遷移後的新系統性能更好。
*圖4:從 Red Hat 5.10 升級到 Ubuntu 14.04 後的性能提升
AMI 認證過程
NDBench 同時也是 Netflix 的 AMI 認證過程的一部分,AMI 認證包括集成測試和部署驗證。團隊使用 SPinnaker 設計了流程,並將 NDBench 集成到其中。下圖展示了 bakery-to-release 的生命周期。開始時我們使用 Cassandra 烘焙了一個 AMI,創建了一個 Cassandra 集群,創建了一個 NDBench 集群,進行配置,啟動一個性能測試。最後我們檢查了結果,做出了需不需要將「實驗性」的 AMI 提升為「候選者」的決定。對於 Dynomite,團隊使用了相同的流程,使用不同的客戶端 API 測試了重複功能。通過 NDBench 性能測試意味著 AMI 已經可以在生產環境中使用了。類似的流程在 Netflix 的其他的數據存儲系統中也被採用。
圖5:NDBench 與 Spinnaker 流水線集成
過去,Netflix 團隊發布了使用 Dynomite 的基準測試,這個測試利用 Redis 作為存儲引擎,由 NDBench 完成。在圖 6 中,展示了從 Dynomite 的 NDBench 測試中獲得的一些高延遲百分比。
圖6:NDBench 的一致性設置為 DC_QUORUM 時 Dynomite P99 延遲
NDBench 允許工程師進行無限期測試來識別內部開發的長時間運行應用可能存在的內存泄漏。同時,在集成測試中,我們引入了錯誤條件,改變系統中的基本參數,引入了 CPU 密集運算(比如修正/和解),和確定了基於應用需求的最優性能。最後,Netflix 的其他應用例如 Priam、Dynomite-manager 和 Raigad 進行了各種各樣的操作,例如多線程備份到對象存儲系統。我們想要確認,通過集成測試,數據存儲系統的性能不會受到影響。
結論
在過去幾年中,和 AMI 驗證一樣,NDBench 在功能測試、集成測試和性能測試中被廣泛使用。在測試過程中改變負載模式的能力、支持不同客戶端的 API 和與我們的雲部署進行集成在驗證我們的數據存儲系統的過程中極大地幫助了我們。將來我們希望 NDBench 在幾個方面有提升,這樣既能提高可用性也能支持其他特性。我們將會去實現的幾個特性包括:
性能報告管理
自動 cannary 分析
基於目的地模式的動態負載生成
在 Netflix 的雲資料庫工程團隊中,NDBench 已經被證明了非常有用,Netflix 也很高興能有機會分享其中的價值。因此,Netflix 開源了 NDBench 項目,並希望能夠收到來自開源社區的反饋、想法和貢獻。
推薦閱讀:
※如何評價美劇「十三個原因」(Thirteen Reasons Why)?
※如何看待對 Netflix 的新定價?
※《黑鏡》第三季第二集到底哪些是遊戲哪些是現實,男主真的掛了?
※《黑鏡》S4E3「鱷魚」:沒有灰色地帶的黑白世界