Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Master-slave下一致性问题 #23

Closed
fengchen8086 opened this issue Mar 25, 2014 · 3 comments
Closed

Master-slave下一致性问题 #23

fengchen8086 opened this issue Mar 25, 2014 · 3 comments

Comments

@fengchen8086
Copy link

看redis的介绍,在m-s下存在一致性的问题,两个问题没有理清,希望能得到一些指导

  1. master-slave下,slave只读,是说client直接访问slave么,意即client既要知道master的地址,也要知道对应client的地址以区分读写操作?
  2. 如果对slave的读操作发生在【client的写操作已经从master返回】与【新数据更新到slave】这个操作之间,有没有什么办法来保证数据的一致性呢?还是按照官网所说,“You may think at it as a relaxed version of the "C" in the CAP theorem, where consistency is not ensured for a given write, but at least the time window for data loss is restricted to a given number of seconds.” 即在经过一个比较确定的时间窗口后,Redis能够保证数据一致性?

谢谢!

@huangzworks
Copy link
Owner

你好,关于你的两个问题,解答如下。

其一:

客户端向 slave 发送什么命令,要由程序来决定,如果程序向一个 slave 发送了写命令,那么这个写命令将被拒绝,因此程序有责任将正确的命令发送给正确的服务器 —— 将写命令发送给 master ,将读命令发送给 slave ,而这些目前需要使用程序手动去做。

有一些数据库也支持只读 slave ,但是它们的 slave 可以在接到写命令时,自动把客户端引导至 master ,并让客户端重新发送命令(这好像被称为“读写分离”特性?),而不会像 Redis 的 slave 那样,直接返回错误,不过我用过的 Ruby 和 Python 客户端都不支持这种特性,至于其他客户端是否支持,我不太清楚。

其二:

官网说的是对的, Redis 目前的主从复制没办法保持强制一致性:当你向 master 发送一条写命令之后, master 会向 slave 发送相同的写命令,而这条写命令在发送的过程中可能会有一段时间延迟,这段延迟时间之内, master 和 slave 的数据并不是完全一致的。

为了规避这一缺陷,如果你需要执行一个写然后读(write-and-read)操作,那么为了确保数据的正确性,你应该直接写和读 master ,而不要写 master ,然后读 slave ,因为这可能会引起问题。

Redis 的官网有提到将来可能会支持强一致性, Redis 的 github repo 上面也相关的实验性质的 branch 存在,有兴趣的话可以找找看。

huangz

@fengchen8086
Copy link
Author

看到了,谢谢!

@huangzworks
Copy link
Owner

:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants