码迷,mamicode.com
首页 > 其他好文 > 详细

Redis主备复制

时间:2015-11-19 22:24:00      阅读:477      评论:0      收藏:0      [点我收藏+]

标签:

     Redis 支持 Master-Slave(主从)模式,Redis Server 可以设置为另一个 Redis Server 的主机(从机),从机定期从主机拿数据。特殊的,一个从机同样可以设置为一个 Redis Server 的主机,这样一来 Master-Slave 的分布看起来就是一个有向无环图,形成 Redis Server 集群,无论是主机还是从机都是 Redis Server,都可以提供服务。

技术分享

 

     在配置后,主机Master可负责读写服务从机Slave只负责读。Redis 提高这种配置方式,为的是让其支持数据的弱一致性,即最终一致性。redis 复制在 master 这一端是非阻塞的,也就是说在和 slave 同步数据的时候,master 仍然可以执行客户端的操作命令而不受其影响。

二、redis主从复制特点

1、同一个Master可以拥有多个Slaves。

2、Master下的Slave还可以接受同一架构中其它slave的链接与同步请求,实现数据的级联复制,即Master->Slave->Slave模式;

3、Master以非阻塞的方式同步数据至slave,这将意味着Master会继续处理一个或多个slave的读写请求;

4、Slave端同步数据也可以修改为非阻塞是的方式,当slave在执行新的同步时,它仍可以用旧的数据信息来提供查询;否则,当slave与master失去联系时,slave会返回一个错误给客户端;

5、主从复制具有可扩展性,即多个slave专门提供只读查询与数据的冗余,Master端专门提供写操作;

6、通过配置禁用Master数据持久化机制,将其数据持久化操作交给Slaves完成,避免在Master中要有独立的进程来完成此操作。

三、redis主从复制原理

技术分享

 

1、当启动一个Slave进程后,它会向Master发送一个SYNC Command,请求同步连接。无论是第一次连接还是重新连接,Master都会启动一个后台进程,将数据快照保存到数据文件中,同时Master会记录所有修改数据的命令并缓存在数据文件中;

2、后台进程完成缓存操作后,Master就发送数据文件(dump.rdb)给Slave,Slave端将数据文件保存到硬盘上,然后将其在加载到内存中,接着Master就会所有修改数据的操作,将其发送给Slave端。

3、若Slave出现故障导致宕机,恢复正常后会自动重新连接,Master收到Slave的连接后,将其完整的数据文件发送给Slave,如果Mater同时收到多个Slave发来的同步请求,Master只会在后台启动一个进程保存数据文件,然后将其发送给所有的Slave,确保Slave正常。

第一次:Slave向Master同步实现原理如下:

Slave向Master发送同步请求(Sync命令),Master先dump出rdb文件,然后将rdb文件全量传输给slave,然后Master把缓存的写命令转发给Slave,初次同步完成 ;

第二次:同步实现原理如下:Master将变量的快照直接实时依次发送给各个Slave,但不管什么原因导致Slave和Master断开重连都会重复以上两个步骤的过程。Redis的主从复制是建立在内存快照的持久化基础上的,只要有Slave就一定会有内存快照发生。   

rdb复制弊端请参见:http://my.oschina.net/hanruikai/blog/308007?fromerr=VJsCzCcq           

四、redis主从配置

    实现主从复制仅需要修改Slave对应的redis.conf文件中的如下参数,Master中的此参数不需要修改:

slaveof <master ip> <port>  

slaveof 192.168.126.137   6379

IP和端口为Master的IP和端口

     replication在redis.conf的配置选项:

     #slaveof [masterip] [masterport]  设置master的ip和port #masterauth [master-password]     如果master需要auth,在此设置password
     #slave-serve-stale-data yes       如果slave与master的连接断开,该选项决定slave是否继续提供服务
     #slave-read-only yes              slave是否是只读的 #repl-ping-slave-period 10        master端ping slave端的时间间隔,时刻检测slave连接的有效
     #repl-timeout 60                  replication连接的超时时间
     #slave-priority 100               slave的权重,用于redis sentinel模式中,如果master down,权重大的slave接替master

    replication是redis提供的复制功能,用于master提供给slave的数据同步。 slave在连接master后,master端会在后台启动一个进程进行rdb文件的建立,当文件建立完成后,发送给slave端,slave端收到后,会通过rdb文件完成对master的复制。

具体示例如下:

先打开三个终端,然后起三个实例,分别用三个 client 去连接它们:

A:src $ ./redis-server --port 10000 --daemonize yes

A:src $ ./redis-cli -p 10000

端口10000的做 master。

slave 01:

A:src $ ./redis-server --port 10001 --daemonize yes

A:src $ ./redis-cli -p 10001

slave 02:

A:src $ ./redis-server --port 10002 --daemonize yes

A:src $ ./redis-cli -p 10002

上面只是让它们的实例启动了并用客户端去连接它,并没有设置主从关系。在 slave 01 和 slave 02 上执行下面的命令:

127.0.0.1:10001> slaveof 127.0.0.1 10000

OK

127.0.0.1:10001> 

这样就设置好了主从关系。我们来试试有没有效果。

127.0.0.1:10001> get testkey001

(nil)

127.0.0.1:10001> 

这个时候是没有值的。

master 上执行:

127.0.0.1:10000> set testkey001 testvalue001

OK

127.0.0.1:10000> 

然后看看 slave 上有没有:

127.0.0.1:10001> get testkey001

"testvalue001"

127.0.0.1:10001> 

127.0.0.1:10002> get testkey001

"testvalue001"

127.0.0.1:10002> 

当你设置了主从关系后,slave 在第一次连接或者重新连接 master 时,slave 都会发送一条同步指令给 master ;

master 接到指令后,开始启动后台保存进程保存数据,接着收集所有的数据修改指令。后台保存完了,master 就把这份数据发送给 slave,slave 先把数据保存到磁盘,然后把它加载到内存中,master 接着就把收集的数据修改指令一行一行的发给 slave,slave 接收到之后重新执行该指令,这样就实现了数据同步。

slave 在与 master 失去联系后,自动的重新连接。如果 master 收到了多个 slave 的同步请求,它会执行单个后台保存来为所有的 slave 服务。

Redis主备复制

标签:

原文地址:http://www.cnblogs.com/moonandstar08/p/4979173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!