AWS Redis Reader 端点和 ioredis

AWS Redis Reader endpoint and ioredis

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

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

但是,我没有看到 ioredis 有任何简单或自动化的方法来使用该方法,我可以在其中设置哪个端点用于写入,哪个端点用于读取。即使在这里我也可以看到最后推荐的方法是 "manually split": https://github.com/luin/ioredis/issues/387

您是否知道任何现有的解决方案或好的方法,我可以设置哪些端点将用于写入,哪些端点将用于读取?

现在对我来说最直接的是某种 "proxy" 层,我将在其中创建两个 Redis 实例,并将所有写入发送到主要端点,所有读取发送到 Reader端点。但是我更喜欢一些更好的(或经过良好测试的)方法。

PS:我尝试 "hack it" 具有 ioredisCluster 功能,但即使是没有任何功能的简单连接和一个 - 主要端点 - 也因 ClusterAllFailedError: Failed to refresh slots cache. (要启用 Reader 端点 - 集群模式必须关闭)

请注意它是如何结束的

我们有两个实例(如果 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 is "master" by default, which means ioredis will never send any queries to slaves. There are other three available options:

"all": Send write queries to masters and read queries to masters or slaves randomly. "slave": Send write queries to masters and read queries to slaves.

https://github.com/luin/ioredis