【问题标题】:Redis Distributed Transaction using Lua Script使用 Lua 脚本的 Redis 分布式事务
【发布时间】:2017-04-21 22:36:32
【问题描述】:
我们正在尝试设计一个跨多个 Redis 数据库的分布式事务。是否可以使用 Lua 脚本来实现这一点?我们不想通过 2 阶段提交来实现,因为这会导致数据丢失。我们不能承受数据丢失。
示例场景:我有 3 个 Redis 数据库。我们需要更新所有 3 个。更新可以是顺序的,但我们希望只有在所有三个都成功时才能成功结束事务。如果其中任何一个失败,我们应该能够回滚所有这些。
【问题讨论】:
标签:
lua
redis
distributed-transactions
【解决方案1】:
不,仅依靠 Lua 脚本来实现 Redis 实例之间的分布式事务是不可能的,因为 Redis 不公开用于网络调用的库。但是,您可以使用 Lua 脚本作为构建分布式事务的解决方案的一部分(我使用 Lua 脚本在 Redis 服务器上实现 Paxos)。
顺便说一句,在您的问题中,对 2 阶段提交导致数据丢失存在误解。这不可能发生。 2PC的教科书实现可能会导致系统阻塞但不会导致数据丢失的情况。但即使是阻塞也不是问题,因为 2PC 有非阻塞版本,例如 Google 的 Percolator 论文中的那个。
我创建了a visualization of non-blocking 2PC。它可以帮助您了解它的运动部件。