通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。
所以为避免单点故障,我们需将数据复制多份到多台不同的服务器上,即使有一台服务器出现故障了,其他服务器依然可以继续提供服务。
那么这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上;
如何实现?
Redis提供了复制(replication)功能来自动实现多台redis服务器的数据同步
1.Redis一主多从架构
我们可以通过部署多台redis,并在配置文件中指定这几台redis之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即master/slave,并且redis默认master用于写,slave用于读,向slave写数据会导致错误;
实现Redis的主从复制,只需要修改Redis的主配置文件redis.conf即可,配置如下(同一台linux服务器中配置时机开发中redis可能在不同服务器上):
主redis配置:
include /usr/local/redis-5.0.5/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
从服务器1配置:
include /usr/local/redis-5.0.5/redis.conf
daemonize yes
port 6381
pidfile /var/run/redis_6381.pid
logfile 6381.log
dbfilename dump6381.rdb
slaveof 192.168.6.128 6380
#masterauth 123456(密码配置)
从服务器2配置:
include /usr/local/redis-5.0.5/redis.conf
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 192.168.6.128 6380
#masterauth 123456(密码配置)
这3个文件进行上传
2.启动redis服务
2.1连接redis客户端
使用info命令查看
同时也可以进入从redis使用info查看
3.验证主从复制
向主redis写入数据从redis都是可以取到数据
4.主从复制原理
全量复制
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份,具体步骤:
完成上面几个步骤后就完成了slave服务器数据初始化的所有操作,savle服务器此时可以接收来自用户的读请求。
master/slave 主从同步过程本身是异步的,意味着master执行完客户端请求的命令后会立即返回结果给客户端,然后异步把命令同步给slave。
这一特征保证启用master/slave后,master的性能不会受到影响。
但另一方面,如果在这个数据不一致的窗口期间,master/slave因为网络问题断开连接,而这个时候,master是无法得知某个命令最终同步给了多少个slave数据库。不过redis提供了一个配置项来限制只有数据至少同步给多少个slave的时候,master才是可写的:
min-replicas-to-write 3表示只有当3个或以上的slave连接到master,master才是可写的;
min-replicas-max-lag 10表示允许slave最长失去连接的时间,如果10秒还没收到slave的响应,则master认为该 slave已断开;
原来老版本这两个参数是:
min-slaves-to-write 3
min-slaves-max-lag 10
增量复制
从redis 2.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文件并载入,但是这种方式会存在一些问题:
- 当master禁用RDB时,如果执行了复制初始化操作,Redis依然会生成RDB快照,当master下次启动时执行该RDB文件的恢复,可能会造成数据出现问题;
- 当硬盘性能比较慢的情况下,那初始化复制过程会对性能产生影响,因此2.8.18以后的版本,Redis引入了无硬盘复制选项,可以不需要通过RDB文件去同步,直接发送数据,通过以下配置来开启该功能:
repl-diskless-sync yes
master在内存中直接创建rdb,然后发送给slave,不会在自己本地磁盘保存;