1. 概要
redis クラスターは、redis ノードのグループ間で高可用性とシャーディングを実現できます。クラスター内には 1 つのマスター ノードと複数のスレーブ ノードが存在します。マスター ノードに障害が発生した場合、スレーブ ノードが新しいマスターとして選択される必要があります。ただし、redis 自体 (多くのクライアントを含む) には、自動障害検出を実装してアクティブ/スタンバイ切り替えを実行する機能がなく、自動障害回復を実現するには外部監視ソリューションが必要です。
redis Sentinel は、公式に推奨される高可用性ソリューションです。これは、Redis クラスターの監視および管理ツールであり、ノードの監視、通知、自動障害回復、およびクライアント構成検出サービスを提供できます。
2. 発生した問題
1. Docker ホスト ネットワーク
Docker がホスト ネットワークを使用する場合 (Windows および Mac の場合)それはうまくいかなかったので(解決策が見つからなかった)、最終的にWindowsをあきらめ、centosを使用してクラスターをデプロイしました。
2. ホスト ネットワークを使用しない Sentinel 接続の問題
ホスト ネットワークを使用せずに Sentinel クラスターに接続する場合、マスター ノードのポートを指定できるため、正常に接続できますが、マスターノードに障害が発生すると、マスターノードから Sentinel が取得した IP がコンテナ内の仮想 IP となり、クラスターが正常に接続できなくなります。
3. 構築プロセス
1. ディレクトリ構造
2、センチネル設定ファイル
1、sentinel1.conf
#端口号 port 26379 dir /tmp # mymaster:自定义集群名,2:投票数量必须2个sentinel才能判断主节点是否失败 sentinel monitor mymaster <ip> <port> 2 # 指的是超过5000秒,且没有回复,则判定主节点不可达 sentinel down-after-milliseconds mymaster 5000 # 表示在故障转移的时候最多有numslaves在同步更新新的master sentinel parallel-syncs mymaster 1 # 故障转移超时时间 sentinel failover-timeout mymaster 5000
2、sentinel2.conf
#端口号 port 26380 dir /tmp # mymaster:自定义集群名,2:投票数量必须2个sentinel才能判断主节点是否失败 sentinel monitor mymaster <ip> <port> 2 # 指的是超过5000秒,且没有回复,则判定主节点不可达 sentinel down-after-milliseconds mymaster 5000 # 表示在故障转移的时候最多有numslaves在同步更新新的master sentinel parallel-syncs mymaster 1 # 故障转移超时时间 sentinel failover-timeout mymaster 5000
3、sentinel3.conf
#端口号 port 26381 dir /tmp # mymaster:自定义集群名,2:投票数量必须2个sentinel才能判断主节点是否失败 sentinel monitor mymaster <ip> <port> 2 # 指的是超过5000秒,且没有回复,则判定主节点不可达 sentinel down-after-milliseconds mymaster 5000 # 表示在故障转移的时候最多有numslaves在同步更新新的master sentinel parallel-syncs mymaster 1 # 故障转移超时时间 sentinel failover-timeout mymaster 5000
3. docker-compose.yml
version: '2' services: master: image: redis:4.0 restart: always container_name: redis-master #使用主机网络 network_mode: "host" command: redis-server --port 16379 slave1: image: redis:4.0 restart: always container_name: redis-slave-1 network_mode: "host" # 指定端口并指定master ip 端口 command: redis-server --port 16380 --slaveof <master ip> 16379 slave2: image: redis:4.0 restart: always container_name: redis-slave-2 network_mode: "host" command: redis-server --port 16381 --slaveof <master ip> 16379 sentinel1: image: redis:4.0 restart: always container_name: redis-sentinel-1 network_mode: "host" # 指定sentinel文件位置 command: redis-sentinel /usr/local/etc/redis/sentinel.conf # 使用数据卷映射文件到指定sentinel位置 volumes: - ./sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf sentinel2: image: redis:4.0 restart: always container_name: redis-sentinel-2 network_mode: "host" command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf sentinel3: image: redis:4.0 restart: always container_name: redis-sentinel-3 network_mode: "host" command: redis-sentinel /usr/local/etc/redis/sentinel.conf volumes: - ./sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
4. centos を使用してクラスターをデプロイし、効果をテストします
1. クラスターへの接続をテストします。 Sentinel1
2. マスター ノードと子ノードのデータ同期をテストします
3. マスターを閉じて、マスター/スタンバイ スイッチを表示します。
センチネルの通常の接続
マスターノードが 16379 から 16381 に切り替わりました
以上がdocker に基づいて redis-sentinel クラスターを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。