Redis主从复制

持久化

Redis高性能的原因是将所有数据都存储在了内存中

为了使Redis在重启后保证数据不丢失,需要将数据从内存中同步到硬盘中

Redis支持两种方式的持久化:RDB方式和AOF方式

可以单独使用其中一种或将二者结合使用。

1.1 RDB持久化

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

RDBRedis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1

save 300 10

save 60 10000

save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系,“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。

redis.conf中:

配置dir指定rdb快照文件的位置

配置dbfilenam指定rdb快照文件的名称

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费2030秒钟。

问题总结:

通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

1.2 AOF持久化

默认情况下Redis没有开启AOFappend only file)方式的持久化,可以通过appendonly参数开启:

appendonly yes

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬

盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof

主从复制(了解)

2.1 什么是主从复制

持久化保证了即使redis服务重启也会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

 

说明:

redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

只有一个主redis,可以有多个从redis

主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求

一个redis可以即是主又是从,如下图:

 

2.2 主从配置

2.2.1 redis配置

无需特殊配置。

2.2.2 redis配置

修改从redis服务器上的redis.conf文件,添加slaveof redisip  redis端口

 #salveof <masterip><masterport>

 salveof 192.168.215.130 6379

上边的配置说明当前该从redis服务器所对应的主redis192.168.101.3,端口是6379

2.3 主从复制过程

2.3.1 完整复制

redis2.8版本之前主从复制过程如下图:

 

复制过程说明:

1、 slave 服务启动,slave 会建立和master 的连接,发送sync 命令。

2master启动一个后台进程将数据库快照保存到RDB文件中

注意:此时如果生成RDB文件过程中存在写数据操作会导致RDB文件和当前主redis数据不一致,所以此时master 主进程会开始收集写命令并缓存起来。

3master 就发送RDB文件给slave

4slave 将文件保存到磁盘上,然后加载到内存恢复

5master把缓存的命令转发给slave

注意:后续master 收到的写命令都会通过开始建立的连接发送给slave

master slave 的连接断开时slave 可以自动重新建立连接。如果master 同时收到多个slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有slave

完整复制的问题:

redis2.8之前从redis每次同步都会从主redis中复制全部的数据,如果从redis是新创建的从主redis中复制全部的数据这是没有问题的,但是,如果当从redis停止运行,再启动时可能只有少部分数据和主redis不同步,此时启动redis仍然会从主redis复制全部数据,这样的性能肯定没有只复制那一小部分不同步的数据高。

2.3.2 部分复制

 

部分复制说明:

从机连接主机后,会主动发起 PSYNC 命令,从机会提供 masterrunid(机器标识,随机生成的一个串) offset(数据偏移量,如果offset主从不一致则说明数据不同步),主机验证 runid offset 是否有效, runid 相当于主机身份验证码,用来验证从机上一次连接的主机,如果runid验证未通过则,则进行全同步,如果验证通过则说明曾经同步过,根据offset同步部分数据。

原文地址:https://www.cnblogs.com/xsl1995/p/10009178.html