如何简单地处理(非常)短的mysql复制滞后

时间:2012-02-03 08:51:31

标签: mysql replication lag

我有一个运行MySQL 5.5(1个主服务器和1个服务器)的应用程序(php)

我用来在主/从上发送读/写。

当我创建一个新记录(用户或类似的东西)时,我将它写在主服务器上,当我重新加载页面时,我从服务器上加载它。

示例:

...
if ($_GET['id'])
{
    #Load user
    $user = $sql->load('user', $_GET['id']);

    if ($user == false)
    {
        throw exception('User not found');
    }
}
else if ($_POST['create]')
{
    #Create a new user

    $user_id = $sql->insert('user', $_POST);
    $mvc->reload('?id=' . $user_id);
    exit();
}
...

但是当主人真的很高效(快速插入)并且复制不是(滞后= 0.3 - 1秒)时,重新加载将无效......

处理该问题的最佳做法是什么

一些解决方案:

  • 减少滞后的数据库优化(非常困难)
  • 睡觉前(1)在阅读之前或写完之后......不是很优雅

1 个答案:

答案 0 :(得分:0)

首先,您需要定义您的应用程序是否可以使用延迟。

如果没有,那么您需要确保要获取的数据已在slave上可用。例如,从slave获取最后一个id并将其与你要获取的id进行比较;或者首先尝试slave,如果row不存在,则回退到master(但是这会使master对请求新数据超载)。

通常,Web应用程序可以使用陈旧数据。如果其他访问者在10秒后看到新帖子就没有问题。但正如你所提到的,如果帖子的作者没有立即看到它,那就不好了。因此,您可以根据获取的数据/原因采取不同的行动(例如,缓存有关会话中最近发布的帖子的信息,在这种情况下从主服务器获取)