1

サーバーで 3 つの redis-server インスタンスを実行しています。インスタンスには異なる構成ファイルと db ファイルがあります。例: redis1 はデータベースの場所を /var/lib/redis_1 として設定し、redis2 はデータベースの場所を /var/lib/redis_2 として設定します。私はtemproxy構成を持っています:

アルファ:                                                                                                                                      
  リッスン: 0.0.0.0:9999
  レディス: 真
  ハッシュ: fnv1a_64
  配給:ケタマ
  auto_eject_hosts: 真
  サーバー再試行タイムアウト: 2000
  server_failure_limit: 2
  サーバー:
   - 127.0.0.1:6381:1
   - 127.0.0.1:6382:1
   - 127.0.0.1:6383:1

3 つの redis インスタンスを起動し、データの「名前」を redis-cli で別々の値として設定しました。例: 最初のサーバーに「6381」、2 番目のサーバーに「6382」という名前を設定しました。db ファイル dump.rdb を開き、3 つのデータ値を確認してから、temproxy を開始しました。

temproxy を redis-cli に接続し、キー「name」を読み取ると、常に「6382」が返されます。別のクライアントを使用して接続しても、値は同じです。Redis インスタンスで値を直接変更するか、temproxy インスタンスに対して他の操作を行うと、変更が 2 番目の db ファイル /var/lib/redis_2/dump.rdb にのみ更新されることがわかりました。

temproxy が 3 つの redis-server インスタンスで機能しないのはなぜですか? 私の設定に何か問題がありますか?

4

1 に答える 1

7

temproxy の仕組みを誤解していると思います。テストで何が起こっているのか、temproxy が各インスタンスに接続していることを検証する方法について説明します。

Twemproxy はハッシュを使用してキー空間を分割し、構成した 3 つのインスタンスに分割します。これは、'name' のキーがただ 1 つのサーバーにマップされることを意味します。Twoemproxy は、ストライピングを使用してすべてのノードにデータを配置するのではなく、1 つのノードだけにデータを配置します。

あなたの場合、'name' はポート 6382 で実行されているインスタンスにマップされます。 name' で、保存した値を直接返します。

temproxy が各インスタンスに接続していることを検証するには、キーの範囲を設定してから、各 Redis インスタンスに直接クエリを実行できます。ただし、直接クエリを実行する場合は、info コマンドを使用して接続と操作の統計を確認できます。

  1. 接続が開いたままになるように、redis-cli を使用してそれぞれに直接接続します。
  2. temproxy を開始
  3. さまざまなキー名を使用して一連の get を発行する
  4. 接続統計で接続数の増加を確認します

temproxy が起動時に Redis インスタンスに接続するかどうかは、現時点では思い出せません。そうだと思います。その場合は、手順 2 の後で接続統計を確認できます。まずこれを試してみます。

要約すると、それはあなたの構成ではなく、何が起こるべきかについてのあなたの理解です。上記の説明で解決しない場合はお知らせください。回答を明確化/拡大します。

乾杯

于 2013-06-09T18:09:26.597 に答える