Redisにおけるレプリカとクライアントの管理方法

はじめに

Redisはオープンソースのインメモリキーバリューデータストアです。その中でも最も求められる機能の一つは、レプリケーションのサポートです。Redisサーバーはデータを任意の数のレプリカに複製することができ、高い読み取りスケーラビリティとデータの冗長性を実現します。さらに、Redisは多くのクライアント(デフォルトで最大1万)がデータに接続して相互作用することを許容するよう設計されており、同じデータセットへのアクセスが多くのユーザーに必要なケースに適しています。

このチュートリアルでは、Redisクライアントとレプリカを管理するために使用するコマンドの概要を説明します。

このガイドの使い方

このガイドは、自己完結型の例を用いたチートシートとして書かれています。私たちは、お使いになりたいタスクに関連するどのセクションにも飛ぶことをお勧めします。

このガイドで示されているコマンドは、Redisバージョン6.0.16を実行しているUbuntu 22.04サーバーでテストされました。同様の環境をセットアップするには、Ubuntu 22.04におけるRedisのインストールとセキュリティの手順(当ガイドのステップ1)に従うことができます。これらのコマンドの振る舞いをredis-cliというRedisコマンドラインインターフェースを使用して実行することで、デモンストレーションします。ただし、別のRedisインターフェース(例: Redli)を使用している場合、特定のコマンドの出力は異なる場合があります。

または、これらのコマンドをテストするために、管理されたRedisデータベースインスタンスをプロビジョニングすることもできますが、データベースプロバイダに許可された制御レベルによっては、このガイドに記載されているようにいくつかのコマンドが機能しない場合もあります。Silicon CloudのManaged Databases製品ドキュメントに従って、Silicon CloudのManaged Databaseをプロビジョニングしてください。その後、Redliをインストールするか、TLSトンネルを設定してManaged DatabaseにTLS経由で接続する必要があります。

Note

注意:Redisプロジェクトでは、複製における異なる役割を特定するために、ドキュメンテーションや様々なコマンドで「マスター」という用語を使用していますが、プロジェクトの貢献者は互換性の問題が発生しない場合にはこの言語を変更する取り組みを進めています。Silicon Cloudは一般的に代替語として「プライマリ」と「レプリカ」の使用を好みます。
このガイドでは可能な限り「プライマリ」と「レプリカ」という用語をデフォルトとしますが、注意してください。「マスター」という用語が避けられない場合もいくつかあります。

レプリカの管理

Redisの最も特徴的な機能の1つは、内蔵されたレプリケーションです。レプリケーションを使用すると、Redisはプライマリインスタンスの正確なコピーを作成します。これらのセカンダリインスタンスは、接続が切断された場合でも常にプライマリに再接続し、常にプライマリの正確なコピーであることを目指します。

現在接続しているRedisインスタンスがプライマリインスタンスかレプリカか確認する方法は、roleコマンドを実行することです。

  1. role

 

このコマンドでは、Redis Sentinelを使用している場合、マスター、レプリカ、または潜在的にセンチネルのいずれかが返されます。

他のインスタンスのレプリカとしてRedisインスタンスを指定するには、レプリカオブジェクトコマンドを実行します。このコマンドには、主要なサーバーのホスト名またはIPアドレスとポートを引数として指定します。

  1. replicaof hostname_or_IP port

 

もしサーバーが既に他のプライマリのレプリカである場合、旧サーバーのレプリケーションを停止し、直ちに新しいサーバーと同期を開始します。また、旧データセットも破棄します。

レプリカをプライマリに昇格させるためには、以下のレプリカオブコマンドを実行します。

  1. replicaof no one

 

これによって、インスタンスはプライマリサーバーの複製を停止しますが、既に複製したデータセットは破棄しません。この構文は、元のプライマリが失敗した場合に役立ちます。失敗したプライマリのレプリカで replicaof no one を実行した後、以前のレプリカを新しいプライマリとして使用し、自分自身のレプリカを故障対策として使用できます。

クライアントの管理

クライアントとは、サーバーに接続してサービスにアクセスするための機械やソフトウェアのことです。Redisには、クライアント接続の追跡や管理を支援するためのいくつかのコマンドが付属しています。

クライアントリストコマンドは、現在のクライアント接続に関する人が読みやすい情報のセットを返します。

  1. client list

 

Output

“id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client ”

それぞれのフィールドが意味するものは以下の通りです。

  • id: a unique 64-bit client ID
  • name: the name of the client connection, as defined by a prior client setname command
  • addr: the address and port from which the client is connecting
  • fd: the file descriptor that corresponds to the socket over which the client is connecting
  • age: the total duration of the client connection, in seconds
  • flags: a set of one or more single-character flags that provide more granular detail about the clients; review the client list command documentation for more details
  • db: the current database ID number that the client is connected to. It can range from 0 to 15
  • sub: the number of channels the client is subscribed to
  • psub: the number of the client’s pattern-matching subscriptions
  • mutli: the number of commands the client has queued in a transaction. This will show -1 if the client hasn’t begun a transaction or 0 if it has only started a transaction and not queued any commands
  • qbuf: the client’s query buffer length, with 0 meaning it has no pending queries
  • qbuf-free: the amount of free space in the client’s query buffer, with 0 meaning that the query buffer is full
  • obl: the client’s output buffer length
  • oll: the length of the client’s output list, where replies are queued when its buffer is full
  • omem: the memory used by the client’s output buffer
  • events: the client’s file descriptor events. These can be r for “readable”, w for “writable,” or both
  • cmd: the last command run by the client

クライアント名の設定は、Redisを利用しているアプリケーションの接続リークのデバッグに役立ちます。新しい接続は、名前が割り当てられていない状態で開始されますが、cliend setnameを使用して現在のクライアント接続のための名前を作成することができます。クライアント名の長さに制限はありませんが、Redisは通常、文字列の長さを512MBに制限しています。ただし、クライアント名にはスペースを含めることはできません。

  1. client setname elaine

 

クライアント接続名を取得するには、クライアントのgetnameコマンドを使用してください。

  1. client getname

 

Output

“elaine”

クライアントの接続IDを取得するためには、クライアントIDコマンドを使用してください。

  1. client id

 

Output

(integer) “19492”

RedisクライアントのIDは決して繰り返されず、単調に増加します。つまり、あるクライアントのIDが他のクライアントより大きい場合は、後の時間に確立されたことを意味します。

クライアントのブロックとクライアント接続の終了

レプリケーションシステムは通常、同期型または非同期型として説明されます。同期型のレプリケーションでは、クライアントがデータを追加または変更する際には、変更が確定されたことを示すために、一定数のレプリカから何らかの確認を受け取る必要があります。これにより、ノード間でのデータの競合を防ぐのに役立ちますが、一定数のレプリカからの応答を待たなければ次の操作を実行することができないため、レイテンシのコストがかかります。

非同期レプリケーションでは、データがローカルストレージに書き込まれるとすぐに操作が完了したことをクライアントに確認させます。しかし、レプリカが実際にデータを書き込むまでには遅延が発生することがあります。もしレプリカのうちの1つが変更を書き込む前に故障した場合、その書き込みは永久に失われます。そのため、非同期レプリケーションは、クライアントがレプリカを待つことによる遅延なしで操作を続けることができますが、ノード間でのデータの競合を引き起こし、データベース管理者が競合を解決するために追加の作業が必要になることがあります。

パフォーマンスと低遅延に重点を置いているため、Redisはデフォルトで非同期レプリケーションを実装しています。ただし、waitコマンドを使用することで同期レプリケーションをシミュレートすることもできます。waitコマンドは、指定した時間(ミリ秒単位)だけ現在のクライアント接続をブロックし、以前の書き込みコマンドが指定した数のレプリカに正常に転送・受け入れられるまで待機します。このコマンドの構文は以下のようになります。

  1. wait number_of_replicas number_of_milliseconds

 

たとえば、前の書き込みが少なくとも3つのレプリカで30ミリ秒のタイムアウトまで登録されるまで、クライアント接続をブロックしたい場合は、以下のように待機の構文を記述します。

  1. wait 3 30

 

書き込みコマンドに対して、レプリカのうち認識を行った数を表す整数値を返すウェイトコマンドです。すべてのレプリカが認識しなかった場合でも、その旨を返します。

Output

2

以前にブロックされたクライアント接続を解除するために、wait、brpop、またはxreadコマンドから、以下の構文を使用して、クライアントのアンブロックコマンドを実行することができます。

  1. client unblock client_id

 

Redisサーバーに接続しているすべてのクライアントを一時的に停止するには、クライアントポーズコマンドを使用することができます。これは、Redisのセットアップを制御された方法で変更する必要がある場合に便利です。例えば、レプリカのうちの1つをプライマリインスタンスに昇格する場合、事前にすべてのクライアントを一時停止しておき、レプリカを昇格させても、プロセス中に書き込み操作を失うことなく、クライアントが新しいプライマリに接続することができます。

クライアントの一時停止コマンドを使用するには、クライアントを一時停止する時間(ミリ秒単位)を指定する必要があります。以下の例では、全てのクライアントを1秒間一時停止させます。

  1. client pause 1000

 

クライアントキル構文を使用すると、さまざまなフィルタに基づいて単一の接続または特定の接続のセットを閉じることができます。この構文は以下のように記述されます。

  1. client kill filter_1 value_1 ... filter_n value_n

 

以下のフィルターが利用可能です。

  • addr: allows you to close a client connection from a specified IP address and port
  • client-id: allows you to close a client connection based on its unique ID field
  • type: closes every client of a given type, which can be either normal, master, replica, or pubsub
  • skipme: the value options for this filter are yes and no:if no is specified, the client calling the client kill command will not get skipped and will be killed if the other filters apply to it
    if yes is specified, the client running the command will be skipped and the kill command will have no effect on the client. skipme is always yes by default

結論

このガイドでは、Redisのクライアントやレプリカを管理するために使用されるいくつかのコマンドについて詳しく説明しています。もし他の関連するコマンドや引数、手順についてこのガイドで学びたいことや質問があれば、コメントでお知らせください。

Redisコマンドに関する詳細な情報は、Redisデータベースの管理方法に関するチュートリアルシリーズをご覧ください。

コメントを残す 0

Your email address will not be published. Required fields are marked *