Redis高可用性クラスタ

12826 ワード

JAVAアーキテクチャ2019-03-22 21:28:55
Redisのクラスタ主従モデルは高可用性クラスタアーキテクチャである.本章の主な内容は:高利用可能なクラスタの構築、Jedis接続クラスタ、クラスタノードの追加、クラスタノードの削除、その他の構成の補足説明である.
高可用性クラスタ構築
クラスタ(cluster)技術は比較的新しい技術であり、クラスタ技術によって、低コストで性能、信頼性、柔軟性の面で比較的高い収益を得ることができ、そのタスクスケジューリングはクラスタシステムの核心技術である.
Redis 3.0以降はクラスタがサポートされ、Redisクラスタには16384個のハッシュスロットが内蔵されている.Redisは,ノード数に応じてハッシュスロットをほぼ均等に異なるノードにマッピングする.
すべてのノード間の相互接続(PING-PONGメカニズム)では、ホストの半数以上がホストが停止していると判断した場合、そのホストは本当に停止し、クラスタ全体が使用できなくなります.
クラスタ内の各ホストに複数のスレーブを割り当てると.ホストが切れて、上位から、依然として正常に動作します.ただし、クラスタの半数以上のホストが停止している場合、スレーブがあるかどうかにかかわらず、そのクラスタは使用できません.
構築前の準備
ruby環境の構築
redisクラスタ管理ツールredis-trib.rbはruby環境に依存する.
[root@itdragon ~]# yum install ruby
[root@itdragon ~]# yum install rubygems
[root@itdragon ~]# gem install redis
[root@itdragon ~]# cd redis-4.0.2/src/
[root@itdragon src]# cp redis-trib.rb /usr/local/redis-4/bin/

ステップ1:ruby環境のインストール
ステップ2:gemパッケージをインストールします(gemはRubyアプリケーションを拡張または変更するために使用されます).参照先:https://rubygems.org/gems/redis/versions/
ステップ3:redis解凍ディレクトリでredis-tribを見つける.rbファイルは、redisサービスを開始するディレクトリにコピーし、管理しやすい.
存在する可能性のある問題
1 redis requires Ruby version>=2.2.2,解決方法は以下の通り
2/usr/local/rvm/scripts/rvmというディレクトリはありません.前回の実行に失敗した可能性があります
[root@itdragon ~]# ruby --versionruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
[root@itdragon ~]# yum install curl
[root@itdragon ~]# curl -L get.rvm.io | bash -s stable
[root@itdragon ~]# source /usr/local/rvm/scripts/rvm 
[root@itdragon ~]# rvm list known
[root@itdragon ~]# rvm install 2.3.3
[root@itdragon ~]# rvm use 2.3.3
[root@itdragon ~]# gem install redis

redisサーバを6台用意
前章の主従レプリケーションロジックと同様にredis.confファイルコピー6回、ポート6000~6005
[root@itdragon bin]# cp redis.conf redis6000.conf
[root@itdragon bin]# vim redis6000.conf 
port xxxx #    
cluster-enabled yes #    ,      
cluster-config-file nodes-xxxx.conf #       
pidfile /var/run/redis_xxxx.pid #pidfile  
logfile "xxxx.log" #    
dbfilename dump_xxxx.rdb #rdb     
cluster-node-timeout 5000 #    ,    
appendonly yes #  aof     
[root@itdragon bin]# vim start-all.sh./redis-server redis6000.conf
./redis-server redis6001.conf
./redis-server redis6002.conf
./redis-server redis6003.conf
./redis-server redis6004.conf
./redis-server redis6005.conf
[root@itdragon bin]# chmod u+x start-all.sh[root@itdragon bin]# ./start-all.sh [root@itdragon bin]# ps aux | grep redisroot 28001 0.0 0.9 145964 9696 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6000 [cluster]
root 28003 0.0 0.9 145964 9696 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6001 [cluster]
root 28008 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6002 [cluster]
root 28013 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6003 [cluster]
root 28018 0.1 0.9 145964 9652 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6004 [cluster]
root 28023 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6005 [cluster]

ステップ1:6つのredisをコピーします.confは関連する構成を修正して、面倒なら私の構成のファイルを使うことができます:https://github.com/ITDragonBlog/daydayup/tree/master/Redis/reids.conf
ステップ2:redisサービスプログラムを新規に一括オープンし、実行権限を追加
ステップ3:6台のredisサービスが正常に起動したかどうかを確認します.
しゅスレーブクラスタ構築
クラスタ作成コマンド:./redis-trib.rb createはクラスタを作成します.--replicas 1はホストごとにスレーブを割り当て、その後の他のパラメータはredisサービスのip:portです.最後にyesを入力して推奨される構成を受け入れます
[root@itdragon bin]# ./redis-trib.rb create --replicas 1 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 112.74.83.71:6003 112.74.83.71:6004 112.74.83.71:6005>>> Creating cluster>>> Performing hash slots allocation on 6 nodes...Using 3 masters:112.74.83.71:6000112.74.83.71:6001112.74.83.71:6002Adding replica 112.74.83.71:6003 to 112.74.83.71:6000Adding replica 112.74.83.71:6004 to 112.74.83.71:6001Adding replica 112.74.83.71:6005 to 112.74.83.71:6002...... #  Can I set the above configuration? (type 'yes' to accept): yes...... #  [OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...[OK] All 16384 slots covered. # 16384                
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6002 -c112.74.83.71:6002> set testKey value-> Redirected to slot [5203] located at 112.74.83.71:6000OK112.74.83.71:6000> cluster infocluster_state:ok......112.74.83.71:6000> cluster nodes0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-1638313ddd4c1b8c00926f61aa6daaa7fd8d87ee97830 112.74.83.71:6005@16005 slave 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 0 1512035803720 6 connecteda3bb22e04deec2fca653c606edf5b02b819f924f 112.74.83.71:6003@16003 slave 1d4779469053930f30162e89b6711d27a112b601 0 1512035802000 4 connected1d4779469053930f30162e89b6711d27a112b601 112.74.83.71:6000@16000 myself,master - 0 1512035802000 1 connected 0-5460a3b99cb5d22f5cbd293179e262f5eda931733c88 112.74.83.71:6001@16001 master - 0 1512035802719 2 connected 5461-10922915a47afc4f9b94389676b4e14f78cba66be9e5d 112.74.83.71:6004@16004 slave a3b99cb5d22f5cbd293179e262f5eda931733c88 0 1512035801717 5 connected

ステップ1:クラスタを構築します./redis-trib.rb create、yesを選択して推奨される構成を受け入れる
ステップ2:クラスタクライアントにアクセスします./redis-cli-h任意ホストhost-p任意ホストport-c,-cはクラスタ方式でredisに接続することを示す
ステップ3:データの保存
ステップ4:cluster infoクラスタステータス情報のクエリー
ステップ5:cluster nodesはクラスタノード情報をクエリーします.ここにはピットがあります.後で説明します.
存在する可能性のある問題
Sorry, the cluster configuration file nodes.conf is already used by a different Redis Cluster node. Please make sure that different nodes use different cluster configuration files.
はっきり言ってcluster-config-file nodesを修正します.confファイルは重複を回避するか、ファイルを削除してクラスタを再作成します.
cluster nodesクエリークラスタノード情報
これは重要なコマンドです.私たちが関心を持っている情報は次のとおりです.
最初のパラメータ:ノードID
2番目のパラメータ:IP:PORT@TCPここのピット、jedis-2.9.0の前のバージョンの解析@エラー
3番目のパラメータ:フラグ(Master,Slave,Myself,Fail...)
4番目のパラメータ:スレーブであればホストのノードID
最後の2つのパラメータ:接続された状態とスロットの位置.
Jedis接続クラスタ
まずファイアウォールを構成します
[root@itdragon ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 6000 -j ACCEPT-A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT-A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT-A INPUT -p tcp -m tcp --dport 6003 -j ACCEPT-A INPUT -p tcp -m tcp --dport 6004 -j ACCEPT-A INPUT -p tcp -m tcp --dport 6005 -j ACCEPT[root@itdragon ~]# service iptables restart

最後にSpringの統合

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

ユニットテスト
/**
 *      
 *           :
 * java.lang.NumberFormatException: For input string: "6002@16002"
 *     redis     4,    jedis      。   2.9.0
 *    cluster nodes       ,4         @16002 tcp    
 * 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
 */@Testpublic void testJedisCluster() throws IOException {
 HashSet nodes = new HashSet<>();
 nodes.add(new HostAndPort(HOST, 6000));
 nodes.add(new HostAndPort(HOST, 6001));
 nodes.add(new HostAndPort(HOST, 6002));
 nodes.add(new HostAndPort(HOST, 6003));
 nodes.add(new HostAndPort(HOST, 6004));
 nodes.add(new HostAndPort(HOST, 6005));
 JedisCluster cluster = new JedisCluster(nodes);
 cluster.set("cluster-key", "cluster-value");
 System.out.println("     : " + cluster.get("cluster-key"));
 cluster.close();
}

存在する可能性のある問題
java.lang.NumberFormatException: For input string: "6002@16002"
redisのバージョンが4.0.0以上の場合はjedis-2.9.0以上を使用することをお勧めします.
ソース:
https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis
クラスタノード操作
プライマリノードの追加
[root@itdragon bin]# cp redis6005.conf redis6006.conf
[root@itdragon bin]# ./redis-server redis6006.conf
[root@itdragon bin]# ./redis-trib.rb add-node 112.74.83.71:6006 112.74.83.71:6000
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512115612162 0 connected #      
[root@itdragon bin]# ./redis-trib.rb reshard 112.74.83.71:6000How many slots do you want to move (from 1 to 16384)? 500What is the receiving node ID? 916d26e9638dc51e168f32969da11e19c875f48f
Please enter all the source node IDs.
 Type 'all' to use all the nodes as source nodes for the hash slots.
 Type 'done' once you entered all the source nodes IDs.
Source node #1:allDo you want to proceed with the proposed reshard plan (yes/no)? yes
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512116047897 7 connected 0-165 5461-5627 10923-11088

ステップ1:redis 6006を作成する.confの新しいホスト、Redisサービスを開始
ステップ2:ホストノードを追加し、「[OK]New node added correctly.」を印刷する追加に成功しました
ステップ3:クラスタノード情報を問い合わせると、6006ポートのホストは追加されていますが、接続状態の後ろにコンテンツがありません.つまり、スロットが割り当てられていません.
ステップ4:6006ポートホストにスロットを割り当て、
  • 最初のパラメータ:スロットを移動する必要がある個数、
  • 第2パラメータ:スロットを受け入れるノードID,
  • の3番目のパラメータ:allと入力すると、すべての元のノードからスロットが取得され、
  • が表示されます.
  • 4番目のパラメータ:yesと入力してスロットをターゲットノードid
  • に移動し始めます.
    ステップ5:クラスタノード情報を照会すると、6006ポートのホストにスロットが割り当てられていることがわかります.
    コアコマンド:
    ./redis-trib.rb add-node新規ホストip:portクラスタ任意ノードip:port
    ./redis-trib.rb reshardクラスタ任意ノードip:port
    存在する可能性のある問題
    [ERR] Sorry, can't connect to node 112.74.83.71:6006
    説明:新しいホストは起動状態でなければなりません.
    スレーブノードの追加
    [root@itdragon bin]# cp redis6006.conf redis6007.conf
    [root@itdragon bin]# vim redis6007.conf 
    [root@itdragon bin]# ./redis-server redis6007.conf
    [root@itdragon bin]# ./redis-trib.rb add-node --slave --master-id 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6007 112.74.83.71:6006
    [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes80315a4dee2d0fa46b8ac722962567fc903e797a 112.74.83.71:6007@16007 slave 916d26e9638dc51e168f32969da11e19c875f48f 0 1512117377000 7 connected
    

    ステップ1:redis 6007を作成する.confの新しいホスト、Redisサービスを開始
    ステップ2:スレーブノードを追加し、元のコマンドに追加しました--slave--master-idマスターノードID
    ステップ3:クラスタノード情報のクエリー
    ノードの削除
    ノードを削除する前に、ノードに値がないことを確認します.そうしないと、プロンプト:is not empty!Reshard data away and try again. このノードに値がある場合は,スロットを割り当てる必要がある.
    ./redis-trib.rb del-node 112.74.83.71:6006 916d26e9638dc51e168f32969da11e19c875f48f 
    

    プロファイル補完
    前の章Redisチュートリアルでは、次の構成について説明しました.
    1 Redisのデーモンを開く:daemonize yes
    2 pidファイルの書き込みファイル名:pidfile/var/run/redisを指定します.pid
    3 Redisポートの指定:port 6379
    4バインドされたホストアドレス:bind 127.0.0.1
    5 Redis永続化デフォルトオープン圧縮データ:rdbcompression yes
    6 rdbファイル名:dbfilename dumpを指定します.rdb
    7 rdbファイルの場所を指定:dir./
    8スレーブが起動すると、自動的にmasterからデータ同期が行われます:slabeof
    9 aof持続化方式を開く:appendonly yes
    10 aofファイル名を指定:appendfilename appendonly.aof
    11トリガaofスナップショットメカニズム:appendfsync everysec(no/always)
    この章はRedisチュートリアルの最後の章で、残りの構成も一緒に話しましょう.
    1クライアント接続タイムアウト時間を設定し、0はオフを示す:timeout 300
    2 Redisログ・レベルの設定、debug、verbose(デフォルト)、notice、warning:loglevel verbose
    3データベース数の設定:databases 16
    4 Redis接続パスワードの設定:requirepass foobared
    5同じ時間に最大クライアント接続数を設定します.デフォルトは無制限です.maxclients 128
    6 Redis最大メモリ制限の指定:maxmemory
    7仮想メモリメカニズムを有効にするかどうかを指定します:vm-enabled no
    8仮想メモリファイルのパス:vm-swap-file/tmp/redisを指定します.swap
    9他のプロファイル:include/path/to/localを含むことを指定します.conf