理解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.conf文件里面 修改如下
搭建测试哨兵高可用故障转移 用三台机器 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 info
然后各个主从节点修改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
然后启动sentinel 服务
/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
master哨兵日志
slave哨兵日志
模拟切换的过程
kiilall redis-server master 哨兵的服务器 然后查看 slave 各节点的日志 发现master 已经从192.168.18.52 切换成192.168.18.50
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-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
自此节点删除完毕