伝え方が9割という本を読んだ。
確かに伝え方を学ぶことで、選択が変わるということがよく理解できる本だった。
さっそく会社で実践してみたら、「めっちゃいいと思う。けどなんか見ているものが大きすぎる」みたいな捉えられ方をしてしまったので、使う場面とかも気にしたほうがよさそう。 ※タイトルは本を読んで得たノウハウをそのままつけた
雑ですが、必要に迫られて作ってみました。
RDS上でMyISAMの暖気がしたかったのです。RDSだとデータディレクトリcatでOSのキャッシュに載せるとかできないからクエリなどでできないか調べつつ作りました。先人の方々で作っていらっしゃる方いないかなと思って調べてたのですが、やはりInnoDBを使われているケースが殆どでMyISAMはなかなか見つかりませんでした。InnoDBの暖気はmysql5.6から簡単になったし本当に最高な感じしかないですね。(※1)
あと久しぶりにgolangを学びも兼ねて書いてみたくなったので、言語はgoを用いました。
以下の2つを実行したら再起動直後のウォームアップとして実行しました。
LOAD INDEX INTO CACHE <table_name>
※2
SELECT * FROM <table_name>
はじめはLOAD INDEX INTO CACHE
だけでいけるのかなと思ったけど、ある程度件数があるデータの場合インデックスを使ったクエリでもデータの読み込みに時間がかかったため、SELECT * FROM <table_name>
を実行しデータがOSキャッシュにのるか試してみました。結果、約3千万レコードあるテーブルで15秒ちょっとかかってたクエリが1秒で返ってくるようになったし、SELECTでもちゃんとのってる感じはする…。
RDSとEC2 on MySQLの場合と2パターンで試したけど、
RDS | EC2 on MySQL | |
---|---|---|
読み込み速度 | 15秒 -> 1秒 | 15秒 -> 0.03秒 |
メモリ | インスタンス作成時と変わらず | cached memoryが2GB増 |
みたいな感じでRDSの方はちょっとどうみたらいいかわからなかった。AWSコンソール上でみれるRDSのメモリは純粋にmysqlで使われるメモリのみなのだろうか。一方MyISAMの場合EC2 on MySQLの方がパフォーマンス的にもメモリの使われ方的にも顕著な感じでした。
簡単先述したクエリ2つのクエリを各テーブルごとにgoroutineとして実行してくれるツールを作りました。使い方などはREADMEをご参照ください。
主にgoで実装するにあたり下記のドキュメント・記事を参考にさせていただきました。ありがとうございました。
※1 MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.13.1.5 再起動を高速化するための InnoDB バッファープールのプリロード
ECSインスタンス立ち上げる時のuserdata内にmackerelのインストール処理を書いたのですが、今後設定変更する時にインスタンス作り直すか、またはECSインスタンス内にsshして設定を変えないといけなかったりなどで、インスタンスの状態を管理するのがイマイチでした。調べたらmackerel-agentのdockerコンテナがあったのでそちら使えばインスタンス上に状態持たなくてよさそうみたいな考えにいたり、ecsのタスク定義の設定方法備忘録書きました。
(といってもdocker runのコマンドをタスク定義の設定に落とし込んだだけ)
適当なタスク名をつける
ここに設定したものがコンテナ内へのマウントポイントとして使える。マウント先は公式のドキュメント通りに指定。
docker hubからimageを取得する場合は下記のスクショのような感じ。tagは適宜変えてください。
2で設定したボリューム設定をコンテナへマウントする
これで設定はおわり。
esc-deployで本番にデプロイすると新旧のタスク分mackerelのグラフに反映されて古いコンテナの項目がしばらく残り続けて不安な気持ちになりますが、公式ドキュメントにもあるように
コンテナを新規に起動すると自動的にグラフに項目が追加され、コンテナを終了すると数時間後に自動的にその項目が見れなくなります。
とのことなので特に心配しないでも良さそうです。
ECSでは状態を持たないdockerコンテナを起動させたりするので、同じく状態を持ちにくく低価格で扱えるスポットインスタンスと相性がいいです。
今回はEC2::SpotFleetをECSで使う方法の備忘録です。
ほぼ公式ドキュメントのまんまですが。
ここから選択
ここで注意しないといけないのはAMIが各リージョン毎にECSに最適化AMIがあるのでそちらを選ぶことです。最適化インスタンスは先程の公式ドキュメントにありますが、tokyo regionだとami-c393d6a4の模様。
ここは特にハマるところないですが、EBS最適化インスタンスを起動するは必要であればチェックしましょう。
ここでユーザデータに下記の設定をいれるとECSのインスタンスとして使えるようになります。your_cluster_name
は登録したいクラスターの名前に書き換えてください。
#!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
IAMインスタンスプロフィールにはAmazonEC2ContainerServiceforEC2Role
がついているものを選びましょう。この権限がないとECSへのインスタンス追加・削除等の権限ないためエラーになりそうです。
またIAMフリートロールはsws-ec2-spot-fleet-role
のままで大丈夫です。
セキュリティグループですが、ALBにぶら下げて動的ポートマッピングをする場合は 32768 - 65535
のポートは空けたものにします。
※2017年2月20日追記
0 - 65535
と記述していましたが、ecsのエフェメラルポートレンジは 32768 - 65535
とご指摘いただいたので修正致しました。
ref.
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html
ここはご都合に合わせた設定で
これでいけるかと思います。あとはSpotInstanceの入札が完了してインスタンスが起動したらECSに追加されるはずです。
おわり!
ESCへの自動デプロイの設定をやったのでその備忘録です。ecrにリポジトリを作って、コンソール上から手動プロイできる状態まではできている前提で話します。
ますcircleciのwebコンソールのtarget-project -> settings -> Environment Variables
にデプロイに必要な環境変数を設定します。
以上の4つを設定します。
公式ドキュメントと大体同じです。
自分はとりあえずビルド・デプロイをしたかっただけなので下記のようにしました。
machine: services: - docker dependencies: post: - docker build -t test-app . deployment: prod: branch: master commands: - ./deploy.sh
実際に本番で使う時は公式ドキュメント同様にtestは入れたほうが良さそうです。
デプロイ処理はecs-deployにまかせています。 自分でデプロイ処理書くのは骨が折れそうなので、OSSでメンテ(されていく|できる)ものを使いました。
#!/bin/sh set -ex eval $(aws ecr get-login --region ${AWS_DEFAULT_REGION}) docker tag test-app:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/test-app:latest docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/test-app:latest ./docker/ecs-deploy -c ap -n test-app -i $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/test-app:latest
こんな感じです。
作ったばかりでまだ問題点とかはこれからでてきそうだけど、とりあえずこれでデプロイできるところまで行けました。
先日、DevLOVEというエンジニアの外部の勉強会で「越境」をテーマに初めて30min セッションでトークをしてきた。
詳しい内容は会社のブログで書くのでここは書かないが、勉強会に登壇した思いだけ残したい。
この半年の自分の目標として、「アウトプットしていく」という課題があった。アウトプットというと少し抽象的だが、自分がやろうとおもったアウトプットは「OSS活動を頑張る」、「ブログ、勉強会等でやっていることを出していく」ということを主に掲げていた。そんな中、CTO経由で「勉強会登壇の話があるんだけどどうかな?」というありがたいお話を頂いた。その時期は少し忙しく、うーーーんと迷ったのだが、目標にもかがけてるし、せっかく頂いた有難いお話なので、全力で乗っかるかという気持ちで「やります!」と答えた。
やってみて結局資料の作成もギリギリになってしまったけど、イメージした形に近い発表はできたし、その会場で他の方の様々な学びある発表を聞けたので今となっては良かったと思う。 発表の前とか緊張するし、不安な気持ちはあったのだけれど、自分が話したことが誰かのためになるならいいやという心境で、悔いなく話すよう努められた。
また余談だが発表の時間配分もうまくいったし、質問もたくさん出たので、初めての登壇にしては発表はそこそこうまくできたのではないだろうか。
とまあ、振り返りとしてはこんな感じ。 目標を目指すべきところとしておいておくだけでなく、しっかり実現していけるように軽いフットワークで今後も頑張っていきたい。
ポエムになってしまったけどそんな気持ち。