2017-03-15 7 views
0

は私が持っているこのredis replicationsentinel建築家と:Redis sentinelがマスターに接続していません:エラー:READONLY読み取り専用スレーブに対して書き込みできませんか?

5サーバ:.1.2.3.4.5

  • .1:アプリは、Redisのマスターは、R​​edisのは
  • .2をセンチネルnodejs:nodejsアプリを、 redisスレーブ
  • .3:nodejs app、redis slave
  • .4:Redisのは
  • .5をセンチネル:Redisのは予想通りフェールオーバーを処理

センチネルセンチネル。 redis-cli -h x.y.z.5 -p 26379 sentinel get-master-addr-by-name mymasterは常に.1サーバーを返します。このレプリケーション(私はioredisを使用)に接続する

マイコード:次に

let sentinels = [ 
    { host: process.env.REDIS_SENTINEL_1, port: process.env.REDIS_PORT }, 
    { host: process.env.REDIS_SENTINEL_2, port: process.env.REDIS_PORT }, 
    { host: process.env.REDIS_SENTINEL_3, port: process.env.REDIS_PORT } 
] 
store = new Redis({ 
    name: 'mymaster', 
    sentinels: sentinels 
}) 
store.on('ready',() => { 
    store.set('foo', new Date()) 
    store.get('foo', function (err, result) { 
    console.log('redis: get foo: ', result) 
    }); 
}); 

.1 nodejsは、[OK]を実行し、APPが、.2.3で、エラーは、このログで発生します。

events.js:161 
     throw er; // Unhandled 'error' event 
    ^

Error: READONLY You can't write against a read only slave. 

P/s:私のredisサーバーはサーバーIPと127.0.0.1の両方にバインドされています。 127.0.0.1せずに、私はこのエラーを満たし、ので:

Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379 

そうに、私は私のアプリがsentinel経由redis serverに接続されていないが、それはlocalhostに直接接続し、推測します。

すべてのヘルプはappriciateです!

アップデート:私はDEBUG=ioredis:*の電源を入れたときにログインします。

2|MyApp  | Wed, 15 Mar 2017 12:58:42 GMT ioredis:redis status[x.y.z.5:26379]: connecting -> connect 
2|MyApp  | Wed, 15 Mar 2017 12:58:42 GMT ioredis:redis status[x.y.z.5:26379]: connect -> ready 
2|MyApp  | Wed, 15 Mar 2017 12:58:42 GMT ioredis:connection send 1 commands in offline queue 
2|MyApp  | Wed, 15 Mar 2017 12:58:42 GMT ioredis:redis write command[0] -> sentinel(get-master-addr-by-name,mymaster) 
2|MyApp  | events.js:161 
2|MyApp  |  throw er; // Unhandled 'error' event 
2|MyApp  |  ^
2|MyApp  | Error: READONLY You can't write against a read only slave. 
2|MyApp  |  at JavascriptReplyParser._parseResult (/home/demo/demo_api/source/node_modules/redis/lib/parsers/javascript.js:43:16) 
2|MyApp  |  at JavascriptReplyParser.try_parsing (/home/demo/demo_api/source/node_modules/redis/lib/parsers/javascript.js:114:21) 
2|MyApp  |  at JavascriptReplyParser.run (/home/demo/demo_api/source/node_modules/redis/lib/parsers/javascript.js:126:22) 
2|MyApp  |  at JavascriptReplyParser.execute (/home/demo/demo_api/source/node_modules/redis/lib/parsers/javascript.js:107:10) 
2|MyApp  |  at Socket.<anonymous> (/home/demo/demo_api/source/node_modules/redis/index.js:131:27) 
2|MyApp  |  at emitOne (events.js:96:13) 
2|MyApp  |  at Socket.emit (events.js:189:7) 
2|MyApp  |  at readableAddChunk (_stream_readable.js:176:18) 
2|MyApp  |  at Socket.Readable.push (_stream_readable.js:134:10) 
2|MyApp  |  at TCP.onread (net.js:551:20) 
2|MyApp  | [nodemon] app crashed - waiting for file changes before starting... 
2|MyApp  | sentinel production 
2|MyApp  | Wed, 15 Mar 2017 12:58:43 GMT ioredis:redis status[localhost:6379]: [empty] -> connecting 
2|MyApp  | Wed, 15 Mar 2017 12:58:43 GMT ioredis:redis status[x.y.z.5:26379]: [empty] -> connecting 
2|MyApp  | Wed, 15 Mar 2017 12:58:43 GMT ioredis:redis queue command[0] -> sentinel(get-master-addr-by-name,mymaster) 
2|MyApp  | sentinel production 
2|MyApp  | Wed, 15 Mar 2017 12:58:43 GMT ioredis:redis status[localhost:6379]: [empty] -> connecting 
2|MyApp  | Wed, 15 Mar 2017 12:58:43 GMT ioredis:redis status[x.y.z.5:26379]: [empty] -> connecting 
2|MyApp  | Wed, 15 Mar 2017 12:58:43 GMT ioredis:redis queue command[0] -> sentinel(get-master-addr-by-name,mymaster) 

アップデート2:1つの以上の事は、私はproduction環境と私のローカルマシンでアプリケーションを実行し、すべてが魔法のように動作します!

答えて

0

"localhost"に接続すると、.2と.3はローカルの読み取り専用保存と通信しています。 「センチネル経由で接続しない」。あなたはセンチネルに接続し、マスターIPを取得してから、そのIPとポートに接続します。何らかの理由で、あなたがlocalhostに接続しようとしていますが、IPがsentinelによって報告されているわけではありません。なぜ、あなたの質問に情報がないので、私は言うことができません。

センチネルは "localhost"ではなくIPアドレスを返します。したがって、センチネルからの戻り値を使用せず、 "localhost"を使用するようにコードされているため、報告する動作が生成されます。それを見つけて修正する必要があります。

+0

あなたのコメントに感謝、私は上記示したようsentinel'-もそう、しかし、私のコードでは、私は '経由で接続しようとしたと思います。私はなぜそれがlocalhostに接続しようとしているのかわかりません??? – Justin

+0

更新2:もう1つ、私はローカルマシンで 'production'環境でアプリケーションを実行し、すべてがチャームのように動作します! – Justin

0

ええ、最終的に見つかりました。

古いコードでredisモジュールを使用し、localhostに直接接続しようとするのは間違いです。

インスタンスをioredis、それが魅力のように動作するように、それを交換してください:)

関連する問題