Redis のマスター/スレーブ レプリケーション、センチネル モードの構築、スプリングブートの統合
序文
Redis には、マスター/スレーブ同期/レプリケーション、センチネル モード、およびクラスターの 3 つのモードがあります。
マスター/スレーブ レプリケーション: マスター/スレーブ レプリケーションは高可用性 Redis の基礎であり、Sentinel と Cluster はどちらもマスター/スレーブ レプリケーションに基づいて高可用性を実現します。マスター/スレーブ レプリケーションでは、主にデータのマルチマシン バックアップのほか、読み取り操作の負荷分散と単純な障害回復が実装されます。
欠点: 障害回復は自動化できず、書き込み操作は負荷分散できず、ストレージ容量は 1 台のマシンによって制限されます。
Sentinel : Sentinel は、マスター/スレーブ レプリケーションに基づいて、自動障害回復を実装します。
欠点: 書き込み操作は負荷分散できず、ストレージ容量は 1 台のマシンによって制限され、Sentinel はスレーブ ノードの自動フェイルオーバーを実行できません。読み書き分離シナリオでは、スレーブ ノードの障害により読み取りサービスが利用できなくなり、さらにスレーブノードの監視が必要なため、スイッチング操作が必要です。
クラスター: Redis はクラスター化を通じて、書き込み操作の負荷分散ができず、ストレージ容量が単一マシンによって制限されるという問題を解決し、比較的完全な高可用性ソリューションを実装します。
Redis のインストールについてはここでは詳しく説明しませんので、必要な方は前回の記事「Centos7 での Redis のインストールと設定」を参照してください。
1. Redis マスター/スレーブ レプリケーション (読み取り/書き込み分離)
環境整備
ホスト名 | IP |
---|---|
redis(メイン) | 192.168.92.100 |
redis (準備済み) | 192.168.92.101 |
redis (準備済み) | 192.168.92.102 |
1. マスタ・スレーブ型レプリケーションの概要
マスター/スレーブ レプリケーションとは、1 つの Redis サーバーから他の Redis サーバーにデータをコピーすることを指します。前者をマスター ノード (Master)、後者をスレーブ ノード (Slave) と呼び、データ レプリケーションは一方向であり、マスター ノードからスレーブ ノードへのみ可能です。
デフォルトでは、各 Redis サーバーはマスター ノードであり、マスター ノードは複数のスレーブ ノードを持つことができます (またはスレーブ ノードを持たない) が、スレーブ ノードが持つことができるマスター ノードは 1 つだけです。
2. マスター/スレーブ レプリケーション
データの冗長性: マスター/スレーブ レプリケーションは、永続性に加えてデータの冗長性方法であるデータのホット バックアップを実装します。
障害回復: マスター ノードで問題が発生した場合、スレーブ ノードは迅速な障害回復を実現するためのサービスを提供できます。これは実際には一種のサービス冗長性です。
負荷分散: マスター/スレーブ レプリケーションに基づいて、読み取り/書き込み分離と組み合わせることで、マスター ノードは書き込みサービスを提供し、スレーブ ノードは読み取りサービスを提供できます (つまり、Redis データを書き込むとき、アプリケーションはマスター ノードに接続し、 Redis データを読み取るとき、アプリケーションはスレーブ ノードに接続します) ことで、サーバーの負荷を共有します。特に、書き込みが少なく読み取りが多いシナリオでは、複数のスレーブ ノードで読み取り負荷を共有すると、Redis サーバーの同時実行性が大幅に向上します。
高可用性の基礎: 上記の機能に加えて、マスター/スレーブ レプリケーションはセンチネルとクラスターの実装の基礎でもあるため、マスター/スレーブ レプリケーションは Redis の高可用性の基礎となります。
3.Redis マスター/スレーブ レプリケーション プロセス
スレーブ マシン プロセスが開始されると、「同期コマンド」コマンドがマスター マシンに送信され、同期接続を要求します。
最初の接続でも再接続でも、マスター マシンはバックグラウンド プロセスを開始してデータ ファイルにデータ スナップショットを保存します (RDB 操作を実行します)。同時に、マスターはデータとキャッシュを変更するすべてのコマンドも記録します。それらをデータファイルに含めます。
バックグラウンド プロセスがキャッシュ操作を完了した後、マスター マシンはデータ ファイルをスレーブ マシンに送信します。スレーブ マシンはデータ ファイルをハードディスクに保存し、メモリにロードします。その後、マスター マシンはすべての操作を結合します。データを変更するため、スレーブ マシンに送信されます。スレーブに障害が発生してダウンタイムが発生した場合、正常に戻った後に自動的に再接続されます。
マスター マシンがスレーブ マシンからの接続を受信した後、完全なデータ ファイルをスレーブ マシンに送信します。マスターが複数のスレーブから同時に同期要求を受信した場合、マスターはデータを保存するためのプロセスをバックグラウンドで開始します。ファイルをすべてのスレーブ マシンに送信して、すべてのスレーブ マシンが正常であることを確認します。
4. Redis マスター/スレーブ レプリケーションを設定する
1. 3 つの仮想マシンすべてが Redis サーバーに入る
info replication
マスター/スレーブ レプリケーション情報の表示
role:master #現在のマシンの役割は接続されたマスターまたはスレーブです
)salaces:0 #スレーブノードが現在0であることを表します
2. スレーブ ノード (101/102) を入力して構成を変更します
PS: これはスレーブ ノードの構成です。マスター ノードでは、次の構成でマスター/スレーブ構成のパスワードを有効にするだけで済みます (masterauth) XXX、その後のセンチネル建設の準備をする。
-
担当者を検索して見つけます
replicaof
。 -
変更して
replocaofi
、masterauth
-
replica-read-only
読み取りと書き込みを分離するには、ノードからの読み取り操作を [はい] に変更します。 -
保存して終了し、スレーブ ノード マシン上のバックアップ ファイルを削除し、上記と同じ手順に従って 2 番目のスレーブ ノード 102 を構成します。
- Redis サービスを再起動し、上記のように 2 番目のスレーブ ノード 102 を構成します。
-
101 個のスレーブ ノードを表示する
info replication
-
100台のマスターノードのPSを確認する
info replication
:マスターノードがダウンすると、スレーブノードはマスターノードになりません。
2. Redis Sentinel モード (センチネル)
マスター/スレーブ レプリケーションの問題: マスター ノードがダウンしています。可用性を確保して読み取りと書き込みを続行するにはどうすればよいですか?
Redis のマスター/スレーブ レプリケーションでは、Redis マスター ノードがダウンすると、スレーブ ノード Slave は自動的にマスター ノードになることができないため、ユーザーに書き込みリクエストを提供できず、読み取りのみを実行できます。この問題を解決するために、Redis を導入しました。センチネル メカニズム。
センチネル メカニズムを通じて、センチネルはすべてのノードを監視します。マスター ノードがダウンすると、センチネルはスレーブ ノードの 1 つがマスター ノードに代わって書き込み操作を引き継ぎ、新しいマスター/スレーブ モードになります。 。
環境整備
ホスト名 | IP |
---|---|
redis(メイン) | 192.168.92.100 |
redis (準備済み) | 192.168.92.101 |
redis (準備済み) | 192.168.92.102 |
1. Redis センチネル メカニズムを構成する
cd /usr/local/redis/redis-5.0.0
1. Sentinel メカニズムのコア構成ファイルであるRedis インストール ディレクトリ Sentinel.conf に移動します
2. Sentinel コア構成ファイルをコピーします/usr/local/redis
3.
cp sentinel.conf /usr/local/redis
Sentinel コア構成ファイルを編集します
vim sentinel.conf
具体的な構成情報は次のとおりです。
- パラメータを直接コピーして変更するだけです
# Base
#开启,方便其他节点器访问
protected-mode no
#哨兵默认端口号
port 26379
#后台启动模式
daemonize yes
#哨兵机制默认进程号
pidfile /var/run/redis-sentinel.pid
#设置哨兵模式的日志文件路劲
logfile /usr/local/redis/sentinel/redis-sentinel.log
#哨兵模式的工作目录
dir /usr/local/redis/sentinel
# core 核心配置
# my-master:自定义名称 192.168.92.100 6379:主节点ip+端口 2:哨兵数量
sentinel monitor my-master 192.168.92.100 6379 2
#设置主节点密码
sentinel auth-pass my-master 123456
#被哨兵任务失效的毫秒时间段,默认为30秒,单位毫秒
sentinel down-after-milliseconds my-master 30000
#当从节点后变为主节点后,进行配置其他的,多少个从节点进行并行复制 1:一次接一个复制 2:一次复制2个
sentinel parallel-syncs my-master 1
#主备的切换时间,哨兵进行故障转移如果超时,则会交给哨兵集群的另一个节点处理进行故障转移
sentinel failover-timeout my-master 180000
2. これはセンチネル クラスターであるため、3 つの Redis ノードのセンチネル構成ファイルはまったく同じです。
直接コピーを作成することも、次の方法を使用してリモートでコピーすることもできます
PS: 構成ファイルをリモート転送する
scp sentinel.conf [email protected]:/usr/local/redis
scp sentinel.conf [email protected]:/usr/local/redis
3.センチネルを開始する
開始コマンド:redis-sentinel sentinel.conf
ここで、sentinel.conf は Sentinel コア構成ファイルのパスです。
PS: フォルダーやファイルはありません。事前定義されたディレクトリがあるため、それらを作成するだけで、再度開始できます。Redis プロセスを確認し、
mkdir /usr/local/redis/sentinel -p
ps -ef|grep redis
Sentinel
tail -f redis-sentinel.log
ログ ファイルの末尾を動的に確認してください。
このメッセージが表示された場合は、それを意味します構成が成功したことを確認し、
スレーブ ノード サーバーもすべて Sentinel 構成ファイルを開始する必要があります
4. センチネルのメカニズムをテストする
- すべてのマスター/スレーブ レプリケーション アーキテクチャ ノードをオンにします。現在 100 がマスター ノードです。
- マスターノードをシャットダウンしてログを確認すると、
101 がマスターになり、ダウンしていた 100 ノードも削除されていることがわかります
3. 元の 100 マスターノードを起動し
、ログを確認します 100 が生きた後、以前のマスターがノードは復元されません。
5. 元のマスターが復元された後の同期外れの問題を解決する
注意深い学生なら、元のマスター (100) がスレーブに復元された後、その同期ステータスが OK ではなく、ステータスが master_link_status:dowm であることに気づくと思います。これはなぜですか? 変更中のマスター認証を自分のパスワードに変更
するだけです。私のパスワードは 123456 です。redis.conf
一般に、マスター データをスレーブに同期できない場合の解決策は次のとおりです。
- ネットワーク通信の問題については、相互に ping を送信し、イントラネット内で通信できることを確認してください。
- ファイアウォールをオフにして、対応するポートを開発します (仮想マシンの場合はファイアウォールを永続的にオフにすることをお勧めします。クラウド サーバーの場合は、イントラネットの相互運用性を確保する必要があります)。
- すべてのパスワードを統一し、未設定のノードを見逃さないようにしてください。
6.SpringBoot は Redis Sentinel を統合します
1. 構成情報
server:
port: 8088
spring:
datasource: # 数据源的相关配置
url: jdbc:mysql://127.0.0.1:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
password: 123456
redis:
# Redis 单机单实例
# database: 0
# host: 192.168.92.100
# port: 6379
# password: 123456
# Redis 哨兵模式
database: 1
password: 123456
sentinel:
master: my-master
nodes: 192.168.92.100:26379,192.168.92.101:26379,192.168.92.102:26379
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.テスト結果:
3. Redis クラスターモード (Redis-Cluster)
先ほど、マスター/スレーブ レプリケーションとセンチネルについて学びました。これらは読み取りの同時実行性を向上させることができますが、単一マスターの容量には制限があり、データが特定のレベルに達するとボトルネックが発生します。現時点では、水平方向に拡張できます。複数のマスター/スレーブでクラスターを形成します。
このセクションの初めに、redis-cluster について学びましょう。redis-cluster は複数のマスターとスレーブをサポートし、大規模なデータをサポートし、高可用性と高い同時実行性を実現します。
Sentinel モードは実際には一種のクラスタです。読み取りリクエストの同時実行性を向上させることができますが、フォールト トレランスにいくつかの問題がある可能性があります。たとえば、masterf がデータをスレーブに同期するとき、これは実際には非同期レプリケーションになります。このとき、masterf はハングします。 、スレーブの順です。そのデータはマスターほど新しくありません。データの同期には時間がかかり、1 ~ 2 秒のデータが失われます。マスターが復元されてスレーブに変換されると、新しいデータは失われます。
特徴
- 各ノードは、互いの関係と自身の役割を認識しています。もちろん、クラスター環境に存在することも認識しており、ピンポンなどの相互作用や通信が可能です。これらの関係は、各ノードに含まれる特定の設定ファイルに保存され、構築時にこれを設定します。
- クライアントがクラスターとの接続を確立したい場合は、そのうちの 1 つとの関係を確立するだけで済みます。
- ノードがハングアップすると、半数以上のノードによってそれが検出され、目標がオフラインになった後のマスター/スレーブ スイッチは、セントリー モードで前述したものと同じになります。
- Redis にはデータを保存するために使用されるスロット (スロット ノードとも呼ばれます) が多数ありますが、これについては今回は無視し、後で説明します。
クラスターフォールトトレランスを
備えた Redis クラスターを構築するには、高可用性クラスターを形成するためにマスターとして少なくとも 3 つのノードが必要です。さらに、各マスターにはスレーブが装備されている必要があるため、クラスター全体では 6 ノードが必要です。これもまた、最も古典的な Redis クラスターであり、3 つのマスターと 3 つのスレーブと呼ぶことができ、耐障害性が優れています。したがって、セットアップ時には 6 台の仮想マシンが必要になります。仮想マシンを 6 台ずつ用意してください。クローン作成により構築できます。Redis の単一インスタンスを使用してクローンを作成できます。
- クラスタは擬似クラスタと呼ばれる 1 台のサーバー上に構築することもできますが、本番環境は実稼働環境である必要があるため、6 台のサーバーを使用することをお勧めします。
- クローン作成後は必ず Redis を閉じてください。
環境整備
以前に構成されていない Redis を見つけて、再度構成することをお勧めします。前の 2 つのセクションの構成ファイルを再利用しないでください。Vmware が構成ファイルを構成した後、システムのクローンを作成できます
。
ホスト名 | IP |
---|---|
103 レディ | 192.168.92.103 |
104 レディ | 192.168.92.104 |
105 レディ | 192.168.92.105 |
106 レディ | 192.168.92.106 |
107 レディ | 192.168.92.107 |
108 レディ | 192.168.92.108 |
1. 最初のクラスターサーバーの運用 103
- redis.conf ディレクトリに入り、ファイルを編集します
cd /usr/local/redis/
vim redis.conf
- 次のように構成を変更します。
#开启集群模式
cluster-enabled yes
#每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由ris自己维护,我们不要处理
cluster-config-file nodes-6379.conf
#超时时间,超时则认为master?宕机,随后主备切换
cluster-node-timeout 15000
#开启AOF
appendonly yes
- 構成ファイルを保存し、redis を再起動し、構成が成功したことを示すクラスターがサービスに表示されるかどうかを確認します。
/etc/init.d/redis_init_script start
2. 6 つの Redis インスタンスを開始します
- 他の 5 つのステーションを開始し、上記の手順を順番に実行します。
- 起動処理中にエラーが発生した場合は、rdbなどのファイルを削除してクリアしてください。
cd working/
rm dump.rdb
- ここではxhellを使用して複数のウィンドウを同時に操作できます
3. クラスターを作成する
(古いバージョンの Redis は、Redis インストール ディレクトリ内の redis-trib.rb スクリプトを使用してビルドする必要があります)
1. 103 (マスター) ノードを操作します。
#####
#集群命令说明
redis-cli --cluster help
#注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb来构建集群,最新版使用C语言来构建了,这个要注意
#注意2:以下为新版的redis构建方式
#####
#创建集群,主节点和从节点比例为1,1-3为主,4-6为从,1和4,2和5,3和6分别对应为主从关系,这也是最经典用的最多的集群模式
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1
##我的集群供参考---------------------------------------------------------------------------------------
#-a 为当前redis服务密码
redis-cli -a 123456 --cluster create 192.168.92.103:6379 192.168.92.104:6379 192.168.92.105:6379 192.168.92.106:6379 192.168.92.107:6379 192.168.92.108:6379 --cluster-replicas 1
##查看集群信息,任意一个节点都行 a 为当前redis服务密码
redis-cli -a 123456 --cluster 192.168.19.108:6379
緑色の領域が表示されたら、3 つのマスターと 3 つのスレーブの構築が完了したことを意味します。
Sots : データのロードに使用されるスロット。マスター ノードでは利用可能ですが、スレーブ ノードでは利用できません。
2. クラスター情報の表示
任意のノードが以下を実行します。
redis-cli -a 123456 --cluster 192.168.19.108:6379
4. スロットノード (一貫したハッシュ原則に従う)
Redis クラスターのマスターノードにはスロットスロットノードが存在しますが、スレーブノードにはスロットノードがありません。
- スロット スロット ノードはマスター ノード上に均等に分散されます
- スロット スロット ノードはデータを保存するために使用されます
クラスター情報の表示 クラスター情報の
表示 クラスターサーバーノード上で表示可能
redis-cli -c -a xxxx密码 -h 192.168.92.142 -p 6379
cluster info
クラスター構成情報の表示
cluster nodes
ノード情報
テストの表示
5.springboot は Redis クラスターを統合します
1. 構成情報
server:
port: 8088
spring:
datasource: # 数据源的相关配置
url: jdbc:mysql://127.0.0.1:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
password: 123456
redis:
# Redis 单机单实例
#database: 0
#host: 192.168.92.100
#port: 6379
#password: 123456
# Redis 哨兵模式
#database: 1
#password: 123456
#sentinel:
# master: my-master
# nodes: 192.168.92.100:26379,192.168.92.101:26379,192.168.92.102:26379
# Redis 集群模式
password: 123456
cluster:
nodes: 192.168.92.103:6379,192.168.92.104:6379,192.168.92.105:6379,192.168.92.106:6379,192.168.92.107:6379,192.168.92.108:6379
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.試験結果
bbb はノード 104 上になく、データはノード 103 に保存されていることがわかります。