AWS Redis读取端点和ioredis

3
我们希望让我们的 Redis 更具可扩展性,并且能够添加更多的读实例。
我正在尝试使用这个新的 Reader endpoint: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:我尝试使用ioredisCluster功能进行“黑客攻击”,但是即使没有任何功能的简单连接和一个主要端点也会失败,ClusterAllFailedError:Failed to refresh slots cache。(为了启用 Reader endpoint,集群模式必须关闭)。
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,它更加优秀,可以推荐。此外,ioredis npm模块可以无缝地使用它(您不需要配置任何内容,只需将配置端点放在那里即可,例如AWS提供的)。这是我们的配置。
redisOptions.scaleReads = 'master'
redis = new Redis.Cluster([RKT_REDIS_URL.href], redisOptions)

scaleReads的选项包括:

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

“all”:将写查询发送到主节点,并随机将读查询发送到主节点或从节点。“slave”:将写查询发送到主节点,并将读查询发送到从节点。

https://github.com/luin/ioredis


根据您的配置,您的主要读取客户端是来自读取端点的连接。由于您正在使用'master'的scaleReads,如果您的读取端点面临过多请求,它会回退到主节点。如果我推断正确,这就是您所期望的?此外,对于集群方法,您根本不需要设置读取端点吗? - Sowmen Rahman
@SowmenRahman - 已经快两年了,我已经不在那家公司了。如果我没记错的话,对于集群模式,你只需要一个端点,ioredis会自动知道如何与主/从节点通信。此外,我们最终可能会将.scaleReads ='slave'作为负载均衡的分配方式。 - libik
使用Redis集群,您根本不需要redisro - libik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接