3

我们希望我们的 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功能“破解它” ioredis,但即使是没有任何功能的简单连接和一个 - 主要端点 - 失败ClusterAllFailedError: Failed to refresh slots cache. (启用阅读器端点 - 集群模式必须关闭)

4

1 回答 1

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,它好多了,可以推荐它。此外,ioredisnpm 模块能够无缝地使用它(您无需配置任何东西,您只需将配置端点放在那里,即 AWS 提供的端点,仅此而已)。

这是我们的配置

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

scaleReads 的选项是

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

“all”:随机向master发送写查询,向master或slave发送读查询。“slave”:向主服务器发送写查询,向从服务器发送读查询。

https://github.com/luin/ioredis

于 2021-01-08T16:56:07.260 回答