クラスタ--Redisクラスタの構築(実際の運用におけるデータの読み書き状況、障害発生後のデータの読み書き状況)

43461 ワード

文書ディレクトリ

  • 前言
  • 一、Redisクラスタ
  • 1.1 Redisクラスタ紹介
  • 1.2 Redisクラスタの利点
  • 1.3 Redisクラスタの実装方法
  • 1.4 Redis-CRusterデータスライス
  • 1.5 Redis-CRusterの主従複製モデル
  • 二、Redisクラスタ構築
  • 2.1実験環境
  • 2.2構築プロセス
  • 2.3クラスタ機能の検証
  • 2.4アナログmasterサーバダウンタイム
  • 2.5まとめ

  • 前言


    前回は単一ノードRedisサーバの構築について説明したが、単一ノードRedisサーバで発生する問題:単一の障害、サービスが利用できず、大量の同時データ要求を処理できず、データが失われた場合、Redisクラスタを構築する必要がある

    一、Redisクラスタ


    1.1 Redisクラスタの説明


    ●Redisクラスタは、複数のRedis間ノード間でデータを共有するプログラムセットである
    ●Redisクラスタでは、複数のkeysを扱うコマンドはサポートされていません.これは、異なるノード間でデータを移動する必要があるため、Redisのようなパフォーマンスが得られず、高負荷の場合、予期せぬエラーが発生する可能性があります.
    ●Redisクラスタは、パーティション化によってある程度の可用性を提供し、実際の環境において、あるノードがダウンタイムした場合、または到達できない場合、コマンドの処理を継続することができる

    1.2 Redisクラスタの利点


    ●異なるノードへのデータの自動分割
    ●クラスタ全体のノードの一部が失敗したり、到達できなかったりした場合にコマンドの処理を継続できる

    1.3 Redisクラスタの実装方法


    ●クライアントスライス
    ●エージェントスライス
    ●サーバ側スライス

    1.4 Redis-CRusterデータスライス


    ●Redisクラスタはコンシステンシhashを用いずハッシュスロット概念を導入した
    ●Redisクラスタには16384個のハッシュスロットがある
    ●各keyは、CRC 16検査後に16384を型抜きすることにより配置溝を決定する
    ●クラスタの各ノードはハッシュスロットの一部を担当する
    ●3ノードからなるクラスタを例に
    ●ノードAはО5500番ハーシースロットへ
    ●ノードBは、5501〜11000番のハッシースロットを含む
    ●ノードCは11001から16384番のハッシースロットを含む
    ●ノードの追加または削除をサポート
    ●削除ノードの追加サービス停止不要
    たとえば
    ●新たにノードDを追加する場合は、ノードA,B,Cの一部をDに移動する
    ・ノードAを除去するには、AのスロットをBおよびCノードに移動し、スロットのないAノードをクラスタから除去する必要がある

    1.5 Redis-CRusterのマスターコピーモデル


    ●クラスタにはA,B,Cの3つのノードがあり、ノードBが失敗すると、クラスタ全体が5501-1000という範囲のスロットが欠けて使用できなくなる
    ・各ノードにスレーブノードA 1,B 1,C 1を追加すると、クラスタ全体に3つのマスターノードと3つのslaveノードが構成され、ノードBが失敗すると、クラスタはB 1を新しいマスターノードに選択してサービスを継続する
    ●BとB 1の両方が失敗すると、クラスタは使用できなくなる

    二、Redisクラスタ構築


    2.1実験環境


    マスターサーバ3台
    192.168.100.100;192.168.100.128;192.168.100.129
    slaveサーバ3台
    192.168.100.8;192.168.100.130;192.168.100.131

    2.2構築プロセス


    Redisデータベースのインストール(6つのノードの操作と同じように、詳細は前回のブログを参照してください)https://blog.csdn.net/weixin_47151650/article/details/108473001
    [root@localhost mnt]# yum install gcc gcc-c++ -y
    [root@localhost mnt]# tar zxvf redis-5.0.7.tar.gz -C /opt
    [root@localhost mnt]# cd /opt/redis-5.0.7/
    [root@localhost redis-5.0.7]# make
    [root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install
    [root@localhost redis-5.0.7]# cd utils/
    [root@localhost utils]# ./install_server.sh
    Welcome to the redis service installer
    This script will help you easily set up a running redis server
    
    Please select the redis port for this instance: [6379] 
    Selecting default: 6379
    Please select the redis config file name [/etc/redis/6379.conf] 
    Selected default - /etc/redis/6379.conf
    Please select the redis log file name [/var/log/redis_6379.log] 
    Selected default - /var/log/redis_6379.log
    Please select the data directory for this instance [/var/lib/redis/6379] 
    Selected default - /var/lib/redis/6379
    Please select the redis executable path [] /usr/local/redis/bin/redis-server
    Selected config:
    Port           : 6379
    Config file    : /etc/redis/6379.conf
    Log file       : /var/log/redis_6379.log
    Data dir       : /var/lib/redis/6379
    Executable     : /usr/local/redis/bin/redis-server
    Cli Executable : /usr/local/redis/bin/redis-cli
    Is this ok? Then press ENTER to go on or Ctrl-C to abort.
    Copied /tmp/6379.conf => /etc/init.d/redis_6379
    Installing service...
    Successfully added to chkconfig!
    Successfully added to runlevels 345!
    Starting Redis server...
    Installation successful!
    [root@localhost utils]# ln -s /usr/local/redis/bin/ * /usr/local/bin/
    [root@localhost utils]# netstat -natp | grep 6379
    tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      24447/redis-server  
    

    プライマリサーバプロファイルの変更(6ノードとも同じ)
    [root@localhost utils]# vim /etc/redis/6379.conf  '      '
    70 #bind 127.0.0.1   '   70    127  ,        '
    89 protected-mode no  '   89         '
    93 port 6379     '   93   ,    6379'
    137 daemonize yes   '   137   ,       '
    700 appendonly yes  '   700   ,  aof   '
    833 cluster-enabled yes  '   833   ,      '
    841 cluster-config-file nodes-6379.conf  '   841   ,        '
    847 cluster-node-timeout 15000	 '   847   ,        '
    [root@localhost utils]# service redis_6379 restart  '  redis  '
    [root@localhost utils]# cd /var/lib/redis/6379/
    [root@localhost 6379]# ls
    appendonly.aof  dump.rdb  nodes-6379.conf  
    '       ,appendonly.aof AOF     ,dump.rdb RDB    ,nodes-6379.conf              '
    

    メインサーバはrvmをインストールして、RUBYはクラスタソフトウェアを制御します
    [root@master01 6379]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 
    '  key  ,   error,        '
    [root@master01 6379]# curl -sSL https://get.rvm.io | bash -s stable '  rvm'
    [root@master01 opt]# ./rvm-installer.sh
    [root@master01 opt]# source /etc/profile.d/rvm.sh  '      '
    [root@master01 opt]# rvm list known  '  ruby       '
    # MRI Rubies
    [ruby-]1.8.6[-p420]
    [ruby-]1.8.7[-head] # security released on head
    [ruby-]1.9.1[-p431]
    [ruby-]1.9.2[-p330]
    [ruby-]1.9.3[-p551]
    [ruby-]2.0.0[-p648]
    [ruby-]2.1[.10]
    [ruby-]2.2[.10]
    [ruby-]2.3[.8]
    [ruby-]2.4[.10]
    [ruby-]2.5[.8]
    [ruby-]2.6[.6]
    [ruby-]2.7[.1]
    ruby-head
    [root@master01 opt]# rvm install 2.4.10  '  ruby2.4.10  ,           '
    [root@master01 opt]# ruby -v  '    ruby  '
    ruby 2.4.10p364 (2020-03-31 revision 67879) [x86_64-linux]
    [root@master01 opt]# rvm use 2.4.10  '  Ruby2.4.10  '
    Using /usr/local/rvm/gems/ruby-2.4.10
    [root@master01 opt]# gem install redis  '    Redis'
    Fetching redis-4.2.2.gem
    Successfully installed redis-4.2.2
    Parsing documentation for redis-4.2.2
    Installing ri documentation for redis-4.2.2
    Done installing documentation for redis after 0 seconds
    1 gem installed
    

    プライマリ・サーバ上のクラスタの作成
    [root@localhost profile.d]# redis-cli --cluster create 192.168.100.100:6379 192.168.100.128:6379 192.168.100.129:6379 192.168.100.8:6379 192.168.100.130:6379 192.168.100.131:6379 --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 192.168.100.130:6379 to 192.168.100.100:6379
    Adding replica 192.168.100.131:6379 to 192.168.100.128:6379
    Adding replica 192.168.100.8:6379 to 192.168.100.129:6379
    M: 1daf95d3008b5a070c698a677ff14271630c90b6 192.168.100.100:6379
       slots:[0-16383] (5461 slots) master
    M: 1daf95d3008b5a070c698a677ff14271630c90b6 192.168.100.128:6379
       slots:[0-16383] (5462 slots) master
    M: 1daf95d3008b5a070c698a677ff14271630c90b6 192.168.100.129:6379
       slots:[0-16383] (5461 slots) master
    S: 1d51bf7d5e95b14216c0d2f7a448c97c815f7895 192.168.100.8:6379
       replicates 1daf95d3008b5a070c698a677ff14271630c90b6
    S: 1d51bf7d5e95b14216c0d2f7a448c97c815f7895 192.168.100.130:6379
       replicates 1daf95d3008b5a070c698a677ff14271630c90b6
    S: 1d51bf7d5e95b14216c0d2f7a448c97c815f7895 192.168.100.131:6379
       replicates 1daf95d3008b5a070c698a677ff14271630c90b6
    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 192.168.100.100:6379)
    M: 1daf95d3008b5a070c698a677ff14271630c90b6 192.168.100.100:6379
       slots:[0-16383] (16384 slots) master
       1 additional replica(s)
    S: 1d51bf7d5e95b14216c0d2f7a448c97c815f7895 192.168.100.8:6379
       slots: (0 slots) slave
       replicates 1daf95d3008b5a070c698a677ff14271630c90b6
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    

    2.3クラスタ機能の検証

    [root@master01 ~]# redis-cli -c -h 192.168.100.100   '  master01'
    192.168.100.100:6379> keys *
    (empty list or set)
    192.168.100.100:6379> set name zhangsan   '      '
    -> Redirected to slot [5798] located at 192.168.100.128:6379  '  master02'
    OK
    192.168.100.128:6379> set addr nanjing    '     master02,       '
    -> Redirected to slot [12790] located at 192.168.100.129:6379  '  master03'
    OK
    [root@slave03 6379]# redis-cli -c -h 192.168.100.130  '  master02 slave'
    192.168.100.130:6379> keys *    '    ,     '
    1) "name"
    192.168.100.130:6379> get name
    -> Redirected to slot [5798] located at 192.168.100.129:6379  ' master02  '
    "zhangsan"
    [root@slave01 6379]# redis-cli -c -h 192.168.100.131  '  master03 slave'
    192.168.100.131:6379> keys *   '    ,     '
    1) "addr"
    192.168.100.131:6379> get addr
    -> Redirected to slot [12790] located at 192.168.100.129:6379  ' master03  ' 
    "nanjing"
    

    2.4マスターサーバのダウンタイムのシミュレーション

    [root@master03 6379]# service redis_6379 stop  '  master03'
    Stopping ...
    Waiting for Redis to shutdown ...
    Redis stopped
    [root@slave01 6379]# redis-cli -c -h 192.168.100.131  '  master03 slave'
    192.168.100.131:6379> keys *   '        ,      '
    1) "addr"
    192.168.100.131:6379> get addr
    "nanjing"
    [root@master02 ~]# redis-cli -c -h 192.168.100.128  '  master02'
    192.168.100.100:6379> set age 20      '      ,   master01'
    -> Redirected to slot [741] located at 192.168.100.128:6379
    OK 
    192.168.179.124:6379> set team yun   '       ,     master03 slave'
    -> Redirected to slot [15631] located at 192.168.179.126:6379
    OK
    192.168.100.131:6379> keys *   '  master03 slave,      '
    1) "team"
    2) "addr"
    192.168.100.131:6379> get team   '           '
    "yun"
    

    2.5まとめ


    Redisクラスタでは、3つのmaster間で順次データを書き込み、それぞれのslaveでデータをコピーし、1台のmasterがダウンタイムした後、そのslaveに代わってデータの読み書き作業を行う