Open6

インフラメモ

mysqltuner で MySQL の設定を見直す

mysqltuner を使うと mysql の状態をいろいろとチェックして,変更したほうが良い設定などを教えてくれる.

ubuntu では,

apt-get install mysqltuner

でインストール可能.

mysqlhost=hostname
mysqluser=username
mysqlpass=password
mysqltuner_result=/tmp/mysqltuner$(date +%Y%m%d_%H%M%S).txt
mysqltuner_memory=4096

mysqltuner --host ${mysqlhost} --user ${mysqluser} --pass ${mysqlpass} --buffers --dbstat --idxstat --sysstat --pfstat  --forcemem ${mysqltuner_memory} --outputfile ${mysqltuner_result}

のようにして実行する.

実行結果はたくさん出力される(私の環境では 300KB ぐらい)ので,気になっているキーワードで grep をかけたり,最後の数十行にまとめて出力される推奨事項を読んだりすると良さそう.

MySQL の connection まわりの設定はデフォルトで使ってはいけない!

開発用に運用していた MySQL インスタンスで,クライアントからのコネクションが張れない(タイムアウトする)現象が多発していた.

原因としては, wait_timeout をデフォルト(8時間!)のまま運用しており,古いコネクションが残り続けていた.

調査

mysqltuner を実行すると下記のような出力を得た.

[!!] Highest connection usage: 100%  (152/151)
[OK] Aborted connections: 1.46%  (170/11610)

max_connection はデフォルトの 151 だが,アクティブな開発メンバーが 3 人ぐらいしかいない状況でこの数のコネクションが枯渇するとは考えにくい.

そこで,コネクションのタイムアウトを見直すと,デフォルトの 8 時間になっていた.

my.cnf に

max_connections=512
wait_timeout=60
interactive_timeout=60

を追記して解決.

現在のコネクション数を確認するには,

show status like 'Threads_connected';
show processlist;

などを使う.

API Gateway におけるクライアント IP の取り扱い

lambda 側で sourceIp を判定するやり方では X-Forwarded-For ヘッダの偽装により突破されそうだと思っていたけど、TCP コネクションから IP をとっているので大丈夫かも。

CloudFront でビューワの IP を取得

CloudFront でビューワの IP をとりたい場合は、 lambda@edge および CloudFront Functions で取得可能。

  • lambda@edge
    • ビューワリクエスト・オリジンリクエストの Records.cf.request.clientIp でクライアント IP を取得可能
      • 「ビューワーが HTTP プロキシまたはロードバランサーを使用してリクエストを送った場合、この値はプロキシまたはロードバランサーの IP アドレスです。」とあるので、おそらく X-Forwarded-For ヘッダの影響を受けない TCP コネクションの IP を返しているのだとおもう
      • Lambda@Edge イベント構造
  • CloudFront Functions
    • Lambda@edge と同様に、 viewer.ip フィールドからクライアント IP を取得可能
    • 「ビューワーリクエストが HTTP プロキシまたはロードバランサーを通して来た場合、値はプロキシまたはロードバランサーの IP アドレスです。」とのこと
    • CloudFront Functions のイベント構造
ログインするとコメントできます