redis的分布式集群(主从复制)

集群

先来简单了解下redis中提供的集群策略,虽然redis有持久化功能能够保障redis服务器宕机也能恢复并且只有少量的数据损失,但是由于所有的数据在一台服务器上,如果服务器出现故障,就算是有备份也不可避免数据丢失的问题。

在实际生产中应使用集群模式,避免出现单点故障

主从复制,复制的作用是把redis的数据库复制多个副本部署在不同的服务器上,如果其中一台服务器出现故障,也能快速迁
移到其他服务器上提供服务。 复制功能可以实现当一台redis服务器的数据更新后,自动将新的数据同步到其他服务器上。

主从复制就是我们常见的master/slave模式,主数据库可以进行读写操作,当写操作导致数据发生变化时,会主动将数据同步给从数据库,而一般情况下,从数据库是只读的,并接受主数据库同步过来的数据

配置

在redis中配置master/slave是非常容易的,只需要在从数据库的配置文件中加入slaveof主数据库地址端口,而master数据库不需要做任何改变。

准备两台服务器,安装redis,node1,node2

1.在node2的redis.conf文件中增加slaveof node1  -ip 6379 ,同时将bind ip 注释掉,允许所有ip访问。

2.启动node2

3.访问node2的redis客户端,info replication

4.通过在node1机器上输入命令 ,set aa bb,在node2服务器就能看到数据已经同步过来了

 

原理

全量复制

全量复制发生在slave初始化阶段,这时slave需要将master上的所有数据都复制一份,如下图

redis的分布式集群(主从复制)_第1张图片

完成上面几个步骤后就完成了slave服务器数据初始化的所有操作,savle服务器此时可以接收来自用户的读请求。
master/slave 复制策略是采用乐观复制,也就是说可以容忍在一定时间内master/slave数据的内容是不同的,但是
两者的数据会最终同步。具体来说,redis的主从同步过程本身是异步的,意味着master执行完客户端请求的命令
后会立即返回结果给客户端,然后异步的方式把命令同步给slave。
这一特征保证启用master/slave后 master的性能不会受到影响。
但是另一方面,如果在这个数据不一致的窗口期间,master/slave因为网络问题断开连接,而这个时候,master
是无法得知某个命令最终同步给了多少个slave数据库。不过redis提供了一个配置项来限制只有数据至少同步给多
少个slave的时候,master才是可写的:


min-slaves-to-write 3 表示只有当3个或以上的slave连接到master,master才是可写的
min-slaves-max-lag 10 表示允许slave最长失去连接的时间,如果10秒还没收到slave的响应,则master认为该slave以断开

增量复制

从redis2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络链接断掉了,那么可以接着上次复制的地方继续复制先去,而不是从头开始复制一份。

master node 会在内存中创建一个backlog,master和slave都会保存一个replica offset还有master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制

但是如果没有找到对应的offset,那么就会执行一次全量同步

无硬盘复制

我们说过,Redis复制的工作原理基于RDB方式的持久化实现的,也就是master在后台保存RDB快照,slave接
收到rdb文件并载入,但是这种方式会存在一些问题


\1. 当master禁用RDB时,如果执行了复制初始化操作,Redis依然会生成RDB快照,当master下次启动时执行该
RDB文件的恢复,但是因为复制发生的时间点不确定,所以恢复的数据可能是任何时间点的。就会造成数据出现问

\2. 当硬盘性能比较慢的情况下(网络硬盘),那初始化复制过程会对性能产生影响
因此2.8.18以后的版本,Redis引入了无硬盘复制选项,可以不需要通过RDB文件去同步,直接发送数据,通过以
下配置来开启该功能
repl-diskless-sync yes
master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了

 

 

 

 

你可能感兴趣的:(redis,redis深度解析1.0)