Redisクラスタの設定


今日はRedisクラスタについて説明し、3台のサーバにクラスタを設定します.
各サーバには、プライマリノードとセカンダリノードが追加されます.

Redisクラスタ


必要性


Redisクラスタは、複数のRedisノードに自動的にデータを格納する方法を提供する.また、一部のノードが死亡したり、通信できなくなったりしても作業を継続できる可用性も提供します.ただし,半数以上のプライマリノードが死亡するとクラスタも停止する.
つまり、Redisclusterのメリットは次のとおりです.
1.複数のノードに自動的にデータを格納
2.一部のノードが死亡または通信できない場合は、作業を続行できます.
また,Redisがユーザ命令を処理する部分は単一スレッドである.(Redis 6.0からThreadedIOを追加してマルチスレッドのユーザコマンドをサポートするが、実行コマンドのカーネル部分は依然としてシングルスレッドであり、IO socketの読み取り/書き込み時にマルチスレッドとして実行される.Redis 6.0 features)
したがって、一定規模のプロジェクトについては、Redisを使用するときにクラスタとして構成することを推奨します.
短いRedisの使用経験から、テストプラットフォーム環境で独立したRedisを使用すると、クラスタ構成時のパフォーマンスに大きな違いがあります.

こうぞう


To be continued

サーバにredisをインストールする


サーバは全部で3台、1つのプライマリノード、1つのスレーブノード、全部で6つのノードがあります.
そのため、redisは3台のサーバに別々にインストールする必要があります.(Redis公式ホームページ参照)

サーバのバージョン


RedisクラスタをインストールするサーバはCentos 7.0で、Redisバージョンでは最新の安定バージョン6.2がインストールされます.

設定


redisをインストールするコマンドは以下のとおりです.順番に入力すれば、インストールできます.
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
make install
インストール後にredis-serverコマンドを入力し、サーバーの表示が良好であればインストールに成功します.

クラスタ設定


プロファイル設定


1.サーバの設定


各サーバは、プライマリノードとセカンダリノードを駆動します.
マスターはすべて7000番ポートに、slaveは7001番ポートに変更されます.
クラスタ構成の場合、クラスタバス通信のポートは各ノードポート+10000個であるため、合計7000、7001、17000、17001個のポートのファイアウォールを解除する必要がある.
  • クラスタバス:
  • 障害検出、構成更新、およびフェイルオーバ承認用
    また、メモリの使用量が多すぎる処理方法や、スロット数の設定を変更してください.(設定されていない場合はWARNING overcommit_memory is set to 0! Background save may fail under low memory condition.警告)
    # 메모리 사용량이 허용량을 초과할 경우, overcommit을 처리하는 방식 결정하는 값을 "항상"으로 변경
    sudo sysctl vm.overcommit_memory=1
    sudo echo "vm.overcommit_memory=1" >> /etc/sysctl.conf 
    sudo sysctl -a | grep vm.overcommit
    
    # 서버 소켓에 Accept를 대기하는 소켓 개수 파라미터를 변경
    sudo sysctl -w net.core.somaxconn=1024
    sudo echo "net.core.somaxconn=1024" >> /etc/sysctl.conf 
    sudo sysctl -a | grep somaxconn

    2.ディレクトリ構造

    /opt/redisディレクトリを作成し、redisインストールディレクトリ(そのまま入力すればredis-stableであるべき)のredis.confファイルを/opt/redisにコピーします./opt/redisの下に、70007001というフォルダが作成されます.(/opt/redis/7000/opt/redis/7001)

    3.マスターノードconfファイルの作成

    /opt/redis/7000に7000を追加します.confファイルを作成し、次のように入力します.
    include /opt/redis/redis.conf
    
    bind 0.0.0.0
    daemonize yes
    protected-mode no
    
    port 7000
    pidfile /opt/redis/7000/redis_7000.pid
    logfile /opt/redis/7000/redis-7000.log
    dir /opt/redis/7000
    dbfilename dump_7000.rdb
    
    requirepass [redis password]
    masterauth [redis password]
    
    cluster-config-file node-7000.conf
    cluster-enabled yes
    cluster-node-timeout 5000
    cluster-announce-ip [서버 public ip] # NAT/포트포워딩 사용시
    
    rename-command keys ""
    
    appendonly no
  • requirePass:redisサーバにパスワードを設定します.デフォルトはnull,redisに設定されています.confでは純テキストで書きます.長さ制限はなく、150 K程度まで伸びるそうです.openssl rand -base64 32でランダムパスワードを生成しました.
  • masterauth:プライマリノードにパスワードが設定されている場合は、ノードからコピー同期操作を行う前に、スレーブノードにパスワードを通知する必要があります.slaveがパスワードを知らない場合、masterはslaveの要求を拒否します.上のRequiremePassに小さなパスワードを入力します.
  • クラスタ-クラスタモードをオンにするにはenabled yesを追加する必要があります.Noに設定すると、独立モードで実行されます.
  • cluster-config-file nodes.conf:このファイルはクラスタの状態を記録するバイナリファイルです.クラスタの状態が変化するたびに,状態が記録される.
  • クラスタ-node-timeout 5000:Redisノードがダウンタイムしたかどうかを判断する時間.単位はミリ秒です.
  • クラスタ-通知-ip:docker、NAT設定、またはポート転送を使用すると、Redisクラスタノードは見つかりません.(redis.confドキュメントを参照)この場合、各ノード自身の静的パブリックIPを教える必要がある.
  • 4.スレーブノードconfファイルの作成

    /opt/redis/700017001.confファイルを作成し、次のように入力します.
    include /opt/redis/redis.conf
    
    bind 0.0.0.0
    daemonize yes
    protected-mode no
    
    port 7001
    pidfile /opt/redis/7001/redis_7001.pid
    logfile /opt/redis/7001/redis-7001.log
    dir /opt/redis/7001
    dbfilename dump_7001.rdb
    
    requirepass [redis password]
    masterauth [redis password]
    
    cluster-config-file node-7001.conf
    cluster-enabled yes
    cluster-node-timeout 5000
    cluster-announce-ip [서버 public ip]
    
    rename-command keys ""
    
    appendonly no

    5.オフセットノード


    各サーバの7000、7001番ノードが実行されます.(面倒くさいから、脚本を書きましょう)
    redis-server 7000/7000.conf 
    redis-server 7001/7001.conf
    ps -ef | grep redisで7000、7001番ノードがすべて昇っているか確認します.
    デーモンモードで実行され、画面にはログが表示されません./opt/redis/7000/redis-7000.logを確認すればいいです.

    クラスタへのマスターノードの追加


    1台のサーバで、次のコマンドを使用してクラスタを実行し、Can I set the above configuration? (type 'yes' to accept)にyesを入力します.
    redis-cli -a [비밀번호] --cluster create [서버1 IP]:7000 [서버2 IP]:7000 [서버3 IP]:7000
    このとき、Waiting for the cluster to joinとともに...無限の画面が撮れたら、ポートファイアウォールがすべて開いているかどうかを確認してください.
    土をすくうconfファイルにクラスタ-通知-ipを入力せず、NAT接続のパブリックIPを使用してクラスタを接続している場合は、ノードを接続できません.
    最初はサーバーのファイアウォールの問題だと思っていました.😩 ファイアウォールはすべて通じていて、どうしてだめなのか、長い時間の除去を経て...
    現在のサーバの共通IPがNATに設定されている場合、redisクラスタのノードアドレス発見に失敗する可能性があります.
    したがってcollection-blease-ip設定を追加してノード設定を行い、結果は正常です.😂

    ノードからクラスタへの追加


    1台のサーバで、次のコマンドを使用してslaveノードを追加します.
    サーバ2の7001ノードはサーバ1のプライマリノードのスレーブノードであり、サーバ3の7001ノードはサーバ2のプライマリノードのスレーブノードである…これにより、異なるサーバにmaster-slaveを配置します.
    redis-cli -a [비밀번호] --cluster add-node [서버2 IP]:7001 [서버1 IP]:7000 --cluster-slave
    redis-cli -a [비밀번호] --cluster add-node [서버3 IP]:7001 [서버2 IP]:7000 --cluster-slave
    redis-cli -a [비밀번호] --cluster add-node [서버1 IP]:7001 [서버3 IP]:7000 --cluster-slave
    [OK] New node added correctlyメッセージが確認された場合、ノードの追加は成功しました.
    クラスタ情報を検証するために、任意のredisノード(redis-server -h [서버IP] -p 7000)を接続します.
    [IP]:7000> AUTH [비밀번호] # 사용자 인증 필요
    [IP]:7000> 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:3
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:1934
    cluster_stats_messages_pong_sent:1915
    cluster_stats_messages_sent:3849
    cluster_stats_messages_ping_received:1911
    cluster_stats_messages_pong_received:1934
    cluster_stats_messages_meet_received:4
    cluster_stats_messages_received:3849
    
    [IP]:7000> cluster nodes
    XXX [IP]:7001@17001 slave XXX 0 1635593861555 3 connected
    XXX [IP]:7000@17000 myself,master - 0 1635593860000 1 connected 0-5460
    XXX [IP]:7001@17001 slave XXX 0 1635593861254 2 connected
    XXX [IP]:7000@17000 master - 0 1635593860550 2 connected 5461-10922
    XXX [IP]:7001@17001 slave XXX 0 1635593860000 1 connected
    XXX [IP]:7000@17000 master - 0 1635593860249 3 connected 10923-16383

    テスト


    セットテスト


    入力redis-server -h [서버IP] -p 7000 -c -a [비밀번호]は、クラスタモードでredis-serverに接続されます.(入力-cが必要)
    クラスタ・モードで接続されていない場合、キーの設定中に次のエラーが発生します.
    [IP-1]:7000> set key hi
    (error) MOVED 12539 [IP-3]:7000
    set key hi鍵のslotは12539で、3番ノードに割り当てる必要がありますが、クラスタモードでアクセスしていないため、redis-cliが他のノードに接続できないためエラーが発生しました.
    -cでクラスタモードを開いて接続すると、次のように成功し、3番ノードに切り替わります.
    [IP-1]:7000> set key hi
    -> Redirected to slot [12539] located at [IP-3]:7000
    OK
    [IP-3]:7000> get hi

    Redis Client UIプログラムを使用したテスト

  • 設定
    Redis Client UIプログラムP 3 Xをローカルにインストールします.
    P 3 Xを実行しSETTINGに入り、NEW CONNECTIONボタンをクリックします.

    hostnameにサーバのIPアドレスとプライマリポートを入力し、ADD NODEボタンをクリックして残りの5つのノードを設定します.TEST CONNECTIONボタンをクリックすると、右下にsuccessfulのメッセージが表示されます.
  • 左下隅で、CONNECTボタンをクリックし、入力したプロファイルを選択し、下図のように表示します.😎
  • クラスタ設定が完了しました.
    次の記事では、フェイルオーバ・リカバリ・スキームを試みます.