4

我一直在寻找扩展 MySQL 的解决方案。除了添加 Memcached 层之外,经常出现的一个问题是读/写拆分——所有写入都转到主服务器,所有读取都转到一组负载平衡的从服务器。

这种方法明显提出的一个问题是“最终一致性”。当我在主服务器上运行写入时,复制到读取从服务器需要一定的时间。因此,如果我请求新创建的行,它可能不存在。

有谁知道处理这个问题的具体策略?我已经阅读了关于“阅读你所写的内容”能力的概念性部分解决方案。但是,是否有人对如何实现这样的解决方案有任何想法——无论是在概念上,还是特别是在 Spring/Hibernate 堆栈中?

4

1 回答 1

1

我没有这样做,但这是一个想法。您可以在每次读取查询之前连接到您的写入数据库上的内存缓存服务器。当您进行写入时,将某种键添加到您的内存缓存中,当您复制1时,删除该键。

当您执行 memcache 读取并且您正在读取单个记录时,如果找到记录的键,您应该只从 master 读取它。如果您要选择多条记录,则从从属设备中读取它们,然后根据内存缓存键查询每个找到的 ID。如果在 memcache 中找到任何记录,则仅从 master 数据库中重新读取这些记录。

您可能会发现在某些(大量写入的)用例中,这种策略会否定读/写拆分的好处。但我敢打赌,在大多数情况下,额外检查 memcache 和偶尔的 master 重读仍然值得。

1如果您使用标准复制并且无法跟踪特定记录是否已完全复制,只需为所有密钥添加时间戳,并在最坏情况延迟后删除/过期它们。例如,如果您的奴隶比您的主人落后两分钟,请忽略(并删除)任何超过两分钟的密钥,因为它们肯定会被复制。

话虽如此:不要忘记在很多情况下延迟是可以接受的。例如,如果您有一个用户更新其个人资料的网站,如果他们的更改在五分钟内没有完全传播,这在大多数情况下是可以的。关键是,imo,如果没有必要,不要过度设计某些东西以获得即时传播。

于 2011-11-22T15:38:32.223 回答