Elasticsearch が応答しなくなった #AWS #Elasticsearch

概要

  • Amazon Elasticsearch Service で、Elasticsearch が突然死んでしまった
  • 復旧方法が分からないので、結局別ドメインで作り直した

原因は結局わからないままだったので備忘録です。 想定される原因や、強制的に再起動する方法があったら教えてほしいです。。

何が置きたか

ある日突然エンドポイントの応答がなくなった

502 Bad Gateway だった気もするが、記憶があやふや。 Timeout だったかもしれない。

Web アプリケーションから Elasticsearch を呼び出していたが、アプリケーションとしては 60秒のタイムアウトでレスポンスが帰っていた。

原因の調査

マネージメントコンソールから確認すると、ドメインのステータスは「アクティブ」になっており、問題無さそうに見えた。

エラーログを確認してみると下記のような感じのログが吐かれていた。

[2019-XX-XXTXX:XX:XX,XXX][WARN ][o.e.m.j.JvmGcMonitorService] [XXXXXX] [gc][XXXXXX] overhead, spent [2.1s] collecting in the last [2.1s]

似たようなログが何度か吐かれた後、静かになっている。

Cloudwatch やらでメトリクスを確認すると、上記のログが最初に吐かれる 12h ほど前から突然取得できなくなっていた。

落ちる前と比べて、何かが跳ねるなどの目立つ傾向も見受けられなかった。

また、特定のリソースが落ちる前から逼迫しているということもなかった。

※最大メモリ使用率だけは90%越えをしているタイミングはあったが、落ちる前だけに限定した現象ではなかった

対応

エラーログの内容で調べてみると、Elasticsearch 関連の情報がいくつか引っかかった。

「メモリの割当サイズを増やして再起動する」ということだったが、Elasticsearch Service を手動で再起動する方法が見つけられなかった。

そのため、インスタンスサイズの変更を試してみることにした。

しかし、ドメインのステータスが「処理中」になったまま 24h 以上変化がなかった。

下記の記事を見つけたりもしたのだが、そもそも curl が 502 になって帰ってこない。

aws.amazon.com

結局復旧は諦め、別ドメインで同じ構成のインスタンスを用意して、そちらを利用することにした。

ただの想像

  • 開発用だったということもあり、インデックスの全件更新などを高頻度で実施していた
  • サイジングなどのチューニングは行っておらず、デフォルトのまま利用していた

上記のようなことから何かしらの問題が発生したのかとは思いつつ、復旧しなかったことなど含め原因はよくわからない。

参考

brew services に慣れていない

docker で 9000番ポート使おうとしたら他が使っていると怒られた。

なんだろうと思って調べてみると php-fpm が使っていた。

$ lsof -i:9000 -P

起動したっけな、と思いながら無邪気に kill したけど再起動が走り止められない。。

自動で何か仕込んでたかな、と色々調べたところ、 brew services で動いていた。

$ brew services stop php
$ brew services list

使用頻度が低いと、パッと思い浮かばず時間を浪費してしまう。。

参考

リリースしたらレゴを組み立てている

僕らはリリースするたびレゴを組み立てている。

それを「リリースレゴ」って呼んでいる。

リリースレゴとは

レゴブロックをリリースの度に組み立てる。

ざっくり、下記のようなルール。

  • 1案件を Production にリリースするたび、組み立て手順を1進める
    • 1リリースで2案件対応している場合は2進める
    • バグ対応も1案件とカウントする
  • 毎日夕会の後にその日のリリース案件を確認する
    • リリースがあったら夕会の後に「リリースの儀」としてレゴを組み立てる
    • 記念写真を取る 📸

バグレゴ にヒントを得たプラクティスとして始めた。

なぜやるのか

それっぽくいうなら、 Output (の積み上げ)の可視化のため。

例えば試行錯誤フェーズのプロダクトだったり、トラブル対応が重なっているときなんかは、日々忙しいけれども、自分たちの達成していることに実感を失いがちだと思う。

なので、「達成」や「実績」ということを、なんならちょっと楽しいイベントとして可視化しようという試み。

ここから始まって

f:id:su-kun1899:20190923204404p:plain
ただの板

こんな感じになり

f:id:su-kun1899:20190923204621j:plain
箱?

だんだん大きくなって

f:id:su-kun1899:20190923204647j:plain
なにかの形に

完成!(だいぶ早送りですが)

f:id:su-kun1899:20190923204710j:plain
じゃーん!

すでに小さいものは2作目が完成し、現在3作目の制作が始まっている。

他のチームでも始めたところがあるみたい。

退職に伴い今のチームは離れてしまうのだが、新しいチームでも似たようなことができるといいな。

「ここだから話せるVPoEの現場」に参加した #kiitok_meetup

kiitok.connpass.com

最近また「人・組織」方面の関心度が高まってきて、面白そうだったので参加してみた。

年齢制限があったけど、ギリギリセーフ笑

参加して考えたこと

VPoE になる人というのは、VPoE になろうとしたわけではない気がした。

たぶん自分の仕事領域にあまりこだわらず、ボトルネックを探して改善するタイプの人が、チームや組織を改善しようとした結果、その役割になっていただけなんじゃなかろうか。

優秀な人が集まってもハイパフォーマンスが出るとは限らないとは思っており、そこに再現性をもたせる役割だったり仕組みづくりを責務とする人がいた方がいいような気はする。

その一方で、「技術者としての貯金を切り崩している感覚がある」という話だったり、VPoE 自体の評価のあり方であったり、ともすると VPoE そのものは魅力のない役割にも見える。

それでも、もし素晴らしい VPoE がいたとしたら、それだけで組織が(中からも外からも)魅力的なものになるんじゃないかなぁ、とは思った。

自分がやりたいかは別だけど。*1

*1:重要なのに魅力的に見えない仕事というのは、主に評価のあり方が定まってないことに起因している気がする

CircleCI をローカルで動かそうとしたら image が pull できない #circleci

問題

CircleCI をローカルで動かそうとしたら、なんかエラーになって動かない

$ circleci build すると下記のエラーメッセージが出る。

Error: Could not find picard image: failed to pull latest docker image: exit status 1

解決策

メールアドレスでログインしていたのが問題らしい。

一度 docker をログアウトして、ユーザーIDでログインし直すと解決した。

メモ

公式で image のタグを確認して見たけど間違っていなそうだったので

circleci.com

辿っていったら下記のIssue に行き着いた。

github.com

「docker のログインをメールアドレスじゃなくて ユーザーID でやれ」 ということらしい。

確かにメールアドレスでログインしていたので、一度ログアウトしてユーザーIDでログインし直すと成功した。

ちなみに Docker for Mac の話です。

関連

su-kun1899.hatenablog.com

バッチ処理を作るときに考えていること

バッチ処理を作る必要があるときに、考えているようなことをまとめておく。

はじめに

バッチは機能の実現方式であって、機能そのものではないと思っている。

なので、バッチ処理は単独で考えるものではないというのが前提。

とはいえバッチという手段を選んだ場合に、その手段故に考えておいたほうがいいことがあるのは確か。

思いつくままに

バッチ処理固有ではないものもあるけど、思いつくままに列挙しておく。

  • 実行周期
    • 日次とか月次とか
    • 手動とか(リランや任意のタイミングでの実行とか)
  • 実行タイミング
    • 夜間とか早朝とか
  • 処理時間
    • 始まってから終わるまでどれくらいかかるか?
  • 負荷
    • 特に他システムとの兼ね合い
      • オンラインでも使ってるDBを見に行くとか
      • API コール数の制限とか
  • 並列度
    • 並列実行させるか(できればさせたくないが)
      • させるなら同期をどうやって実現させるか
  • 処理件数
  • リラン設計
    • 失敗時どうするか
    • デプロイやメンテナンス等で意図的に止めたい場合どうするか
    • 冪等なども観点に含める
    • 動かなかったときに、何が起こるか?
      • 後続ジョブやオペレーション
  • リトライ設計
    • 自動で何度かリトライするか
  • 通知
    • エラー等の通知方法やレベル
  • ログ設計
  • テスト設計
    • 限界はあるが、できるだけ容易にテストや動作確認ができるように
      • データ用意のコスト
      • 任意タイミングでの実行
      • パラメータを任意に変更できるように
      • etc

参考

wyukawa.hatenablog.com

Mac に Virtual Box がインストールできない

概要

Macクリーンインストールして、VirtualBoxを入れようとしたらエラーになってしまった。

brew でも、ダウンロードしたインストーラでもだめ。

installer: The install failed (エラーによってインストールできませんでした。ソフトウェアの製造元に問い合わせてください。)

みたいなことを言われてしまう。

システム整合性保護(System Integrity Protection: SIP)を一時的に無効化してやるとインストールできた。

Macリカバリーモードで起動

起動時に Cmd + R を押し続けるとリカバリーモードで起動する

SIP の無効化

[ユーティリティ] -> [ターミナル] でターミナルを開き、無効化するコマンドを打つ。

# csrutil disable

コマンドを打ったあと、Mac を再起動する。

VirtualBox のインストール

brew で入るようになった。

$ brew cask install virtualbox

SIP の有効化

再びリカバリーモードで起動して、もとに戻しておく。

# csrutil enable

参考