【发布时间】:2023-04-05 19:23:01
【问题描述】:
我有一个用于送餐的网络/移动应用。问题是,我的服务器对数据库执行的写入 比读取 多得多。现在我正在运行一个 PostgreSQL,问题是很多服务器请求发生在短时间内(大约中午和晚上),所以我需要各种实例(加上 S3 进行备份)才能实现写入吞吐量,我认为这不是什么好东西,因为事情正在扩展,这些 PG 实例看起来就像兔子在繁殖。
我的限制:
- 写入远多于读取
- 写入大约 25.000 个请求/秒,并且还在增长
- 在系统注册后(写入数据库)
- 最好不要运行服务而不是运行有故障的服务(为了一致性而牺牲可用性)
对我的生产服务器进行一些基准测试,Redis 仅用 1 台服务器就能够处理 1.5 倍的当前峰值,并且具有 List 结构,这对于管理订单队列非常有用。
我读到 Redis,开箱即用的 Sentinel/Cluster 无法提供强一致性,因此,为了实现这一点,我想到了做以下两件事之一:
- 使用配置了
Wait和appendfsync always策略的3 个实例(1 个主实例和2 个从属实例)设置Sentinel,并在Wait返回小于2 时签入客户端。这样,Sentinel 将负责复制和故障转移,在我的服务器的帮助下,它始终保持高度一致性。 - 第二个选项是拥有与
appendfsync always相同的 3 个实例,但只需通过我的应用程序服务器在这 3 个中应用软件 RAID 1,但这样,我必须在控制逻辑中考虑实现冗余和故障转移功能。问题是尝试在代理后面扩展我的应用程序(node.js)时,因为为了提供完全冗余,我必须管理每个 Redis 实例中的写入尝试,如果这个应用程序出现故障,另一个可能不知道这 3 个是否同步以及要同步的最新数据是什么。
在我看来,第二个选项似乎比第一个更强大,因为在这种情况下我只能松动 1 个服务器,而在第二个选项中我可以使用 3 个中的任何一个,前提是我保证一致性。
我错过了什么?有什么建议吗?
【问题讨论】:
标签: redis load-balancing redundancy