Redisの分散構成(シャーディング)を実現するphpredisの機能は、一貫ハッシュアルゴリズムを用いて関連するキーを同一ノードに配置し、データの効率的な分散を実現します。この機能はA + E Networksの支援によって開発されました。
分散環境の構成要素は以下の通りです:
- Redisノードのリスト
- キーの一部を抽出する関数(オプション):一貫ハッシュ処理に使用
- 旧ノードリスト(「previous」オプション):ノード追加・削除時のバックアップ環
- インデックス設定(オプション):キー移行時の参照用
- 自動再散列機能(「autorehash」オプション)
分散配置の作成方法
RedisArrayクラスを使用して分散環境を構築できます。以下に例を示します。
// ノードリストを指定して初期化
$shard = new RedisArray(['primary-server', 'replica-server:6380', 'backup-server:6381']);
// キー抽出関数を指定
function extractShardKey($key) {
return substr($key, 0, 5); // 最初の5文字をハッシュ対象
}
$shard = new RedisArray(['node1', 'node2'], ['function' => 'extractShardKey']);
// ノード追加時のバックアップ設定
$shard = new RedisArray(
['new-node-1', 'new-node-2', 'new-node-3'],
['previous' => ['old-node-1', 'old-node-2']]
);
接続設定オプション
接続関連のパラメータを指定できます。
// 再接続待ち時間(ミリ秒)
$shard = new RedisArray(['host1'], ['retry_timeout' => 200]);
// 遅延接続モード
$shard = new RedisArray(['host1', 'host2'], ['lazy_connect' => true]);
// 接続タイムアウト設定
$shard = new RedisArray(['host1'], ['connect_timeout' => 0.3]);
キー移行と自動再散列
ノード構成の変更時、キーの移行を自動化できます。
// 自動再散列を有効化
$shard = new RedisArray(['node1', 'node2'], ['autorehash' => true]);
// 手動で再散列を実行
$shard->_rehash(function($host, $count) {
// 移行状況の進捗を記録
});
Multi/execの利用
トランザクション処理は単一ノード上で実行する必要があります。
$target = $shard->_target('user:123:name');
$shard->multi($target)
->del('user:123:name')
->srem('user:index', '123')
->exec();
クラスタ情報の取得
分散環境の状態を確認するメソッドを提供しています。
$shard->_hosts():ノード一覧を取得$shard->_function():ハッシュ関数名を取得$shard->_target('key'):対象ノードを特定$shard->_instance('host'):特定ノードへの接続インスタンスを取得
テスト実行
テストを実行するには、以下のようにします。
cd tests
./mkring.sh start
php array-tests.php