Redis主从复制、持久化、哨兵

(一)Redis集群的主从复制

概念
主从备份,防止主机宕机
读写分离,分担master的任务
任务分离,如从服务节点分担备份与计算工作

主从复制特点
1:master 可以拥有多个 slave
2:多个 slave 可以连接同一个 master 外,还可以连接到其他 slave
3:主从复制不会阻塞 master,在同步数据时,master 可以继续处理 client 请求
4:提高系统的伸缩性
集群架构模型
Redis主从复制、持久化、哨兵_第1张图片

(二)持久化机制

redis 是一个支持持久化的内存数据库,也就是说 redis 需要经常将内存中的数据同步到磁盘来保证持久化.redis 支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是 Append-only file(缩写 aof)的方式.

snapshotting 方式

快照是默认的持久化方式.这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb.可以通过配置设置自动做快照持久化的方式.我们可以配置 redis在 n 秒内如果超过 m 个 key 被修改就自动做快照,下面是默认的快照保存配置

save 900 1 #900 秒内如果超过 1 个 key 被修改,则发起快照保存
save 300 10 #300 秒内容如超过 10 个 key 被修改,则发起快照保存
save 60 10000

下面介绍详细的快照保存过程:
1.redis 调用 fork,现在有了子进程和父进程.
2. 父进程继续处理 client 请求,子进程负责将内存内容写入到临时文件.由于 os 的实时复
制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时 os 会为父
进程要修改的页面创建副本,而不是写共享的页面.所以子进程地址空间内的数据是 fork

时刻整个数据库的一个快照.
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出.
client 也可以使用 save 或者 bgsave 命令通知 redis 做一次快照持久化.save 操作是在主线程
中保存快照的,由于 redis 是用一个主线程来处理所有 client 的请求,这种方式会阻塞所有
client 请求.所以不推荐使用.另一点需要注意的是,每次快照持久化都是将内存数据完整
写入到磁盘一次,并不是增量的只同步变更数据.如果数据量大的话,而且写操作比较多,
必然会引起大量的磁盘 io 操作,可能会严重影响性能.
下面将演示各种场景的数据库持久化情况

aof 方式

由于快照方式是在一定间隔时间做一次的,所以如果 redis 意外 down 掉的话,就会丢 失最后一次快照后的所有修改.如果应用要求不能丢失任何修改的话,可以采用 aof 持久化 方式.下面介绍 Append-only file:
aof 比快照方式有更好的持久化性,是由于在使用 aof 持久化方式时,redis 会将每一个收到的写命令都通过 write 函数追加到文件中
(默认是appendonly.aof).当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容.当然由于 os 会在内核中缓 存 write 做的修改,所以可能不是立即写到磁盘上.这样 aof 方式的持久化也还是有可能会 丢失部分修改.不过我们可以通过配置文件告诉 redis 我们想要通过 fsync 函数强制 os 写入 到磁盘的时机.有三种方式如下(默认是:每秒 fsync 一次)
appendonly yes //启用 aof 持久化方式
appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no //完全依赖 os,性能最好,持久化没保证

(三)搭建Redis主从复制

1、概述
Redis主从复制、持久化、哨兵_第2张图片

1:准备三个redis节点,即三个不同名称的配置文件,然后指定配置文件启动
2:模拟三个端口为:6379、6380、6381,注意检查端口占用
3:主节点配置:关闭RDB和AOF(默认关闭)
4:从节点配置:启用RDB和AOF、参数:slaveof指定主节点

复制三个端口配置文件到redis目录下
在这里插入图片描述
2、主节点配置
1:注意端口修改和检查
2:注释掉save #关闭RDB和AOF
Redis主从复制、持久化、哨兵_第3张图片
3、从节点配置
1:如果是同一台机器,需要修改端口,这里是模拟的使用的是一台机器
2:修改rdb输出文件名称,主要用于从节点分担主节点备份任务
在这里插入图片描述
3:appendonly 设置为yes #开启AOF模式,并修改保存数据的AOF文件名称
4:appendfilename “appendonly.aof” #保存数据的AOF文件名称
Redis主从复制、持久化、哨兵_第4张图片
5:slaveof 主节点IP 主节点端口 从#节点指定主节点
在这里插入图片描述
6:注意,在新版本中如果客户端连接必须指定密码,那么从节点配置文件必须配置主节点密码
Redis主从复制、持久化、哨兵_第5张图片
PS:一开始不知道需要配置,结果主从复制始终失败,看了半天的配置文件文档才明白,需要添加masterauth主节点密码才可以

4、启动测试

./bin/redis-server ./redis6379.conf
./bin/redis-server ./redis6380.conf
./bin/redis-server ./redis6381.conf

在这里插入图片描述
检查主从复制
步骤:客户端连接主节点在主节点添加数据,连接从节点在从节点访问
命令:指定端口 ./bin/redis-cli -p 6380 -a 123456
结论:从节点可以访问到主节点数据

从节点能否添加数据
步骤:客户端连接从节点,看是否可以添加
结论:从节点不能添加数据,默认情况下从节点为只读

(四)单点故障和哨兵

概述
1:哨兵监视主节点,如果主节点没有响应,则进行主从节点切换
2:哨兵会根据一定的选择规则,选择一个可用的从节点作为主节点
3:同时会将原主节点下其他的从节点链接到当前主节点下
4:如果原主节点恢复正常,则重新链接并作为从节点
5:实际情况下,哨兵也存在故障,因此哨兵也需要部署多个,保证高可用
配置演示

#移动redis安装目录下的sentinel.conf到redis程序目录下,
cp sentinel.conf …/
#修改配置文件,参考下图
#启动哨兵,开启前先开启主从节点
bin/redis-sentinel sentinel.conf
#启动页面,如下图所示
#备注:可以通过关闭主节点应用kill -9 6379端口对应pid ,然后重新启动6379观察对应的哨兵启动页面日志输出

Redis主从复制、持久化、哨兵_第6张图片
Redis主从复制、持久化、哨兵_第7张图片

你可能感兴趣的:(Redis)