标签:redis研究 redis replication master slave
在上一节中我们写了Redis的数据持久化
http://blog.csdn.net/wtyvhreal/article/details/42916503
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失。为了避免单点故障,我们希望将数据库复制多个副本以部署在不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上,Redis提供了复制(replication )功能可以自动实现同步的过程。
1.配置
同步后的数据库分为两类,一类是主数据库(master),一类是从数据库(slave)。主数据库可以进行读写操作,当发生写操作时自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
在Redis中使用复制功能非常容易,只需要在从数据库的配置文件中加入“slaveof主数据库IP主数据库端口”即可,主数据库无需进行任何配置。为了能够更直观地展示复制的流程,下面将进行简单的演示。我们要在一台服务器上启动两个Redis实例,监听不同端口,其中一个作为主数据库,另一个作为从数据库。首先我们不加任何参数来启动一个Redis实例作为主数据库:
redis-server
redis-server --port 6380 --slaveof 127.0.0.1 6379
此时在主数据库中的任何数据变化都会自动同步到从数据库中。我们打开redis-cli实例A并连接到主数据库:
redis-cli
再打开redis-cli实例B并连接到从数据库:
redis-cli -p 6380
在实例A中使用SET命令设置一个键的值:
redis A>SET foo bar OK
redis B>GET foo "bar "
但在默认情况下从数据库是只读的,如果直接修改从数据库的数据会出现错误:
redis B>SET foo hi (error)
可以通过设置从数据库的配置文件中的slave-read-only 为no以使从数据库可写,但是对从数据库的任何更改都不会同步给任何其他数据库,并且一旦主数据库中更新了对应的数据就会覆盖从数据库中的改动。
配置多台从数据库的方法也一样,在所有的从数据库的配置文件中都加上 slaveof参数指向同一个主数据库即可。
除了通过配置文件或命令行参数设置slaveof参数,还可以在运行时使用SLAVEOF命令修改:
redis>SLAVEOF 127.0.0.1 6379
2.原理
当一个从数据库启动后,会向主数据库发送SYNC命令,主数据库接收到SYNC命令后会开始在后台保存快照(即RDB持久化的过程),并将保存期间接收到的命令缓存起来。当快照完成后,Redi s会将快照文件和所有缓存的命令发送给从数据库。从数据库收到后,会载入快照文件并执行收到的缓存的命令。当主从数据库断开重连后会重新执行上述操作,不支持断点续传。
实际的过程略微复杂一些,由于Redi s服务器使用TCP协议通信,所以我们可以使用telnet工具伪装成一个从数据库来了解同步的具体过程。首先在命令行中连接主数据库(默认端口为6379,且没有任何从数据库连接):
telnet 127.0.0.1 6379 Trying 127.0.0.1... Connected to localhost. Escape cha acter i s '^]' .
PING +PONG
REPLCONF l istening-por t 6381 +OK
SYNC 29 REDI S0006?foobar ?6_?"
*3 $3 set $3 foo $2 hi
3.图结构
从数据库不仅可以接收主数据库的同步数据,自己也可以同时作为主数据库存在,形成类似图的结构,如图所示,数据库A的数据会同步到B和C中,而B中的数据会同步到D和E中。向B中写入数据不会同步到A或C中,只会同步到D和E中,
4.读写分离
通过复制可以实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率大于写,当单机的Redis无法应付大量的读请求时(尤其是较耗资源的请求,比如SORT命令等)可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作。
5.从数据库持久化
另一个相对耗时的操作是持久化,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中使用SLAVEOF NO ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLAVEOF命令将其设置成新的主数据库的从数据库,即可将数据同步回来。
标签:redis研究 redis replication master slave
原文地址:http://blog.csdn.net/wtyvhreal/article/details/42979299