web-dev-qa-db-ja.com

Redisマスター/スレーブレプリケーション-単一障害点

ゼロのダウンタイムでRedisの新しいバージョンにどのようにアップグレードしますか? Redisスレーブは読み取り専用であるため、マスターを停止する必要があり、DBのリロードを待っている間、サイトは45秒以上読み取り専用になるようです。

これを回避する方法はありますか?

37
nornagon

ノードをオフラインにするとき、SLAVEOFコマンドを使用してスレーブをマスターにプロモートし、オンラインに戻すとスレーブとして設定し、オンラインノードからすべてのデータをコピーします。

また、クライアントが変更/欠落したマスターノードを適切に処理できることを確認する必要があります。

本当に空想を得たい場合は、マスターへの書き込みエラーを検出した場合、スレーブを昇格するようにクライアントを設定できます。

22
Tom Clarkson

Redisチームにはこれに関する非常に優れたドキュメントがあります

コアステップ:

  • 新しいRedisインスタンスを現在のRedisインスタンスのスレーブとしてセットアップします。そのためには、別のサーバー、またはRedisの2つのインスタンスを同時に実行し続けるのに十分なRAMを持つサーバーが必要です。
  • 単一のサーバーを使用する場合は、スレーブがマスターインスタンスとは異なるポートで起動されていることを確認してください。そうでない場合、スレーブはまったく起動できません。
  • レプリケーションの初期同期が完了するのを待ちます(スレーブログファイルを確認します)。
  • INFOを使用して、マスターとスレーブに同じ数のキーがあることを確認してください。 redis-cliで、スレーブが希望どおりに動作しており、コマンドに応答していることを確認します。
  • 新しいインスタンス(つまり、スレーブ)を使用するために、すべてのクライアントを構成します。
  • マスターがクエリを受信して​​いないことを確認したら(MONITORコマンドで確認できます)、SLAVEOF NO ONEコマンドを使用してマスターにスレーブを選択し、マスターをシャットダウンします。

完全なドキュメント:

ダウンタイムなしでRedisインスタンスをアップグレードまたは再起動する

29
kaji

これを行うためにRedis Sentinelを使用できます。センチネルは自動的にスレーブを新しいマスターとして昇格させます。詳細はこちらをご覧ください http://redis.io/topics/sentinel

Sentinelはredisサーバーの管理に使用されるシステムであり、redisマスターとスレーブを継続的に監視します。マスターがダウンすると、スレーブをマスターに自動的に昇格させます。古いマスターが起動すると、新しいマスターのスレーブとして作成されます。

ここでは、ダウンタイムがないか、設定ファイルの手動設定が必要です。上記のリンクにアクセスして、Redisサーバーのセンチネルを構成する方法を確認できます。

10
Abhi

スレーブに書き込むには、次の設定を確認して設定する必要がある場合があります。 (「デフォルトでは、Redis 2.6はスレーブは読み取り専用です」)

redis-cli config set slave-read-only no

-例

-bash-4.1$ redis-cli info
 Server
redis_version:2.6.9

-bash-4.1$ redis-cli slaveof admin2.mypersonalsite.com 6379
OK

-bash-4.1$ redis-cli set temp 42
(error) READONLY You can't write against a read only slave.

-bash-4.1$ redis-cli slaveof no one
OK

-bash-4.1$ redis-cli set temp 42
OK

-bash-4.1$ redis-cli get temp
"42"


-bash-4.1$ redis-cli config set slave-read-only no
OK

-bash-4.1$ redis-cli slaveof admin2.mypersonalsite.com 6379
OK

-bash-4.1$ redis-cli set temp 42
OK

-bash-4.1$ redis-cli get temp
"42"
6
Ed J