AOF持久化流程
(1)客户端的请求写命令会被append追加到AOF缓冲区内;
(2)AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;
(3)AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;
(4)Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;
开启AOF
699行,appendonly 默认为no 改为yes
策略:731行,根据电脑性能选择 (不能选no)
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
AOF启动/修复
/usr/redis/bin/redis-check-aof --fix 文件的位置/appendonly.aof进行恢复
重写文件的大小
第一次:64m rewrite ->50m 50+50*100%=100
第二次: 100m
第三次: 200m
重写流程
(1)bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。
(2)主进程fork出子进程执行重写操作,保证主进程不会阻塞。
(3)子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。
(4)子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。2).主进程把aof_rewrite_buf中的数据写入到新的AOF文件。
(5)使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。
主从复制
一主二从
主:6380
从:6381,6382
主机配置文件
6381 和6382 只需要将上面文件中的6380 替换成对用的端口号即可
查看状态
配从
slaveof <ip><port>
在6381和6382上执行: slaveof 127.0.0.1 6380
就相当于认6380为主 6381,6382都为从
6382从机
6381从机
主机6380
2.在主机上写,在从机上可以读取数据
3.主机挂掉,重启就行,一切如初
4.从机重启需重设:slaveof 127.0.0.1 6380
薪火相传
当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
用 slaveof no one 将从机变为主机。
配置哨兵
在/usr/redis/bin/sentinel.conf路径下
加入sentinel monitor mymaster 127.0.0.1 6380 1
启动文件 ./redis-sentinel sentinel.conf
主是 6380
当主机挂掉,从机选举中产生新的主机
(大概10秒左右可以看到哨兵窗口日志,切换了新的主机 6382 )
哪个从机会被选举为主机呢?根据优先级别:replica-priority
原主机重启后会变为从机。
原主机再次启动后就变成了从机
优先级在redis.conf中默认:replica-priority 100,值越小优先级越高
偏移量是指获得原主机数据最全的
每个redis实例启动后都会随机生成一个40位的runid