Aurora MySQLのローカルストレージ不足で事故ったログ

日次でDB内のとあるテーブルのデータ全件をBigQueryに同期するバッチがあって
RDS for MySQLからデータをselectしていたが、先日Aurora MySQL(5.6.10)に移行した直後から急にバッチがこけはじめた。

原因調査

バッチは使用しているMySQLクライアントの設定値(3600秒)に従ってタイムアウトし落ちていた。

バッチの実行時間帯のCloud Watchメトリクスを確認してみると
AuroraのCPU使用率が30分間ほど平常値から外れて高くなっていた。

しかしバッチを実行しているEC2のネットワークインプットメトリックは特に変動がなく、Auroraからselectした結果を受け取れてなさそうなことも同時にわかった。

DBへの接続がタイムアウトするまでに1時間かかっているのに、selectによるCPU負荷が30分程度しか上昇していないので
クエリが何らかの理由で異常終了している可能性を疑い始める。

続きを読む

Netflix製のjsonシリアライザgem fast_jsonapiを試す

先日OpenAPIのスキーマからRubyのクラスを自動生成するgemを作りました。

OpenAPIのschema定義からRubyのクラスを生成するgem「openapi2ruby」をつくりました - Start Today Technologies TECH BLOG

このgemを作って自動生成しようとしたのがActiveModel::Serializer(AMS)のシリアライザで
他にも自動生成できるものがないか調べていたときに、ちょっと前に話題になったNetflixのgemを見つけたので使ってみることに。

github.com

なんでも

serialization time is at least 25 times faster than Active Model Serializers on up to current benchmark of 1000 records.

らしい。速い。

続きを読む

ふるさと納税で届いたシマアジを刺身とだし茶漬けにして食べました

こないだのスーパーセールで買ったふるさと納税シマアジが届きました。

美味しんぼ 4話 「活きた魚」でおなじみのシマアジ
この回を見て以来、シマアジを見ると食べずにはいられない体になってしまった。

続きを読む

誕生日から年齢を計算するhappybirthday gemをリリースしました

happybirthday | RubyGems.org | your community gem host

使い方は以下の通り

require 'happybirthday'

birthday = Happybirthday.born_on('2000-01-01')
birthday.age.years_old
# => 18
続きを読む

Dockerでデータ入りのMySQLボリュームイメージをつくる

普段お仕事でRailsアプリケーションを作ってて、今はチーム内共通のMySQLサーバーをみんなが参照している。
これをDocker化してうまくみんなにイメージを配布したかった。

前職ではMySQLにデータが投入済みのDockerイメージを作成して、コマンド一発でデータが入った状態のMySQLコンテナが立ち上がるようになっていたので、そのやり方を元同僚に聞いて再現してみることにした。

構成

docker-composeを使って

  • 公式のMySQLコンテナ
  • volume用コンテナ

の2つを立ち上げて利用する。

流れ

まずはデータ入りDockerイメージ作成

  • 公式MySQLイメージからコンテナを立ち上げてdumpデータ投入
  • データ入りのファイルをホストに/var/lib/mysql以下をコピー
  • 新規でホストからコンテナに↑の手順でコピーしてきたデータをCOPYするDockerfileを作成
  • docker buildすれば出来上がり

続いてデータ入りのイメージから、データ投入済みMySQLコンテナを立ち上げる

  • さっき docker buildしたimageを起動
  • ↑で起動したコンテナをvolume指定して、公式MySQLイメージからMySQLコンテナを起動

順を追って詳細説明していきます。

データ入りDockerイメージ作成

公式イメージからMySQLコンテナの起動
起動したらDB作成とデータ投入

$ docker run -d --name db -e 'MYSQL_ALLOW_EMPTY_PASSWORD=yes' -p 3306:3306 mysql:latest

データ入りのファイルをホストにコピー

$ mkdir -p ./data/var/lib
$ docker cp db:/var/lib/mysql ./data/var/lib

Dockerfileの作成

FROM busybox
RUN mkdir -p /var/lib/mysql
COPY data/var/lib/mysql /var/lib/mysql
RUN chown -R 999:999 /var/lib/mysql
VOLUME /var/lib/mysql
CMD tail -f /dev/null

最後に

$ docker build .

データ投入済みMySQLコンテナを立ち上げる

docker-compose.ymlをつくって $ docker-compose up

version: '2'
services:
  db-storage:
    image: {さっきつくったdocker image}
    volumes:
      - /var/lib/mysql
  db:
    image: mysql:latest
    ports:
      - 3306:3306
    volumes_from:
      - db-storage

storage用のimageをDockerHubなどのレジストリにpushしておけば、他の開発者はプロジェクトのリポジトリをcloneして docker-compose upするだけでデータ入りのDBが即座に立ち上がる。

雑感

最初これを作ろうとしたとき VOLUME指定をするとimageにデータが保存されなくて困っていたところ、元同僚から「Dockerfileの中でVOLUMEを指定する前に追加したデータはimageに含まれるんですよ」というアドバイスをもらい無事に実現できたのでありがとうありがとうという感じ。

とりあえずやりたいことは実現できたが、微妙にやり切れてないのがdocker-compose.ymlをversion: 3で書くことで、version3から volumes_fromが消えていてうまく書けなかったりしている。

ちょうど趣味プロジェクトでまあまあのデータ量のDBを扱うアプリケーションを作ろうとしていたので、Docker化をして友達の開発者とかに「こんな感じで動くよ」ってすぐに見せられて便利。
Docker imageにでっかいデータをのっけることの筋が良い悪い話はいったん置いといてください。

github.com

「現場で役立つシステム設計の原則」を読んだ

この記事を書いたあたりから、よりDDDについて知りたくなって追加で読み始めた本

takanamito.hateblo.jp

業務におけるプログラミングでオブジェクト指向を実践するにはどうすればよいかを、ここまで具体的に書いてくれてる本は初めてだったので読んでよかった。

  • 1章からいきなりドメインオブジェクトの軽い説明と例示
  • 3章ではドメインロジックをドメインオブジェクトに抽出していく説明
  • 4章ではさらにその手前の、業務フローからドメインオブジェクトを見つけていく手法と、ドメインオブジェクトの育て方
  • 少し飛んで8章ではドメインオブジェクトとAPIレスポンスをどう対応させるかについて

この辺の話が印象に残っていて
特に4章の「ドメインオブジェクトの見つけ方」にかかれていた「業務の関心事の3分類 ヒト・モノ・コト」の話に関しては
普段自分が仕事で要件や仕様を整理する時に意識していたことが言語化されていて感動した上に
そこで整理したドメイン知識やロジックをいかにドメインオブジェクトとして表現するのかについて、DDDでいうとこの戦術的なアプローチが紹介されていて学びがあった。

またDDDの文脈からは少し外れるけど
7章では画面とドメインオブジェクトの設計をどう連動させるかの話の中で、複雑な画面のデータを表現するドメインオブジェクトを作るのではなく
ドメインオブジェクトに合わせて画面を分割/分解する手法が紹介されていたのもよかった。

技術的なアプローチではなく、そもそもの画面仕様を変更することを検討する内容で
同じような場面に遭遇する気がするのでその時に使えそう。

また4,9章ではそれぞれドメインモデルを見つける/伝えるにあたって必要な資料や図、ドキュメントについて
何が必要なのかが詳細に書かれていて、こちらは1年目に読んでると精度高くプログラム以外の資産も残せたんだろうなーと思える内容だった。

DDDを通じてオブジェクト指向を実現するためのテクニックや手法の解説

業務でアプリケーションを開発をする上で必要な勘所

の2つを解説してくれている、とても実践的な本でした。おすすめ。