Redis持久化、主从与哨兵架构详解
持久化
RDB快照(snapshot)
在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。
你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。
比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:
AOF(append-only file)
快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化,将修改的每一条指令记录进文件appendonly.aof中
主从架构图
主从复制是为了什么呢? 无非就是说当master挂掉了,为了保证高可用,继续让slave顶替master去工作呗,在一个就是保证数据的完成性,回头因为master挂了数据丢了那就惨了下面说说原理:
主从复制原理(决定都能听得懂,自己的理解大家挺好,这也是面试必问的啊)
1.当给master配置了slave时(可能是多个从),从呢会给主发送一个命令(sync)大家就理解为一个心跳吧 这期间保持长连接 主和从一直通信着呢.
2.主收到这个请求的时候呢,就会用一个bgsave命令去后台生成rdb快照数据(这个bgsave是异步的啊),与此同时呢 客户端新过来的set操作啊咋办 嘿嘿 在2.8版本之后呢 redis会吧这些数据在内存中穿件一个缓存队列保存着
3.主把用bgsava生成的rdb文件传输给从.
4.然后将内中中缓存数据发送给从 send buffer
5.从将 rdb文件和 buffer 数据合并 刷新本地数据
6.将合并的数据生成新的rdb文件,并且将数据load到内存中
7.由于主从保持的是心跳 或者说是长连接 从而保证主可以一直把数据发送给从
这下大家明白了吧 嘿嘿 感觉还是挺好理解的 面试上应该说出来这些就好了 对于全量复制 和 增量赋值 差别就是那个buffer呦
下面就是搭建主从服务了 嘿嘿 按照我说的做 一次搞定
1、复制一份redis.conf文件
2、将相关配置修改为如下值:
port 6380
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dir /usr/local/redis-5.0.3/data/6380
3、配置主从复制
replicaof 192.168.0.60 6379 # 从本机6379的redis实例复制数据
replica-read-only yes
4、启动从节点
redis-server redis.conf
5、连接从节点
redis-cli -p 6380
6、测试在6379实例上写数据,6380实例是否能及时同步新修改数据
7、可以自己再配置一个6381的从节点
说明一下哈 本人呢是整个了服务器 远程调用的时候呢会发生 127.0.0.1:6379访问被拒绝 那么只需要将
注释掉就好啦 还有可能呢会报错说模块受保护 别急 看下面
将YES改成NO 就好啦
现在主从就搭建好了 主从之间也建立的很好的机制 但是现在我们的从是只读的啊 是不可以set数据的呢
记好 一会下面会说这个
Redis哨兵高可用架构
哨兵是干嘛的呢 就是站岗的嘛 对不对 就是检测redis集群的健康状况 那么问题来了 我干嘛要用你这个呢你说你站岗我就要用你了? 你说你是哨兵,有啥用.这样 我们来说一个场景 假如说按照上图我们的master挂掉了 那么作为程序猿的我们肯定要考虑到这种情况下 那么我们就要自己考虑 主挂掉了 肯定是要把slave变成主嘛 咋搞 修改他的conf文件,然后写一个算法,搞一搞他的选举机制,而且呢还要判断是不是因为网络抖动假死啊 哦 当然了 我没死就是卡了你下 你就把我的地位从主变成从了 闹呢 哈哈 开个玩笑 要实现这套机制是真的很麻烦.
程序猿:哨兵 你这些能干么?
哨兵:废话 等你半天了 我就干这个的.
程序猿:好吧.还是你厉害.
嘿嘿 懂了吧 说说原理吧 官方语言啊.
sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)
怎么玩哨兵呢 超级简单
1、复制一份sentinel.conf文件
cp sentinel.conf sentinel-26379.conf
2、将相关配置修改为如下值:
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "26379.log"
dir "/usr/local/redis-5.0.3/data"
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
sentinel monitor mymaster 192.168.0.60 6379 2
3、启动sentinel哨兵实例
src/redis-sentinel sentinel-26379.conf
4、查看sentinel的info信息
src/redis-cli -p 26379
127.0.0.1:26379>info
可以看到Sentinel的info里已经识别出了redis的主从
5、可以自己再配置两个sentinel,端口26380和26381,注意上述配置文件里的对应数字都要修改
这下就搭建好了 试一试就ok啦 这就是哨兵模式 当然啦这就是基础入门的 后续会更新选举机制啊 做到高可用啊 后期慢慢在分享 先分享到这里吧 有问题欢迎留言 最后感谢诸葛老师的分享和教学 感谢