ローカルPCで新しく追加したり、修正加えたテストを実行する時
prove -v t/hoge.t t/fuga.t ...
みたいに普通にやっていたんだけど、 git使ってるし、変更あったファイルをテストするのもっと楽にできるやんって思って
#!/bin/sh git diff --name-only HEAD t/ | xargs prove -v
こんな感じのshell script書いて、dp
ってうったら差分のあったファイルだけテストする感じにしみてた。
便利な気がする
ローカルPCで新しく追加したり、修正加えたテストを実行する時
prove -v t/hoge.t t/fuga.t ...
みたいに普通にやっていたんだけど、 git使ってるし、変更あったファイルをテストするのもっと楽にできるやんって思って
#!/bin/sh git diff --name-only HEAD t/ | xargs prove -v
こんな感じのshell script書いて、dp
ってうったら差分のあったファイルだけテストする感じにしみてた。
便利な気がする
go-irceventでbotを作成しました。 本当は既にあるperlで書かれたbot使えば良かったのだけれども、 どうぜやるならgolangでbot書きたいなって思って勢いで作りました。
何も考えずにgo-ircevent使うとif Aというコマンドの時は
みたいな条件分岐がふえて可読性が悪くなるので、hubのコードを参考にして、commands.go
のCallを呼べばよしなにコマンドに対応するfuncを取ってきて実行するような形を採用しました。
基本的にコマンド特有の色が濃い処理は commands/hoge.go
の中に書いて闇を封じ込めて、処理として切り離せる(使いまわせる)部分はmodels/
以下に書いていくような感じです。
設定情報などはconfig/config.yml
を読み込みにいきますが、外に出したくない情報などを扱いたい場合は、config/config_local.yml
を作ることでそちらの情報を優先して読み込むようにしています。config_local.yml
は.gitignoreに入れているので、まちがってコミットされたりすることもなさそうなので便利😇
以下がソースです。
github.com ※今実装されているコマンドは自分都合でつくったものなので、他の場面ではほぼ使えないとおもいます。
golangっぽい書き方とかわかってないので、ご指摘いただけますと幸いです。
はやくテストかかねば
実装するにあたって以下の記事・プロダクトを参考にさせていただきました。
go-irceventでお手軽IRC bot作成 - Qiita
ありがとうございます🙏
前回の記事でMulti-AZについてふれましたが、その続きです。
今回は自分の整理のために、Multi-AZが設定されている場合と無い場合で 障害が起こった際にどういった復旧手順の違いがでてくるか考察します。
Multi-AZが設定されてないので、一つのAZにのみMaster RDB 1台がある想定です。またその下に2つReadReplicaが並んでいます。 MasterとReadReplicaが1:1だと、ReadReplicaにそこそこ参照系のクエリが飛んでいて、ReadReplicaが落ちた場合に 全てのクエリがMaster 1台に飛んでしまい、Masterも道連れで落ちてしまうため可能性がでるため、ReadReplicaは2台という想定にしています。
ここでMasterのRDSインスタンスの障害で、参照も更新もできない状態になってしまったとします。 ここからの復旧作業だと、おそらく次の手順をする必要があるのかなと思います。
みたいな手順になるかなとおもいます。 実際にそんな障害にあったことないので、正確な手順としては色々かけてそうですが、だいたいこんな感じのことをするのかなという想像。
Multi-AZが設定されていると次のような図になると思います。
設定していない場合との違いは、別のAZにMasterのDBの複製を常に作っています。 もしこの状態で、今のAZまたはRDSインスタンスに障害が起こった場合に、自動的に別のAZにスタンバイしているインスタンスにフェイルオーバーします。 公式ドキュメントによると 1~2 分間完了するらしいです。 また同じRegionにあり、endpointが変わらないのでApp側のRDSの接続設定とか書き換えないでそのまま使えるます。 フェイルオーバー完了までにかかった時間 = ダウンタイムと考えると、Multi-AZを設定していない場合と比較してかなりはやく復旧できそうです。 手順でいうと
ぐらいで、こちらでするのはReadReplicaを作成し直す作業かな。
以上がMulti-AZを設定していない場合としていた場合の大きな違いになると思います。 ただMulti-AZ配置にするとやっぱり2つインスタンス立ててる状態になるので、料金も高かった。 費用対効果を考えて、使うかどうか判断しないとですね。
記事を書くにあたって色々調べつつ、他の方に聴きつつまとめました。 自分の理解が及んでいなく、間違っている部分が多々あるかもしれません。 間違いなどありましたら、ご指摘いただけますと幸いです。
今日
Multi-AZになってるの?
みたいな話になって、そういばよく耳にする言葉だけど、 これ有効にすると何がおこるのか知らなかったから調べた。 というかドキュメント読んだ。
Multi-AZ 配置 - Amazon RDS | AWS
まとめると
みたいな良さがある。 そもそもMulti-AZ設定しないとフェイルオーバーよしなにしてくれないの知らなかった。
日常の会話で知らない単語が度々でてくるけど、その都度調べないとわからないことが当たり前の単語が増えてしまうなと。 まだまだインフラ周りのことは覚えることが多いなあと。
容量がいっぱいになってmysqlが落ちたました。 もちろんテスト環境です。
落ちた時の状況としては
っていった感じです。
サーバーのデータ容量をdfで見たら確かに一つだけUsedが100%。
よしデータあけるぞ!ってなってその後やったこと。
古いデータで必要のないものを消しました バックアップファイルで1日より前のものはいらなかったので
$ find . -atime +1 | grep <1日以内のファイル名> // 消しちゃいけないファイルが入っていないことを確認 $ find . -atime +1 -delete // 削除
これで500KB近く空きました。
dfとduを実行してなんか容量に違いが出る。 調べると、既に削除されたファイルだがプロセスが使用しているものがあるらしく、そのせいのようでした。
$ lsof | grep deleted
を実行するとでてきました。
ただ消しちゃいけないものもあるのかなーと思い、明らかに使ってないだろうっていうものだけkill。 これで 100KB近く空きました。
その後調べると、mysqlのbinlogが22GBほどありました。
テスト環境は特にレプリケーションをしているわけでもなく、データを復旧したいということも特にないので容量を食っていたbinlogを削除。
これで22GB空きました。容量が空いたのでmysqlを再度起動できる状態です。
先程述べたようにbinlogファイルはテスト環境では必要ありません。同じことが起こらないようにmy.cnfの
log-bin=mysql-bin
をコメントアウトしてbinlogが吐かれないようにしてから起動。
無事mysqlを起動できました。
もはやbinlogだけ消せば問題なかったかもしれませんが、時間を絞ってファイル削除とか、deletedな状態のものがあることを知れたこととかbinlogの必要性とか、色々知れて学びが多かったです。
このmysql落ちた1件で色々助言を下さった れもんさん ありがとうございました!
AwsConsoleでS3からファイル落とそうとすると,一個ずつポチポチしなきゃいけなくて辛いなーって思ったのでGoで書いてみました。※1
1.aws configureでaccess_key_idとsercret_keyを設定
$ aws configure AWS Access Key ID [NONE]: *** AWS Secret Access Key [NONE]: ***
Regionとかも設定するように進められるけど、今はここで Tokyoに固定しちゃってます。
2.ビルドする
$ go get -d github.com/MacoTasu/g3 $ go build $ go install
これでg3コマンドは使えるようになったはず。
使い方は簡単でbucketと落としてきたい対象のファイル or ディレクトリー名を指定するだけです。 コマンドを実行したカレントディレクトリに対象のファイル or ディレクトリーを作成します。
$ g3 get <bucketname> <target file or directory>
ex) $ g3 get test // バケット内のファイルを全て落としてくる $ g3 get test test/hoge.png // testディレクトリを作成してhoge.pngを落とす $ g3 get test test/ // testディレクトリを作成して、testディレクトリ以下全てのファイルを落とす (※いずれの場合も上限1000個)
^のような感じに使えます。 正規表現とかでディレクトリ内のファイルの絞込できるともっと便利そうかなとブログ書きながら思った。
Goを初めて書いたのでコード中に良くないと思われる部分が多々あるかもれしません。 もっと良い書き方などあれば、後学のためにご指摘いただけると幸いです。
※1.テストコードは書けていません
SELECTで取ってきたレコードをソートして、ソートした結果に連番でidふるみたいなことできないかなーとおもってmysqlのドキュメント読んでたら変数を使えることを知りました。
MySQL :: MySQL 5.7 Reference Manual :: 9.4 User-Defined Variables
変数使えるなら連番ふれるじゃんとおもってさっそくやってみた。
先程も書いた通り結果を小さい順にソートして、小さい方から1,2,3...と通しの番号をふる
mysql> SHOW CREATE TABLE user_point\G; *************************** 1. row *************************** Table: user_point Create Table: CREATE TABLE `user_point` ( `user_id` int(11) DEFAULT NULL, `point` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
userを判別するためのuser_idカラムと、userが所持しているポイントを管理するpointカラムをもったuser_pointテーブルで試します。
テーブルの中は
mysql> SELECT * FROM user_point; +---------+-------+ | user_id | point | +---------+-------+ | 1 | 500 | | 2 | 400 | | 3 | 300 | | 4 | 200 | | 5 | 100 | +---------+-------+
このようになっています。
mysql> SET @number = 0; mysql> SELECT (@number := @number + 1) AS number, user_id ,point FROM user_point ORDER BY point asc;
^のSQLを流すと
mysql> SELECT (@number := @number + 1) AS number, user_id ,point FROM user_point ORDER BY point asc; +--------+---------+-------+ | number | user_id | point | +--------+---------+-------+ | 1 | 5 | 100 | | 2 | 4 | 200 | | 3 | 3 | 300 | | 4 | 2 | 400 | | 5 | 1 | 500 | +--------+---------+-------+
こんな感じでポイントをソートして通しの番号を振ってくれます。 もう一回同じクエリを流すと
mysql> SELECT (@number := @number + 1) AS number, user_id ,point FROM user_point ORDER BY point asc; +--------+---------+-------+ | number | user_id | point | +--------+---------+-------+ | 6 | 5 | 100 | | 7 | 4 | 200 | | 8 | 3 | 300 | | 9 | 2 | 400 | | 10 | 1 | 500 | +--------+---------+-------+ 5 rows in set (0.00 sec)
前の値は保持したままインクリメントされました。 どうやらこの変数公式ドキュメントによると
User-defined variables are session-specific. A user variable defined by one client cannot be seen or used by other clients.
と書いてあり、セッションで固定で、自分がいじっている変数を他のユーザが見たり、編集したりすることはできないそうです。 なので一旦exitしてもう一度同じクエリを流すと@numberの値は何も入っていない状態になります。
学びがある