这是一个难题,并且有很多潜在的解决方案。一种可能的解决方案是看看facebook 做了什么,
TLDR - 读取请求被路由到只读副本,但是如果您进行写入,那么在接下来的 20 秒内,您的所有读取都将发送到可写主机。
我们必须解决的另一个主要问题是只有我们在加利福尼亚的主数据库才能接受写操作。这一事实意味着我们需要避免提供从弗吉尼亚进行数据库写入的页面,因为每个页面都必须跨越国家到我们在加利福尼亚的主数据库。幸运的是,我们最常访问的页面(主页、个人资料、照片页面)在正常操作下不会进行任何写入。因此,问题归结为,当用户请求页面时,我们如何确定发送到弗吉尼亚是否“安全”或是否必须路由到加利福尼亚?
这个问题原来有一个相对简单的答案。用户对 Facebook 的请求命中的第一批服务器之一称为负载均衡器。这台机器的主要职责是选择一个 Web 服务器来处理请求,但它也有许多其他用途:防止拒绝服务攻击和多路复用用户连接等等。此负载均衡器能够在第 7 层模式下运行,它可以检查用户请求的 URI 并根据该信息做出路由决策。这个特性意味着很容易告诉负载均衡器我们的“安全”页面,它可以根据页面名称和用户的位置决定是将请求发送到弗吉尼亚还是加利福尼亚。
然而,这个问题还有另一个问题。假设您去editprofile.php 更改您的家乡。此页面未标记为安全,因此它会被路由到加利福尼亚,然后您进行更改。然后你去查看你的个人资料,因为它是一个安全的页面,我们把你送到弗吉尼亚。但是,由于我们前面提到的复制滞后,您可能看不到刚刚所做的更改!这种体验对于用户来说是非常混乱的,并且还会导致重复发布。每当您向我们的数据库写入内容时,我们通过在您的浏览器中设置一个带有当前时间的 cookie 来解决这个问题。负载均衡器还会查找该 cookie,如果它注意到您在 20 秒内写了一些东西,它将无条件地将您发送到加利福尼亚。然后当 20 秒过去了,我们'