Redisシャーディング技術
シャーディングの必要性
Redisに保存されるデータ量が増大するにつれて、パフォーマンスが低下する問題が発生します。この問題を解決するためにシャーディング技術が採用されます。
シャーディング手法の種類
- クライアントサイドシャーディング
アプリケーション層でデータ分割を実施し、どのデータをどのRedisインスタンスに格納するかをプログラムで制御します。柔軟性は高いものの、ノード追加時のスケーリングが困難です。
- プロキシベースシャーディング
Twemproxyなどのサードパーティ製プロキシを使用しますが、プロキシ自体がボトルネックとなる可能性があります。
- Redisクラスタネイティブ方式
- Codis(豌豆荚社開発)
Redisクラスタのシャーディングメカニズム
Redisクラスタでは一貫性ハッシュではなくデータシャーディングを採用しています。クラスタは16384個のハッシュスロットを持ち、各キーは式
CRC16(key) % 16384 によってどのスロットに属するか決定されます。
具体的な例として、3ノードのクラスタ構成では以下のようにスロットを分配できます:
- ノードA:スロット0〜5500
- ノードB:スロット5501〜11000
- ノードC:スロット11001〜16384
この設計により、ノードの追加や削除が容易になります。新しいノードDを追加する際には、既存ノードから一部のスロットを移動することで対応可能です。
Redisクラスタのマスター・スレーブ構成
クラスタの可用性を確保するために、各ノードは1つ以上のレプリカを持ちます。マスターノードがダウンした場合、対応するスレーブノードが新しいマスターとして昇格します。
一貫性に関する考慮事項
Redisクラスタは強一貫性を保証しません。非同期レプリケーションのため、特定条件下で書き込みコマンドが失われる可能性があります。
Redisクラスタ構築手順
環境準備
まずRedisがインストールされていることを確認してください。
ディレクトリ構造の作成
cd /opt/
mkdir `seq 7101 7108`
cp /etc/redis/6379.conf ./
設定ファイルの編集
以下の設定を追加してください:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
複数ポート用設定ファイル生成
for port in {7101..7108}; do
sed "s/6379/${port}/g" 6379.conf > ${port}/redis.conf
done
Redisインスタンス起動
for instance in {7101..7108}; do
cd /opt/$instance && /usr/local/bin/redis-server redis.conf
done
Ruby管理ツールのセットアップ
yum -y install ruby rubygems
gem install redis
クラスタ管理ツールの配置
cp /opt/redis-3.0.4/src/redis-trib.rb /usr/local/bin/redis-trib
redis-trib help
6ノードクラスタの構築
ポート7101〜7106を使用して6つのRedisノードでクラスタを構成します:
redis-trib create --replicas 1 192.168.0.201:7101 192.168.0.201:7102 192.168.0.201:7103 192.168.0.201:7104 192.168.0.201:7105 192.168.0.201:7106
実行結果の例:
>>> Creating cluster
Connecting to node 192.168.0.201:7101: OK
Connecting to node 192.168.0.201:7102: OK
...
Using 3 masters:
192.168.0.201:7101
192.168.0.201:7102
192.168.0.201:7103
Adding replica 192.168.0.201:7104 to 192.168.0.201:7101
Adding replica 192.168.0.201:7105 to 192.168.0.201:7102
Adding replica 192.168.0.201:7106 to 192.168.0.201:7103
クラスタへの接続
redis-cli -c -h 192.168.0.201 -p 7101
ノード情報の確認
192.168.0.201:7101> cluster nodes
クラスタステータスの確認
192.168.0.201:7101> cluster info
クラスタのスケーリング
新規ノードの追加
redis-trib add-node 192.168.0.201:7107 192.168.0.201:7101
スロットの再分配
追加されたノードにスロットを割り当てます:
redis-trib reshard 192.168.0.201:7107
スレーブノードの追加
ノード7108を7107のスレーブとして追加します:
redis-trib add-node 192.168.0.201:7108 192.168.0.201:7101
7108を7107のスレーブとして設定します:
redis-cli -c -h 192.168.0.201 -p 7108
192.168.0.201:7108> cluster replicate [7107のノードID]
クラスタ操作の特徴
Redisクラスタでは、マスターからのスレーブ同期はBGSAVEコマンドを使用して実施されます。大容量データを持つマスターでは複数のRedisインスタンスに分割して配置することが推奨されます。
また、複数のキーを跨ぐ操作は制限されます。異なるキーが異なるノードに分散されているため、マルチキー操作はサポートされていません。
キー配置の自動リダイレクト
192.168.7.107:7102> set sample_key_01 value1
-> Redirected to slot [2541] located at 192.168.7.107:7101
OK
192.168.7.107:7101> set sample_key_02 value2
-> Redirected to slot [12345] located at 192.168.7.107:7103
OK