は私が持っているこのredis replication
sentinel
建築家と:Redis sentinelがマスターに接続していません:エラー:READONLY読み取り専用スレーブに対して書き込みできませんか?
5サーバ:.1
、.2
、.3
、.4
と.5
.1
:アプリは、Redisのマスターは、Redisのは.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
環境と私のローカルマシンでアプリケーションを実行し、すべてが魔法のように動作します!
あなたのコメントに感謝、私は上記示したようsentinel'-もそう、しかし、私のコードでは、私は '経由で接続しようとしたと思います。私はなぜそれがlocalhostに接続しようとしているのかわかりません??? – Justin
更新2:もう1つ、私はローカルマシンで 'production'環境でアプリケーションを実行し、すべてがチャームのように動作します! – Justin