Jus*_*tin 8 node.js redis-sentinel ioredis
我redis replication和sentinel建筑师有这个:
5个服务器:.1、.2、.3和.4.5
.1:nodejs应用程序、redis主控、redis哨兵.2:nodejs应用程序,redis从属.3:nodejs应用程序,redis从属.4:redis哨兵.5:redis哨兵Sentinel 按预期处理故障转移。
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)
});
});
Run Code Online (Sandbox Code Playgroud)
然后,.1nodejs 应用程序运行正常,但是在.2和中.3,出现错误并显示以下日志:
events.js:161
throw er; // Unhandled 'error' event
^
Error: READONLY You can't write against a read only slave.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以,我想,我的应用程序没有连接到redis servervia sentinel,但它直接连接到localhost。
任何帮助都是值得的!
更新:当我打开时记录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)
Run Code Online (Sandbox Code Playgroud)
更新 2:还有一件事,我在本地计算机上运行该应用程序,production环境一切正常!
Moh*_*ufi 13
如果出现上述错误,说明当前Redis服务是只读的,没有写权限。估计该服务是作为从库使用的。
解决方案1
打开Redis服务对应的配置文件,将属性slave-read-only的值修改为no,使其可以写入。
解决方案2
或者更快的方法是通过运行此命令
redis-cli -h 127.0.0.1 -p 6379 slaveof no one
Run Code Online (Sandbox Code Playgroud)
命令停止当前Redis服务接收其他Redis服务的同步,同时将自身升级为主数据库。
通过连接到“localhost”,.2 和 .3 正在与其本地只读保存进行通信。您不“通过哨兵连接”。您连接到哨兵,获取主 IP,然后连接到该 IP 和端口。由于某种原因,您尝试连接到本地主机,而不是哨兵报告的 IP。至于为什么,我不能说,因为你的问题中没有提供信息。
Sentinel 返回一个 IP 地址,而不是“localhost”,因此您没有使用哨兵的返回结果,而是在某个地方编码为使用“localhost”,这将产生您报告的行为。您需要找到并修复它。
| 归档时间: |
|
| 查看次数: |
46680 次 |
| 最近记录: |