upstream consistent ハッシュ

説明

ngx_http_upstream_consistent_hash - 正しいバックエンドノードを選択するために内部的なconsistentハッシュリングを使用するロードバランサ。memcache.hash_strategy = php-memcacheモジュールのconsistentと一貫性があるように設計されています。つまり、php-memcache モジュールを使ってmemcachedクラスタに値を保持することができ、後でNGINXがクラスタ内で値を見つけそこから読み込むことができることを意味します。

ディレクティブ

consistent_hash

構文:consistent_hash hash-key
デフォルト:none
コンテキスト:upstream

このパラメータはupstream定義の中になければなりません。consistentハッシュupstreamモジュールを有効にし、ハッシュリング上で正しいバックエンドを見つけるためにハッシュされるべき文字列を定義もします。例として以下のことができるでしょう:

upstream somestream {
  consistent_hash $request_uri;
  server 10.50.1.3:11211;
  server 10.50.1.4:11211;
  server 10.50.1.5:11211;
}

...

server {
  listen       80;
  server_name  localhost;

  location / {
    default_type text/html;
    set $memcached_key $request_uri;
    memcached_pass somestream;
    error_page      500 404 405 = @fallback;
  }

  location @fallback {
    root /srv/www/whatever;
    fastcgi_intercept_errors on;
    error_page 404 = @404;

    set $script $uri;
    set $path_info "";

    include /usr/local/nginx/conf/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /srv/www/whatever/test.php;
    fastcgi_param SCRIPT_NAME $script;
    fastcgi_param REQUEST_URI $uri;
    fastcgi_pass   127.0.0.1:9000;
  }
}

この例は3つのバックエンドサーバを使います。On initialization NGINX will create a hashring which contains each server (160 * weight) times in the same way as the php-memcache module with hash_strategy = consistent does. $request_uriのハッシュに基づいて、どのバックエンドサーバが使われるべきかを決定するでしょう。これで、上の例のtest.php スクリプトが以下のように見えます:

$memcache = new Memcache;

$memcache->addServer('10.50.1.3', 11211);
$memcache->addServer('10.50.1.4', 11211);
$memcache->addServer('10.50.1.4', 11211);

$memcache->set($_SERVER["REQUEST_URI"], $_SERVER["REQUEST_URI"] . "from memcache");

知っておくべき重要なこと

  • バージョン1.2.8のPHP memcacheモジュールを使ってテストしました。このバージョンのモジュールには、hash_strategyがconsistent_hashに設定されてもweightを完全に無視するバグがあるようです。NGINX consistentハッシュupstreamはweightパラメータを認識しますが、memcacheモジュール1.2.8と一緒に使う場合はどのバックエンドサーバのweightも触れるべきではありません。
  • NGINX 0.7.61 と0.6.34のモジュールをテストしました。他のバージョンについては保証しません。

Bugs/Feedback

何かバグを見つけた場合は、私にメールをしてください。手助けをするつもりでいます。

どのような種類のフィードバックあるいは問題の報告も歓迎します。

Mail: mauro.stettler(A.T)gmail.com

ダウンロード

githubで"master"と"dns"の2つのブランチがあります。これは、もしPHP側でIPの代わりにDNSエントリを使いたい場合、これをするためにNGINXにパッチを適用する必要があるだろうからです。もしPHPがmemcacheに接続するためにDNS名を使わない場合は、"master"ブランチはクリーンなモジュールですので、これをダウンロードするほうが良いでしょう。もしPHPがDNS名を使うのであれば、NGINXのためのパッチを含んでいる"dns"ブランチをダウンロードしなければなりません。

GitHubからダウンロード