icon

Blog

ISUCON10予選の過去問練習-2 App-DBを別インスタンスに

2021/07/30

まずは過去問の講評に書いてあることを出来るようにならねばということで別インスタンスのDBが動作するよう変更してみる。去年挑んだのと同じ問題だが力になれなかった悔しさを胸に。。


今回の目標はISUCON10予選の講評に書かれているこいつができるようになること。

estate と chair で DB を別サーバに分ける

AWSインスタンス2つ目起動

前回同様 m3.medium のインスタンスを起動。同一VPC内に起動しているようなので繋がるはず。 MySQLのクライアントが接続できるように、ポート3306を公開。

Dataの用意

前回 でやった手順で同様に、initial-data は別のインスタンスで用意する必要があった。同じように make で初期データをDBに登録する。本番は初期データも入っている状態だと思うのでこの手順は不要だと思われる。

pingが通らない

調べた結果、EC2インスタンスにpingを通したければICMPをセキュリティグループに設定する必要があるらしい。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-ping

接続先変更

DBインスタンス

  • sudo systemctl stop isuumo.go.service

Appインスタンス

  • env.sh を編集してMYSQL_HOSTをインスタンス2のプライベートIPに変更
  • sudo systemctl stop mysql.service
  • sudo systemctl restart isuumo.go.service

WebAppをブラウザから確認。API動いてない。。。benchも失敗する。。。

MySQLの外部公開

参考にした。
https://qiita.com/2019Shun/items/34d44d63b00d086db51a

/etc/mysql/mysql.conf.d/mysqld.cnf を編集

bind-address                    = 0.0.0.0

MySQLのユーザを外から接続できるよう変更

一緒にISUCON参加予定のメンバーから教えてもらった。これでISUCONユーザがlocalhost以外からでも接続できるようになる。

GRANT ALL PRIVILEGES ON *.* TO 'isucon'@'%' WITH GRANT OPTION;
select user, host from mysql.user;

これで再起動して動くようになった。

benchちょっと改善

{"pass":true,"score":191,"messages":[],"reason":"OK","language":"nodejs"}

{"pass":true,"score":232,"messages":[],"reason":"OK","language":"nodejs"}

とりあえず App と DB のインスタンスを分離できた。chair, estateを分離するまではできなかったが、同様の手順でやって、App に複数 MySQL を接続できるように変更すればできるだろう。