72 日目 Redis の高可用性マスター/スレーブ レプリケーション、セントリー、クラスター クラスター

Redis の高可用性

高可用性とは

Web サーバーにおける高可用性とは、サーバーに正常にアクセスできる時間を指し、通常のサービスをどれだけ長く提供できるか (99.9%、99.99%、99.999% など) を測定します。

ただし、Redis の文脈での高可用性の意味はもっと広いと思われ、通常のサービス (マスター/スレーブ分離、迅速な災害復旧技術など) の提供の確保に加えて、高可用性の拡張も考慮する必要があります。データ容量と損失のないデータセキュリティなど。

Redis の高可用性テクノロジー

Redisにおいて高可用性を実現する技術としては、主に永続化、マスタースレーブレプリケーション、セントリー、クラスタークラスターがあり、それぞれの機能とどのような問題を解決できるかについて説明します。

  • 永続性:永続性は最も単純な高可用性方法です (高可用性方法として分類されていない場合もあります)。その主な機能はデータのバックアップ、つまり、プロセスによってデータが失われないようにデータをハードディスクに保存することです。出口。

  • マスター/スレーブ レプリケーション:マスター/スレーブ レプリケーションは高可用性 Redis の基礎であり、Sentinel とクラスターは高可用性を実現するためにマスター/スレーブ レプリケーションに基づいています。マスター/スレーブ レプリケーションは主に、データの複数マシンのバックアップ (および同期) を実現するだけでなく、読み取り操作の負荷分散と単純な障害回復も実現します。

    • 欠点: 障害回復は自動化できません。書き込み操作の負荷分散はできません。ストレージ容量は 1 台のマシンによって制限されます。
  • Sentinel: Sentinel は、マスター/スレーブ レプリケーションに基づいて、自動障害回復を実装します。(マスターがダウンしているため、新しいマスターとなるスレーブを見つけます。センチネル ノードがそれを監視します)

    • 欠点: 書き込み操作は負荷分散できず、ストレージ容量は 1 台のマシンによって制限されます。
  • クラスター クラスター: Redis はクラスタリングを通じて、書き込み操作の負荷分散ができず、ストレージ容量が単一マシンによって制限されるという問題を解決し、比較的完全な高可用性ソリューションを実現します。(マスター 3 台、スレーブ 3 台のペアで 6 セット開始)

Redis のマスター/スレーブ レプリケーション

マスター/スレーブ レプリケーションとは、1 つの Redis サーバーのデータを他の Redis サーバーにコピーすることを指します。前者をマスターノード(Master)、後者をスレーブノード(slave)と呼び、データの複製はマスターノードからスレーブノードへの一方向のみとなります。

デフォルトでは、各 Redis サーバーはマスター ノードであり、マスター ノードは複数のスレーブ ノードを持つことができます (またはスレーブ ノードを持たないこともできます)。ただし、スレーブ ノードはマスター ノードを 1 つだけ持つことができます。

マスター/スレーブ レプリケーションの役割

  • データ冗長性:マスター/スレーブ レプリケーションは、永続化以外のデータ冗長化方法であるデータのホット バックアップを実装します。
  • 障害回復:マスター ノードに問題が発生した場合、スレーブ ノードは迅速な障害回復を実現するためのサービスを提供できます。これは実際には一種のサービス冗長性です。
  • 負荷分散:読み取り/書き込み分離と組み合わせたマスター/スレーブ レプリケーションに基づいて、マスター ノードは書き込みサービスを提供し、スレーブ ノードは読み取りサービスを提供できます(つまり、アプリケーションは Redis データの書き込み時にマスター ノードに接続します) 、アプリケーションは Redis データの読み取り時にスレーブ ノードに接続します)、サーバーの負荷を共有するため、特に書き込みを減らし読み取りを増やすシナリオでは、複数のスレーブ ノードで読み取り負荷を共有すると、Redis サーバーの同時実行性が大幅に向上します。
  • 高可用性の基礎:上記の機能に加えて、マスター/スレーブ レプリケーションもセンチネルとクラスターの実装の基礎となるため、マスター/スレーブ レプリケーションは Redis の高可用性の基礎となります。

 マスター/スレーブ レプリケーション プロセス

(1) スレーブ マシンのプロセスが開始されると、マスター マシンに同期コマンドを送信して同期接続を要求します。

(2) 最初の接続であっても再接続であっても、マスター マシンはバックグラウンド プロセスを開始してデータ ファイルにデータ スナップショットを保存し (rdb 操作を実行)、マスターはデータとキャッシュを変更するためのすべてのコマンドも記録します。データファイルの途中にあります。

(3) バックグラウンド プロセスがキャッシュ操作を完了した後、マスター マシンはデータ ファイルをスレーブ マシンに送信し、スレーブ マシンはデータ ファイルをハードディスクに保存してメモリにロードし、次にマスター マシンがデータ ファイルをスレーブ マシンに送信します。マシンはすべてのデータ ファイルを変更します。操作はスレーブ マシンにも送信されます。スレーブに障害が発生してダウンタイムが発生した場合、通常に戻った後、自動的に再接続されます。

(4) マスター マシンがスレーブ マシンからの接続を受信した後、完全なデータ ファイルをスレーブ マシンに送信します。マスターが複数のスレーブから同時に同期要求を受信した場合、マスター マシンはバックグラウンドでプロセスを開始し、同期要求をスレーブ マシンに送信します。データファイルを保存してすべてのスレーブマシンに送信し、すべてのスレーブマシンが正常であることを確認します。

Redis マスター/スレーブ レプリケーションを構築する

master 192.168.137.10
slave1 192.168.137.15
slave2 192.168.137.20

4.1 すべてのサーバーは Redis データベースを構築します

关闭防火墙
systemctl stop firewalld
setenforce 0
#安装依赖环境
yum install -y gcc gcc-c++ make
 
#解压文件到指定文件夹 opt
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#安装
make
make PREFIX=/usr/local/redis install
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
……
慢慢回车
Please select the redis executable path []
手动输入
/usr/local/redis/bin/redis-server
 
#创建软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
 
/etc/init.d/redis_6379 stop				#停止
/etc/init.d/redis_6379 start			#启动
/etc/init.d/redis_6379 restart			#重启
/etc/init.d/redis_6379 status	
			
#重启redis服务
/etc/init.d/redis_6379 restart

ファイアウォールをオフにし、依存環境をダウンロードします。

 パッケージを解凍してコンパイルします

 指定したディレクトリにインストールする

 パッケージが提供するスクリプトファイルを実行する

 この問題が発生した場合は、「vim ./install_server.sh」と入力します。 

 

 ソフトリンクを作成する

 Redisサービスを起動して確認する

 4.2 Redis設定ファイルの変更(マスターノードの操作)

vim /etc/redis/6379.conf
bind 0.0.0.0      #70行,修改监听地址为0.0.0.0
daemontze yes     #137行,开启守护进程
logfile/var/log/redis_6379.1og   #172行,指定日志文件目录
dir/var/lib/redis/6379           #264行,指定工作目录
appendonly yes                   #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart

 

 4.3 Redis設定ファイルの変更(スレーブノード操作)

vim /etc/redis/6379.conf 
 
bind 0.0.0.0         #70行,修改监听地址为0.0.0.0
daemonize yes        #137行,开启守护进程
logfile/var/log/redis 6379.1og    #172行,指定日志文件目录
dir/var/lib/redis/6379            #264行,指定工作目录
replicaof 192.168.137.10 6379#288行,指定要同步的Master节点IP和端口
appendonly yes     #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart
netstat -natp | grep redis 

 スレーブノードの構成はマスターノードと同様なので、リモート送信用のscpコマンドを使用して変更します。

scp /etc/redis/6379.conf 192.168.137.15:/etc/redis
scp /etc/redis/6379.conf 192.168.137.20:/etc/redis

 変更する 2 つのスレーブ サーバーを入力してください

vim /etc/redis/6379.conf 
replicaof 192.168.137.10 6379#288行,指定要同步的Master节点IP和端口
/etc/init.d/redis_6379 restart
netstat -natp | grep redis 查看主从服务器是否连接

4.4 マスタースレーブ効果の検証

マスターノードのログを表示する

tail /var/log/redis_6379.log
Replica 192.168.137.15:6379 asks for synchronization
Replica 192.168.137.20:6379 asks for synchronization

マスターノード上のスレーブノードを確認する

redis-cli info replication

2.Redisセンチネルモード

マスター/スレーブ切り替え技術の方式は、サーバーがダウンした場合、手動でスレーブ マシンをマスター マシンに切り替える必要があり、手動による介入が必要であり、時間と労力がかかるだけでなく、サービスの停止にもつながります。一定期間利用できなくなること。マスター/スレーブ レプリケーションの欠点を解決するために、センチネル メカニズムがあります。

Sentinel のコア機能: Sentinel は、マスター/スレーブ レプリケーションに基づいて、マスター ノードの自動フェイルオーバーを導入します。

1.センチネルモードの役割

  • 監視: Sentry は、マスター ノードとスレーブ ノードが適切に機能していることを常にチェックします。
  • 自動フェイルオーバー: マスター ノードが正常に動作しない場合、Sentinel は自動フェイルオーバー操作を開始します。障害が発生したマスター ノードのスレーブ ノードの 1 つを新しいマスター ノードにアップグレードし、代わりに他のスレーブ ノードに新しいマスター ノードをコピーさせます。 。
  • 通知 (リマインダー): Sentinel はフェイルオーバーの結果をクライアントに送信できます。

2. センチネル構造は、センチネル ノードとデータ ノードの 2 つの部分で構成されます。

  • センチネル ノード: セントリ システムは 1 つ以上のセンチネル ノードで構成されます。センチネル ノードは、データを保存しない特別な Redis ノードです。ノードの数は 3 以上の奇数である必要があります。
  • データ ノード: マスター ノードとスレーブ ノードは両方ともデータ ノードです。

 

3. フェイルオーバーメカニズム

監視ノードによる定期的な監視により、マスターノードに障害が発生していないかどうかを確認します。

  • 各センチネル ノードは、ハートビートを検出するために、マスター ノード、スレーブ ノード、および他のセンチネル ノードに 1 秒ごとに ping コマンドを送信します。マスター ノードが特定の時間枠内に応答しない場合、またはエラー メッセージで応答した場合、センチネルはマスター ノードが主観的に (一方的に) オフラインであるとみなします。センチネル ノードの半数以上が主観的にマスター ノードがオフラインであると考える場合、客観的にはオフラインです。
  • マスター ノードに障害が発生すると、センチネル ノードは Raft アルゴリズム (選挙アルゴリズム) を通じて選挙メカニズムを実装し、マスター ノードのフェイルオーバーと通知の処理を担当するリーダーとしてセンチネル ノードを共同で選出します。したがって、Sentinel を実行するクラスターの数は 3 ノード以上である必要があります。
  • フェイルオーバーはリーダー センチネル ノードによって実行され、プロセスは次のとおりです。

    • スレーブ ノードを新しいマスター ノードにアップグレードし、他のスレーブ ノードが新しいマスター ノードを指すようにします。
    • 元のマスター ノードが回復すると、そのノードはスレーブ ノードになり、新しいマスター ノードを指します。
    • プライマリ ノードが交換されたことをクライアントに通知します。


客観的オフラインはマスター ノードに固有の概念であることに注意することが重要です。スレーブ ノードとセンチネル ノードに障害が発生した場合、センチネルによって主観的にオフラインになった後は、その後の客観的オフラインおよびフェイルオーバー操作は行われません。

4. マスターノードの選択

  • センチネルの ping 応答に応答しない、異常な (オフラインの) スレーブ ノードをフィルターで除外します。
  • 構成ファイル内で最も優先度の高い構成を持つスレーブ ノードを選択します。(レプリカの優先順位、デフォルト値は 100)
  • 最大のレプリケーション オフセットを持つスレーブ ノード、つまり最も完全なレプリケーションを選択します。

セントリーの開始はマスター/スレーブ モードに依存するため、センチネル モードを実行する前にマスター/スレーブ モードをインストールする必要があります。

5. Redis Sentinel モードを構築する

master 192.168.137.10
slave1 192.168.137.15
slave2 192.168.137.20
sentinel-1: 1992.168.137.30
sentinel-2: 1992.168.137.40
sentinel-3: 1992.168.137.50

5.1 すべての Sentinel サーバーに redis サービスをインストールする

关闭防火墙
systemctl stop firewalld
setenforce 0
#安装依赖环境
yum install -y gcc gcc-c++ make
 
#解压文件到指定文件夹 opt
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#安装
make
make PREFIX=/usr/local/redis install
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
……
慢慢回车
Please select the redis executable path []
手动输入
/usr/local/redis/bin/redis-server
 
#创建软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
 
/etc/init.d/redis_6379 stop				#停止
/etc/init.d/redis_6379 start			#启动
/etc/init.d/redis_6379 restart			#重启
/etc/init.d/redis_6379 status	
			
#重启redis服务
/etc/init.d/redis_6379 restart

5.2マスターとスレーブのデプロイ Redis マスター/スレーブ レプリケーション

マスターノード構成ファイルを変更する

vim /etc/redis/6379.conf
bind 0.0.0.0      #70行,修改监听地址为0.0.0.0
daemontze yes     #137行,开启守护进程
logfile/var/log/redis_6379.1og   #172行,指定日志文件目录
dir/var/lib/redis/6379           #264行,指定工作目录
appendonly yes                   #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart

 スレーブノード構成ファイルを変更する

vim /etc/redis/6379.conf 
 
bind 0.0.0.0         #70行,修改监听地址为0.0.0.0
daemonize yes        #137行,开启守护进程
logfile/var/log/redis 6379.1og    #172行,指定日志文件目录
dir/var/lib/redis/6379            #264行,指定工作目录
replicaof 192.168.137.10 6379#288行,指定要同步的Master节点IP和端口
appendonly yes     #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart
netstat -natp | grep redis 

5.3 センチネルノードの設定ファイル Sentinel.conf を変更する (センチネルノードのすべての操作)

ここで 192.168.52.200 センチネル ノードの構成ファイルを変更し、scp コマンドを使用して他の 2 つのセンチネル ノードに渡します。

vim /opt/redis-5.0.7/sentinel.conf
 
protected-mode no                  #17行,关闭保护模式
port 26379                         #21行,Redis哨兵默认的监听端口
daemonize yes                      #26行,指定sentine1为后台启动
logfile "/var/log/sentinel.log"     #36行,指定日志存放路径
dir "/var/lib/redis/6379"           #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.137.10 6379 2
#84行,修改指定该哨兵节点监控192.168.137.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 3000
#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000
#146行,同一个sentine1对同一个master两次failover之间的间隔时间(180秒)
 
#远程传续将配置文件传输给其他哨兵服务器
scp /opt/redis-5.0.7/sentinel.conf 192.168.137.30:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/sentinel.conf 192.168.137.40:/opt/redis-5.0.7/

5.4 セントリーモードの開始

#所有哨兵服务器执行
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

5.5 センチネル ノードでセンチネル メッセージを表示する

redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.239.10:6379,slaves=2,sentinels=3
[1]+  完成                  redis-sentinel sentinel.conf

5.6 故障シミュレーション

#在master节点查看redis-server进程号
ps -ef | grep redis
 
#杀死master节点redis-server进程
kill -9 21981

マスターがセンチネル ノード上のスレーブ サーバーに移行されていることを確認します。

tail -f /var/log/sentinel.log

Sentinel で変換が成功したかどうかを確認する

redis-cli -p 26379 info sentinel

5.7 障害回復

#主节点
rm -rf /var/run/redis_6379.pid  #删除pid文件如果pid文件不删除则服务起不来
/etc/init.d/redis_6379 start  #启动服务
netstat -natp |grep 6379  
#主服务器查看
redis-cli info replication

3. Redisクラスターモード

クラスター、つまり Redis クラスターは、R​​edis3.0 によって導入された分散ストレージ ソリューションです。

クラスターは複数のノード (Node) で構成され、Redis データはこれらのノード間に分散されます。クラスター内のノードはマスター ノードとスレーブ ノードに分割されます。マスター ノードのみが読み取りおよび書き込みリクエストとクラスター情報のメンテナンスを担当します。スレーブ ノードはマスター ノードのデータとステータス情報のみを複製します。

1. クラスターの役割は2点に集約されます

(1) データ パーティショニング: データ パーティショニング (またはデータ シャーディング) は、クラスターの中核機能です。
クラスターはデータを複数のノードに分散します。一方で、Redis 単一マシンのメモリー サイズの制限を突破し、ストレージ容量が大幅に増加します。他方、各マスター ノードは外部の読み取りおよび書き込みサービスを提供でき、これにより、クラスターの応答性が大幅に向上します。
Redis スタンドアロンのメモリ サイズは制限されており、これは永続性とマスター/スレーブ レプリケーションの紹介で説明したとおりです。その結果、スレーブ ノードは長時間サービスを提供できなくなり、マスター ノードのレプリケーション バッファーがオーバーフローする可能性があります。完全なレプリケーションフェーズ。

(2) 高可用性: クラスターは、マスター/スレーブ レプリケーションとマスター ノードの自動フェイルオーバー (Sentinel と同様) をサポートしており、いずれかのノードに障害が発生しても、クラスターは引き続き外部サービスを提供できます。
 

2. Redis クラスターのデータ断片化

  • Redis クラスターではハッシュ スロットの概念が導入されています
  • Redis クラスターには 16384 個のハッシュ スロット (0 ~ 16383 の番号が付けられます) があります。
  • クラスターの各ノードはハッシュ スロットの一部を担当します。
  • 各キーが CRC16 チェックに合格した後、16384 の残りを取得して、どのハッシュ スロットに配置するかを決定します。この値を通じて、対応するスロットに対応するノードを見つけ、アクセス操作のために対応するノードに直接かつ自動的にジャンプします。

3 つのノードで構成されるクラスターを例に挙げます。

  • ノード A には 0 ~ 5460 のハッシュ スロットが含まれます

  • ノード B にはハッシュ スロット 5461 ~ 10922 が含まれます

  • ノード c にはハッシュ スロット 10923 ~ 16383 が含まれます

3. Redisクラスターモードの構築

Redis クラスターには通常、6 つのノード、3 つのマスター、3 つのスレーブが必要です

サーバーの種類 システムとIPアドレス インストールする必要があるコンポーネント
マスター1 192.168.137.10 redis-5.0.7.ta​​r.gz
マスター2 192.168.137.15 redis-5.0.7.ta​​r.gz
マスター3 192.168.137.20 redis-5.0.7.ta​​r.gz
スレーブ1 192.168.137.30 redis-5.0.7.ta​​r.gz
スレーブ2 192.168.137.40 redis-5.0.7.ta​​r.gz
スレーブ3 192.168.137.50 redis-5.0.7.ta​​r.gz

3.1 環境の初期化 各ホストに redis をインストールする

关闭防火墙
systemctl stop firewalld
setenforce 0
#安装依赖环境
yum install -y gcc gcc-c++ make
 
#解压文件到指定文件夹 opt
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#安装
make
make PREFIX=/usr/local/redis install
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
……
慢慢回车
Please select the redis executable path []
手动输入
/usr/local/redis/bin/redis-server
 
#创建软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
 
/etc/init.d/redis_6379 stop				#停止
/etc/init.d/redis_6379 start			#启动
/etc/init.d/redis_6379 restart			#重启
/etc/init.d/redis_6379 status	
			
#重启redis服务
/etc/init.d/redis_6379 restart

3.2 クラスタ機能を有効にする

サーバー構成ファイルを変更する

vim /opt/redis-5.0.7/redis.conf
 
bind 192.168.137.10                       #69行,注释掉bind项,改为自己
protected-mode no                         #88行,修改,关闭保护模式
port 6379                                 #92行redis默认监听端口,
daemonize yes                             #136行,开启守护进程,以独立进程启动
appendonly yes                            #700行,修改,开启AOF持久化
cluster-enabled yes                       #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf       #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000                #846行,取消注释群集超时时间设置
 
#远程传输完要修改监听地址为自己
scp /opt/redis-5.0.7/redis.conf 192.168.137.15:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/redis.conf 192.168.137.20:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/redis.conf 192.168.137.30:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/redis.conf 192.168.137.40:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/redis.conf 192.168.137.50:/opt/redis-5.0.7/

3.3 Redis ノードの起動

すべてのノードが実行される

cd /opt/redis-5.0.7/
redis-server redis.conf   #启动redis节点

3.4 クラスタの起動

任意の 1 つのノードが起動します

redis-cli --cluster create 192.168.137.10:6379 192.168.137.15:6379 192.168.137.20:6379 192.168.137.30:6379 192.168.137.40:6379 192.168.137.50:6379 --cluster-replicas 1
#六个示例分为三组,每组一主一从,前面的做主节点后面的做从节点下面交互的时候需要输入yes才可以创建 --replicas 1表示每个主节点有一个从节点

3.5 テストクラスター

redis-cli -h 192.168.137.10 -p 6379 -c           #加-c参数,节点之间可以互相跳转
192.168.239.10:6379> cluster slots               #查看节点哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922                            #哈希槽编号范围
   3) 1) "192.168.137.10"  
      2) (integer) 6379                          #主节点ip和端口
      3) "093fd0ff72272a5b3c91b01fbcc106184971b818"
   4) 1) "192.168.137.40" 
      2) (integer) 6379                          #从节点ip和端口
      3) "97b3832b9be3df6455f3ba34269a92ee07bd46e3"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "192.168.137.15"
      2) (integer) 6379
      3) "03523dfb1c9efd1da17f9380e94276c171ef2041"
   4) 1) "192.168.137.30"
      2) (integer) 6379
      3) "33bb54b95acfcb61960317f3eaaf19f74fd5cafa"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.137.20"
      2) (integer) 6379
      3) "a0515c00438a99c928e16bd0ec704013e74cc2e7"
   4) 1) "192.168.137.50"
      2) (integer) 6379
      3) "efbb3e371167be32d67462e496ba538ee94fad07"

おすすめ

転載: blog.csdn.net/weixin_57560240/article/details/131040700
おすすめ