我有一个数据库,存储我的应用程序的用户。 当新用户注册时,会为该用户在数据库中插入一条logging。 我有一个复制的版本(奴隶)这个数据库(现在使用mysql)。
我关心的是这种情况:
步骤1:用户注册并将用户logging插入到数据库中
第2步:用户然后尝试login,login过程查询用户的数据库。 但是,此查询命中从属数据库,但用户logging尚未复制到从属中,并返回用户不存在的错误。
这是一个非常简单的例子,但我可以看到它可以应用于很多情况。 有没有configuration复制数据库来帮助防止这种情况的策略?
这是一个真正的问题,几乎在您开始尝试写入主服务器并从服务器读取时就会发生。 尽pipe用户注册和用户login之间的时间间隔可能足够长,不必担心这个问题,但用户需要做的大部分事情都会导致这个问题。
诸如创build论坛或博客post之类的操作通常会导致redirect,将他们带回到可以查看他们刚发布的post的页面。 如果这个页面从从站读取,那么在写入和读取之间只有几分之一秒的时间,这往往不足以允许复制。
我曾经使用过三种解决scheme,一种我没有亲自使用。
scheme3对我来说是过去最成功的,也是我将来select的select。
不是(我知道的); 你将不得不有一个重大的滞后(或有一个严重的错误,导致从属不同步)用户login和潜在命中从属数据库比从属数据库可以复制服务器更快。
我能想到的唯一select就是在应用程序级别上有一些东西,如果从服务器找不到logging,就会命中主服务器。 但是这相当于能够首先查询奴隶的目的。
在运行查询之前,请检查数据库是否为slave,如果是,请检查从属线程是否正在运行,如果是,请检查Seconds_Behind_Master 。 全部在SHOW SLAVE STATUS; 。 如果它没有运行,或者如果有明显的延迟,那就去查询master。