memcachedを学ぼう (gumiStudy#2)

  • kazeburoさんによるmemcachedのお話が聞ける貴重な機会でとても楽しみに参加させてもらいました。
  • 会場に対する「memcachedを使ったことない人」という質問に誰も手を挙げなかったことからも、おそらく自分が一番わかってなかった気がしますが気にせず感想というかメモを書いてみます。
    • ちなみにmemcachedはインストールして、データを入れたり取ったりして少し遊んだくらいしかありません。。手を挙げずにすみません。

memcachedについて

  • 最初は、導入としてmemcachedについての概要をわかりやすく説明くださりました。
memcachedとは?
  • DBやWeb APIのデータなどを毎回取りにいくと当然時間掛かるので、一度取得したらキャッシュしておく。そのキャッシュを管理するのがmemcached
  • memstrikeというベンチマークツールでパフォーマンスを計測したところ、約73,000 req/secくらい出る。
  • memcachedを使っている話はソーシャルアプリ系のサービスをはじめ本当によく聞きますし、利用方法もいろいろと考えられそうですし、最早当然の技術になっているのかなと思いました。
分散構成について
  • 複数のmemcachedサーバーを立てて分散させる場合は、クライアントで分散アルゴリズムを実装する必要がある。
  • アルゴリズムについては後述。
  • 分散して配置する際は、「6GB * 2台」の構成よりも「2GB * 6台」の構成の方が運用を考えても好ましい。
  • 専用サーバーを立てるのが望ましいけど、アプリケーションサーバーの空きメモリを利用して立ててもいい。
運用について
  • メモリ使用量の見極めが必要。
  • (Min|Max)SpareServersは使わない。
  • アプリケーションのプロセス数は固定する。
    • デメリットとしては、TCPの接続数が増える。

起動オプションについて

  • 「-c」
    • 最大接続数。
    • デフォルトは1024になってるけど、262144など大きな値に設定しておく。
      • 1024以上にするにはroot権限が必要。
      • memcachedをrootで動かすことは出来ないので、上記設定をする場合は「-u nobody」など実行ユーザーを指定する必要がある。
    • この値は大きな値を指定しても特に問題はないので、はじめから大きな値を指定しておくといい。
  • 「-l」
    • ListenするInterface。
    • デフォルトでは、全てのInterfaceでListenしているので、「-l 127.0.0.1」、「-l 192.168.0.1」など指定する。
    • ただ、制限することで運用時に不便になることも。
  • 「-v -vv -vvv」
    • 冗長モード。
  • 「-p」
    • TCPポートを指定。
  • 「-U」
    • UDPポートの指定。
    • 「-p」と「-U」 の両方しておくのがいい。片方だけの指定だと意図した通りにならない?
  • 「-m」
    • 最大メモリサイズ。
    • ただし、指定したサイズが100%使用されるわけではない。
      • 専用サーバーでも指定サイズの80%くらい。
    • また、プロセスサイズは指定した値以上に大きくなる。
  • 「-C」
    • CASを無効に。

ここまでの設定をまとめたオススメの起動オプション設定。

-c 32768 -u nobody -C -m 16GB(サーバーに応じて) -p 11211 -U 0
  • 1.4からは「stats settings」というコマンドで起動時のオプションの確認が出来る。

監視

  • 監視には、稼動監視とリソースモニタリングの2つがある。
    • 稼動監視は、PingやHTTP、TCPの応答などにより、サーバーが正常に稼動しているかを確認する。
    • リソースモニタリングは、CPUやトラフィック、メモリの使用率などをグラフ化するなどして見える化する。
  • 何を監視するか
    • 動いているか
    • コネクションが足りているか
    • メモリ使用率
    • キャッシュのHit率
    • 負荷
    • get/set コマンドの発行回数
    • サーバーの偏り
  • 監視をすることによりサービスの状態を確認しておくのは本当に基本だと思いますので、どの項目をどうやって監視するのかといった知識や方法はしっかり身につけたいなと思いました。
ツール
  • 稼動監視・・・Nagios
  • プラグインを簡単に作成することが出来、プラグインを追加していくことで監視項目を追加していく。
    • memcachedの場合、statsコマンドの戻り値にuptimeがあるかどうかや、getした戻り値などで監視する。
    • 詳しくは、「Web開発者のための大規模サービス技術入門」にも載っている。
  • Nagiosについては、「スケーラブルWebサイト」で少し見ていたくらいなので、ここで話が聞けてとても勉強になりました。
  • リソースモニタリング・・・Ganglia、CloudForecast...
  • CloudForecast
    • リソース監視のためのフレームワーク/ツール。
    • mixiのリソース監視項目をもとに作成。
    • 高速かつ簡単に設定が出来、小規模から大規模まで1つの設定で対応が可能。
      • Livedoorでは、1200台、5000サービスの監視を行っているそうです。すごいですね。
    • 詳しくはYAPC::ASIAで!とのことでした!楽しみです。
    • インストールの流れとしては、yumで依存モジュール(net-snmp、net-snmp-perlrrdtoolrrdtool-perl)をインストール後、gitからCloudForecastを取得し、cpanmでインストールする流れになるそうです。
    • 前回のYokohama.pmとCasual Perlのイベントの際に、間に合わず話を聞くことが出来なかったので、今回話を聞くことが出来て嬉しかったです。
    • 各設定ファイルもYAML形式で直感的でわかりやすそうでしたし、CGIなど設定することなく利用出来るWebの管理画面も見やすくていいですね。
    • 使ってみたいなと思いました。
その他監視の注意点
  • モリー使用量監視
    • どれくらいの期間でMax近くまでいくかを確認する。
      • すぐにMax近くまでなっているようだとメモリーを増やすかアプリケーションロジックの見直しなど改善が必要。
      • 2〜3日くらいでMax近くに到達するくらいだと問題ない。
  • getコマンドのhit率及び接続数については、定常値を認識しておくことが重要。
    • 値はアプリケーションの性質によって大きく異なるので、値よりも定常値からの変化に注目し異常を認識することが必要。
  • 必要に応じて「stats slabs」や「stats items」を使用し詳細な値を確認する。
まとめ
  • 稼働監視、リソースモニタリングで最適な起動オプションを。
    • 中でもメモリーの値や監視は重要。chunkサイズよりもメモリーをガツンと確保する。
    • 実際、memcachedが落ちることはあまりないらしいです。
トークセッションで出ていた話。
  • Session管理にmemcachedを使用していると、気軽に再起動出来なくなる。
    • 設計やアプリケーション側で工夫する。
  • mixiのお知らせのような全ページから参照されるデータをmemcachedに入れると、当然memcachedサーバーのアクセスは偏る。
    • memcachedのキャッシュのコピーを作るなどしてアクセスを分散させる。
  • 分散アルゴリズム
    • 剰余アルゴリズム
      • PerlのCache::Memcachedで使われている。
      • キャッシュの作り直しが面倒でサーバーの増減の影響を受ける?
    • Consistent Hashing
      • PerlのCache::Memcached::Fastやlibmemcachedで使用することが出来る。
      • こちらの方が新しくてサーバーの増減の影響を受けにくい?
    • Consistent Hashingは以前も耳にしたことがあって、イマイチちゃんと理解出来ていないので勉強しようと思いました。
感想
  • memcachedについても実際に使えるノウハウ満載で当然すごく勉強になったのですが、監視や運用についてこれまであまり話を聞いたことがなかったので、その点がすごく勉強になりました。
    • 今回のお話を聞いて、監視、運用の難しさや職人的な部分を感じることが出来、改めてそのスゴさや面白さを感じました。
  • 下記のgihyoでの連載ページを読んで、さらに勉強しようと思いました。
  • kazeburoさん、運営者の皆様、ありがとうございました!