我们希望我们的 Redis 更具可扩展性,并且希望能够添加更多的读取实例。
我正在尝试使用这个新的读取器端点: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 实例,并将所有写入发送到主终结点,将所有读取发送到读取器终结点。但是,我更喜欢一些更好(或经过良好测试(的方法。
PS:我试图用ioredis
的功能"破解它"Cluster
但即使是没有任何功能的简单连接和一个 - 主端品 - 也失败了ClusterAllFailedError: Failed to refresh slots cache.
(若要启用读取器终结点 - 群集模式必须关闭(
只需注意它是如何结束的
我们有两个实例(如果 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