アリババの超すごいカオス実験実装ツール【カオスブレード】

Chaosbladeとは何ですか?

Chaosbladeは、Chaos Engineeringの原則に従う実験ツールであり、模拟常见的故障场景改善に役立てるために使用されます分布式系统的可恢复性和对故障的容错性

Chaosbladeは、Alibabaのほぼ10年間の故障テストとドリルの実践に基づいており、グループのさまざまなビジネスの最高のアイデアと実践を組み合わせています。

現在サポートされているドリルシナリオがあります操作系统类的 CPU、磁盘、进程、网络,Java 应用类的 Dubbo、MySQL、Servlet 和自定义类方法延迟或抛异常等以及杀容器、杀 Pod,具体可执行 blade create -h 查看

さて、上記の紹介はChaosbladeのgithubホームページからコピーされています。

githubホームページアドレス:https://github.com/chaosblade-io/chaosblade/blob/master/README_CN.md

率直に言って、Chaosbladeは、サーバーのCPUがいっぱい、ディスクがいっぱい、ネットワークが遅い、Dubboのサービスの応答時間が長い、jvmのメソッドが例外をスローする、Mysqlの呼び出しが遅いなどをシミュレートできる障害シミュレーションツールです。したがって、このツールは、システムの高い可用性と安定性を確保するためにさまざまな障害を事前にシミュレートできるため、大企業にとって非常に便利です。

Chaosbladeの使い方は?

使用法は非常に簡単で、2つのステップに分かれています。

  • 圧縮されたパッケージをダウンロードして解凍します:https://github.com/chaosblade-io/chaosblade/releases
  • 解凍されたファイルにはブレード実行可能ファイルがあります。これはChaosbladeが提供するクライアントツールです。主にこのツールを障害シミュレーションに使用します。

ブレードのさまざまなパラメータの詳細な説明については、githubのホームページにアクセスして確認してください。ここでは紹介しません。主に、障害シミュレーションの具体的な使用法と効果を示します。

次に、Chaosbladeの6つの使用シナリオを紹介します。

  • シミュレートされたサーバーのCPUがいっぱいです
  • シミュレートされたサーバーディスクがいっぱいです
  • Dubboサービスタイムアウトの呼び出しをシミュレートする
  • JVMでメソッドをシミュレートして、例外をスローするか、メソッドの戻り値を変更します
  • 呼び出しMysqlのタイムアウトまたは例外をシミュレートする
  • シミュレートされたサーバーネットワークは遅い

シナリオ1:サーバーのCPUがいっぱいです

フォールトドリル前のシステムのcpuステータスは、top -o CPUコマンドを直接使用して以下を表示します。

Chaosblade:Aliの超素晴らしいカオス実験実装ツール

フォールトドリルを実行します。

$ ./blade create cpu fullload
{"code":200,"success":true,"result":"a0682a98d0d7d900"}

コマンドが実行後に正常に戻った場合は、フォールトドリルが成功したことを証明し、top -o CPUコマンド
Chaosblade:Aliの超素晴らしいカオス実験実装ツール
を確認します。結果から、Chaosbladeがcpuをいっぱいにして、サーバーのcpuがいっぱいになるようにする必要があることがわかります。

シナリオ2:サーバーディスクがいっぱいです

フルディスクをシミュレートする場合、実際には特定のフォルダーに大きなファイルを生成するだけでよいので、ここに/ bladediskフォルダーを作成します。

失敗ドリルの前の/ bladediskフォルダーのサイズは次のとおりです。

$ du -sh /bladedisk/
  0B    /bladedisk/

フォールトドリルを実行し、次のコマンドを実行します。

./blade create disk fill -d --mount-point /bladedisk --size 1024

通常の状況では、chaos_filldisk.log.datファイルが/ bladediskフォルダーに作成されます。このファイルのサイズは1024バイトです。

通常の状況では、Max OXシステムを使用しているため、上記のコマンドを実行するとエラーが報告されると言うのはなぜですか。特定のエラーがgithubの問題に送信されました。関心のある人は、問題のアドレスに注意を払うことができます。
事実:問題を提出するとき、私は中国語を使用しましたが、それは非常に強力なchaosblade-botによって自動的に英語に翻訳されました。

その後、ご使用のシステムでお試しいただけます。この問題が解決したら、記事を更新して追加します。Chaosbladeがこのシナリオと対応する原理をシミュレートできることを知っておく必要があるだけです。

シナリオ3:Dubboサービスの呼び出しがタイムアウトしました

公式ウェブサイトのデモは私たちに以下を提供します:

  • ダボプロバイダー
  • ダボ-消費者

上記のサービスプロバイダーとサービスコンシューマーのjarパッケージをダウンロードした後、ダウンロードディレクトリに移動し、次のコマンドで実行します。

#启动 dubbo-provider
nohup java -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-provider -jar dubbo-provider-1.0-SNAPSHOT.jar > provider.nohup.log 2>&1 &
#稍等 2 秒,然后启动 dubbo-consumer
nohup java -Dserver.port=8080 -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-consumer -jar dubbo-consumer-1.0-SNAPSHOT.jar > consumer.nohup.log 2>&1 &
nohup是linux中的命令,可以让java命令后台运行。

実行後、次のコマンドを使用してサービスを呼び出すことができます。

http://localhost:8080/hello?msg=world

通常の状況では、リクエストはすぐに完了して返されます。

{
"date": "Wed Jul 03 16:33:10 CST 2019",
"msg": "Dubbo Service: Hello world"
}

フォールトドリルを実行します。

$ ./blade prepare jvm --process dubbo.consumer
{"code":200,"success":true,"result":"5cdbc31f46a3d621"}
$ ./blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --consumer --process dubbo.consumer
{"code":200,"success":true,"result":"3e705e8babe8a86c"}

上記のコマンドにより、消費者はcom.alibaba.demo.HelloServiceサービスのhelloメソッドを呼び出すときに3秒の遅延を追加します。上記のパスを訪れると、以前より少し長く待ちます。

ダボでフォールトドリルを実行する場合、ダボにはコンシューマーとプロバイダーの2つの役割があるため、実際には多くの細分化シナリオがサポートされています。コンシューマーがプロバイダーに電話をかけているときに、このリクエストの遅延を増やしたいと考えています。どちらでもかまいません。プロバイダー側​​は指定されたサービスの遅延を増やし、コンシューマーが呼び出すときに指定されたサービスを遅らせることもできるので、上記のコマンドを見ることができます。実際にはコンシューマーによって制御され、コマンドはプロバイダー側​​でもサポートされています。制御されて、次のコマンドを実行します。

blade create dubbo delay --help

ヘルプに次の情報が表示されます。

Flags:
      --appname string          The consumer or provider application name
      --consumer                To tag consumer role experiment.
      --effect-count string     The count of chaos experiment in effect
      --effect-percent string   The percent of chaos experiment in effect
  -h, --help                    help for delay
      --methodname string       The method name
      --offset string           delay offset for the time
      --process string          Application process name
      --provider                To tag provider experiment
      --service string          The service interface
      --time string             delay time (required)
      --timeout string          set timeout for experiment
      --version string          the service version

その中--consumer和--providerで、サービスコールの両端をコマンドで制御できることを意味します。したがって、プロバイダー側​​を制御し、呼び出されたときにインターフェイスをタイムアウトさせたい場合は、フォールトドリルを実行することは完全に可能です。

基本的な原則については、Dubboをよりよく理解する必要があります。Dubboには動的構成機能があるため、ChaosbladeもDubboの動的構成機能を使用する必要があります。

シナリオ4:JVMのメソッドが例外をスローするか、メソッドの戻り値を変更します

Chaosbladeは、jvmのメソッドの直接操作をサポートして、例外をスローしたり、戻り値を変更したりします。

まず、MockJvmクラスを準備します。

package com;
import java.util.concurrent.TimeUnit;
public class MockJvm {
    public String test() {
        return "test...";
    }

    public static void main(String[] args) throws InterruptedException {
        MockJvm testJVM = new MockJvm();

        while (true) {
            try {
                System.out.println(testJVM.test());
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            TimeUnit.SECONDS.sleep(3);
        }
    }
}

このクラスは、3秒ごとにテストメソッドを呼び出し、メソッドの戻り値を出力し并且在捕获test方法所抛出的异常进行打印,test方法默认返回"test"ます。このクラスを実行して、このクラスを実行し続けます。正常に実行されている場合、コンソールは次のように出力します。

test...
test...
test...
test...

メソッドは例外をスローします

$ ./blade prepare jvm --process MockJvm
{"code":200,"success":true,"result":"5ff98509d2334906"}
$ ./blade create jvm throwCustomException --process MockJvm --classname com.MockJvm --methodname test --exception java.lang.Exception
{"code":200,"success":true,"result":"f9052478db2f7ffc"}

上記のコマンドは、MockJvmプロセスの下のcom.MockJvmクラスのテストメソッドがjava.lang.Exceptionをスローすることをシミュレートします。このコマンドが正常に実行されると、上記で実行していたコードコンソールは例外をスローします。

test...
test...
test...
chaosblade-mock-exception
chaosblade-mock-exception

次のコマンドを使用して、シーンシミュレーションを今すぐ中止します。

./blade destroy f9052478db2f7ffc // f9052478db2f7ffc。

撤回後、コンソールは通常の印刷を再開します。

chaosblade-mock-exception
chaosblade-mock-exception
chaosblade-mock-exception
chaosblade-mock-exception
test...
test...

メソッド
の戻り値を変更するメソッドの戻り値を変更するには、次のコマンドを使用します。

$ ./blade create jvm return --process MockJvm --classname com.MockJvm --methodname test --value hahaha...
{"code":200,"success":true,"result":"9ffce12b1fdc2580"}

コンソールが印刷されます:

test...
test...
test...
hahaha...
hahaha...
hahaha...

テストメソッドの戻り値が正常に変更されたことがわかります。

シナリオ5:Mysqlの呼び出しがタイムアウトまたは異常

Chaosbladeは現在、ステートメントの実行時にMysqlタイムアウトまたは例外を呼び出すなどのMysqlシナリオをサポートしています。ただし、JDBCレベルで制御されており、実際にはmysqlサーバーを制御していません。

ここでは、最初にJDBCを使用してテストクラスを記述します。

package com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

public class JDBCConnection {
    public static String url_encrypt="jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
    public static String user="root";
    public static String password="Nice89163";

    public static void main(String[] args) throws Exception
    {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn  = DriverManager.getConnection(url_encrypt,user,password);
        Statement stmt= conn.createStatement();

        while (true) {
            try {
                LocalDateTime before = LocalDateTime.now();
                ResultSet rs = stmt.executeQuery("select * from t_test");
                LocalDateTime after = LocalDateTime.now();
                System.out.println("执行时间:" + (after.getSecond() - before.getSecond()));
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            TimeUnit.SECONDS.sleep(3);
        }

    }
}

このJDBCConnectionクラスは、JDBCを直接使用してSQLを実行し、mysql-connector-javaに対応するjarに依存します。ここで、テスト中に[email protected]バージョンを使用すると障害シミュレーションを正常に実行でき、mysql-connector-java @ 8.0.15バージョンを使用すると通常の障害シミュレーションを実行できないことがわかりました。具体的な理由まだチェックしていません。

このテストの機能は、選択クエリを実行することです。選択中に例外がスローされた場合、例外がキャッチされて出力され、選択ステートメントの実行にかかる時間も計算されます。

上記のクラスを最初に実行すると、コンソールは常に次のように出力されます。

执行时间:0
执行时间:0
执行时间:0

Mysqlを呼び出すと例外がスローされます

次のコマンドを実行して、障害シミュレーションを開始します。

$ ./blade prepare jvm --process JDBCConnection
{"code":200,"success":true,"result":"f278e66ddb1b4e11"}
$ ./blade create mysql throwCustomException --database test --host 127.0.0.1 --port 3306 --process JDBCConnection --sqltype select --table t_test --exception java.lang.Exception
{"code":200,"success":true,"result":"ddd6799da50f9201"}

コマンドが正常に実行されると、コンソールは例外を出力します。

执行时间:0
执行时间:0
执行时间:0
Unexpected exception encountered during query.
Unexpected exception encountered during query.

次のコマンドを使用して、シーンシミュレーションを今すぐ中止します。

./blade destroy ddd6799da50f9201 

撤回後、コンソールは通常の印刷を再開します。

Unexpected exception encountered during query.
Unexpected exception encountered during query.
Unexpected exception encountered during query.
执行时间:0
执行时间:0

Mysqlを呼び出して待ち時間を増やします

次のコマンドを直接使用すると、selectを実行するときに4秒の遅延が増加します。すべてJDBCレイヤーで制御されることに注意してください。

$ ./blade create mysql delay --database test --host 127.0.0.1 --port 3306 --process JDBCConnection --sqltype select --table t_test --time 4000
{"code":200,"success":true,"result":"8e5b35e76098caab"}

コマンドが実行されると、コンソールは次のように出力します。

执行时间:0
执行时间:0
执行时间:4
执行时间:4
执行时间:4

シナリオ6:サーバーネットワークが遅い

Chaosbladeはネットワークを制御することもできます。たとえば、次のコマンドを実行して、eth0ネットワークカードを介したネットワーク遅延を3秒に制限します。

./blade create network delay --interface eth0 --time 3000

ただし、Macシステムは実際にはLinuxシステムでtc(Traffic Control)コマンドを使用するため、このシナリオをサポートしていません。したがって、シミュレートする場合は、Linuxシステムを使用する必要があります。ここではシミュレートしません。

総括する

この記事を通して、誰もがカオ​​スブレードの役割と機能を理解する必要があると思います。何か違う意見があれば、コメントセクションで議論してください。

おすすめ

転載: blog.csdn.net/Javayinlei/article/details/109383346