maco's life

主にエンジニアリングと読書について書いていきます。

Multi-AZ

今日

Multi-AZになってるの?

みたいな話になって、そういばよく耳にする言葉だけど、 これ有効にすると何がおこるのか知らなかったから調べた。 というかドキュメント読んだ。

Multi-AZ 配置 - Amazon RDS | AWS

まとめると

  • AZはアベイラビリティーゾーンの略で、同じリージョン内のそれぞれのロケーションを指している。
  • プライマリーDBに何かあった時に、別のAZでスタンバイになっているRDSにフェイルオーバーする、その時にendpointが変わることがないからそのまま使える

みたいな良さがある。 そもそもMulti-AZ設定しないとフェイルオーバーよしなにしてくれないの知らなかった。

日常の会話で知らない単語が度々でてくるけど、その都度調べないとわからないことが当たり前の単語が増えてしまうなと。 まだまだインフラ周りのことは覚えることが多いなあと。

容量がいっぱいになってmysqlが落ちた

容量がいっぱいになってmysqlが落ちたました。 もちろんテスト環境です。

落ちた時の状況としては

  • テストデータ作成スクリプト流している
  • 突然のRollback、mysqlに繋がらなくなる
  • エラーログに'full~'みたいなエラーででてる

っていった感じです。

サーバーのデータ容量をdfで見たら確かに一つだけUsedが100%。

よしデータあけるぞ!ってなってその後やったこと。

古いデータを消す

古いデータで必要のないものを消しました バックアップファイルで1日より前のものはいらなかったので

$ find . -atime +1 | grep <1日以内のファイル名> // 消しちゃいけないファイルが入っていないことを確認
$ find . -atime +1 -delete // 削除

これで500KB近く空きました。

削除したファイルだがプロセスが使用したままになっている

dfとduを実行してなんか容量に違いが出る。 調べると、既に削除されたファイルだがプロセスが使用しているものがあるらしく、そのせいのようでした。

$ lsof | grep deleted

を実行するとでてきました。

ただ消しちゃいけないものもあるのかなーと思い、明らかに使ってないだろうっていうものだけkill。 これで 100KB近く空きました。

binlogファイルを削除

その後調べると、mysqlのbinlogが22GBほどありました。

テスト環境は特にレプリケーションをしているわけでもなく、データを復旧したいということも特にないので容量を食っていたbinlogを削除。

これで22GB空きました。容量が空いたのでmysqlを再度起動できる状態です。

mysql起動

先程述べたようにbinlogファイルはテスト環境では必要ありません。同じことが起こらないようにmy.cnfの

log-bin=mysql-bin

コメントアウトしてbinlogが吐かれないようにしてから起動。

無事mysqlを起動できました。

最後に

もはやbinlogだけ消せば問題なかったかもしれませんが、時間を絞ってファイル削除とか、deletedな状態のものがあることを知れたこととかbinlogの必要性とか、色々知れて学びが多かったです。

このmysql落ちた1件で色々助言を下さった れもんさん ありがとうございました!

S3から複数のファイルを落としてくるコマンドをGoで作ってみた

AwsConsoleでS3からファイル落とそうとすると,一個ずつポチポチしなきゃいけなくて辛いなーって思ったのでGoで書いてみました。※1

github.com

導入

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.テストコードは書けていません

mysqlでユーザ定義変数をつかう

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の値は何も入っていない状態になります。

学びがある

TeamGeek 第1章 天才プログラマの神話

TeamGeek読んだので第1章「天才プログラマの神話」を読んだメモ

どんな本か

プログラマがソフトウェア開発を効果的かつ効率的にために、他人の理解・コミュニケーション・コラボレーションの能力を向上させる

以上を目的とした本でgoogleの中の人が書いている。もっとざっくり言うとチームで開発するときに大切にしたいことを色んな視点からかいてる。

大事だとおもったこと

  • 天才の神話
  • バス係数を高める
  • HRTを大切にする

天才の神話

天才と呼ばれる人...マイケル・ジョーダン、リーナスetc 彼らはその分野でも天才と呼ばれている

しかし、リーナスはLinuxの父として崇められてるけど 実際はUnixライクなカーネルができるというコンセプトを実証して、メーリングリストに投稿したということをしただけ。 それを見た人たち頭の人たちがLinuxを開発した。 実際リーナスは方向性を示しただけで、Linux協働作業の成果です。

マイケル・ジョーダンに関してもチームとうまくやることにたけていた。 決して1人じゃチャンピオンシップは勝てなかったはず。

このように天才という存在がいるからみんな自分のコードに自身がなく、開発途中の中途半端なコードは隠してしまい傾向がある。

この隠すという行為は良い効果をうまない

隠すとダメになる

隠すということは、それだけ他の人に目に触れる機会が減ること。 また隠さないことで、協力者が現れて早く開発が終わることができたり、 早い段階で他の人の指摘を受けることができるので、欠陥をみつけることができるというメリットがある。 それでいてバス係数をたかめることができる

バス係数

バス係数とは何人の人がバス引かれたらプロジェクトが終わるかということを示す係数である。 実際にバスに引かれるわけじゃないけど、転職などで人がいなくなることがある。 バス係数が高いと、リスク面からみても安心だし、開発スピードをあげられる。 それは解決方法の相談、協働作業できる点など、あらゆる面から言える。 身近な例だとコードレビューのFBが強固になる。 チームで開発すること のメリットは大きいということ、 むしろ現状ソフトウェア開発はチームスポーツとよばれている。

なのでチームで開発するべきというより、チームで開発をしないといけない。

HRTを大切にする

チームで働くときのポイントで大切なのはHRTです

  • HRT(ハート)
    • 謙虚(Humility)
    • 尊敬(Respect)
    • 信頼(Trust)

痛みを軽減するからハート。※hurtではないからね :) これがないと人間関係衝突がおこる。 こういった衝突が起こさないために、もどうやってHRTを実践すればいいのか

HRTを実践

  • エゴを無くす
    • 謙虚のない相手に態度を新たてもらう方法にはエゴを無くすこと。自分の意見を言わないのではない。全ての提案や議論の細部にまで口をだすのはエゴにつながる。意見を言わないのがいいというわけじゃなく、なんでも自分が正しい、自身があるという印象を相手に与えてはいけない。
  • 批判の配分と対応を学ぶ
    • 建設的な批判は、プロダクトの改善を考えており、そこには尊敬が含まれていること。性格に対する攻撃的な批判は何の役に立つこともない。批判される方は、自分が謙虚に受け入れるだけでなく相手を信頼しないといけない。コードレビューででる批判は、レビューされる人の価値を評価しているのではなく、その人が書いたコードを批判していることを認識する必要がある。
    • 良くない例をだすと、「Aというフローは間違っているので、みんながつかっているBというフローにしたほうがいい」。これはダメだから変えてといっているのと同じ。相手は自分自身がだめなのかなとおもってしまう。なのでこの場合、「Aのフローがわからないのですが、Bのフローをつかったほうがわかりやすくなるかな?」というあくまで自分の疑問として相手に尋ねることが謙虚な聞き方になる
  • 忍耐強くなる
  • 影響を受けやすくなる
    • 頑固なのはよくない。頑固だとみんなその人を避けて通るようになって、そこに信頼関係はうまれない。相手の言っていることに耳をかたむけ、自分の間違いや能力不足だったらそれを素直に認める。これは謙虚を相手にみせ、相手を信頼することである。その繰り返した、みんなからの尊敬にもつながる。

※政治家が信用されないのは間違いや無知をみとめないことにもつながる

無刻印のHHKB

できるエンジニアの人が無刻印のHHKB使ってて、かっこいいなーと思って自分も買ってしばらく使ってた。

 
コードをガッて書く期間とかはタイピングきもちー!ってなってテンションあがってよかった。
 
けど運用とかで本番サーバーで何か実行するときに、いかんせん怖いんですよねこれが。
 
いま自分が実行しようとしているkeyがほんとうに n なのか。もしかしたら y で実行されちゃうじゃないのか、みたい。
 
慎重を要される作業時はやっぱり視覚的にそのキーはなんなのか確認をしたいので、次は刻印があるやつを買おうとおもいます。