数据库复制用于新用户注册

我有一个数据库,存储我的应用程序的用户。 当新用户注册时,会为该用户在数据库中插入一条logging。 我有一个复制的版本(奴隶)这个数据库(现在使用mysql)。

我关心的是这种情况:

步骤1:用户注册并将用户logging插入到数据库中

第2步:用户然后尝试login,login过程查询用户的数据库。 但是,此查询命中从属数据库,但用户logging尚未复制到从属中,并返回用户不存在的错误。

这是一个非常简单的例子,但我可以看到它可以应用于很多情况。 有没有configuration复制数据库来帮助防止这种情况的策略?

这是一个真正的问题,几乎在您开始尝试写入主服务器并从服务器读取时就会发生。 尽pipe用户注册和用户login之间的时间间隔可能足够长,不必担心这个问题,但用户需要做的大部分事情都会导致这个问题。

诸如创build论坛或博客post之类的操作通常会导致redirect,将他们带回到可以查看他们刚发布的post的页面。 如果这个页面从从站读取,那么在写入和读取之间只有几分之一秒的时间,这往往不足以允许复制。

我曾经使用过三种解决scheme,一种我没有亲自使用。

  1. 监视从站上的复制延迟,如果滞后于主站,则将其从池中取出。 pipe理这个最可靠的方法是使用Percona工具包中的心跳工具。 这可能不会解决论坛post的问题。
  2. 坚持让主人查询某些类别的查询。 例如,成功后页面以及CMS或pipe理中心内的任何页面只能从主服务器进行查询。 这给主人带来了额外的负担。
  3. 使用caching。 像Memcached或类似的东西。 对这个问题敏感的代码应该同时写入memcached,并且应该先从那里读取。 从奴隶读取错过,这意味着仍然值得拥有一个。 您将不得不修改读取或写入应用程序的每个部分,但是如果您已经正确提取,这应该不是困难的。 你可以使用像mysql-proxy这样的东西实现,但我实际上不能推荐这个选项。
  4. 同步复制。 我不认为MySQL可以做到这一点,但他们有一个名为半同步复制来在下一个主要版本。 这个想法是,原来的写查询将不会返回,直到数据也被写入到从站。 这有一个缺点,使你的写查询需要更长的时间,当你的整个平台停下来的时候。

scheme3对我来说是过去最成功的,也是我将来select的select。

不是(我知道的); 你将不得不有一个重大的滞后(或有一个严重的错误,导致从属不同步)用户login和潜在命中从属数据库比从属数据库可以复制服务器更快。

我能想到的唯一select就是在应用程序级别上有一些东西,如果从服务器找不到logging,就会命中主服务器。 但是这相当于能够首先查询奴隶的目的。

在运行查询之前,请检查数据库是否为slave,如果是,请检查从属线程是否正在运行,如果是,请检查Seconds_Behind_Master 。 全部在SHOW SLAVE STATUS; 。 如果它没有运行,或者如果有明显的延迟,那就去查询master。