Redis5.0クラスタ構築(サーバ2台)

記事ディレクトリ

1 はじめに

目的: Redis クラスターの構築
redis バージョン: redis5.0.8
2 台のマシン: HUAWEI CLOUD 低構成 Linux マシン
2 台の仮想マシンを使用して 6 ノードをシミュレートし、1 台のマシンには 3 ノードがあり、3 マスター、3 スレーブ環境を作成します。
どちらの仮想マシンも Huawei Cloud EulerOS 2.0 で、1 つは EulerOS (IP: 192.168.2.180)、もう 1 つは EulerOS (IP: 192.168.3.23) です。

2. 2 台のマシンのイントラネット接続を構成します。

2 台の Huawei Cloud マシンのイントラネット相互接続
https://blog.csdn.net/craftsman2020/article/details/128127525

3.redisのインストール

Redis の Linux インストールとデプロイ
https://blog.csdn.net/craftsman2020/article/details/122851974

4. Redis クラスターのバージョン 5.0 より前と 5.0 以降の違い

4.1 Redis 5.0 より前のバージョンでのクラスターの作成

redis5.0以前では、クラスターを作成するコマンドとしてredis-trib.rbが使用されていましたが、これはruby言語に基づいて実装され、ruby環境に依存していました。

  • クラスター作成コマンド
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6378 127.0.0.1:6377 127.0.0.1:6376 127.0.0.1:6375 127.0.0.1:6374

4.2 redis5.0以降のクラスターの作成

redis5.0以降はc言語ベースで実装されたクラスタ作成コマンドとしてredis-cliが使用され、redis自体もcベースで実装されているため、5.0以降のクラスタ構築は他の環境に依存しません。 5.0 より前のバージョンでは、多くのビルドが簡単になります。

  • クラスター作成コマンド
redis-cli --cluster create  127.0.0.1:6379 127.0.0.1:6378 127.0.0.1:6377 127.0.0.1:6376 127.0.0.1:6375 127.0.0.1:6374 --cluster-replicas 1
  • 5.0 以降のバージョンでは、以前のバージョンの手順を使用してクラスターを作成することはできなくなりました。
问题描述:WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead

レディス

4.3 redis5.0より前のバージョンはRuby環境に依存する必要がある

若使用docker搭建集群,此处较为简单
apt install ruby -y
若非docker搭建的需要升级ruby版本,redis需要ruby版本在2.3以上,yum安装的为2.0版本
#安装依赖
yum install -y ruby ruby-devel rubygems rpm-build
#安装rvm升级ruby
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
#安装ruby2.3以上版本
rvm install 2.3.4  
#安装redis
gem install redis

5. Redis5.0クラスタ構築

Redis クラスターには少なくとも3 つのマスター ノードが必要です。ここでは 3 つのマスター ノードを構築し、マスターごとにスレーブ ノードを構築します。合計 6 つの Redis ノード、3 つのマスターと 3 つのスレーブがあります。クラスターを構築する手順は次のとおりです。 :

5.1 redis-cluster ディレクトリの作成

2 つのサーバーの下の redis インストール ディレクトリ (/usr/local/redis/) にそれぞれ redis-cluster ディレクトリを作成します。

cd  /usr/local/redis/
mkdir  redis-cluster

redis-cluster の下に 8001、8002、8003 // 8004、8005、8006 ディレクトリを作成します

# A机器创建目录
cd /usr/local/redis/redis-cluster
mkdir 8001 8002 8003 
# 同理,切到B机器创建目录
mkdir 8004 8005 8006

5.2 前の redis.conf を 8001 ディレクトリにコピーします。

cp /usr/local/redis/redis.conf  /usr/local/redis/redis-cluster/8001/

5.3 redis.confを変更する

1)daemonize yes
2)port 8001(分别对每个机器的端口号进行设置)
3)dir /usr/local/redis/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
4)cluster-enabled yes(启动集群模式)
5)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
6)cluster-node-timeout 5000
7) bind 127.0.0.1(去掉bind绑定访问ip信息, 注释掉,或改为0.0.0.0也可)
8) protected-mode no (关闭保护模式)
9)appendonly yes
如果要设置密码需要增加如下配置:
10)requirepass xxx (设置redis访问密码)
11)masterauth xxx (设置集群节点间访问密码,跟上面一致)

5.4 redis.conf の一般的な構成手順

設定項目の説明

  • daemonize yes: Redis のデーモン プロセスを開き、Redis サービスがバックグラウンドで実行されます。

  • ポート8001: Redis ポート番号。各設定ファイルは独自のポート番号を設定します。このドキュメントでは 8001、8002 ... 8006 として設定されています。

  • dir /usr/local/redis-cluster/8001/: データ ファイルの保存場所を設定します。別のディレクトリの場所を指定する必要があります。指定しないと、データが失われます。

  • cluster-enalbed yes: クラスター モードを開始します。デフォルトはコメントアウトされており、コメントが解除されています。

  • クラスタ構成ファイルnodes-8001.conf: クラスタノード情報ファイル。
    デフォルトはnodes-6379.confですが、6379をこのノードのポート番号に変更するだけです。
    : このオプションの名前にもかかわらず、これはユーザーが作成したりユーザーが編集したりできる構成ファイルではなく、Redis クラスター ノードが変更されるたびにクラスター構成 (基本的には状態) を自動的に保存するファイルです。更新日 起動時に再読み込みされます。このファイルには、クラスター内の他のノード、その状態、永続変数などがリストされます。通常、このファイルは特定のメッセージを受信すると上書きされ、ディスクにフラッシュされます。

  • cluster-node-timeout 5000: 単位: ミリ秒; Redis クラスター ノードが障害とみなされずに使用できなくなる最大時間。指定された時間を超えてマスター ノードに到達できない場合、マスター ノードはスレーブによってフェイルオーバーされます。そして、指定された時間内に大多数のマスター ノードに到達できないノードはすべて、クエリの受け入れを停止します。

  • bind 127.0.0.1 192.168.11.15:
    127.0.0.1 は、現在のホストが 127.0.0.1 および localhost を介してローカル ノードにアクセスできることを意味します。192.168.11.15 は
    現在のホスト IP であり、他のサーバー ノードからアクセスできます。それ以外の場合、クラスターはアクセスできません。
    バインドが 0.0 .0.0 またはコメントアウトされた場合は、現在のホスト IP を通じてすべてのマシンにアクセスできることを示します

  • protected-mode no: redis3.2 バージョン以降の新しい保護モード構成、デフォルトは yes、つまりオープンです; no: 外部ネットワークに直接アクセスできます; yes: バインド IP を構成するか、アクセス パスワードを設定する必要があります。

  • appendonly yes: AOF 永続性を有効にします (サーバーの電源障害が発生した場合、またはオペレーティング システムはまだ正常に実行されているが、Redis プロセスが不可解にハングアップした場合に、Redis が失うデータは 1 秒のみです);

: パスワードを設定する場合は、次の 2 つの設定項目を追加する必要があります

  • requirepass XXX: Redis アクセスパスワードを設定します。
  • masterauth XXX: requirepass と一致する、クラスター ノード間のアクセス パスワードを設定します。

5.5 redis.conf を各ノードにコピーし、ポートを変更する

8001 の変更した設定ファイルを 8002 ~ 8006 にそれぞれコピーし、対応するポートとファイル名を変更します

cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/redis-cluster/8002/
cp  /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/redis-cluster/8003/
scp /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8004/
scp  /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8005/
scp  /usr/local/redis/redis-cluster/8001/redis.conf [email protected]:/usr/local/redis/redis-cluster/8006/

新しくコピーされた 5 つのファイルは、構成項目 (port、dir、cluster-config-file) のみを変更します。

5.6 6つのredisインスタンスをそれぞれ起動します

redis-server /usr/local/redis/redis-cluster/8001/redis.conf
redis-server /usr/local/redis/redis-cluster/8002/redis.conf
redis-server /usr/local/redis/redis-cluster/8003/redis.conf
redis-server /usr/local/redis/redis-cluster/8004/redis.conf
redis-server /usr/local/redis/redis-cluster/8005/redis.conf
redis-server /usr/local/redis/redis-cluster/8006/redis.conf

5.7 クラスターの作成

redis-cli -a 123456--cluster create --cluster-replicas 1 192.168.2.180:8001 192.168.2.180:8002 192.168.2.180:8003 192.168.3.23:8004 192.168.3.23:8005 192.168.3.23:8006

5.8 クラスターの検証

マシン A の任意のノードに接続する

redis-cli -a 123456 -c -h 192.168.2.180 -p 8001  -a 123456

Redisクラスターマシン B の任意のノードに移動して値を取得します

redis-cli -a xxx -c -h 192.168.3.23 -p 8005 -a 123456

Redisクラスター

5.9 クラスター情報の表示

クラスター情報

  • cluster_known_nodes:6 # 6 つのノード
  • cluster_size:3 # クラスターのサイズは 3 で、マスター/スレーブは 1 としてカウントされます

5.10 クラスターノードの表示

クラスターノード

5.11 クラスタのシャットダウン

  • 1 つずつ閉じるには、次のコマンドを使用します。
redis-cli -a 123456 -c -h 192.168.2.180 -p 8001 shutdown
redis-cli -a 123456 -c -h 192.168.2.180 -p 8002 shutdown
redis-cli -a 123456 -c -h 192.168.2.180 -p 8003 shutdown
redis-cli -a 123456 -c -h 192.168.3.23 -p 8004 shutdown
redis-cli -a 123456 -c -h 192.168.3.23 -p 8005 shutdown
redis-cli -a 123456 -c -h 192.168.3.23 -p 8006 shutdown
  • スクリプトで閉じる
#!/bin/bash
#所有服务器节点的hostname
allnodes=('cnode-1' 'cnode-2' 'cnode-3')
#端口号开始
PORT=7001
#结束端口号
ENDPORT=7003
#密码,如果redis没配置密码可省略
PASSWROD=123456
while [ $((PORT < ENDPORT)) != "0" ]; do
    for ip in ${
    
    allnodes[@]};
    do
        #判断某个端口是否已被占用,如果是,则执行关闭命令
        count=`ssh $ip lsof -i:$PORT | wc -l`
        if [ $count -gt 0 ];
        then
            echo "Stopping Redis $ip:$PORT"
            ssh $ip redis-cli -p $PORT -a $PASSWROD shutdown 2>/dev/null
        else
            echo "no redis $ip:$PORT"
        fi
    done
    PORT=$((PORT+1))
done
exit 0

6. 関連する問題

6.1 Redis クラスターの構築中に発生した問題: クラスターの参加を待機しています…

集まるこの状況の原因のほとんどは、クラスターバスのポートが開いていないことです。

クラスター バス
Redis クラスター内の各ノードは 2 つの TCP 接続を開く必要があります。通常、クライアントにサービスを提供するために接続 (6379 など) が使用され、データ ポートとして追加のポート (このポート番号に 10000 を追加) があります。たとえば、redis のポートは 6379 で、次に redis のポートが 6379 です。開く必要があるのは : 6379 + 10000、つまり 16379 をオンにする必要があります。 ポート 16379 は、バイナリ プロトコルを使用したポイントツーポイント通信チャネルであるクラスタ バスに使用されます。このクラスター バス (クラスター バス) は、ノード障害の検出、構成の更新、フェイルオーバーの承認などに使用されます。

解決策:
問題がわかれば、Redis ポートに対応するクラスター バス ポートを開くだけで解決方法が自然にわかります。例: 6379 + 10000 = 16379。したがって、クラスターを正常に作成するには、各クラスター ノードのクライアント ポートとクラスター バス ポートを開きます。
: すべての Redis クラスター マシンは、対応する Redis クライアント ポートとクラスターバス ポートを解放する必要があります。
仮想マシン上に Redis クラスターを構築している場合は、ファイアウォールを直接オフにして問題を解決できます。

systemctl stop firewalld.service  关闭防火墙
systemctl disable firewalld      永久关闭防火墙

ただし、クラウド サーバー上に Redis クラスターを構築している場合は、セキュリティ グループに移動して、対応する Redis クラスター バス ポートを解放する必要があります。
HUAWEI CLOUDサーバーのポート開放設定は以下のとおりです。
ここに画像の説明を挿入

6.2 [ERR] ノード 192.168.2.180:8001 は空ではありません。ノードはすでに他のノードを認識しているか (CLUSTER NODES で確認してください)、データベース 0 に何らかのキーが含まれています。

クラスターノード
Redis クラスター環境にノードを追加するときに、新しく追加されたノードが空ではないというメッセージが表示される問題が発生しました。

解決策:

  • 1. 追加する必要があるノード下の aof や rdb などのローカル バックアップ ファイルを削除します。

appendonly yes

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

dir はバックアップファイルのディレクトリを設定するもので、設定されていない場合はそのフォルダ配下に dump.rdb が生成されます。

# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /usr/local/redis/redis-cluster/8004

################################# REPLICATION #################################
  • 2. 同時に、新しいノードのクラスター構成ファイルを削除します。つまり、redis.conf 内のクラスター構成ファイルが配置されているファイルを削除します。
cluster-config-file nodes-8004.conf

# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
#
cluster-node-timeout 15000

  • 3. 新しいノードを再度追加します。エラーがまだ報告される場合は、新しいノードにログインします。/redis-cli–hx –p でデータベースをクリアします: 172.168.2.180:8001>lushdb #現在のデータベースを空にし
    ます

私の dir ディレクトリは /usr/local/redis/redis-cluster/800x/ に設定されているので、下図のように削除します。 aof
ここに画像の説明を挿入
と cluster-config-file が配置されているファイルを削除します。
ここに画像の説明を挿入
各ノードのデータベースをクリアします。
redisクラスター完了後上記の操作により、ノードが再作成され、成功しました。
ここに画像の説明を挿入注: この状況は、redis クラスターが異常にシャットダウンされるたびに発生する可能性があります。

6.3 192.168.3.23:8004 で Redis に接続できませんでした: 接続がタイムアウトしました

ポート番号が開いていないことが考えられますので、
HUAWEI CLOUDサーバーの場合は、HUAWEI CLOUDにログインし、セキュリティグループに設定してください。
ここに画像の説明を挿入

6.4 192.168.2.180:8001 で Redis に接続できませんでした: 接続が拒否されました

クラスターを作成するときに、「192.168.2.180:8001 で Redis に接続できませんでした: 接続が拒否されました」とレポートします。

  1. まず、対応するノードの Redis サービスが有効になっていないことを考慮し、それを有効にするだけです。
  2. 2 番目は、バインド 127.0.0.1 がコメント化されています。注釈が付いているため、デフォルトで誰でも接続できることを意味します。コメントするか、0.0.0.0 に変更します。
  3. 再度、保護モードが no に設定されているかどうか。バインド IP が設定されておらず、パスワードも設定されていない場合、Redis はこのマシンからの応答のみを受け入れることができます。

他のマシンを Redis サービスに接続したいと考えています。方法は 3 つあります。

  1. Redis を protected-mode が no のモードで実行する方法を見つけます。
  2. protected-mode が Yes の場合、Redis サービスにバインドを設定できます。つまり、マシンの 1 つが持つ IP の数を設定し、サービスがリッスンするようにバインドされているマシンの IP を指定できます。
  3. protected-mode が Yes の場合、bind の設定に加えて、パスワードを設定することもできます。つまり、requirepass パラメータを設定して、他のマシンからアクセスできるようにするという目的を達成します。
  1. 最後に、ファイアウォールが閉じている
    ここに画像の説明を挿入
    か、指定されたポート番号を開いているかを確認します。これはローカル テストです。便宜上、ファイアウォールを直接閉じますが、運用環境ではこれを行わないでください。

7. Redis-cli 共通コマンドパラメータ

redis-cli で最もよく使用される 3 つのパラメータは、-h、-p、および -a オプションです。これらは、接続された redis-server のホスト、ポート、ログイン パスワードを指定するために割り当てられます。
redis-cli –help を通じて見つかると、redis-cli には他の多くのパラメーターと関数も提供されます。

  1. -x
    -x オプションは、標準入力 (stdin) から最後の引数を読み取ります。たとえば、パイプから入力を読み取るには:
echo -en "chen.qun" | redis-cli -x set name
  1. -r -i
  • -r オプションは、指定された回数だけコマンドを繰り返します。
  • -i コマンドの実行間隔を設定します。
    たとえば、1 秒あたりに redis によって実行されるコマンド (qps) を確認します。
redis-cli -r 100 -i 1 info stats | grep instantaneous_ops_per_sec
  1. -c は
    、redis クラスター ノードを接続するときに使用される、reidis クラスター モードを有効にします。

  2. -rdb
    指定した Redis インスタンスの rdb ファイルを取得し、ローカルに保存します。

redis-cli -h 192.168.44.16 -p 6379 --rdb 6379.rdb
    • -slave は、
      スレーブがマスターから受け取るコマンドをシミュレートします。スレーブで受信されるコマンドはすべて更新操作であり、データの更新動作を記録します。
  1. -scan および - -pattern
    は、scan コマンドを使用して Redis 内のキーをスキャンします。 - -pattern オプションは、スキャンされるキーのパターンを指定します。キーパターンモードと比較すると、redis は長時間ブロックされないため、他のクライアントのコマンド リクエストは常にブロックされます。

redis-cli --scan --pattern 'chenqun_*'
  1. -pipe は
    非常に便利なパラメータです。元の Redis プロトコル形式のデータを実行のためにサーバーに送信します。
    たとえば、次の形式のデータです (Linux サーバー上の dos ファイルに変換するには、unix2dos を使用する必要があります)。
    Linux のデフォルトの改行は \n、Windows システムの改行は \r\n、redis は \r\n を使用します。
echo -en '*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | redis-cli --pipe

参考:http://redis.io/topics/mass-insert

  1. -bigkeys は、
    redis 内のキーをサンプリングして、より大きなキーを見つけます。scan メソッドが使用されるため、redis が長時間ブロックされ、他のリクエストを処理できなくなることを心配する必要はありません。実行結果は、redisのメモリ使用状況や各種キーの平均サイズなどを分析することができます。
redis-cli --bigkeys
  1. -eval は、
    指定された lua スクリプトを実行します。
redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3

8. 関連記事

Redis クラスターの構築、追加のサービス開始および停止スクリプト
https://blog.csdn.net/alwaysbefine/article/details/109790828

おすすめ

転載: blog.csdn.net/craftsman2020/article/details/128130348