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"ブランチをダウンロードしなければなりません。