【问题标题】:How to achieve redundancy and failover strategy for Redis backed serverRedis后备服务器如何实现冗余和故障转移策略
【发布时间】:2023-04-05 19:23:01
【问题描述】:

我有一个用于送餐的网络/移动应用。问题是,我的服务器对数据库执行的写入读取 多得多。现在我正在运行一个 PostgreSQL,问题是很多服务器请求发生在短时间内(大约中午和晚上),所以我需要各种实例(加上 S3 进行备份)才能实现写入吞吐量,我认为这不是什么好东西,因为事情正在扩展,这些 PG 实例看起来就像兔子在繁殖。

我的限制:

  • 写入远多于读取
  • 写入大约 25.000 个请求/秒,并且还在增长
  • 在系统注册后(写入数据库)
  • 最好不要运行服务而不是运行有故障的服务(为了一致性而牺牲可用性)

对我的生产服务器进行一些基准测试,Redis 仅用 1 台服务器就能够处理 1.5 倍的当前峰值,并且具有 List 结构,这对于管理订单队列非常有用。

我读到 Redis,开箱即用的 Sentinel/Cluster 无法提供强一致性,因此,为了实现这一点,我想到了做以下两件事之一:

  1. 使用配置了Waitappendfsync always 策略的3 个实例(1 个主实例和2 个从属实例)设置Sentinel,并在Wait 返回小于2 时签入客户端。这样,Sentinel 将负责复制和故障转移,在我的服务器的帮助下,它始终保持高度一致性。
  2. 第二个选项是拥有与appendfsync always 相同的 3 个实例,但只需通过我的应用程序服务器在这 3 个中应用软件 RAID 1,但这样,我必须在控制逻辑中考虑实现冗余和故障转移功能。问题是尝试在代理后面扩展我的应用程序(node.js)时,因为为了提供完全冗余,我必须管理每个 Redis 实例中的写入尝试,如果这个应用程序出现故障,另一个可能不知道这 3 个是否同步以及要同步的最新数据是什么。

在我看来,第二个选项似乎比第一个更强大,因为在这种情况下我只能松动 1 个服务器,而在第二个选项中我可以使用 3 个中的任何一个,前提是我保证一致性。

我错过了什么?有什么建议吗?

【问题讨论】:

    标签: redis load-balancing redundancy


    【解决方案1】:

    写入比读取多得多 大约 25.000 次请求/秒的写入和增长

    你有没有看 Cassandra (https://cassandra.apache.org/),如果你不需要经常改变数据结构,它可能是你的好选择。

    我读到 Redis,带有 Sentinel/Cluster 的开箱即用无法提供强一致性

    是的,这是真的。

    如果您有 25.000 次写入/秒,WAITappendfsync always 不是好的选择。

    问候,

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2014-11-01
      • 1970-01-01
      • 2018-02-02
      • 2018-12-28
      相关资源
      最近更新 更多