1. 理解redis持久化的两种模式,并说明他们的区别。

    redis 两种持久模式 一个是RDB模式一个是AOF模式

    RDB模式是基于时间的快照,可以通过bgsave 自定义时间点的备份,保留多个备份,出现问题恢复到不同的时间点, 在大量数据面前执行速度比较快,缺点是不能实时保存数据,可能会丢失从上次快照到当前时间点之间未做快照的数据

     AOF模式数据安全性相对较高,对日志文件的写入操作采用的是append模式,在写入中不需要seek,即使出现宕机也不会破坏日志文件中已经存在的内容,如果写了一半数据系统崩溃,下一次启动前可以通过redis-check-aof工具来解决,另外AOF包含一个格式清晰,易于理解的日志文件用于记录所有的修改才做,缺点是有些操作是重复的也要全部记录因此文件大小大于RDB格式的文件,在恢复大量数据集时的速度比RDB恢复的要慢,根据fsync策略不同,AOF速度可能慢于RDB

在两种方式的选择上,如果主要充当缓存功能,或者可以承受数分钟的数据丢失,用RDB即可,如果数据需要持久保存,数据一点不能丢失,可以选择同事开启RDB和AOF,生产不建议只开启AOF

2.使用redis哨兵模式实现高可用及故障转移。

首先实现主从同步很简单 只需要在从节点上配置

REPLICAOF  192.168.18.50 6379

CONFIG SET masterauth 123456

然后info一下看一下状态

马哥架构班第四周作业_redis

从节点只能只读 但是这样重启服务状态就没了,因此要写入redis.conf文件里面 修改如下

马哥架构班第四周作业_redis_02

搭建测试哨兵高可用故障转移 用三台机器  ip 分别是192.168.18.50/51/52   其中52作为主

这三台机器要统一配置成 bind 0.0.0.0

masterauth 123456   requirepass 123456 

然后在两个从节点配置文件上添加 replicaof 192.168.18.52 6379

主哨兵的redis info

马哥架构班第四周作业_redis_03

从哨兵的redis info

马哥架构班第四周作业_redis_04

然后各个主从节点修改sentinel.conf 

bind 0.0.0.0

port 26379

daemonize yes

pidfile "/var/run/redis-sentinel.pid"

logfile "/var/log/redis/sentinel.log"

dir /tmp

sentinel monitor mymaster 192.168.18.52 6379 2

 sentinel auth-pass mymaster 123456

 sentinel down-after-milliseconds mymaster 3000

acllog-max-len 128

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

SENTINEL resolve-hostnames no

SENTINEL announce-hostnames no

马哥架构班第四周作业_redis_05

然后启动sentinel 服务

/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf

master哨兵日志

马哥架构班第四周作业_redis_06slave哨兵日志

马哥架构班第四周作业_redis_07

模拟切换的过程

kiilall redis-server master 哨兵的服务器 然后查看 slave 各节点的日志  发现master 已经从192.168.18.52 切换成192.168.18.50

马哥架构班第四周作业_redis_08

马哥架构班第四周作业_redis_09

马哥架构班第四周作业_redis_10

3.搭建redis cluster集群,并增删节点

搭建cluster的最小单位为六台机器 三主三从

首先修改六台机器的redis.conf文件 

bind 0.0.0.0

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6379.conf

cluster-require-full-coverage no

然后启动redis服务

 马哥架构班第四周作业_redis_11

redis-cli -a 123456 --cluster create 192.168.18.50:6379 192.168.18.51:6379 192.168.18.52:6379  192.168.18.53:6379 192.168.18.54:6379 192.168.18.55:6379 --cluster-replicas 1

redis-cli cluster nodes

验证集群状态 redis-cli -a 123456 CLUSTER INFO

增删节点  因为我的redis 是6.2.1 所以按照最新的方式  如果是redis 3/4版本 会有另外的方式

redis-cli -a 123456 --cluster add-node 192.168.18.56:6379

在新master上分配槽点

redis-cli -a 123456 --cluster reshard

然后选择all 选择done 等待分配完毕

为新的master 分配新的slave 节点

redis-cli -a 123456 --cluster add node 192.168.18.57:6379 <任意集群节点 192.168.18.56>:6379 --cluster-slave --cluster-master-id  192.168.18.56的master-id

删除节点

删除节点需要先把槽位迁移到别的集群中 再删除 正好与添加过程相反

比如将 192.168.18.50 和192.168.18.51 这一对主从下架

redis-cli -a 123456 --cluster reshard 任意节点ip:端口 --cluster-slots 1375 --cluster-from 被撤下的master 的master-id --cluster-to 移动到的master节点的master-id --cluster-yes

如此执行3遍把 slots 分配给其他master 节点

这样192.168.18.50 从集群里面删除 192.168.18.51 也自动成为其他master的slave

现在开始删除节点

redis-cli -a 123456 --cluster del-node 192.168.18.50:6379  master-id

删除节点后redis进程自动关闭

删除节点信息

rm -f /var/lib/redis/nodes-6379 避免服务再起来加入节点

redis-cli -a 123456 --cluster del-node 192.168.18.51:6379  slave-id

rm -f /var/lib/redis/nodes-6379

自此节点删除完毕