我有一个针对 MariaDB Galera 集群运行的 Laravel (Lumen 5.2) 项目。运行应用程序时,它似乎工作得很好。但是当我运行 PHPUnit 测试时,它们随机失败。
问题是我填充了数据库,然后尝试获取数据(id)以使用外键填充其他表。但是当尝试立即获取数据时,数据为空。
Laravel 数据库连接与 READ 用户和 WRITE 用户一起使用。(Laravel 在插入或读取时会自动使用正确的那个)。我认为这就是问题所在。当我只使用 WRITE 用户时,测试工作得很好。
SET SESSION wsrep_sync_wait = 1;
在SELECT将保证写入已经赶上之前。
虽然 Galera 是“同步的”,但并不完全是。保证将写入发送到所有其他节点,并且它们将在那里工作。但是,在“关键”读取的情况下,aSELECT可能会太快到达接收节点而无法看到写入。上面的设置解决了这个问题。
现在,让我们真正了解您应该如何实现,例如,一个带有 Galera 的网站。
COMMIT.SET。SELECT虽然等待复制可能会有轻微的延迟,但延迟通常非常接近于零。我建议您的测试实际上是压力测试,会欺骗性地说等待时间很高。也就是说,基准测试通常旨在找到“最差”,而不是“典型”。
写入和失败之间有多少延迟SELECT?也许只有 1ms。“用户”发布“博客”的速度有多快,然后到达下一页并发现它“丢失”?可能超过 100 毫秒。
您的压力测试发现了对 的需求SET,而不是Galera 已“损坏”。