I have this redis replication with sentinel architect:
5 servers: .1, .2, .3, .4 and .5
.1: nodejs app, redis master, redis sentinel.2: nodejs app, redis slave.3: nodejs app, redis slave.4: redis sentinel.5: redis sentinel
Sentinel handle failover as expected. redis-cli -h x.y.z.5 -p 26379 sentinel get-master-addr-by-name mymaster is always return .1 server.
My code to connect to this replication (I use 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)
});
});
Then, .1 nodejs app run ok, but in .2 and .3, the error occurs with this log:
events.js:161
throw er; // Unhandled 'error' event
^
Error: READONLY You can't write against a read only slave.
P/s: my redis servers are binding in both server IP and 127.0.0.1. Because, without 127.0.0.1, I meet this error:
Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
So, I guess that, my app isn't connect to redis server via sentinel, but it connect directly with localhost.
Any help are appriciate!
via Justin
No comments:
Post a Comment