1

次の Redis/Sentinel 構成があります。

  • Redis マスターA+Nスレーブ
  • Mセンチネルズ ウォッチングA, 名前付きmasterA
  • クライアント アプリケーションは、センチネルに のクエリを実行しmasterA、次にクエリと変更を行いますA

Aでは時代遅れであり、(最小限のダウンタイム/データ損失で) と呼ばれる新しい Redis マスターに置き換えたいと考えていBます。操作の最後に、これが必要です:

  • Redis マスターB+Nスレーブ
  • クライアント アプリケーションのクエリと変更B

次のように進めることができました:

  1. センチネルBに という名前の監視を開始させるmasterB
  2. の各スレーブをAのスレーブにするB

masterAそこから、センチネルと話すときにクライアントアプリケーションがまだ要求しているため、私は立ち往生しています。2 つの質問があります。

  • センチネルBとして知られるようになり、したがってクライアントアプリケーションでもマスター名を切り替える方法はありますか?masterA
  • 古いマスターから新しいマスターへの切り替えを処理するようにクライアント アプリケーション コードを変更した方がよいでしょうか?
4

1 に答える 1

1

目的を達成する 1 つの方法は、「別のレベルの間接化を追加する」という古くからの解決策に従うことです。

特に効果的な方法は、クライアントに TCP プロキシ (HAProxy など) と通信させ、現在のマスターにトラフィックを渡すようにすることです。

TCP プロキシの同期を維持するには、HAProxy Sentinel を認識させるhttp://blog.haproxy.com/2014/01/02/haproxy-advanced-redis-health-check/と同様のことを行うことができます。

このソリューションの主な利点は、クライアントが非常にシンプルになることです。クライアントは 1 つの場所にのみ接続し、トラフィックは常に正しい Redis インスタンスに転送されます。

このソリューションの 1 つの問題は、HAProxy の構成 DSL には、Redis サーバーが再起動し、センチネルがそれをスレーブにする前に最初にマスターとしてアナウンスする期間を処理する機能がないことです。これにより、書き込みの欠落や一貫性のない状態が発生しますが、アプリケーションによっては問題ない場合もあります。

これに対処するために、HAProxy を現在のマスターと同期させる「よりスマートな」デーモンの開発を開始しました。私の解決策はhttps://github.com/mdevilliers/redishappyにあります。

于 2014-12-19T09:17:44.497 に答える