F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8のエンジニア・技術ブログ

本番サーバを止めてみたよ。

参加した経緯

某マッチングイベントで仲良くなり、5日間のインフラ系インターンに参加させていただいた。

私は誰なのか

飛田一貴(通称: かずきち)です。
大阪の専門学生で、しがないWebエンジニアをやっています。
インフラは素人に毛が生えた程度にしか分かりません。

なぜインフラ系のインターンを選んだのか

今まではWebを中心にやってきましたが、自分のスキルの幅を広げたかったからです。

何をやったのか

端的に言うと、本番環境で動いているサーバを止めてみました。
それに至るまでにサーバの構成や役割、ユーザからのリクエストがどう流れているか等を調べ、最終的に「止めても問題ない」と判断できたサーバを止めました。

技術的な話

インフラの細かい構成の話とかをすると怒られそうな気がするので、代わりに技術調査メモをいい感じにまとめてここに貼り付けておこうかなあと思います。

sysctl

sysctlはLinuxカーネルのパラメータを確認したり変更したりできるコマンド。
カーネルの再構築が不要で、コマンドで動的に動作を変更できる。

systemctl

sysctlと似ているが別物。
systemctlsystemdを操作するコマンド。
サービスのステータスを確認したり、設定したりできる。
CentOS 6まではserviceというinitをいじくるコマンドが用意されていたが、CentOS 7からはsystemdが採用されたためsystemctlを使うようになった。
systemctl <operation> <unit_name> の形式で操作できる。

journalctl

systemdの動作している環境では、標準のログ(≒ジャーナル)収集・格納サービスとしてjournaldが用意されている。
journaldの操作は journalctl コマンドで行う。
よく使うオプションとして、ジャーナルを流し続ける -f や指定したサービスのジャーナルに絞る -u <unit_name> がある。

rsyslog

rsyslogsyslogというログを転送するための仕組みに信頼性(reliability)が担保されたもの。
TCPで転送できるようになったらしい。

LVS

LVSLinux Virtual Serverの略。
レイヤ4で動作するロードバランサ。
正確には、Linuxカーネルに組み込まれているIPVS(IP Virtual Service)というロードバランサの実装を用いて作ったクラスタのことを指している。
LVSの設定や操作には、 ipvsadm か、それをさらにラップした keepalived を使用する。

ipvsadm

あんまりよく分かっていない。
ipvsadm -Ln というコマンドでリアルサーバのweightとかアクティブなコネクション数、インアクティブなコネクション数を確認できた。
このコマンドでリアルサーバの生死を簡易的に判別できる。

keepalivedの設定

ここの設定を一番読んだ気がする。

リアルサーバ

リアルサーバとは、仮想サーバに関連付けられた実際のサーバのこと。

ウェイト

重み(weight)はヘルスチェックが成功/失敗する度にプライオリティをどれだけ上げるかとかそういう設定っぽい。
weight というパラメータに対して設定する。

ヘルスチェック

リアルサーバが生存しているかを確認するリクエスト。
delay_loop というパラメータに対してヘルスチェックを送信する間隔を設定する。

ヘルスチェックでどんなリクエストを送信するかを設定することができる。
例えば以下のように記述すると、 /foo.html に対してGETリクエストを送信し、HTTPステータスが200かどうかを確認する。

HTTP_GET {
  url {
    path /foo.html
    status_code 200
  }
}
タイムアウト時間

connect-timeout というパラメータに対して設定する。
ここで設定された秒数の間、ヘルスチェックが失敗するとリアルサーバがダウンしたと判断する。

再試行間隔

リアルサーバがダウンしている場合のヘルスチェックを再試行する間隔。
delay_before_retry というパラメータに対して設定する。

ヘルスチェック失敗時

ヘルスチェックに失敗した場合にweightを0にする設定として、 inhibit_on_failure という設定がある。

スケジューリングアルゴリズム

どのようにロードバランシングするかの種類(スケジューリングアルゴリズム)の設定。
lvs_sched というパラメータに対して設定できる。

スケジューリングアルゴリズム 説明
rr ラウンドロビン(round-robin)アルゴリズム。リアルサーバを設定順に選択する。全てのサーバに均等にトラフィックが分散される。
wrr weight round-robin。rrにweightによる重み付けを加味したもの。
lc least connection。コネクション数が一番少ないサーバを選択する。
wlc weight least connection。lcにweightによる重み付けを加味したもの。(コネクション数 + 1) / weight という計算式によってサーバが選択される。

SSL化していると、暗号化/復号化にそれなりの処理が必要なため、複雑なスケジューリングアルゴリズムを選択するとリクエストを処理しきれなくなることがあるらしい。
ちなみにスケジューリングアルゴリズムは他にも色々あった。

ステート

state というパラメータに設定する。
MASTER とか BACKUP がある。

転送方式

lvs_method というパラメータに設定する。
nat はNATで、LVSでアドレス変換をして返す方式。
dr はダイレクトルーティングで、LVSを介さずに直接クライアントへ返す。
ダイレクトルーティンではLVSの負荷が軽減されるというメリットがある。

感想

いつもと違う技術領域に触れることができたため、新鮮で刺激的でした。
また、現場で働いているインフラエンジニアの方から適切なアドバイスを貰うことができるため、効率的に学ぶことができました。
フロントエンド、バックエンド、インフラ、ネットワークと様々な技術領域やレイヤを扱うことのできるつよつよエンジニアを目指していきたい。