Redisシリーズ学習ノート21クラスタ

2389 ワード

クラスタ


Redisの分散型データベース実装
Redisクラスタは、複数のRedisサーバからなる分散型ネットワークサーバ群であり、クラスタ内の各サーバはノード(node)と呼ばれ、これらのノードは相互に接続され通信される.
分散されたRedisクラスタには中心ノードがないので、あるノードがクラスタ全体のパフォーマンスボトルネックになる心配はありません.
Redisクラスタの各ノードには、プライマリノード(master node)とセカンダリノード(slave node)の2つのロールがあります.プライマリノードはデータを格納するために使用され、セカンダリノードはプライマリノードのレプリケーションです.
クラスタは、スライスを使用してデータベースの容量を拡張し、コマンド要求の負荷を異なるノードに渡して分担します.
クラスタはデータベース全体を16384スロット(slot)に分け、すべてのキーが16384スロットの1つに属し、キーキーキーがどのスロットに属するかを計算する式がslot_number=crc 16(key)%16384、ここでcrc 16は16ビットの循環冗長検査和関数である.
クラスタ内の各プライマリノードは、0〜16384個のスロットを処理することができ、16384個のスロットがいずれかのノードが処理を担当している場合、クラスタはオンライン状態に入り、クライアントから送信されたデータコマンド要求の処理を開始する.
スロットが割り当てられたプライマリノードの場合、このプライマリノードは、自分に割り当てられたスロットに属するコマンド要求のみを処理します.ノードが自分の処理するスロットに関係のないコマンド要求を受信すると、ノードはクライアントにステアリングエラー(redirection error)を返し、クライアントにどのノードがこのコマンドを処理する責任を負うのかを教え、その後、クライアントはエラーに含まれるアドレスとポート番号に基づいて正しいノードにコマンド要求を再送信する必要がある.

クラスタ構築


クラスタの設定と構築方法
Redisクラスタを構築するには、次の手順に従います.
  • は、複数のノードを作成します.
  • は、各ノードにスロットを割り当て、複数のノードを接続してクラスタを構成する.
  • クラスタデータベースの16384スロットにノードが処理されている場合、クラスタはオンライン状態に入る.

  • Redisサーバをクラスタモードで動作させるには、サーバの起動時にサーバのクラスタモードオプションを開く必要があります.
    cluster-enabled yes
    

    また、複数のノードが同じマシンで動作している場合は、ノードごとに異なるポート番号を指定する必要があります.
    port 7000
    

    この2つの構成値をredisに書き込むことができます.confファイルで、次のコマンドを実行してノードを起動します.
    $ redis-server redis.conf
    

    3つのプライマリノードと3つのスレーブノードを含むクラスタを作成するには、次のコマンドを実行する必要があります.
    $ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    

    ここでcreateメソッドはクラスタを作成することを示し、その後の-replicas 1はredis-tribをrbはクラスタ内の各プライマリノードにスレーブノードを設定し,その後に各ノードのIPアドレスとポート番号を入力する.

    クラスタへのアクセス


    クラスタクライアントを使用してクラスタにコマンドリクエストを送信
    twemproxy
    クラスタ
    動作モード
    エージェントモードでは、エージェント自体がパフォーマンスのボトルネックになる可能性があり、負荷が増加するにつれてリクエスト負荷を分担するためにtwemproxyを追加する必要がありますが、twemproxy自体も一定のリソースを消費します.
    スライス
    基本的には、プール内のサーバ数Nに基づいてスライスされ、各サーバは平均してデータベース全体の1/Nを占めます.
    レプリケーションと高可用性
    レプリケーションと高可用性を実現するには、Redisのレプリケーション特性とRedis Centinelを組み合わせる必要があります.
    結論:完全なスライス、レプリケーション、および高可用性特性が必要であり、エージェントの使用によるパフォーマンスのボトルネックとリソース消費を回避するには、Redisクラスタの使用を選択します.一部のプロパティ(スライスのみが必要ですが、レプリケーションや高可用性は必要ありませんなど)のみが必要な場合は、twemproxy、Redisレプリケーション、Redis Sentineの1つ以上を個別に選択できます.