Hello Clojure - Jepsen

3709 ワード

Jepsenは分散型テストライブラリであり、分散型システムに対して一連の操作を実行し、最終的にこれらの操作が正しく実行されているかどうかを検証することができます.
Jepsenは多くの分散システムの検証に成功し、mysql-cluster、zookeeper、elasticsearchなど、関連システムのテストコードをソースコードに見ることができます.
なぜjepsenを研究するのか、主に分布式データベースtidbのテストを行う必要があり、自分で分布式テストフレームワークを書くのは難しいし、分布式環境の下で自分のテストフレームワークが正しいかどうか保証できないので、既成のテストフレームワークを使用して、検証されたテストフレームワークが現段階で最も良い選択であることを発見しました.
Jepsenはclojureを使用して開発されたので、これは私がclojureを学ぶ理由ですが、何日も勉強したのに、コードがあまり読めず、ゆっくりと模索するしかありません.

Design


Jepsenのテストは、関連するclojureプログラムを1つのcontrol node上で実行することによって行われ、control nodeはsshを使用して関連するシステムnode(jepsenはdb nodeと呼ばれています)にログインしていくつかのテスト操作を行います.
分散システムが起動すると、control nodeは多くのプロセスを起動し、各プロセスは特定のclientを使用して分散システムにアクセスできます.1つのgeneratorは、プロセスごとに一連の操作を生成し、実行させます.各操作はhistoryに記録されます.操作を実行すると同時に、別のnemesisプロセスは、iptableを使用してネットワーク接続を切断するなど、この分散システムを破壊しようとします.
最後に、すべての操作が実行されると、jepsenはcheckerを使用してhistoryの検証を分析し、関連するレポートを生成します.
以上から,jepsenの設計原理は実は簡単で,分布式システムに対して一連の操作を実行し,同時にシステムを破壊し続け,最後に操作の結果を検証することによって分布式システム全体の頑丈性を検証することである.

Install


Jepsenのインストールは簡単なことではありません.control node、5つのdb nodeが必要です.幸いなことに、dockerがあります.dockerはdocker in docker技術をサポートしているので、5つのdockerを実行するのに便利です.
Jepsenはすでに関連するdocker imageを提供しており、直接使用することができます.
docker run --privileged -t -i tjake/jepsen

しかし、時には自分のcaseをテストする必要があるので、volumnのサポートを提供する必要があります.そこで、私は少し修正して、カスタムdockerを使用しました.
FROM tjake/jepsen

RUN mkdir /jepsen_dev
VOLUME /jepsen_dev

ADD ./bashrc /root/.bashrc

起動時に、自分のtest case mountをdockerに入れることができ、使いやすく、docker buildを使用して構築することができます.
docker build -t jepsen_dev .

Example test


jepsenのdocker環境を構築した後、簡単にテストすることができます.そのドキュメントを参照して、jepsen 0.0.6バージョンを使用してmeowdbのプロジェクトを構築し、meowdb_test.cljには次のコードが書かれています.
(ns jepsen.meowdb-test
  (:require [clojure.test :refer :all]
            [jepsen.core :refer [run!]]
            [jepsen.meowdb :as meowdb]))

(def version
  "What meowdb version should we test?"
  "1.2.3")

(deftest basic-test
  (is (:valid? (:results (run! (meowdb/basic-test version))))))

そしてmeowdbでcljの中:
(ns jepsen.meowdb
  "Tests for MeowDB"
  (:require [clojure.tools.logging :refer :all]
            [clojure.core.reducers :as r]
            [clojure.java.io :as io]
            [clojure.string :as str]
            [clojure.pprint :refer [pprint]]
            [knossos.op :as op]
            [jepsen [client :as client]
                    [core :as jepsen]
                    [db :as db]
                    [tests :as tests]
                    [control :as c :refer [|]]
                    [checker :as checker]
                    [nemesis :as nemesis]
                    [generator :as gen]
                    [util :refer [timeout meh]]]
            [jepsen.control.util :as cu]
            [jepsen.control.net :as cn]
            [jepsen.os.debian :as debian]))
            
(defn basic-test
  "A simple test of MeowDB's safety."
  [version]
  tests/noop-test)

dockerを起動します.
docker run --privileged -t -i -v meowdb:/jepsen_dev --name jepsen jepsen_dev

その後、lein testを実行し、予期せぬことがなければ、次のような結果を出力します.
INFO  jepsen.store - Wrote /jepsen_dev/meowdb/store/noop/20151211T094940.000Z/history.txt
INFO  jepsen.store - Wrote /jepsen_dev/meowdb/store/noop/20151211T094940.000Z/results.edn
INFO  jepsen.core - Everything looks good! ヽ(‘ー`)ノ

{:valid? true,
 :linearizable-prefix [],
 :worlds ({:model {}, :fixed [], :pending #{}, :index 0})}
 
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.

ここではjepsenの簡単な紹介にすぎませんが、tidbに早く使えるように、後でよく研究する必要があります.