CentOS8でRedisクラスターをセットアップする方法-パート3-


Redis Clusterは、以前はSentinelsを使用して実装されていた自動シャーディング、レプリケーション、および高可用性をサポートする組み込みのRedis機能です。これは、2つの主要な目的のために設計されています。1つはデータセットを複数のインスタンスに自動的に分割すること、もう1つはパーティション中にある程度の可用性を提供すること、一部のインスタンス(特にマスター)に障害が発生した場合や大部分のインスタンスと通信できない場合に操作を続行することです。クラスター内のノード。

ただし、より大きな障害が発生した場合(たとえば、マスターインスタンスの大部分が使用できない場合)、クラスターは動作を停止します。また、マスターとスレーブに同時に障害が発生した場合、クラスターは通常の操作を続行できません(ただし、回避策は、ノードを追加するか、クラスターに非対称性を作成して、クラスターのレイアウトを自動変更することです)。

Redisクラスターのドキュメントによると、期待どおりに機能する「最小クラスター」には、少なくとも3つのマスターノードが含まれている必要があります。ただし、高可用性に最適なセットアップには、3つのマスターと3つのスレーブを備えた少なくとも6つのノードが必要であり、各マスターにはスレーブがあります。

重要:Redisクラスターにはいくつかの制限があります。NATされた環境や、たとえばDockerでIPアドレスまたはTCPポートが再マップされる環境はサポートされていません。さらに、すべてのクライアントライブラリがそれをサポートしているわけではありません。

この記事では、CentOS 8で(クラスターモードを無効にして)Redisクラスターをセットアップする方法を示します。Redisのインストール、クラスターノードの構成、クラスターの作成、クラスターのフェイルオーバーのテストの方法について説明します。

注:このガイドでは、新しい/空のRedisインスタンスを使用してクラスターモードを実行します。クラスターモードは、Redisシリーズの最初の2つのガイドで行われた一部の構成では機能しません。特に、パラメーターのレプリカが使用されている場合は機能しません。

  1. Servers with CentOS 8 Installation
Redis Master1: 10.42.0.247
Redis Master2: 10.42.0.197
Redis Master3: 10.42.0.132

Redis Slave1: 10.42.0.200
Redis Slave2: 10.42.0.21
Redis Slave3: 10.42.0.34

このセットアップには、3つの読み取り/書き込みマスターノードと3つの読み取り専用レプリカノードがあり、各マスターには1つのレプリカがあるため、3つのシャードには各ノードのクラスターのすべてのデータが含まれます。アプリケーションAPIまたはCLIクライアントは、マスターノードにのみ書き込むことができますが、クラスター内の任意のノードから読み取ることができます。

ステップ1:すべてのノードにRedisをインストールする

1. SSH経由ですべてのインスタンスにログインし、次のコマンドを実行して、図のようにDNFパッケージマネージャーを使用してRedisモジュールをインストールします。

# dnf module install redis

2.次に、Redisサービスを開始し、システムの起動時に自動的に開始できるようにし、ステータスをチェックして実行されていることを確認します(6つのインスタンスすべてでサービスを確認します)。

# systemctl start redis
# systemctl enable redis
# systemctl status redis

ステップ2:すべてのノードでRedisインスタンスを構成する

3.このセクションでは、Redisクラスターノードを構成する方法について説明します。ここですべてのノードで構成を実行することを忘れないでください。

/etc/redis.conf構成ファイルを使用して、Redisサーバーを構成します。推奨される方法として、選択したコマンドラインテキストエディタを使用して編集する前に、元のファイルのバックアップを作成してください。

# cp /etc/redis.conf /etc/redis.conf.orig
# vi /etc/redis.conf

4.次に、次の構成パラメーターを見つけて、図のようにそれらの値を編集します。 bindパラメーターは、Redisサーバーがリッスンするインターフェースを設定し、その値をインスタンスLANIPに設定します。 127.0.0.1を削除すると、クラスターの作成プロセス、特にクラスターへの参加段階が遅くなることがわかりました。

bind  10.42.0.247

次に、protected-modeを no に設定して、クラスター上の他のインスタンスからの接続を許可します。

protected-mode no

portパラメーターは、Redisサーバーが接続をリッスンするポートを定義します。デフォルトは6379です。これは、クライアントと通信するためのデータポートです。

port 6379

5.次のパラメーターのセットは、クラスターモードを有効にし、その便利な機能のいくつかを設定します。 cluster-enabledパラメーターを yes に設定すると、クラスターモードがアクティブになります。

cluster-enabled yes

次に、cluster-config-fileパラメーターは、クラスターノードのクラスター構成ファイルの名前を設定します(例:nodes-6379.conf)。ファイルは作業ディレクトリ(デフォルトはdirパラメータを使用して定義された/ var/lib/redis)に作成され、ユーザーが編集することはできません。

cluster-config-file nodes-6379.conf

次の便利なクラスターオプションはcluster-node-timeoutです。これは、インスタンスが障害状態と見なされるために使用できない最大時間をミリ秒単位で設定するために使用されます。 15000の値は15秒に相当します。

cluster-node-timeout 15000

6.ディスク上でRedisの永続性を有効にする必要もあります。永続化モードの1つであるAppendOnly File(AOF)を使用できます。これは、サーバーが正常に受信したすべての書き込み操作を(作業ディレクトリの下に作成されたappendonly.aofファイルに)ログに記録します。データはサーバーの起動時に再生され、元のデータセットが再構築されます。

これを有効にするには、appendonlyパラメーターを yes に設定します。

appendonly yes

7.すべての変更を行った後、すべてのノードでRedisサービスを再起動して、最近の変更を適用します。

# systemctl restart redis

8.この時点で、すべてのクラスターノードにIDが必要です。これは、/ var/log/redis /redis.logにあるログファイルで確認できます。

# cat /var/log/redis/redis.log

9.次に、すべてのインスタンスでポート6397と16379を開きます。後者のポートは、クラスターバス(バイナリプロトコルを使用したノード間通信チャネル)に使用されます。これは、RedisクラスターTCP接続の基本的な要件です。

# firewall-cmd --zone=public --permanent --add-port=6379/tcp 
# firewall-cmd --zone=public --permanent --add-port=16379/tcp 
# firewall-cmd --reload

ステップ3:Redisクラスターを作成する

10.クラスターを作成するには、次のようにredis-cliコマンドラインクライアントを使用します。 -cluster create はクラスターの作成を有効にし、 -cluster-replicas 1 はマスターごとに1つのレプリカを作成することを意味します。

6つのノードがあるセットアップでは、3つのマスターと3つのスレーブがあります。

最初の6つのノードはマスター(M)と見なされ、次の3つのノードはスレーブ(S)と見なされることに注意してください。最初のスレーブ、つまり10.42.0.200:6379は最初のマスター、つまり10.42.0.247:6379を複製し、2番目のスレーブは2番目のマスターをこの順序で複製します。

次のコマンドは、結果が上記の論理設定を表すようにフォーマットされています。

# redis-cli --cluster create 10.42.0.247:6379 10.42.0.197:6379 10.42.0.132:6379 10.42.0.200:6379 10.42.0.21:6379 10.42.0.34:6379 --cluster-replicas 1

11.クラスターの作成が成功したら、任意のホストで次のコマンドを実行して( -h フラグを使用してIPアドレスを指定)、すべてのクラスターノードを一覧表示します。

# redis-cli -h 10.42.0.247 -p 6379 cluster nodes

次のスクリーンショットに示すように、スレーブがマスターを示している状態で、すべてのクラスターノードを表示できるはずです。

さまざまなフィールドは、ノードID、IPアドレス:ポート、フラグ、最後に送信されたping、最後に受信されたpong、構成エポック、リンクステート、スロット(マスターの場合)の順序になっています。

ステップ4:Redisクラスターフェイルオーバーのテスト

12.このセクションでは、クラスターのフェイルオーバーをテストする方法を示します。まず、マスターに注目しましょう。

# redis-cli -h 10.42.0.247 -p 6379 cluster nodes  | grep master

また、Redisスレーブにも注意してください。

# redis-cli -h 10.42.0.247 -p 6379 cluster nodes  | grep slave

13.次に、マスターノードの1つ(10.42.0.197など)でRedisサービスを停止し、クラスター内のすべてのマスターノードを確認します。

# systemctl stop redis
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master

次のスクリーンショットから、ノード10.42.0.197:6367が失敗状態にあり、そのスレーブ10.42.0.21:6379がマスターステータスにプロモートされていることがわかります。

14.次に、障害が発生したノードでRedisサービスをもう一度開始し、クラスター内のすべてのマスターを確認します。

# systemctl start redis
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes  | grep master

また、クラスタースレーブをチェックして、障害が発生したマスターがスレーブになったことを確認します。

# redis-cli -h 10.42.0.247 -p 6379 cluster nodes  | grep slave

ステップ5:Redisクラスター全体でのデータレプリケーションのテスト

15.この最後のセクションでは、クラスターデータのレプリケーションを確認する方法について説明します。マスターの1つにキーと値を作成し、次のようにすべてのクラスターノードからそれを読み取ろうとします。 -c スイッチを使用して、redis-cliユーティリティでクラスターサポートを有効にし、クラスターモードでデータにアクセスします。

# redis-cli -c -h 10.42.0.247 -p 6379 set name 'TecMint.com'
# redis-cli -c -h 10.42.0.247 -p 6379 get name
# redis-cli -c -h 10.42.0.21 -p 6379 get name
# redis-cli -c -h 10.42.0.132 -p 6379 get name
# redis-cli -c -h 10.42.0.200 -p 6379 get name
# redis-cli -c -h 10.42.0.197 -p 6379 get name
# redis-cli -c -h 10.42.0.34 -p 6379 get name

結論として、Redisクラスターは、自動シャーディング、レプリケーション、および高可用性を実現するための推奨される方法です。 /etc/redis.confファイルの残りの部分には、他にも多くの十分に文書化された構成パラメーターがあります。詳細については、公式ドキュメント(RedisクラスターチュートリアルおよびRedisクラスター仕様)を参照してください。

これで、3部構成のRedisチュートリアルシリーズは終了です。以下のフィードバックフォームを使用して、質問やコメントを投稿できます。