1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

redisクラスタ構築のチュートリアルと発生した問題

2022-01-03 11:22:30

ここでは、Linuxの仮想マシン上に6ノードのredis疑似クラスタを構築するため、考え方は簡単で、仮想マシン上に6つのredisインスタンスを開き、それぞれ専用のポートを用意します。これは、6台のマシンをシミュレートし、その6台のインスタンスを使用してredisクラスタを構築することと同じです。

前提条件:redisが/usr/local/redis-4.0.1にインストール済みであること そうでない場合は、以下の記事を参照してください。  Windowsでのredisインストール Linuxでのredisのインストール

redisクラスタはrubyスクリプトを使用しているので、そのスクリプトを実行するには、ruby環境 . これはredisソースコードのsrcディレクトリにあるredis-trib.rbに対応します。redis-trib.rbはredisクラスターを管理するためのredis公式ツールで、redisが提供するクラスターコマンドをベースに、シンプルで便利で役立つ操作ツールとしてカプセル化されたものですので。

ruby環境をインストールする。

  1.

yum install ruby

  2.

yum install rubygems

  3.

gem install redis

  Centosはデフォルトでrubyを2.0.0までサポートしていますが、redisは最低でも2.2.2が必要です。 

       1. sudo yum install curl

       2. rvmのインストール

curl -L get.rvm.io | bash -s stable 

  3.

source /usr/local/rvm/scripts/rvm

  4. rvmリポジトリで既知のrubyのバージョンを表示する

rvm list known

  5. rubyのバージョンをインストールする

rvm install 2.3.3

  6. ルビーバージョンの使用

rvm use 2.3.3

  7. 既知のバージョンのアンインストール

rvm remove 2.0.0 

  8. バージョンを見る

ruby --version

  9. redisを再度インストールする

gem install redis

 redisクラスタの構築

  redis-clusterディレクトリを作成し、redis-8001, redis-8002, redis-8003ノードディレクトリを作成し、redis-confを各ノードディレクトリにコピーしてください。

      各インスタンスは、1つのマシン(192.16819.129)上にあるので、異なるポートを持つべきです。また、各インスタンスは当然、データを保存する独自の場所を持ちます。

  redisサービスを起動し、起動するか確認してください。

  startall.shスクリプトの作成(prompt permission deniedはパーミッションが足りないことを意味し、chmod 777 startall.shを実行してパーミッションを変更する)。

  startall.shスクリプトを起動します。

  stopall.shスクリプトを作成します。

  クラスターを作成する

  次に、Rubyスクリプトでクラスタを作成します。

  redis-trib.rbには、以下のような機能があることがわかります。

  1. create : クラスターを作成する
  2. check : クラスターをチェックする
  3. info : クラスタ情報を見る
  4. fix : クラスタを修復する
  5. reshard : スロットをオンラインに移行する
  6. rebalance : クラスターノードスロット数のバランスをとる。
  7. add-node : クラスタに新しいノードを追加します。
  8. del-node : クラスタからノードを削除する
  9. set-timeout:クラスタノード間のハートビート接続のタイムアウトを設定する
  10. call : クラスタの全ノードでコマンドを実行します。
  11. import : 外部REDISデータをクラスタに取り込む

redis-trib.rbには、主に2つのクラスがあります。  ClusterNode  と  RedisTrib  .  ClusterNode  で、各ノードに関する情報を保持する。  RedisTrib  は、redis-trib.rbの各関数の実装です。

  Note: Prompt for minimum of 3 master cluster nodes, earlier it was saying to create 6, but actually I only created 3 nodes, so we can conclude that we are creating a redis cluster with minimum of three master nodes, it should be a odd number, so don't lazy and create three more.

  ここで重要なのはオプションのreplicasパラメータ、--replicas 2で、これは各マスターに2つのスレーブが割り当てられることを意味します。replicasはスレーブが何個必要かを意味し、このパラメータなしでマスターが3つあるようにうまく作成することができます。replicasパラメータは後ほど説明します。

まず、--replicas 1 1 は実際には比率を表しており、マスターノード数/スレーブノード数の比率を表しています。つまり、クラスタを作るときに、どのノードがマスターノードになるのか?どのノードがスレーブノードなのか?答えは、コマンドのIP:PORTの順番で、3つのマスターノードと3つのスレーブノードになります。

次に、図中のスロットの概念に注目してください。Redisクラスタのスロットとは、データを格納する場所、つまりスロットのことです。各Masterにはスロットの範囲が存在しますが、Slaveには存在しません。Redisクラスタでは、やはり読み書きできるのはMasterで、Slaveは読み込みのみです。データの書き込みは、実際にはスロットに分散して格納されるため、従来の1.XのMaster-Slaveモデル(Master/Slaveモードではデータ格納は同一)とは異なり、Redisクラスタ内の3つのMasterのデータ格納は同一にならないからです。これについては、続報で検証する予定です。