Jepsen
Jepsen是一個clojure庫。它使用 Jepsen 庫建立一個分佈式系統,對該系統運行一系列操作,並驗證這些操作的歷史是否符合要求。Jepsen可以被用來驗證很多系統,例如最終一致的交換數據庫、可線性化的協調系統、分佈式任務調度器等等。
設計簡介
一個jepsen測試程序是開辟一個control node,並在這個node上運行的,測試程序遠程訪問數據庫節點。
當程序開始運行的時候,control node會創建一些單線程的進程,每個進程充當訪問系統的一個用戶,由generator為每個進程生成操作序列(一系列的invocation事件),然後這些進程以用戶訪問系統的形式並發地執行操作。每個操作的結果會存在系統的日志中。與此同時,一個特殊的nemesis進程會註入錯誤。
運行結束後,讀取系統的日志信息,jepsen使用checker去分析測試的history(由invocation事件和response事件構成),生成錯誤報告等。test,history,result都會生成到store/<test-name>/<date>/目錄下保存。
如何編寫一個jepsen測試程序 && jepsen測試流程
jepsen庫是基於clojure,一個函數式編程語言,在寫測試程序之前需要對clojure有一定的瞭解,這裡推薦兩個學習資源,Clojure From the Ground Up是一個從配置clojure環境開始的教程,clojure doc是一個方便查詢的文檔。
jepsen客戶端
由於jepsen測試是創建多個客戶端登錄到待測系統,因此首先要定義客戶端類型(這裡以etcd的測試客戶端為例):
(ns jepsen.etcdemo
(:require [clojure.tools.logging :refer :all]
[clojure.string :as str]
[verschlimmbesserung.core :as v]
[jepsen [cli :as cli]
[client :as client]
[control :as c]
[db :as db]
[tests :as tests]]
[jepsen.control.util :as cu]
[jepsen.os.debian :as debian]))
...
(defrecord Client [conn]
client/Client
(open! [this test node]
this)
(setup! [this test])
(invoke! [_ test op])
(teardown! [this test])
(close! [_ test]))