redis 5.0.2クラスタの構築

62715 ワード

前言
私たちは日常的にredisの使用中に、よくいくつかの問題に遭遇します.
  • 高可用性の問題は、redisの持続的な高可用性を保証する方法です.
  • 容量の問題で、単一インスタンスのredisメモリは無限に拡張できず、32 Gに達すると64ビットの世界に入り、性能が低下した.
  • の同時性能の問題は、redisは単一のインスタンス10万同時と呼ばれているが、終わりがある.

  • ハッシュスロットの概念
    Redisクラスタには16384個のハッシュスロットが内蔵されており、Redisクラスタにkey-valueを配置する必要がある場合、redisはまずkeyに対してcrc 16アルゴリズムを用いて結果を算出し、その後、結果を16384に対して残数を求める.これにより、各keyは0-16383の番号のハッシュスロットに対応する.redisは,ノード数に応じてハッシュスロットをほぼ均等に異なるノードにマッピングする.Redisクラスタはコンシステンシhashを用いず,ハッシュスロットの概念を導入した.Redisクラスタには16384個のハッシュスロットがあり、各keyはCRC 16の検査後に16384に対して型を取ることによってどのスロットを置くかを決定する.クラスタの各ノードはhashスロットの一部を担当する.この構造は、ノードの追加または削除が容易であり、ノードの追加または変更にかかわらず、クラスタが使用できない状態にはなりません.ハッシュスロットを使用する利点は、ノードの追加または削除を容易にすることにある.ノードを追加する必要がある場合は、他のノードのいくつかのハッシュスロットを新しいノードに移動するだけでよい.ノードを削除する必要がある場合は、削除ノード上のハッシュスロットを他のノードに移動するだけでよい.これにより、後でノードを新規または削除する際に、すべてのredisサービスを停止することなく実行を継続する.
    redis-clusterの利点
  • 公式推薦は疑いの余地がない.
  • は中心化されず、クラスタは最大1000個のノードを増加することができ、性能はノードの増加に伴って線形に拡張される.
  • 管理が便利で、その後、ノードを追加または削除したり、スロットを移動したりすることができます.
  • 簡単で、使いやすいです.

  • 一.Redisクラスタ構成パラメータ
    cluster-enabled:yesの場合、クラスタの有効化を示します.そうでなければ、cluster-config-fileを一例モードで起動します.オプションです.これはユーザーが編集できるプロファイルではありません.このファイルは、Redisクラスタノードが構成の変更を自動的に永続化し、起動時に再読み込みするためです.cluster-node-timeout:タイムアウト時間、クラスタノードが使用できない最大時間.マスターノードが指定した時間を超えて到達できない場合は、失敗したとみなされます.指定した時間内にほとんどのmasterノードに到達できない各ノードは、クエリー要求の受け入れを停止することに注意してください.cluster-slave-validity-factor:0に設定すると、slaveは常にmasterをフェイルオーバしようとします.正数に設定すると、最大接続を失う時間はnode timeoutにこのfactorを乗算します.cluster-migration-barrier:1つのmasterとslaveが接続を維持する最小数(すなわち、少なくともどれだけのslaveと接続を維持するか)、つまり少なくとも他のどれだけのslaveと接続を維持するslaveがmasterになる資格があるか.cluster-require-full-coverage:yesに設定されている場合は、key spaceがどれだけに達していない場合は、書き込み要求の受け入れを停止します.Noに設定されている場合、クエリ要求は、一部keyのみが要求されている場合でも受け入れられます.
    二.Redisノードの作成
    (1)異なるプロファイルノードの作成
    redisディレクトリの下に8000から8005の異なる5つのノードを作成し、各ノードの下に各種のredisを新規作成する.confプロファイル
    cd redis
    mkdir 8000 8001 8002 8003 8004 8005
    

    redisの下のredisをコピーします.confからredis/8000/以下、他のポート番号の順に実行
    cd redis
    cp redis.conf /redis/8000/
    

    (2) redis.confプロファイル
    ポート番号8000を例にとると、他のノードは下端スローガンを変更するだけです.
    protected-mode no
    port 8000
    cluster-enabled yes
    cluster-config-file nodes-8000.conf
    cluster-node-timeout 5000
    daemonize yes
    pidfile /var/run/redis_8000.pid
    logfile "8000.log"
    dir /redis/data
    bind 127.0.0.1
    

    (3)各ポートインスタンスを順次起動する
    cd redis
    cd 8000/redis-server redis.conf
    

    別のポートが順次実行され、ポート番号が表示されます.
    [root@localhost 8005]# ps -ef|grep redis
    
    [root@localhost 8005]# ps -ef|grep redis
    root       3140      1  0 18:11 ?        00:00:00 redis-server 127.0.0.1:8000 [cluster]
    root       3153      1  0 18:12 ?        00:00:00 redis-server 127.0.0.1:8001 [cluster]
    root       3158      1  0 18:12 ?        00:00:00 redis-server 127.0.0.1:8002 [cluster]
    root       3163      1  0 18:12 ?        00:00:00 redis-server 127.0.0.1:8003 [cluster]
    root       3168      1  0 18:12 ?        00:00:00 redis-server 127.0.0.1:8004 [cluster]
    root       3173      1  0 18:12 ?        00:00:00 redis-server 127.0.0.1:8005 [cluster]
    root       3178   2043  0 18:12 pts/0    00:00:00 grep --color=auto redis
    

    三.クラスタの構築
    (1)rubyを取り付ける
    比較的簡単なのはredis-tribツールで、srcディレクトリの下にあります.rubyプログラムなのでrubyをインストールする必要があります
    yum install ruby yum install rubygems gem install redis
    最後のコマンドを実行すると、次のような問題が発生する可能性があります.
    [root@localhost /]# gem install redis
    Fetching: redis-4.0.3.gem (100%)
    ERROR:  Error installing redis:
    	redis requires Ruby version >= 2.2.2.
    

    (2).rubyのアップグレード
    (1)curlを取り付ける
    sudo yum install curl
    (2)鍵key
    gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
    (3)rvmのダウンロード
    curl -sSL https://get.rvm.io | bash -s stable
    (4)プロファイルの検索
    find/-name rvm.sh
    (5)プロファイルの有効化
    source/etc/profile.d/rvm.sh
    (6)rvm依存のダウンロード
    rvm requirements
    (7)rvmライブラリrubyバージョンの表示
    rvm list known
    (8)ruby指定バージョンのインストール
    rvm install ruby-2.4.4
    (9)rubyバージョンのデフォルトの使用
    rvm use 2.4.4 default
    (10)取付
    gem install redis
    3.その他の関連操作
    (1)rubygemsをアンインストールshibaiをインストールする場合は、アンインストールする必要があります.
    yum remove rubygems -y
    

    (2)rubyのredis拡張パッケージをアンインストールする
    gem uninstall redis --version 3.3.3
    

    (3)redisパスの表示
    find/-name “redis”
    (4)gemのミラーアドレスの表示
    $ gem sources -l
    *** CURRENT SOURCES ***
    
    https://rubygems.org/
    

    (5)ミラーを移動し、新しいミラーを追加して元のgemソースを削除する
    gem sources --remove https://rubygems.org/
    国内ソースの追加
    gem sources -a https://gems.ruby-china.com
    (3)クラスタの作成
    Redis5.0クラスタ管理ツールredis-trib.rbは廃棄されているので、rubyなどを取り付ける必要はありません.上にrubyを取り付ける方法針はredis 5についてです.0以下で使用する、当時redis-trib.rbの機能は、redis-cliに統合され、認証された状況で実行でき、./redis-cli--cluster help使用方法を表示します.redis-cliクラスタコマンドヘルプドキュメント
    [root@localhost src]# redis-cli --cluster help
    Cluster Manager Commands:
      create         host1:port1 ... hostN:portN
                     --cluster-replicas <arg>
      check          host:port
      info           host:port
      fix            host:port
      reshard        host:port
                     --cluster-from <arg>
                     --cluster-to <arg>
                     --cluster-slots <arg>
                     --cluster-yes
                     --cluster-timeout <arg>
                     --cluster-pipeline <arg>
      rebalance      host:port
                     --cluster-weight <node1=w1...nodeN=wN>
                     --cluster-use-empty-masters
                     --cluster-timeout <arg>
                     --cluster-simulate
                     --cluster-pipeline <arg>
                     --cluster-threshold <arg>
      add-node       new_host:new_port existing_host:existing_port
                     --cluster-slave
                     --cluster-master-id <arg>
      del-node       host:port node_id
      call           host:port command arg arg .. arg
      set-timeout    host:port milliseconds
      import         host:port
                     --cluster-from <arg>
                     --cluster-copy
                     --cluster-replace
      help 
    

    クラスタを作成するには、次の手順に従います.
    redis-cli --cluster create   127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005  --cluster-replicas 1
    

    問題が発生した場合
    [ERR] Node 127.0.0.1:8000 is not empty. Either the node already knows other nodes (check with CLUSTE
    生成されたプロファイルnodesを削除します.conf、できない場合は、現在作成するノードには古いクラスタのノード情報が含まれていることを示し、redisの永続化ファイルを削除してからredisを再起動する必要がある.例えば、appendonly.aof、dump.rdb
    続けて
    [root@localhost 8005]# redis-cli --cluster create   127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005  --cluster-replicas 1
    >>> Performing hash slots allocation on 6 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    Adding replica 127.0.0.1:8003 to 127.0.0.1:8000
    Adding replica 127.0.0.1:8004 to 127.0.0.1:8001
    Adding replica 127.0.0.1:8005 to 127.0.0.1:8002
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: f70c555de0ab6863247271b03570dcb017748a1d 127.0.0.1:8000
       slots:[0-5460] (5461 slots) master
    M: 1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001
       slots:[5461-10922] (5462 slots) master
    M: 9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002
       slots:[10923-16383] (5461 slots) master
    S: 298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003
       replicates 9f103d9ecc5506b095919154dfb80bc8cfbb414e
    S: e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004
       replicates f70c555de0ab6863247271b03570dcb017748a1d
    S: 4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005
       replicates 1c2dd486c7f885f86501932c144da131c68fdcad
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join
    ....
    >>> Performing Cluster Check (using node 127.0.0.1:8000)
    M: f70c555de0ab6863247271b03570dcb017748a1d 127.0.0.1:8000
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    S: e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004
       slots: (0 slots) slave
       replicates f70c555de0ab6863247271b03570dcb017748a1d
    M: 1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    S: 298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003
       slots: (0 slots) slave
       replicates 9f103d9ecc5506b095919154dfb80bc8cfbb414e
    M: 9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    S: 4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005
       slots: (0 slots) slave
       replicates 1c2dd486c7f885f86501932c144da131c68fdcad
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    [root@localhost 8005]# 
    

    四.クラスタアクション
    (1)クラスタ情報とクラスタノード情報の表示
    クラスタ情報の表示
    127.0.0.1:8000> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:2902
    cluster_stats_messages_pong_sent:1422
    cluster_stats_messages_fail_sent:4
    cluster_stats_messages_sent:4328
    cluster_stats_messages_ping_received:1422
    cluster_stats_messages_pong_received:1446
    cluster_stats_messages_fail_received:7
    cluster_stats_messages_received:2875
    
    

    ノード情報の表示
    127.0.0.1:8002> cluster nodes
    298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003@18003 slave 9f103d9ecc5506b095919154dfb80bc8cfbb414e 0 1544402618000 4 connected
    1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001@18001 master - 0 1544402617072 2 connected 5461-10922
    9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002@18002 myself,master - 0 1544402616000 3 connected 10923-16383
    e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004@18004 master - 0 1544402618478 7 connected 0-5460
    4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005@18005 slave 1c2dd486c7f885f86501932c144da131c68fdcad 0 1544402617473 6 connected
    f70c555de0ab6863247271b03570dcb017748a1d 127.0.0.1:8000@18000 slave e57e483ae48a85d95e1374bf4ba486e7a4df256b 0 1544402617000 7 connected
    

    (2)ノード情報の表示
    ノード8001ポート番号のクラスタ情報を表示する
    [root@localhost src]# redis-cli --cluster check 127.0.0.1:8001
    127.0.0.1:8001 (1c2dd486...) -> 1 keys | 5462 slots | 1 slaves.
    127.0.0.1:8002 (9f103d9e...) -> 1 keys | 5461 slots | 1 slaves.
    127.0.0.1:8004 (e57e483a...) -> 0 keys | 5461 slots | 0 slaves.
    [OK] 2 keys in 3 masters.
    0.00 keys per slot on average.
    >>> Performing Cluster Check (using node 127.0.0.1:8001)
    M: 1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    M: 9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    M: e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004
       slots:[0-5460] (5461 slots) master
    S: 298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003
       slots: (0 slots) slave
       replicates 9f103d9ecc5506b095919154dfb80bc8cfbb414e
    S: 4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005
       slots: (0 slots) slave
       replicates 1c2dd486c7f885f86501932c144da131c68fdcad
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    

    クラスタの正常な表示
    (3)クライアント操作クラスタ
    redis-cli -p 8001
    [root@localhost src]# redis-cli -p 8001
    127.0.0.1:8001> get a
    (error) MOVED 15495 127.0.0.1:8002
    127.0.0.1:8001> 
    

    こちらからMOVEDコマンドを提示すると、次のようになります.
    [root@localhost src]# redis-cli -c -p 8001
    127.0.0.1:8001> get a
    -> Redirected to slot [15495] located at 127.0.0.1:8002
    "aaaa"
    127.0.0.1:8002> 
    

    クライアント接続に-cオプションを追加すると、keyを格納して抽出するときに8001と8002の間でジャンプし続け、これをクライアントリダイレクトと呼ぶことがわかります.クライアントリダイレクトが発生したのは、Redis Cluster内の各Masterノードが一部のスロット(slot)を担当し、アクセス時にキー空間計算を行い、位置決めkeyがどのスロット(slot)にマッピングされているかを計算し、マッピングされたスロット(slot)が現在のMasterノードが担当している場合は直接アクセスし、そうでなければ他のMasterノードの負のスロット(slot)にジャンプしてアクセスし、このプロセスはクライアントに対して透明です.以下のクラスタパーティションの原理を引き続き参照してください.
    (4)ノードの削除
    ポート番号8000のノードの削除:redis-cli--cluster del-node 127.0.0.1:8000
    [root@localhost src]# redis-cli --cluster del-node 127.0.0.1:8000 f70c555de0ab6863247271b03570dcb017748a1d
    >>> Removing node f70c555de0ab6863247271b03570dcb017748a1d from cluster 127.0.0.1:8000
    >>> Sending CLUSTER FORGET messages to the cluster...
    >>> SHUTDOWN the node.
    

    削除後にノード情報を再度表示
    127.0.0.1:8001> cluster nodes
    9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002@18002 master - 0 1544406706289 3 connected 10923-16383
    1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001@18001 myself,master - 0 1544406705000 2 connected 5461-10922
    e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004@18004 master - 0 1544406705000 7 connected 0-5460
    298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003@18003 slave 9f103d9ecc5506b095919154dfb80bc8cfbb414e 0 1544406705284 4 connected
    4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005@18005 slave 1c2dd486c7f885f86501932c144da131c68fdcad 0 1544406706000 6 connected
    

    ポート番号8000のノードが存在しないことがわかりました
    (5)ノードの追加
    削除したポート8000のノードをクラスタの8001のプライマリノードに追加
    [root@localhost 8005]# redis-cli --cluster add-node 127.0.0.1:8000 127.0.0.1:8001
    >>> Adding node 127.0.0.1:8000 to cluster 127.0.0.1:8001
    >>> Performing Cluster Check (using node 127.0.0.1:8001)
    M: 1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
    M: e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004
       slots:[0-5460] (5461 slots) master
    M: 9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    S: 4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005
       slots: (0 slots) slave
       replicates 1c2dd486c7f885f86501932c144da131c68fdcad
    S: 298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003
       slots: (0 slots) slave
       replicates 9f103d9ecc5506b095919154dfb80bc8cfbb414e
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    >>> Send CLUSTER MEET to node 127.0.0.1:8000 to make it join the cluster.
    [OK] New node added correctly.
    [root@localhost 8005]# redis-cli -c -p 8000
    127.0.0.1:8000> cluster nodes
    298c94aa55f1cdcf53918fd9301f617b6dca37f7 127.0.0.1:8003@18003 slave 9f103d9ecc5506b095919154dfb80bc8cfbb414e 0 1544411418529 3 connected
    e57e483ae48a85d95e1374bf4ba486e7a4df256b 127.0.0.1:8004@18004 master - 0 1544411418000 7 connected 0-5460
    ef3394bfe7574d617960422a9f3b7009cd2923eb 127.0.0.1:8000@18000 myself,master - 0 1544411417000 0 connected
    1c2dd486c7f885f86501932c144da131c68fdcad 127.0.0.1:8001@18001 master - 0 1544411416519 2 connected 5461-10922
    9f103d9ecc5506b095919154dfb80bc8cfbb414e 127.0.0.1:8002@18002 master - 0 1544411418328 3 connected 10923-16383
    4c61c720fa60a3d507fe355ae27218b0ac096f8a 127.0.0.1:8005@18005 slave 1c2dd486c7f885f86501932c144da131c68fdcad 0 1544411416820 2 connected
    127.0.0.1:8000> 
    

    ノード情報のクエリに成功しました
    (6)各ノードスロット数のバランス
    [root@localhost 8005]# redis-cli --cluster rebalance --cluster-threshold 1 127.0.0.1:8000
    >>> Performing Cluster Check (using node 127.0.0.1:8000)
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    *** No rebalancing needed! All nodes are within the 1.00% threshold.
    
    

    バランスをとる必要はありません.