Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

カオスエンジニアリング入門〜ChaosBladeの紹介〜

681 views

Published on

2019/10/09 Alieaters #13で発表した資料
Alibaba Cloud Developers Meetup #13

Published in: Technology
  • Be the first to comment

  • Be the first to like this

カオスエンジニアリング入門〜ChaosBladeの紹介〜

  1. 1. カオスエンジニアリング⼊⾨ 〜ChaosBladeの紹介〜 2019/10/09 AliEaters#13 渡辺 信秀
  2. 2. ⾃⼰紹介 渡辺 信秀 インフラエンジニア 中国への在住経験は3年 • #9 Alibaba CloudのCENで⾼速・安定した VPC通信を実現しよう! • #10 ⿅班というパブリックベータサービスを 使ってみた • #12 未来ホテルと天猫精灵 AliEaters発表歴
  3. 3. Apsara Conference速報? • 既にQiitaにレポートは書いた • Apsara Conference 2019 参加レポート • 4⼈⽬だし、話かぶらないようにするのむずい
  4. 4. Alibabaのオープンソースの話をしよう! OceanBase Alipayの決済を⽀える凄い分散データベース 中国建設銀⾏など、他の⾦融系でも採⽤されている ChaosBlade カオスエンジニアリングツール
  5. 5. [速報] Alibaba CloudにOceanBase登場 • 2019.09.24パブリックベータ開始(※ 但し、中国アカウントのみ) • https://cn.aliyun.com/product/news/detail?id=14424
  6. 6. OceanBaseはオープンソース…だった? • GitHubはバージョン0.4(更新が無い) • バージョン2.1が最新? • 公式サイトはバージョン1.4 https://oceanbase.alipay.com/download/resource https://github.com/alibaba/oceanbase
  7. 7. ChaosBladeはGitHubで更新されている https://github.com/chaosblade-io/chaosblade
  8. 8. Todayʼs Topic 1. カオスエンジニアリングについて 2. Alibabaのカオスエンジニアリングについて 3. ChaosBladeについて 4. ChaosBladeを使ってみた 5. まとめ
  9. 9. 1.カオスエンジニアリングに ついて
  10. 10. 1-1. カオスエンジニアリングについて • カオスエンジニアリングとは、全世界に動画配信サービスを提供するNetflixが導⼊した ことで注⽬されるようになった⼿法で、「本番稼働中のサービスにあえて擬似的な障害を 起こすことで、実際の障害にもちゃんと耐えられるようにしよう」という取り組みです。 • カオスエンジニアリングは、マイクロサービスやサービスメッシュなどのモダンなシス テムアーキテクチャにおいて、これから主流になっていくであろう障害対策のひとつです。 • ※ カオスなのは「分散システムの振るまい」であり、意図的に起こされる障害はコント ロールされたものです。 [引⽤元]カオスエンジニアリングと聞いてカオスになった⼈必⾒ https://qiita.com/naokiiiii/items/de20997a70922c01f754
  11. 11. 1-2. 私のしていた誤解 Øランダムにサーバを停⽌し続け、サービスが正常に動くか確認 し続けるのがカオスエンジニアリング サーバ サーバ サーバ サーバ サーバ サーバ サーバ そんな単純ではない。 サーバ全体の停⽌以外の障害や、⼀部のマイクロサービスの障害・遅延などが全体に与える影響を測 るためにしっかり計画する必要がある。 適当に停⽌適当に停⽌
  12. 12. NetflixがChaosMonky開発開始 2010 NetflixがChaosMonkyをGitHub公開 2012 Gremlin創業 2016 CNCFのLandscapeにChaos Engineeringが追加 2018 Cloud Native Computing Foundation コンテナとか推進している業界団体 SaaS型のカオスエンジニアリングサービスを展開 1-3. カオスエンジニアリングの歴史
  13. 13. 1-4. CNCF Landscape https://landscape.cncf.io/
  14. 14. 2. Alibabaのカオスエンジ ニアリングについて
  15. 15. 2-1. Alibabaのカオスエンジニアリング https://blog.csdn.net/wwd0501/article/details/100741122 ChaosBladeはAlibaba CloudのAHASの基礎となっている Alibaba Cloudのアプリケーション可⽤性改善サービス Alibaba社内で利⽤している障害訓練プラットフォーム Alibabaが開発しているカオスエンジニアリングツール
  16. 16. 2-2. Alibaba CloudのAHAS • AHAS(Application High Availability Service、应⽤用⾼高可⽤用服务) • ※ 但し、中国アカウントのみ A SaaS-based service that aims to improve the high availability of your applications. Application High Availability Service features automatic application architecture discovery, high availability assessment following principles of chaos engineering, application traffic control, and service fallback. This service enables you to enhance application availability in a quick and cost-efficient way アプリケーションの⾼可⽤性を改善することを⽬的としたSaaSベースのサービス。 Application High Availability Serviceは、アプリケーションアーキテクチャの⾃動検出、カオスエンジニアリ ングの原則に従った⾼可⽤性評価、アプリケーショントラフィック制御、およびサービスフォー ルバックを特⻑としています。このサービスにより、アプリケーションの可⽤性を迅速かつコス ト効率の⾼い⽅法で強化できます。 [Google翻訳] https://www.alibabacloud.com/products/ahas
  17. 17. 2-3. AHASの設定画⾯
  18. 18. 3. ChaosBladeについて
  19. 19. 3-1. ChaosBladeについて nAlibabaのオープンソースのカオスエンジニアリングツール nGo⾔語で実装 nGitHubで公開 https://github.com/chaosblade-io/chaosblade nCLI(blade createコマンド)でサーバに実験(experiment)を注⼊できる nREST APIが最新版(v0.3)でサポートされた
  20. 20. 3-2. 利⽤イメージ 管理ツールがChaosBladeをコントロール docker、kubernetes、Linux、Java等 の実験をする
  21. 21. 3-3. blade createコマンドの概要 blade createのSub-command experiment cplus delay、modify(変数の修正)、return(戻り値の指定) cpu fullload(CPU100%) disk burn(Read/WriteのIO消費)、fill(マウントポイントに指定容量を書きこむ) docker cpu,disk,network,process,remove,script ※ containerに対し実⾏ druid connectionpoolfull dubbo delay, threadpoolfull, throwCustomException jvm outOfMemoryError, cpufullload, delay, return, script, throwCustomException, throwDeclaredException k8s delete ※ containerまたはpodに対し実⾏ mem load network delay,dns,drop,loss process kill,stop psql/mysql/servlet/rocketmq/jedis/http delay, throwCustomException script delay, exit 遅延、Drop、例外発⽣、リソース不⾜ 等をコントロールして引き起こす
  22. 22. 4. ChaosBladeを使ってみた
  23. 23. 4-1. 導⼊ 試し⽅は2通り (https://github.com/chaosblade-io/chaosblade) • [⽅法1] ChaosBladeとJavaアプリの⼊ったDemoコンテナを利⽤する。 ß 今回はこちら • [⽅法2] コンパイルするとbladeバイナリが作成される。 # Demo⽤コンテナイメージを取得 ~$ docker pull registry.cn-hangzhou.aliyuncs.com/chaosblade/chaosblade-demo:latest latest: Pulling from chaosblade/chaosblade-demo Digest: sha256:04e9961ed1544695b4b36107197c082c465026bc06c57b1854c296c723843945 Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/chaosblade/chaosblade-demo:latest # Demo⽤コンテナを起動 ~$ docker run -it registry.cn-hangzhou.aliyuncs.com/chaosblade/chaosblade-demo:latest Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/lib/jvm/java-1.8-openjdk/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. use[ curl http://localhost:8080/dubbo/hello?name=dubbo ]command to request demo You can use blade command to execute a chaos experiment. Please read README.txt first!
  24. 24. 4-2. [実験1] Javaアプリの応答遅延 # Demo⽤コンテナ内のJavaアプリにアクセスしてみる bash-4.4# curl http://localhost:8080/dubbo/hello?name=dubbo Hello dubbo, response from provider: 172.17.0.2:20880 # Javaアプリの実験の準備 bash-4.4# blade prepare jvm --process business {"code":200,"success":true,"result":"b5faeb95ddd9c350"} # sayHelloメソッドを呼び出す際に3秒の遅延を作成する bash-4.4# blade create dubbo delay --time 3000 --service com.example.service.DemoService -- methodname sayHello --consumer {"code":200,"success":true,"result":"353f91d553c2a953"} # 再びJavaアプリにアクセス。1秒でタイムアウト例外が発⽣するようになっていたことがわかる bash-4.4# curl http://localhost:8080/dubbo/hello?name=dubbo chaosblade-mock-TimeoutException,timeout=1000
  25. 25. 4-3. [実験2] Javaアプリの例外発⽣ # Helloメソッドを呼び出した時に例外が発⽣する実験を作成 bash-4.4# blade create jvm throwCustomException --exception java.lang.Exception > --classname com.example.controller.DubboController --methodname hello {"code":200,"success":true,"result":"46328ded024c77ca"} # Javaアプリにアクセス bash-4.4# curl http://localhost:8080/dubbo/hello?name=dubbo <!doctype html><html lang="en"><head><title>HTTP Status 500 ‒ Internal Server Error</title><style type="text/css">h1 {font-family:Tahoma,Arial,sans- serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} h3 {font- family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 500 ‒ Internal Server Error</h1><hr class="line" /><p><b>Type</b> Exception Report</p><p><b>Message</b> Request processing failed; nested exception is java.lang.Exception: chaosblade-mock-exception</p><p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.</p><p><b>Exception</b></p><pre>org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.Exception: chaosblade-mock-exception org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) javax.servlet.http.HttpServlet.service(HttpServlet.java:635) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) (以下省略)
  26. 26. 4-4. [実験3] CPU Full # 30秒間、CPU使⽤率をFullにする bash-4.4# blade create cpu fullload --timeout 30 {"code":200,"success":true,"result":"118eefc4901958fe"} # 確認 bash-4.4# top Mem: 1961208K used, 85836K free, 824K shrd, 69112K buff, 1281764K cached CPU: 100% usr 0% sys 0% nic 0% idle 0% io 0% irq 0% sirq Load average: 0.31 0.09 0.06 8/547 237 PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND 214 1 root R 104m 5% 0 100% /usr/local/chaosblade/bin/chaos_burncpu --nohup --cpu-count 2 17 16 root S 2023m 101% 0 0% /usr/lib/jvm/java-1.8-openjdk/jre/bin/java - Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manage 31 1 root S 2316 0% 1 0% bash 16 1 root S 2312 0% 0 0% bash /usr/local/tomcat/bin/catalina.sh start 1 0 root S 2172 0% 0 0% /bin/bash /root/init.sh 235 1 root S 1584 0% 1 0% /bin/sh -c sleep 30; /usr/local/chaosblade/blade destroy 118eefc4901958fe 237 31 root R 1524 0% 0 0% top 236 235 root S 1516 0% 1 0% sleep 30
  27. 27. 4-5. [実験4] Memory 50%使⽤ # 初期 [root@host01 ~]# free -m total used free shared buff/cache available Mem: 1993 27 1863 0 102 1836 Swap: 0 0 0 # 50%のロード [root@host01 ~]# blade create mem load --mem-percent 50 {"code":200,"success":true,"result":"27ae4c5e4ec307be"} # 確認 [root@host01 ~]# free -m total used free shared buff/cache available Mem: 1993 31 1019 833 942 996 Swap: 0 0 0
  28. 28. 4-4. 状態確認 # 状態確認 bash-4.4# blade status --type create { "code": 200, "success": true, "result": [ { "Uid": "353f91d553c2a953", "Command": "dubbo", "SubCommand": "delay", "Flag": "--consumer true --provider false --time 3000 --debug false --methodname sayHello --help false --service com.example.service.DemoService", "Status": "Success", "Error": "", "CreateTime": "2019-10-06T02:52:46.0538948Z", "UpdateTime": "2019-10-06T02:52:46.0996832Z" }, { "Uid": "46328ded024c77ca", "Command": "jvm", "SubCommand": "throwCustomException", "Flag": "--debug false --methodname hello --classname com.example.controller.DubboController --exception java.lang.Exception --help false", "Status": "Success", "Error": "", "CreateTime": "2019-10-06T03:03:53.2458405Z", "UpdateTime": "2019-10-06T03:03:53.3686945Z" } ] }
  29. 29. 4-6. 実験の削除 # 実験の削除 bash-4.4# blade destroy 353f91d553c2a953 {"code":200,"success":true,"result":"command: dubbo delay --consumer true --provider false --time 3000 --debug false --methodname sayHello --help false --service com.example.service.DemoService, destroy time: 2019-10-06T03:10:52.6086831Z"} bash-4.4# blade destroy 46328ded024c77ca {"code":200,"success":true,"result":"command: jvm throwCustomException --debug false -- methodname hello --classname com.example.controller.DubboController --exception java.lang.Exception --help false"}
  30. 30. 5. まとめ
  31. 31. 5. まとめ 1. カオスエンジニアリングについて学びました。 2. ChaosBladeの機能・使い⽅を学びました。 3. Alibaba Cloudのプロダクトとしては、 OceanBaseもAHASも中国アカウントのみです😂

×