Redis 5.0.0インストール(クラスター)

1.Redisクラスターソリューションの比較

センチネルモード

redis3.0より前のバージョンでは、クラスターは通常、センチネルツールを使用してマスターノードのステータスを監視することで実装されます。マスターノードが異常な場合は、マスターとスレーブを切り替え、スレーブをマスターとして使用します。センチネルの構成は少し複雑で、そのパフォーマンスは、特にマスタースレーブの切り替え時にアクセスが一時的に中断され、センチネルモードにマスターノードが1つしかない場合に、高可用性などのすべての面で一般的なパフォーマンスを発揮します。高同時実行性をサポートできない外部サービスを提供するため、単一のマスターノードのメモリは適切ではありません。設定が大きすぎると、永続ファイルが大きくなりすぎて、データリカバリまたはマスターの効率に影響します。スレーブ同期。

高可用性クラスターモード

redisクラスターは、複数のマスタースレーブノードクラスターで構成される分散サーバークラスターです。レプリケーション、高可用性、およびフラグメンテーションの特性がありますRedisクラスターは、ノードの削除およびフェイルオーバー機能を完了するためにセンチネルを必要としません。各ノードをクラスターモードに設定する必要があります。このモードはクラスターノードの中心ではなく、水平方向にスケーラブルです。数万ノードに線形拡張されたと呼ばれる公式テキストファイルによると(公式は1000ノード以下を推奨)。redisクラスターのパフォーマンスと高可用性は、以前のバージョンのセンチネルモードよりも優れており、クラスター構成は非常に単純です。

2つ目は、Redisの高可用性クラスターの構築です。

2.1。スタンドアロンredisをインストールする

目的は、関連する実行可能コマンドと元の構成ファイルを取得することです。以下を参照してください。Redis5.0.0インストール(スタンドアロンバージョン)

2.2。クラスターredisをインストールします

redisクラスターには少なくとも3つのマスターノードが必要です(マスターの選出がほとんどの原則確実に満たすために、注:マスターノードのみが投票権を持っています。原則は以下で説明されています)。ここで3つのマスターノードを構築します。マスターごとにスレーブノードを構築します。合計6つのredisノードがあります。ここでは、3つのマシンを使用して6つのredisインスタンスをデプロイし、各マシンには1つのマスターと1つのスレーブがあります。クラスターを構築する手順は次のとおりです。

手順1:最初のマシンの/ usr / localの下にredis-clusterフォルダーを作成し、その下に2つのフォルダーを作成して、実行可能コマンドをクラスターディレクトリにコピーします。

(1)mkdir -p / usr / local / redis-cluster

(2)mkdir 9001、mkdir 9004

(3)cp / usr / local / redis / bin -r / usr / local / redis-cluster(実行可能コマンドをクラスターディレクトリにコピーします)

手順2:以前の元の構成ファイルredis.confを9001にコピーし、次の内容を変更します。

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

手順3:変更した構成ファイルを9002にコピーし、項目2、3、および5のポート番号を変更して、バッチで置き換えることができます。

:%s /ソース文字列/宛先文字列/ g

ステップ4:他の2台のマシンも上記のステップを実行する必要があります。2台目のマシンは9002と9005を使用し、3台目のマシンは9003と9006を使用します。

ステップ5:それぞれ6つのredisインスタンスを起動し、起動が成功したかどうかを確認します

(1)cd / usr / local / redis-cluster

(2)bin / redis-server 900 * / redis.conf

(3)ps -ef | grep redisは、起動が成功したかどうかを確認します

ステップ6:redis-cliを使用してredisクラスター全体を作成します(以前のバージョンのredis5クラスターはrubyスクリプトredis-trib.rbによって実装されています)

(1)cd / usr / local / redis-cluster

(2)bin / redis-cli -a smsp --cluster create --cluster-replicas 1 10.18.4.25:9001 10.18.4.26:9002 10.18.4.27:9003 10.18.4.25:9004 10.18.4.26:9005 10.18.4.27: 9006

--cluster-replicas 1は、作成されたマスターサーバーノードごとにスレーブサーバーノードを作成することを表します

注:-cluster createを実行してクラスターを作成すると、次の状況が発生する可能性があります。

[root@smsp-dev001-10 redis-cluster]# bin/redis-cli -a smsp --cluster create --cluster-replicas 1 10.18.4.25:9001 10.18.4.26:9002 10.18.4.27:9003 10.18.4.25:9004 10.18.4.26:9005 10.18.4.27:9006
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.18.4.26:9005 to 10.18.4.25:9001
Adding replica 10.18.4.25:9004 to 10.18.4.26:9002
Adding replica 10.18.4.27:9006 to 10.18.4.27:9003
>>> Trying to optimize slaves allocation for anti-affinity
[OK] Perfect anti-affinity obtained!
M: 2349fa527eebba23a4c2749c56c9ee5a8b0d1812 10.18.4.25:9001
   slots:[0-5460] (5461 slots) master
M: 763dfcc1f6bc3a613dc56e77b09b787544297b99 10.18.4.26:9002
   slots:[5461-10922] (5462 slots) master
M: bc03f9c9c6fba1ac80f7073a46956cbbcf4b48dc 10.18.4.27:9003
   slots:[10923-16383] (5461 slots) master
S: 5c31db9af7f63807fb06c17e8707a0486eee88c5 10.18.4.25:9004
   replicates 763dfcc1f6bc3a613dc56e77b09b787544297b99
S: 2251b04ada543220f2e485a7371160fa2da6a059 10.18.4.26:9005
   replicates bc03f9c9c6fba1ac80f7073a46956cbbcf4b48dc
S: 95fe85fcf724be804d1ff4a3769ddeffa9f7c4ad 10.18.4.27:9006
   replicates 2349fa527eebba23a4c2749c56c9ee5a8b0d1812
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
# 在此等待n久集群节点还是没有成功加入集群,而节点启动端口号也已经在防火墙中开放了
Waiting for the cluster to join
.....................................................................................
.....................................................................................
......................................................

長い間待った後も、クラスターノードはクラスターへの参加に失敗し、ノードの起動ポート番号がファイアウォールで開かれました。

理由:クラスターがredisクラスターに参加するのを待っています

解決策:ファイアウォールでも開始ポート+10000ポートを開きます。

同時に、クラスターの作成に失敗するたびに、クラスター関連のファイルがノードのデータディレクトリに生成されます。クラスターを再度作成する前に、まずノードをシャットダウンしてから、データ内のすべてのファイルを削除する必要があります。クラスタを再作成するためのディレクトリ!

手順7:クラスターを確認します。

(1)任意のクライアントに接続するだけです:./ redis-cli -c -h -p(-aアクセスサーバーのパスワード、-cはクラスターモードを意味し、IPアドレスとポート番号を指定します)

  例:bin / redis-cli -a smsp -c -h 10.18.4.25 -p 9001

(2)検証の実行:クラスター情報(クラスター情報の表示)、クラスターノード(ノードリストの表示)

(3)データ動作検証を行う

(4)クラスターをシャットダウンするには、1つずつシャットダウンする必要があります。次のコマンドを使用します。bin/ redis-cli -a smsp -c -h 10.18.4.25 -p 900 * shutdown

2.3.Java操作redisクラスター

redisのJavaクライアントjedisを使用すると、上記のクラスターを操作できます。jedisバージョンのMaven座標は、次のように参照されます。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

以下に示すように、Javaでredisクラスターにアクセスするためのコードを記述するのは非常に簡単です。

package com.ceair.screen.flight.service;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * 访问redis集群
 * @author smsp
 *
 */
public class RedisCluster
{
    public static void main(String[] args) throws IOException
    {
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("10.18.4.25", 9001));
        jedisClusterNode.add(new HostAndPort("10.18.4.26", 9002));
        jedisClusterNode.add(new HostAndPort("10.18.4.27", 9003));
        jedisClusterNode.add(new HostAndPort("10.18.4.25", 9004));
        jedisClusterNode.add(new HostAndPort("10.18.4.26", 9005));
        jedisClusterNode.add(new HostAndPort("10.18.4.27", 9006));

        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(10);
        config.setTestOnBorrow(true);
        //connectionTimeout:指的是连接一个url的连接等待时间
        //soTimeout:指的是连接上一个url,获取response的返回等待时间
        JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "smsp", config);
        System.out.println(jedisCluster.set("student", "zhuge"));
        System.out.println(jedisCluster.set("age", "19"));

        System.out.println(jedisCluster.get("student"));
        System.out.println(jedisCluster.get("age"));

        jedisCluster.close();
    }
}

操作効果は以下のとおりです。

OK OK smsp 19

 

3.Redisクラスターの原理の分析

Redis Clusterは、すべてのデータを16384スロット(スロット)に分割し、各ノードが一部のスロットを担当します。スロット情報は各ノードに保存されます。

Redis Clusterのクライアントがクラスターに接続すると、クラスターのスロット構成情報のコピーも取得し、クライアントにローカルにキャッシュします。このようにして、クライアントがキーを見つけたい場合、ターゲットノードを直接見つけることができます。同時に、クライアントとサーバー間でスロット情報が一致しない可能性があるため(容量が拡大または縮小すると、スロットとノードの対応する情報が変化します)、検証を実現するための修正メカニズムも必要です。スロット情報の調整。

スロット位置アルゴリズム

デフォルトでは、クラスターはcrc16アルゴリズムを使用してキー値をハッシュして整数値を取得し、次にこの整数値を16384を法として使用して特定のスロットを取得します。

HASH_SLOT = CRC16(key)mod 16384

ジャンプリロケーション

クライアントが間違ったノードに命令を送信すると、ノードは命令のキーが配置されているスロットが自分で管理されていないことを検出します。このとき、ノードを運ぶために特別なジャンプ命令をクライアントに送信します。ターゲット操作のアドレス。データを取得するためにこのノードに接続するようにクライアントに指示します。クライアントは命令を受信すると、動作する正しいノードにジャンプするだけでなく、ローカルスロットマッピングテーブルキャッシュを同期的に更新および修正し、後続のすべてのキーは新しいスロットマッピングテーブルを使用します。

ネットワークジッター

実際のコンピュータルームネットワークは、多くの場合穏やかではなく、さまざまな小さな問題を抱えていることがよくあります。たとえば、ネットワークジッターは非常に一般的な現象です。突然、一部の接続にアクセスできなくなり、すぐに通常の状態に戻ります。

この問題を解決するために、Redis Clusterはオプションcluster-node-timeoutを提供します。これは、ノードが継続的なタイムアウトのために接続されていない場合、ノードに障害があり、マスタースレーブスイッチが必要であると判断できることを意味します。このオプションがないと、ネットワークジッターによってマスタースレーブの切り替え(データの複製)が頻繁に発生します。

 

おすすめ

転載: blog.csdn.net/u014225733/article/details/103043024