sql >> データベース >  >> NoSQL >> Redis

Redisクラスターシャーディングの概要–利点、制限、デプロイ、クライアント接続

    Redis Clusterは、Redis内で利用可能なネイティブのシャーディング実装であり、外部のツールやユーティリティに依存することなく、データを複数のノードに自動的に分散できます。 ScaleGridでは、最近、Redis™プランのホスティングを通じて、フルマネージドプラットフォームでRedis™*クラスターのサポートを追加しました。この投稿では、高度なRedisクラスターシャーディングの機会を紹介し、その利点と制限、展開するタイミング、およびRedisクラスターへの接続方法について説明します。

    Redisクラスターを使用したシャーディング

    Redisクラスターのキースペース全体が16384スロット(ハッシュスロットと呼ばれる)に分割され、これらのスロットは複数のRedisノードに割り当てられます。特定のキーはこれらのスロットの1つにマップされ、キーのハッシュスロットは次のように計算されます。

    HASH_SLOT =CRC16(key)mod 16384

    1回のコマンド実行に関係するすべてのキーが同じハッシュスロットに属している限り、Redisクラスターでマルチキー操作がサポートされます。これは、ハッシュタグの概念を使用して保証できます。

    Redisクラスター仕様は、テクノロジーの内部を理解するための最も信頼のおけるガイドです。一方、Redisクラスターチュートリアルは、導入と管理のガイドラインを提供します。

    利点

    Redisクラスターの主な利点を確認して、デプロイメントにどのように役立つかを確認してください:

    • 高性能

      Redis Clusterは、スタンドアロンのRedisデプロイメントと同じレベルのパフォーマンスを約束します。

    • 高可用性

      Redis Clusterは、標準のRedisマスターレプリカ構成をサポートして、高可用性と耐久性を確保します。また、Raftのようなコンセンサスアプローチを実装して、クラスター全体の可用性を確保します。

    • 水平および垂直のスケーラビリティ

      クラスターへの新しいRedisノードの追加または削除は、ダウンタイムなしで透過的に実行できます。これにより、シャードの追加と削除、個々のノードの廃止、スケーリングが簡単になります。

    • ネイティブソリューション

      Redisクラスターのデプロイには外部プロキシやツールは必要ないため、学習したり心配したりする必要のある新しいツールはありません。また、スタンドアロンのRedisデプロイメントとほぼ完全な互換性を提供します。

    制限

    導入に適していることを確認するための制限にも注意してください:

    • クライアントサポートが必要です

      クライアントは、Redisクラスターをサポートするために変更を加える必要があります。 Redis Clustersは何年も前から存在していますが、それをサポートしていないクライアントがまだあります。 Redisクラスターのデプロイを選択する前に、Redisクライアントのドキュメントを参照して、使用しているクライアントがサポートされていることを確認してください。

    • 限定的なマルチキー操作のサポート

      前のセクションで説明したように、マルチキー操作は、単一の操作のすべてのキーが同じスロットに属している場合にのみサポートされます。これは、データ構造を設計するときに注意する必要があることです。

    • 1つのデータベースのみをサポート

      スタンドアロンデータベースとは異なり、Redisクラスターは1つのデータベース(データベース0)のみをサポートし、SELECTコマンドは許可されていません。ほとんどの人は複数のデータベースを使用しないため、これも大きな制限ではありません。

    Redisクラスターをいつデプロイする必要がありますか?

    シャーディングされたRedisソリューションが必要な場合は、Redisクラスターソリューションが最適です。 Redis Clusterは、シンプルで優れたパフォーマンスを提供するネイティブソリューションです。

    通常、スタンドアロンのRedisノードを書き込みで飽和させ始め、書き込みを複数のノードに分散させたい場合、人々はRedisデプロイメントのシャーディングを検討し始めます。 Redisは主にシングルスレッドですが、I / Oは通常、CPUの飽和状態を開始する前に、スタンドアロンでネットワークまたはメモリにバインドされます。スタンドアロンシステムにメモリを追加することを選択することで、メモリの限界をある程度克服できますが、特定のポイントを超えると、コスト、バックアップ、再起動、ウォームアップ時間などの点で法外になり始めます。

    一方、読み取りを複数のノードに分散することだけを目的としている場合は、読み取りレプリカをスタンドアロンに追加する方がはるかに簡単です。

    Redisの他のシャーディングソリューションと比較すると、Redisクラスターでのシャードリバランスはアプリケーションに対して透過的です。これにより、アプリケーションに影響を与えることなく、シャードを簡単に追加または削除できます。

    #Redisクラスターシャーディングの概要–利点、制限、展開するタイミング、クライアント接続クリックしてツイート

    Redisクラスターへの接続

    ScaleGridを使用してRedis™クラスターをデプロイすることを選択した場合、標準リリースと完全に互換性のあるフル機能のRedisクラスターデプロイメントを利用できます。

    始めたばかりの場合は、ScaleGridコンソールで30日間の無料トライアルにサインアップし、最初のScaleGridforRedis™デプロイメントの作成に関するこのドキュメントを確認してください。

    ScaleGridでRedis™クラスターに接続するために必要なものは次のとおりです:

    • ノード名のリスト
    • ポート
    • 認証文字列

    Redis™デプロイメントの詳細ページの[概要]タブには、ポート番号と認証情報とともに、各シャードのマスターのリストがあります。

    または、クラスターのすべてのノードのリストは、[マシン]タブで利用できます:

    お気づきかもしれませんが、オンラインで利用できる認証対応のRedis™クラスタに接続する方法を示す例は多くありません。ここでは、いくつかの例を使用していくつかの例を示します。人気のあるクライアント。

    Javaとの接続

    人気のあるRedis Javaクライアントの中で、JedisとLettuceはRedis™クラスターをサポートしています。例としてジェダイを取り上げます。

    ジェダイ

    Redis™クラスター接続はJedisClusterによって抽象化されます クラス。このクラスを使用してRedis™クラスターに接続する最良の例は、JedisテストのJedisソースコードにあります。残念ながら、現時点では、認証が指定されている場合、 JedisCluster コンストラクターはあまりきれいではありません。これは、Redis™クラスターに100個のキーを書き込む例です。キーはタグ付けされていないため、最終的には異なるノードの異なるスロットに配置されることに注意してください。

    ...
    import java.util.HashSet;
    import java.util.Set;
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPoolConfig;
    ...
    
    public class RedisClusterModeTest {
        public static final int    DEFAULT_TIMEOUT      = 5000;
        public static final int    DEFAULT_REDIRECTIONS = 5;
    
        public static void main(String[] args) {
            Set jedisClusterNodes = new HashSet();
            jedisClusterNodes.add(new HostAndPort("SG-example-1.servers.scalegrid.io, 6379));
            jedisClusterNodes.add(new HostAndPort("SG-example-2.servers.scalegrid.io", 6379));
            jedisClusterNodes.add(new HostAndPort("SG-example-3.servers.scalegrid.io", 6379));
            jedisClusterNodes.add(new HostAndPort("SG-example-4.servers.scalegrid.io", 6379));
            jedisClusterNodes.add(new HostAndPort("SG-example-5.servers.scalegrid.io", 6379));
            jedisClusterNodes.add(new HostAndPort("SG-example-6.servers.scalegrid.io", 6379));
    
            JedisCluster jedis = new JedisCluster(jedisClusterNodes, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS, <auth>, new JedisPoolConfig());
            for (int i = 0; i < 100; i++) {
                jedis.set("key" + i, "value" + i);
            }
            jedis.close();
        }
    }
    

    コンストラクターへの引数は、JedisAPIドキュメントに記載されています。 Jedisを使用したクラスターの作成中に、クラスターのすべてのノードを指定することをお勧めします。

    Rubyとの接続

    Rubyで最も人気のあるRedisクライアントはredis-rbです。また、Redis™クラスターもサポートしているため、この例で使用します。

    Redis-rb

    redis-rbバージョン4.1.0以降では、Redis™クラスターがサポートされています。 'クラスター' 接続の初期化中にオプションを指定する必要があります。正確なセマンティクスについては、このドキュメントを参照してください。上記のRubyのJavaの例と同じプログラムを次に示します。

    require 'redis'
    require 'pp'
    
    NODES = ["redis://SG-example-1.servers.scalegrid.io:6379",
             "redis://SG-example-2.servers.scalegrid.io:6379",
             "redis://SG-example-3.servers.scalegrid.io:6379",
             "redis://SG-example-4.servers.scalegrid.io:6379",
             "redis://SG-example-5.servers.scalegrid.io:6379",
             "redis://SG-example-6.servers.scalegrid.io:6379"]
    begin
        pp "Attempting connection..."
        redis = Redis.new(cluster: NODES, password: <auth>)
        100.times { |i| redis.set("key#{i}", "value#{i}") }
        pp "Done..."
        redis.close
    rescue StandardError => e
        puts e.message
    end
    

    Node.jsとの接続

    Node_redisは、Node.jsで最も人気のあるRedisクライアントです。ただし、Redis™クラスターはまだ正式にはサポートされていません。 ioredisは、Redis™クラスターをサポートするもう1つの人気のあるRedisクライアントであるため、Node.jsの例でこれを使用します。

    ioredis

    ioredisのドキュメントには、Redis™クラスターに接続するために渡す必要のある追加のパラメーターの詳細が記載されており、基本的な例もREADMEに記載されています。これは、ユーザーにキーの入力を求め、Redis™クラスターからその値を読み取るサンプルプログラムです。

    const readline = require('readline');
    const Redis = require('ioredis');
    
    var cluster = new Redis.Cluster([{
        port: 6379,
        host: 'SG-example-1.servers.scalegrid.io'
    },
    {
        port: 6379,
        host: 'SG-example-2.servers.scalegrid.io'
    },
    {
        port: 6379,
        host: 'SG-example-3.servers.scalegrid.io'
    },
    {
        port: 6379,
        host: 'SG-example-4.servers.scalegrid.io'
    },
    {
        port: 6379,
        host: 'SG-example-5.servers.scalegrid.io'
    },
    {
        port: 6379,
        host: 'SG-example-6.servers.scalegrid.io'
    }
    ], { redisOptions: { password: '<auth>' } });
    
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
        prompt: 'enter key> '
    });
    
    console.log('Welcome to the Redis Cluster reader. Enter the key which you want to read [Ctrl D to Exit]');
    rl.prompt();
    rl.on('line', (line) => {
        if (line.trim()) {
            cluster.get(line, function (err, result) {
                if (err) {
                    console.error(err);
                } else {
                    console.log("value: " + result);
                }
                rl.prompt();
            });
        } else {
            console.error("No input received");
            rl.prompt();
        }
    }).on('close', () => {
        console.log('\nterminating');
        cluster.quit();
        process.exit(0);
    });
    

    クライアントマシンに最新バージョンのRedisドライバーをインストールすると、これらの例のいずれかを実行できるようになります。

    RedisデプロイメントをScaleGridのフルマネージドプラットフォームに移行してRedis™をホスティングする準備ができている場合は、ScaleGridコンソールで利用できるすばらしい機能を確認してください。 30日間の無料トライアルを通じて。 Redis™プランのAWSホスティングは、世界中の14の異なるデータセンターで利用できます。Redis™の唯一のサービスであり、独自のクラウドアカウント内でデプロイを管理できます。


    1. さまざまなタイプのMongoDBインデックス

    2. mongodbidからタイムスタンプを取得する

    3. mongodb-最も近い整数値を持つドキュメントを検索します

    4. Kerasはセロリタスク内に戻らないと予測しています