ビッグデータインターネットアーキテクチャフェーズRedis(3)redisクラスタ


Redis(三)redisクラスタ
一、redis哨兵モードの欠点
  • 問題1:横方向の拡張は不便で、いったん拡張すると、コード構造がどんなに簡単であっても、
  • を修正する必要がある.
  • 問題2:ハッシュ分散アルゴリズムはhash整合性であり、どれだけのデータ移行も拡張クラスタと縮小クラスタをもたらす場合にデータ移行を行う必要がある.
  • redisは3.0バージョンでredisクラスタの技術を導入し、以上の問題を解決した.
  • redisクラスタを拡張するには、コードを変更する必要はなく、古い構成
  • を引き続き使用します.
  • redisクラスタは、手動でデータを移行することをサポートしています(コマンドが1つ必要です).また、最下位のアルゴリズムを知る必要はありません.メンテナンス担当者は手動でデータを移行し、移行数を制御することができます.

  • 二、redisクラスタアーキテクチャ
  • クライアントの場合、redisクラスタに接続するすべてのノードのipとポートを少なくとも1つ構成する必要はなく、分散はコードメンテナンスではなくクラスタ内部管理データ分布
  • である.
  • 内部データ(key-value)は、0~16383のチャネルにより伝達する
  • である.
  • 内部データのリダイレクト
  • key値を用いてハッシュモデリングを行い、得られたのはチャネル番号であり、ノードはこのチャネル番号が自分で管理されているかどうかを判断し、もしそうであれば保存する.そうでない場合、データは指向性
  • から
  • このようなキャッシュ構造は、拡張または縮小時に、手動でコードを修正する必要があるという問題
  • を解決する.
  • データの手動移行
  • クラスタ内のすべてのkeyの真のマッピング関係はredisノード自体とは無関係であり、チャネル番号のみに関係し、データ移行が必要な場合、key-valueに対して直接データ操作を行うことはできません.チャネルを再割り当て(reshard)クラスタ内のすべてのデータは、再計算されたチャネル管理内容に基づいて再転送保存(移行のプロセスは、データのロックを変更するプロセスと同様であり、再移行できない場合にデータ操作を行う)
  • である.
  • チャネルを再割り当てすると、現在移行するチャネル番号に対応するkey-valueデータは、チャネルの再割り当てに基づいて
  • に転送される.
  • はredisでreshardデータチャネル番号のために移行コマンドを呼び出すことができるので、コードクライアント呼び出しプログラムがデータを再割り当てする必要はありません.


  • 三、redisクラスタの構築
  • rubyのインストール:クラスタコマンドにはruby環境のサポートが必要です
  • 外部ネットワーク接続がある場合はyum install rubyコマンドを直接使用しますが、バージョンに注意するには2.3バージョン以上を使用する必要があります.
  • インストールが成功したかどうかを確認する
  • 外部ネットワーク接続がない場合は、linuxにアップロードしtar-xvf rubyリソースを使用して解凍する準備パッケージを実装する必要があります(またはネットワークがある場合wget"https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz”)
  • rubyディレクトリに入り、コンパイル
  • を実行する
  • コンパイルインストールmake&&make install
  • を使用

  • インストールgems
  • RubyGems(略称gems)は、rubyグループをパッケージ化するためのrubyパッケージシステムであり、rubyプログラムとライブラリを配布する標準フォーマットを提供し、管理プログラムのパッケージインストールツールを提供し、技術サポート
  • である.
  • コマンドyum install rubygemsを使用して
  • をインストール
  • インストールredisインタフェースパッケージ:gem install redis
  • 取付状況ruby-v
  • を確認する
  • redis略をインストール(redis 1)
  • reidsのバージョンは3.0以上
  • である必要があります.
  • クラスタノードの作成
  • 異なるredisノードに対応する管理ディレクトリ
  • を作成する.
  • 配置文redisを修正する.conf件は指定ディレクトリ
        P61        bind 127.0.0.1//  ip 127.0.0.1            ip 
           bind
        P80        protected-mode no        //yes   no
        P84        port 7000                 //  7000 
        P128    daemonize yes             //     
        P150    pidfile /var/run/redis_7000.pid //pidfile    7000 
                 ,    ps -ef|grep redis             pid
        P163    logfile=7000/redis.log    //    ,    redis    
        P593    appendonly yes            
        P721    cluster-enabled yes     //     
        P729    cluster-config-file nodes_7000.conf         //      
        P735    cluster-node-timeout 15000     //       15 ,     
    
  • にアップロードする.
  • 修正完了アップロード完了後チェック
  • は、これらのノード
    redis-server 7000/redis7000.conf
    redis-server 7001/redis7001.conf
    redis-server 7002/redis7002.conf
    redis-server 7003/redis7003.conf
    redis-server 7004/redis7004.conf
    redis-server 7005/redis7005.conf
    
  • をそれぞれ起動する.
  • 陳宮
  • を起動するかどうかを確認します.
  • しかし現在のすべてのノードはクラスタの状態
  • ではない.
  • srcディレクトリの下にredis-tribがあります.rbファイル、これがruby言語で書かれたコマンドファイルです.
  • クラスタの作成コマンドを実行します.
    ./redis-trib.rb        ./     /etc/profile    PATH   ./   ,                       ./  
     src     
    
    #./redis-trib.rb  create  --replicas  1  106.75.74.254:7000 106.75.74.254:7001  106.75.74.254:7002 106.75.74.254:7003  106.75.74.254:7004  106.75.74.254:7005
    
    ./redis-trib.rb create    ip:    ip:  
    
       , --replicas  1           master      slave         6   ,            3 master( )3 slave( )
    
        
    

  • テストクラスタ:
  • ログインここで注意が必要ですが、既存のコマンド(-cなし)を使用すると、単一ノードログインを表し、クラスタ効果
  • はありません.
  • クラスタ効果epochを表示するのは論理計算時間であり、ノードのすべての変化に関係しています.cluster_current_epoch:6は、現在のクラスタの論理計算時間を表し、数字が大きいほど、操作や構成が新しいほど、クラスタ全体の歌値が一致することを示します.cluster_my_epoch:1は、現在のノードの論理計算時間を表します.
  • クラスタノードを表示ノードID、ip:port(ノードのipとポート番号)、flags(ノードの役割、例えばmaster、slave、myself)、およびステータスが表示されます.
  • スレーブノードである場合、flagsの後に続くマスターノードであるID
  • が続く.
  • masterの後に値の範囲があります.これがメインノードが管理するhashチャネルで、デフォルトではクラスタが開いたときにチャネルを平均的にmasterノードに割り当てます.


  • 高可用性の検証:
  • プライマリノードを停止するプロセス(kill 7000)
  • 次にクラスタにログインしてクラスタノード
  • を表示する.
  • 起動停止したノードは自動的にslaveにスペルされ、
  • に追加されます.
  • 新規ノード70077006
  • を作成して起動
  • はノードの追加コマンドを実行し、クラスタの前にノードを追加するのは追加する必要があるノードであり、後にクラスタに既存の任意のノード
  • がある.
  • では、現在のノードにkeyが存在するかどうかを確認する必要があります.天剣のノードにデータがある場合、クラスタの追加に失敗します.これは、データの競合を防止するために、データのあるノードをクラスタに動的に追加することはできません.flushdbコマンドを使用して7006のデータを
  • から空にします.
  • グループに入ってノード状態を確認する
  • プライマリノードとして追加するスレーブノードを指定します(指定しない場合は、デフォルトでスレーブノードとして追加します)–slaveと-master-idを同時に使用する必要があります.
  • 追加スレーブノード(インプリメンテーション作成およびオープン7007)
  • ノードを1台のマスターノードに追加するスレーブノードコマンドを実行する(-slaveは現在のノードを指定してノードの役割からクラスタに追加する、–master-idはノード追加時にマウントされたマスターノードのIDを指定する)新しいマスターが機能するにはキャッシュデータを保存する必要があり、データは実際にチャネル制御されるため、マスターノードを追加した後にチャネルを移行して新しいマスターノードにチャネル
  • を割り当てる必要がある.
  • プロンプトに従って操作
  • どのくらいのチャネルを移動する必要があるかを尋ねます
  • は、移動するチャネルのノードのID(7006 ID)
  • を受信する.
  • はどこからチャネルを移動しますか?
  • 指定された複数のノードから移行すると、対応するノードのIDが順次貼り付けられ、マスターノードである必要があり、追加完了後にdoneを入力して割付計算終了
  • を示す.
  • すべてのプライマリノードの平均割り当てが必要な場合はall
  • に直接入力.
  • このようなスライス計画を確定しますかyes
  • cluster nodesを見ると7006には他のプライマリノードから移行したチャネルがあることがわかりました
  • ノードの削除
  • 削除スレーブノード(データなしで直接削除)
  • メインノードは直接削除できません.チャネルをすべて削除してから削除する必要があります.チャネルを7003に移動するには7006のidを書かなければなりません.ここでは7006からチャネルを削除するだけです.7006 IDを書き終わったらdoneを入力して
  • を終了します.
  • が完了すると、削除ノードコマンド削除ノード
  • が呼び出される.
  • クラスタノードの状態を表示すると、7006と彼のスレーブノード7007は
  • 消えた.


    四、引き出した問題
  • クラスタの拡張構想分析
  • メンテナンス担当者は、現在のノード上のチャネルを人為的に制御することができ、これにより人為的な制御データが
  • 傾けられる.
  • 質問:各ノードはどのように自分が管理しているチャネルがどれらがあるかを知っていますか?
  • 問題:自分で管理するチャネルでなければ、そのノードにデータを転送しますか?
  • 解答:各ノードは2つの情報を維持しています
  • は16384のビットシーケンス
  • である.
  • すべてのノードが共有する16384要素の配列
  • 本ノードが維持するチャネル番号を知るには、本ノードのこの16384ビットのシーケンスにアクセスするだけで
  • が可能である.
  • クラスタ内のすべてのノードは16384要素の配列を共有し、配列要素はノード情報を保存する.クラスタ内の各ノードの配列情報は一致する
        reshard     ,         
              ,  ,         master      ;
          ;7001 400-500;    101        7002
              400-500   1  0;     400-500     ;
        7002   400-500;       400-500  0  1;      400-500    ,    
         
             ,       ;
         
            ;      key-value  
            0
                  ;
            ;7001 ,7003 
              ,    ,    ;
        7003     ;       , 7001     ,     ;         ,     1           ;      ;
         
               :
        1      ,       
        2 reshard     ,  key    ,      ,      ,      
    
  • である.

    質問:哨兵クラスタ、切断、redisクラスタのメインノードとスレーブノードは自分で指定したのですか?