目次
→ 2.2 RedisクラスタアーキテクチャによりRedisの水平拡張を実現
->3.1 [重要]: サービスに障害が発生した場合、サービスを提供し続けることができますか?
---> 3.1.1 クラスター内の障害のある Redis サービスにマスター/スレーブ サービスがある場合、
---> 3.1.2 Redis クラスターがマスター/スレーブバックアップの公式推奨に従っていない場合
---> 3.2.1 構成 redis.conf を変更する
-> 3.3 単一サーバー上に複数のノードを展開すると帯域幅に影響しますか
-> 4.7 redis-cluster クラスタ構成の作成
-> 4.8 ビルドが成功しました。表示するクラスター Redis を入力します (イントラネット IP)
-> 4.9 テストでは、図に示すように、上記の問題も説明されています
次へ: Java は Redis クラスターを使用して動作します
1. 環境を準備します。
クラウドサーバー<仮想マシンも利用可能>、centos7.9、docker-ce、redisイメージ付き
2. はじめに:
-> 2.1 はじめに(06 のクラウドサーバーを使用してください):
===> ポータル: 06-redis クラスター モード (中) プロジェクト テストのクラウド サービス IP がイントラネットなどに変更されます (ほとんどの問題が解決します)
マスター/スレーブ モード Sentinel モードはクラスター モードに反映され、クラスターには少なくとも 3 つのマスター、3 つのスレーブ、および 6 つの Redis サービスが含まれることが公式推奨されています。
→ 2.2 RedisクラスタアーキテクチャによりRedisの水平拡張を実現
つまり、N 個の redis ノードを起動し、これらの N 個の redis ノードに全体のデータを分散して保存し、各ノードに合計データの 1/N が保存されます。Redis クラスターはパーティショニングによってある程度の可用性を提供し、クラスター内の一部のノードに障害が発生したり通信できなくなったりした場合でも、クラスターはコマンド リクエストの処理を続行できます。
-> 2.3 Redis クラスターのクラスター原理
Redis クラスターにはデフォルトで 16384 のハッシュ スロットがあり、クラスターが正常に構築された後、各マスター ノードにハッシュ スロットを割り当てる必要があります。外部データが挿入されると、どのノードがデータを管理するかを計算するために、キーに対して crc16 が実行され、次にモジュロ 16384 が実行されます。クラスタ作成時にハッシュスロットが割り当てられており、3マスター、3スレーブの構成を採用すると、マスター・スレーブモードによりマスター系サービスの障害発生時にセンチネルモードで自動切り替えが可能となり、高可用性を実現します。クラスサービスの
3. 施工後に特に注意が必要な点
->3.1 [重要]: サービスに障害が発生した場合、サービスを提供し続けることができますか?
---> 3.1.1 クラスター内の障害のある Redis サービスにマスター/スレーブ サービスがある場合、
その後、アクセスするときにスレーブ Redis サービスに戻り、クラスターは正常に実行され、マスター/スレーブ センチネル メカニズムを参照します。
マスターの再選出には通常 30 秒かかります
---> 3.1.2 Redis クラスターがマスター/スレーブバックアップの公式推奨に従っていない場合
Redis サービスの 1 つである emm が失敗すると、クラスター全体が使用できなくなります。これは、Redis クラスター内の各 Redis ノードによって保存されたデータが異なり、ノードに問題が発生した場合、データ全体が失われるためです。
-> 3.2 理解:
クラウド プラットフォームであると仮定すると、各データは異なるサービスに存在し、データ サービス gg はたまたま保存されており、サービスから再選択されていません。emm 他のものは影響を受けません。<何らかの構成を行う必要があります>、データ見つけられない
---> 3.2.1 構成 redis.conf を変更する
redis.confのパラメータcluster-require-full-coverage
に依存します。特定のスロットのマスターとスレーブがハングアップし、cluster-require-full-coverageがyesの場合、クラスタ全体がハングアップします。マスターとスレーブの場合
、特定のスロットのハングアップ スレーブがすべてダウンし、cluster-require-full-coverage が no の場合、すべてのスロット データは使用または保存できません。
-> 3.3 単一サーバー上に複数のノードを展開すると帯域幅に影響しますか
他の人の記事を詳しく紹介したり引用したりするのがとても上手です: Redis Cluster クラスターのメリットとデメリットを紹介しました
4. 実際の操作
→ 4.1 フォルダーの作成
mkdir -p /usr/local/src/docker/redis-cluster
→ 4.2 ディレクトリの入力
cd /usr/local/src/docker/redis-cluster
→ 4.3 テンプレートを作成する
vim redis-cluster.tmpl
→ 4.3.1 ファイル入力内容
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 10.0.4.*
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
bind 0.0.0.0
protected-mode no
---> 4.3.2 テンプレートのコメント
port:ノードポート(外部通信)
クラスターが有効: クラスターを有効にします。
クラスタ構成ファイル: クラスタの構成はnodes.confです。
クラスターノードタイムアウト: 接続タイムアウト 5000 ミリ秒
クラスターアナウンスIP:ホストIP
クラスターアナウンスポート: クラスターノードマッピングポート
cluster-announce-bus-port: クラスター バス ポート
appendonly: 永続モード aof が有効かどうか
---> 4.3.3 ホスト IP に特に注意してください
1 内部ネットワーク IP にすることができます (リモートにする場合は、パブリック ネットワーク IP である必要があります)
ps: ただし、パブリック ネットワーク IP は次の操作を実行する必要があります: ===> ポータル: 06-redis クラスター モード (中) プロジェクト テストのクラウド サービス IP が内部ネットワークなどに変更されます (ほとんどの問題は解決します)
2 ドメイン名解決が利用可能
3 172.0.0.1は使用できません
→ 4.4 カレントディレクトリで操作する
for port in $(seq 8010 8015); \
do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
説明: 構成ファイルを生成するために渡すシェル スクリプト サイクル パラメータ
→ 4.5 Dockerコンテナの作成
for port in $(seq 8010 8015); \
do \
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /usr/local/src/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /usr/local/src/docker/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
-> 4.6 redis-8010コンテナに入る
docker exec -it redis-8010 bash
-> 4.7 redis-cluster クラスタ構成の作成
redis-cli --cluster create 10.0.4.*:8010 10.0.4.*:8011 10.0.4.*:8012 10.0.4.*:8013 10.0.4.*:8014 10.0.4.*:8015 --cluster-replicas 1
-> 4.8 ビルドが成功しました。表示するクラスター Redis を入力します (イントラネット IP)
redis-cli -c -h 10.0.4.* -p 8010
クラスターノード #クラスターノード数の表示
クラスター情報 #クラスターの基本情報の表示
-> 4.9 テストでは、図に示すように、上記の問題も説明されています
5. 例外が発生したため、再度以下を実行
コンテナの一括削除 ディレクトリマウントの一括削除
docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker stop
docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker rm -f
#shell脚本 删除redis容器
for i in $(seq 8010 8015); \
do docker rm -f redis-${i}; \
done;
rm -rf 801{0..5}/conf/redis.conf
rm -rf 801{0..5}
[拡張、正式な本番環境設定パスワードおよびその他の設定、フォローアップ補足を残す]
プレビュー 06: 06-redis クラスター モード (中) プロジェクト テストのクラウド サービス IP が内部ネットワークなどに変更されます (ほとんどの問題が解決されます)