AWS Redis Reader终端节点和ioredis

时间:2020-02-06 12:28:56

标签: node.js amazon-web-services redis amazon-elasticache ioredis

我们希望Redis更具可扩展性,并且希望能够添加更多读取实例。

我正在尝试使用以下新的Reader终结点:https://aws.amazon.com/about-aws/whats-new/2019/06/amazon-elasticache-launches-reader-endpoint-for-redis

但是,对于ioredis,我看不到任何简单或自动化的方法来使用该方法,因此我可以设置哪个端点用于写操作,哪个端点用于读操作。即使在这里,我也可以看到建议的最终方法是“手动拆分”:https://github.com/luin/ioredis/issues/387

您知道任何现有的解决方案或好的方法,可以在其中设置哪些端点用于写操作,哪些端点用于读取吗?

对我而言,目前最直接的是某种“代理”层,在其中我将创建两个Redis实例,并将所有写入发送到主端点,并将所有读取发送到Reader端点。但是,我更喜欢一些更好(或经过良好测试)的方法。

PS:我尝试使用Cluster的{​​{1}}功能来“破解”,但是即使是没有任何功能和简单连接的简单连接-主端点-也会因ioredis而失败 (要启用Reader端点-群集模式必须关闭)

1 个答案:

答案 0 :(得分:1)

请注意它是如何结束的

我们有两个实例(或者如果 URL 相同则重用同一个实例)

redis = new Redis(RKT_REDIS_URL.href, redisOptions)
if (RKT_REDIS_READER_URL.href === RKT_REDIS_URL.href) {
    redisro = redis
} else {
    redisro = new Redis(RKT_REDIS_READER_URL.href, redisOptions)
}

然后首先用于写入,其他用于读取。

 redis.hmset(key, update)
 redisro.hmget(key, field)

不过一段时间后我们采用了集群redis,效果更好,可以推荐。此外,ioredis npm 模块能够无缝地使用它(您不必配置任何东西,您只需将配置端点放在那里,即 AWS 提供的,仅此而已)。

这是我们的配置

redisOptions.scaleReads = 'master'
redis = new Redis.Cluster([RKT_REDIS_URL.href], redisOptions)

scaleReads 的选项是

<块引用>

scaleReads 默认为“master”,这意味着 ioredis 永远不会发送 对奴隶的任何询问。还有其他三个可用选项:

"all": 向 masters 发送写查询和向 masters 读查询或 奴隶随机。 “slave”:向masters发送写查询并读取 向奴隶查询。

https://github.com/luin/ioredis