什么是复制
单机的redis通常情况是无法满足项目需求的,一般都建议使用集群部署的方式进行数据的多机备份和部署,这样既可以保证数据安全,同时在redis宕机的时候,复制也可以对于数据进行快速的修复。
采取的方式
单机部署(忽略)
主从链
一主多从
哨兵模式
集群模式
复制的前提
需要保证
redis.conf
里面的配置是正确的,比如:
dir ./dbfilename "dump.rdb"
需要保证指定的路径对于redis来说是可写的,意味着如果当前目录没有写权限同样会失败
从服务器连接主服务器的几种方式
在从服务器的配置文件里面配置连接那个主服务器:
连接的具体配置如下:
在5.0版本中使用了
replicaof
代替了slaveof
(github.com/antirez/red…),slaveof
还可以继续使用,不过建议使用replicaof
下面是个人的配置
# replicaof replicaof 127.0.0.1 16379
警告:此小节只说明了这一个配置的更改,进行主从配置的时候还有其他几个参数需要更改,这里只作为部分内容参考
在启动的时候,在redis从服务器的redis-cli当中敲击如下的命令:
127.0.0.1:16380> slaveof 127.0.0.1 16379OK Already connected to specified master
这样就可以在从服务器动态的指定要连接哪个主服务器了,但是这种配置是当前运行时有效,下次再次进入的时候,会根据配置文件进行配置或者按照默认的规则当前实例就是master3.
在从服务器执行
slaveof no one
,当前实例脱离控制自动成为master
redis 复制启动的过程(重点)
主服务器操作 | 从服务器操作 |
---|---|
1. (等待命令) | 1. 连接(重新连接)主服务器,发送sync命令 |
2. 开始执行bgsave,使用缓冲区记录bgsave之后执行所有写命令 | 2. 根据配置选项是使用现有的数据(存在)处理客户端请求,还是向请求的客户端返回错误信息 |
3. bgsave执行完毕,向从服务器发送快照文件,同时异步执行缓冲区记录的写命令 | 3. 丢弃所有的旧数据,载入主服务器的快照文件 |
4. 快照文件发送完毕,开始向着从服务器发送存储在缓冲区的写命令 | 4. 完成对于快照的解释操作,恢复日常的请求操作 |
5. 缓冲区写命令发送完成,同时现在每执行一个写命令就像从服务器发送相同写命令 | 5. 执行主服务器发来的所有存储在缓冲区的写命令,并且从现在开始接受主服务器的每一个命令 |
建议:由于bgsave需要开启进行子线程的创建写入缓冲区的创建,所以最好在系统中预留30% - 45% 内存用于redis的bgsave操作
特别注意:当从服务器连接主服务器的那一刻,执行到第三步会清空当前redis里面的所有数据。
配置方式和命令方式的区别:
redis.conf 配置slaveof 的方式:不会马上进行主服务器同步,而是先载入当前本地存在的rdb或者aof到redis中进行数据恢复,然后才开始同步复制
命令slaveof方式:会立即连接主服务器进行同步操作
关于redis的主主复制:
如果我们尝试让两台服务器互相slaveof 那么会出现上面情况呢?
从上面的复制过程可以看到,当一个服务器slaveof另一个服务器,产生的结果只会是两边相互覆盖,也就是从服务器会去同步主服务器的数据,如果此时按照主主的配置,两边互相同步对方的数据,这样产生的数据可能会不一致,或者数据干脆就是不完整的。不仅如此,这种操作还会大量占用资源区让两台服务器互相知道对方
当一台服务器连接另一台服务器的时候会发生什么?
当有新服务器连接的时候 | 主服务器操作 |
---|---|
步骤3还没有执行 | 所有从服务器都会收到相同的快照文件和相同缓冲区写命令 |
步骤3正在执行或者已经执行 | 完成了之前同步的五个操作之后,会跟新服务器重新执行一次新的五个步骤 |
系统故障处理
复制和持久化虽然已经基本可以保证系统的数据安全,但是总有意外的情况,比如突然断电断网,系统磁盘故障,服务器宕机等一系列情况,那么会出现各种莫名奇妙的问题,下面针对这些情况说明一下解决方式:
验证快照文件以及aof文件
在redis的bin
目录下面,存在如下的两个sh
-rwxr-xr-x 1 root root 9722168 Nov 15 20:53 redis-check-aof-rwxr-xr-x 1 root root 9722168 Nov 15 20:53 redis-check-rdb
他们的命令作用和内容如下:
[xd@iZwz99gyct1a1rh6iblyucZ bin]$ ./redis-check-aof Usage: ./redis-check-aof [--fix] [xd@iZwz99gyct1a1rh6iblyucZ bin]$ ./redis-check-rdb Usage: ./redis-check-rdb
redis-check-aof:如果加入--fix
选项,那么命令会尝试修复aof文件,会将内容里面出现错误的命令以及下面的所有命令清空,一般情况下会清空尾部的一些未完成命令。
redis-check-rdb:遗憾的是目前这种修复收效甚微。建议在修复rdb的时候,用SHA1和SHA256验证文件是否完整。
校验和与散列值:
redis2.6 之后加入了校验和与散列值进行验证。
快照文件增加CRC64校验和
什么是crc循环冗余校验?
https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%86%97%E9%A4%98%E6%A0%A1%E9%A9%97
更换故障主服务器:
假设A故障,存在BC两台机器,B为从服务,C为将要替换的主服务器
向机器B发送save命令,同时创建一个新的快照文件,同步完成之后,发送给C
机器C上面启动redis,让C成为B的主服务器
Redis sentienel 哨兵
可以监视指定主服务器以及属下的从服务器
也就是我们常用的哨兵模式
但是随着时代进步,目前使用redis基本还是以cluster模式
为主
redis主从复制模式(redis6.0版本):
前提说明:
有条件的可以弄三台虚拟机查看效果,这样模拟出来的效果算是比较真实的。
三台从服务器以及一台主服务器的配置
个人的办法是copy一个公用的配置,然后进行修改(这里只列举区别以及改动较多的地方,其他地方根据需要配置):
第一台机器的配置:
pidfile /var/run/redi