【Redis】--- 总结
前言
总结Redis中理论,面试总结
集群选举原理
- slave发现自己的master变为FAIL
- 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息
- 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
- 尝试failover的slave收集FAILOVER_AUTH_ACK
- 超过半数后变成新Master
- 广播Pong通知其他集群节点。
从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票
延迟计算公式:
DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。
二、使用步骤
2、(G57)①数据迁移的时候,客户端会同步写入吗?还是会等迁移完成后才会写入
答:迁移时可能会同步写入,但如果写的是正在迁移的槽位就会阻塞等待迁移完成
②master挂了,salve重新选举,课堂上说slave的数据可能会比master少,那master挂了以后,新选举的master比原来的master数据少了,少了的数据就直接忽略了吗?
答:是有可能的,但是概率不大,缓存在特殊场景下一般是允许有少量数据丢失的,毕竟数据库里还有一份可以重写读入的
3、(M84)①redis集群重启,要不要重新cluster create?还是只要重启节点就行了?
答:不需要,只要重启节点就行了
② 3主3从,一个slave和master网络异常(实际master是好的),slave发起选举,这时候是什么机制避免slave选上master?
答:这种只有尽量把节点超时时间设置长点
4、(H36)master挂了后,Slave重新选举,如果选举的slave不是slave中最新的,选举后当master了,那么不是会丢失一部分数据吗,这样怎么解决,还是说丢就丢了。
答:是有可能丢一点数据的,但是概率不大,缓存在特殊场景下一般是允许有少量数据丢失的,毕竟数据库里还有一份可以重写读入的
5、(G25)
有个问题:刚老师上课演示的时候,是新增1个小集群,2个节点,如果要新增2个小集群,4个节点,那么等节点全部加入集群后再分配槽也是可以的吧?
答:应该是可以的,可以自己用伪分布式环境试验下
6、J70
老师搭建的集群 需不需要安装ssh 配置免密钥登录 啥的
答:不需要,不是已经配置密码了么,redis有自己的访问密码
7、I100
如果被选成master的sleaver的rank不是最新的,会不会丢数据啊?
答:有可能,但是概率不大,即便丢一点数据关系也不大哈,毕竟是缓存,数据库里还有一份
8、L63
老师,集群内的数据如何同步数据?
缓存的数据什么时候刷新?
答:一般是增量同步aof的持久化操作命令,也有可能同步快照
第二个问题没看懂
9、I25
问诸葛老师问题,jedis操作redis集群,要add每个节点,如果节点非常多,这明显很麻烦,有什么办法吗?
答:我上课演示过了,可以只添加部分节点,仔细回看下视频
10、L04
集群重启之后需要重新create吗?我尝试重启集群节点后好像没有自动组建集群,但是重新create会报错:node not empty,每次重启必须删除node.conf和持久化文件才能创建。重启集群具体该如何操作呢
答:不需要,重启集群只要把所有redis节点重启就好了
11、N46
redis允许多个指定IP访问怎么配置?
答:例192.168.3.31 192.168.3.32bind 192.168.3.31 192.168.3.32
1、(K73)
验证集群连接的时候,为什么输入具体ip不行,输入127.0.0.1可以呢
要确定ip是否正确,还有最好把防火墙关闭再试试,或者从另外一台机器上用这台机器的ip连接试试
2、(N49)redis搭建主从结构情况下,为保证redis数据不丢失,怎么跳转持久化策略啊?
用aof或者混合持久策略,因为集群里每台机器的内存不会太大用aof也是可以的
4、(M57)想问一下诸葛老师,在lru缓存淘汰策略中,上课时您说淘汰的数据不写入AOF里,那它不就永远消失了吗?再次访问时候怎么办?
Lru缓存淘汰策略不是不写入aof,是从redis内存和aof持久化文件里把满足lru策略需要清理掉的缓存数据直接删除,已经删除的数据再次访问缓存里肯定没有了,但是你数据库里还有哈,可以再次查询数据库把结果放入redis
5、(H36)
①这6个实例需要密码都一样吗?如果不一样,能启动吗
密码必须都一样哈,集群是一个统一的整体
②redis 启动集群,只用在任意一个机器上执行集群命令就行
截图的命令就行了吗
是的
1、(H37)诸葛老师混合重写必须要aof和rdb同时设置为yes么 还是混合的这个设为yes就行
aof和混合那个都要设为yes,混合那个是基础aof的
2、(N14)
①、redis重启后RDB和AOF文件里面的内容会清空吗?
不会哈
②、AOF文件是存在哪的。
redis.conf文件里的dir属性配置的路径
③、手动重写aof文件,如果文件很大,重写 需要花很长时间,这个时候刚好又有新操作的数据怎么办?
新操作会存在内存里,等到aof重写完再最加到aof文件的末尾,aof重写的数据就是重写开始之前的内存数据
3、(G25)
①、诸葛老师上课演示的时候,在客户端手动执行bgrewriteaof,手动重写命令后,此时查看aof文件中并没有aof相关命令(老师说重写,就是set key 最新的状态值),只看到rdb文件,后来又执行了几个设置命令,这些是新增了几个key,这些操作并没有体现出来对之前的key进行重写呀
那是因为已经开启了混合持久化方式了,如果不开启的话你就能看到类似set key的命令了,可以自己本地试验下
②、还有个问题:就是scan命令,第三个参数,比如每次读取1000个,这个是怎么读取的,下次读取另外1000个的时候,会不会把之前已经读过的数据又读了一次,如果不会,因为hash是无序的,那么是怎么读的呢
不会重复读取,是按照hash的一维数组逐个往下读取的
4、J63
比如这时候rdb了 。然后 有新增了很多数据, 然后重写了。 多出来的aof命令是怎么存进去的 。。
会等rdb写完aof文件之后再把之后的数据命令追加到aof文件末尾
5、I05
redis hash冲突后进行rehash 如果再冲突继续rehash?到最后还会不会有冲突的结果?
不是hash冲突后马上进行rehash,是redis扩容后之前的元素再做rehash重新定位,扩容是根据redis内部的扩容因子来计算的,跟hashmap扩容类似,冲突一直都可能有,只不过redis会尽量通过扩容来减小冲突