forked from me115/redis
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ea71f7c
commit 6a458c1
Showing
2 changed files
with
159 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -106,6 +106,7 @@ Redis 命令参考 | |
topic/transaction | ||
topic/persistence | ||
topic/pubsub | ||
topic/replication | ||
|
||
|
||
下载离线版本 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
复制(Replication) | ||
======================= | ||
|
||
.. note:: | ||
|
||
本译文的原文为: http://redis.io/topics/replication | ||
|
||
Redis 支持简单且易用的主从复制(master-slave replication)功能, | ||
该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。 | ||
|
||
以下是关于 Redis 复制功能的几个重要方面: | ||
|
||
- 一个主服务器可以有多个从服务器。 | ||
|
||
- 不仅主服务器可以有从服务器, | ||
从服务器也可以有自己的从服务器, | ||
多个从服务器之间可以构成一个图状结构。 | ||
|
||
- 复制功能不会阻塞主服务器: | ||
即使有一个或多个从服务器正在进行初次同步, | ||
主服务器也可以继续处理命令请求。 | ||
|
||
- 复制功能也不会阻塞从服务器: | ||
只要在 ``redis.conf`` 文件中进行了相应的设置, | ||
即使从服务器正在进行初次同步, | ||
服务器也可以使用旧版本的数据集来处理命令查询。 | ||
|
||
不过, | ||
在从服务器删除旧版本数据集并载入新版本数据集的那段时间内, | ||
连接请求会被阻塞。 | ||
|
||
你还可以配置从服务器, | ||
让它在与主服务器之间的连接断开时, | ||
向客户端发送一个错误。 | ||
|
||
- 复制功能可以单纯地用于数据冗余(data redundancy), | ||
也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): | ||
比如说, | ||
繁重的 :ref:`SORT` 命令可以交给附属节点去运行。 | ||
|
||
- 可以通过复制功能来让主服务器免于执行持久化操作: | ||
只要关闭主服务器的持久化功能, | ||
然后由从服务器去执行持久化操作即可。 | ||
|
||
|
||
复制功能的运作原理 | ||
------------------------------- | ||
|
||
无论是初次连接还是重新连接, | ||
当建立一个从服务器时, | ||
从服务器都将向主服务器发送一个 :ref:`SYNC` 命令。 | ||
|
||
接到 :ref:`SYNC` 命令的主服务器将开始执行 :ref:`BGSAVE` , | ||
并在保存操作执行期间, | ||
将所有新执行的写入命令都保存到一个缓冲区里面。 | ||
|
||
当 :ref:`BGSAVE` 执行完毕后, | ||
主服务器将执行保存操作所得的 ``.rdb`` 文件发送给从服务器, | ||
从服务器接收这个 ``.rdb`` 文件, | ||
并将文件中的数据载入到内存中。 | ||
|
||
之后主服务器会以 Redis 命令协议的格式, | ||
将写命令缓冲区中积累的所有内容都发送给从服务器。 | ||
|
||
你可以通过 telnet 命令来亲自验证这个同步过程: | ||
首先连上一个正在处理命令请求的 Redis 服务器, | ||
然后向它发送 :ref:`SYNC` 命令, | ||
过一阵子, | ||
你将看到 telnet 会话(session)接收到服务器发来的大段数据(\ ``.rdb`` 文件), | ||
之后还会看到, | ||
所有在服务器执行过的写命令, | ||
都会重新发送到 telnet 会话来。 | ||
|
||
即使有多个从服务器同时向主服务器发送 :ref:`SYNC` , | ||
主服务器也只需执行一次 :ref:`BGSAVE` 命令, | ||
就可以处理所有这些从服务器的同步请求。 | ||
|
||
从服务器可以在主从服务器之间的连接断开时进行自动重连, | ||
在重连成功之后, | ||
从服务器需要重新执行一次完整的重同步(resync)操作。 | ||
|
||
|
||
配置 | ||
------------------- | ||
|
||
配置一个从服务器非常简单, | ||
只要在配置文件中增加以下的这一行就可以了: | ||
|
||
:: | ||
|
||
slaveof 192.168.1.1 6379 | ||
|
||
当然, | ||
你需要将代码中的 ``192.168.1.1`` 和 ``6379`` 替换成你的主服务器的 IP 和端口号。 | ||
|
||
另外一种方法是调用 :ref:`SLAVEOF` 命令, | ||
输入主服务器的 IP 和端口, | ||
然后同步就会开始: | ||
|
||
:: | ||
|
||
127.0.0.1:6379> SLAVEOF 192.168.1.1 10086 | ||
OK | ||
|
||
|
||
只读从服务器 | ||
-------------------- | ||
|
||
从 Redis 2.6 开始, | ||
从服务器支持只读模式, | ||
并且该模式为从服务器的默认模式。 | ||
|
||
只读模式由 ``redis.conf`` 文件中的 ``slave-read-only`` 选项控制, | ||
也可以通过 :ref:`CONFIG_SET` 命令来开启或关闭这个模式。 | ||
|
||
只读从服务器会拒绝执行任何写命令, | ||
所以不会出现因为操作失误而将数据不小心写入到了从服务器的情况。 | ||
|
||
即使从服务器是只读的, | ||
:ref:`DEBUG` 和 :ref:`CONFIG` 等管理式命令仍然是可以使用的, | ||
所以我们还是不应该将服务器暴露给互联网或者任何不可信网络。 | ||
不过, | ||
使用 ``redis.conf`` 中的命令改名选项, | ||
我们可以通过禁止执行某些命令来提升只读从服务器的安全性。 | ||
|
||
你可能会感到好奇, | ||
既然从服务器上的写数据会被重同步数据覆盖, | ||
也可能在从服务器重启时丢失, | ||
那么为什么要让一个从服务器变得可写呢? | ||
|
||
原因是, | ||
一些不重要的临时数据, | ||
仍然是可以保存在从服务器上面的。 | ||
比如说, | ||
客户端可以在从服务器上保存主服务器的可达性(reachability)信息, | ||
从而实现故障转移(failover)策略。 | ||
|
||
|
||
设置从服务器,让它通过主服务器的身份验证 | ||
----------------------------------------------- | ||
|
||
如果主服务器通过 ``requirepass`` 选项设置了密码, | ||
那么为了让从服务器的同步操作可以顺利进行, | ||
我们也必须为从服务器进行相应的身份验证设置。 | ||
|
||
对于一个正在运行的服务器, | ||
可以使用客户端输入以下命令: | ||
|
||
:: | ||
|
||
config set masterauth <password> | ||
|
||
要永久地设置这个密码, | ||
那么可以将它加入到配置文件中: | ||
|
||
:: | ||
|
||
masterauth <password> |