Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ヌーラボが Mackerel に移行した3つの理由

ヌーラボが Mackerel に移行した3つの理由

Presentation Slides at Mackerel Meetup#2 Tokyo http://mackerelio.connpass.com/event/8458/

株式会社ヌーラボ

September 24, 2014
Tweet

More Decks by 株式会社ヌーラボ

Other Decks in Technology

Transcript

  1. インフラ運⽤用体制の変更更 •  アプリ開発者が基本的なインフラ作業も担う体制へ •  インフラ全般を⾒見見るスタッフは基本仕組みづくりに注⼒力力 Backlog Cacoo Typetalk Nulab  Account

    開発 Backlog  の開発 チームが担当 Cacoo  の開発 チームが担当 Typetalk  の開発 チームが担当 Nulab  Account  の 開発チームが担当 インフラ 構築 インフラ 運⽤用 インフラ 全体改善 インフラ全般を⾒見見るスタッフが担当 以 前 は 数 ⼈人 で こ こ を す べ て ⾒見見 て い た
  2. 実際やってみたところ •  構築系の作業 •  Ansible  /  Fabric  などの導⼊入で⾃自動化を推進 •  概ね構築系はできるようになった

    •  運⽤用系の作業 •  リリースなどの定型化したものは◦ •  トラブルシューティングなど定型化しにくい ものに課題はまだある •  モニタリングの重要性なども共有しきれてな いものも
  3. モニタリングツール 外部からの死活監視 サービス AWS  (RDS,  ELB,  etc…) EC2 CloudWatch AWS

     の各種リソースの監視 OS  やミドルウェア のリソース監視 内部の導通監視 傾向監視 mon
  4. 1.  インストール、運⽤用が簡単 •  依存ライブラリ問題 •  ライブラリの競合 •  バージョンアップ問題 •  プラグイン動かなくなる

    •  構成変更更時のマスター設定 •  serf  とか使えばできるけれども •  ノード増えるとマスターの負荷があがる
  5. Mackerel  なら •  1バイナリなので依存関係に悩まない •  マスターの管理理の必要がそもそもない $ ldd -r /usr/local/bin/mackerel-agent

    not a dynamic executable $ yum deplist mackerel-agent Loaded plugins: priorities, update-motd, upgrade-helper package: mackerel-agent.noarch 0.12.2-3 dependency: /bin/sh provider: bash.x86_64 4.1.2-15.17.amzn1 dependency: /sbin/chkconfig provider: chkconfig.x86_64 1.3.49.3-2.10.amzn1 dependency: /sbin/service provider: initscripts.x86_64 9.03.40-2.29.amzn1
  6. JVMのモニタリング値の取得 •  jstat •  簡単、⼿手軽 •  バッチで⼀一気に値を取りにくい •  JMX • 

    ミドルウェアの値なども取れる •  起動オプションの設定が必要 •  取得側は基本  Java  で書く •  どっちも沢⼭山実⾏行行すると結構重い
  7. 設定と実⾏行行例例 -javaagent:/usr/java/jolokia/jolokia-jvm-1.2.0- agent.jar=discoveryEnabled=false $ curl -s -o - -X POST

    -d '{"type":"read","mbean":"java.lang:name=PS Scavenge,type=GarbageCollector","attribute":"CollectionCount"}' http://localhost:8778/jolokia/ | jq . { "value": 62143, "request": { "type": "read", "attribute": "CollectionCount", "mbean": "java.lang:name=PS Scavenge,type=GarbageCollector" }, "status": 200, "timestamp": 1411542268 }
  8. プラグインでの実⾏行行 $ sudo ./jvm7_gccount_ps.py jvm7_gccount_ps.young 4 1411547309 jvm7_gccount_ps.old 0 1411547309

    mackerel-‐‑‒ agent カスタム プラグイン mackerel.io 1.  プラグイン呼び出し  (/etc/mackerel-‐‑‒agent/mackerel-‐‑‒agent.conf  ) 2.  sensu  形式での出⼒力力 3.  API  経由でメトリクスを登録
  9. 設定例例 http://qiita.com/tksmd/items/1212331a5a18afe520df <match raw.nginx> type datacounter count_interval 1m count_key status

    input_tag_remove_prefix access tag nginx.status outcast_unmatched yes # patternX: X(1-20) pattern1 2xx ^2\d\d$ pattern2 3xx ^3\d\d$ pattern3 4xx ^4\d\d$ pattern4 5xx ^5\d\d$ </match> <match nginx.status> type mackerel api_key <あなたの API キー> hostid_path /var/lib/mackerel-agent/id metrics_name http_status.${out_key} out_keys nginx_2xx_count,nginx_3xx_count,nginx_4xx_count,nginx_5xx_count </match>
  10. •  通知先の  room  をサービス毎に切切り替え if alert && host state =

    if alert.isOpen then "Open" else "Closed" role = host.roles[0] + service = role.fullname.split(/:/)[0] + switch service + when “Backlogtool”,“Backlog” then room = aaa + when "Cacoo" then room = bbb + when "Typetalk" then room = ccc + when “" then room = ddd + else room = eee msg = "[Mackerel] #{state} #{alert.status}: #{alert.monitorName} at #{host.name} (#{host.status}) #{role.fullname} #{alert.url}" robot.messageRoom room, msg