赞
踩
扩展学习写时复制机制
set qinchen 888
,则aof会记录如下内容- // 以下是一种叫resp协议格式数据,*3代表命令参数个数 $3表示命令有几个字符
- *3
- $3
- set
- $7
- qinchen
- $3
- 888
- // 注意,如果是带过期时间set命令,则记录的不是原始命令
- set qinchen 888 ex 1000
- *3
- $3
- set
- $7
- qinchen
- $3
- 888
- $9
- PEXPIREAT
- $7
- qinchen
- $13
- 1604249786301

一主两从模式,配置简单,主节点负责写
replicaof master ip port
原理
过程中slave挂了后,再恢复时,通过偏移量从master缓冲区同步数据(类似断点续传)
但由于缓冲区大小有限制,若slave挂的时间较长,则slave重启后,偏移量已不在master缓冲中,则将全量恢复master数据
redis的client一般都实现了订阅sentinel发布的节点变动消息,所以client才能收到master变动情况,具体内部选举原理与集群模式类似,请看后面集群选举部分介绍。
- // 1. 可以循环向redis中写值
- // 2. 停掉主节点
- // 3. 客户端发生异常
- // 4. 间隔一段时间后自动恢复正常,命令执行成功
- // 5. 查看sentinel-xx.conf 文件可以看到最后一条master已是最新选举的,多次选举都会被记录
- // 6. 使用info命令也可查看其自动切换后的信息
- // 7. 重启挂掉的master,自动变成从节点,然后从最新主节点同步最新数据
Springboot中,StringRedisTemplate与RedisTemplate区别在于其序列化机制不同,前者是原生内容设置到Redis,后者默认则是利用JDK序列化策略,保存的key & value都是被序列化后的内容。
HASH_SLOT = CRC16(key) mod 16384
跳转重定位机制:客户端与服务端发送槽位信息不一致时,向错误节点发出了指令,将得到一个重定向结果,指向正确的操作目标节点信息,并同步纠正客户端本地信息。
3个节点以上是为了能正常选举,4个节点与3个其实可用性一样,4个节点仍然只能容忍挂一个节点
- cluster info // 查看集群基本信息
- cluster nodes // 查看节点信息
- set key value // 会自动计算key的槽位,然后自动给对应的master节点保存数据
- get key // 其他master节点上get不到数据
- // 核心就是对key进行hash,调用getCRC16(),然后对16384取模
- // 集群的信息在客户端启动时,就缓存到了本地
- // 若集群信息有变化,客户端执行命令时,将返回一个重定向信息给到客户端
- // 客户端根据重定向信息,向重定向服务器发起命令执行,同时更新本地缓存槽位表
- // 对客户端实现原理感兴趣,自行深入学习
Redis集群内部通过gossip协议,实现集群内部元信息变化的更新,C语言实现,可作为扩展了解下
注意集群内部通信端口是以server服务端口+10000,不要问为什么,代码写死的
网络抖动处理:通过参数cluster-node-timeout
进行配置合适的超时时间
集群脑裂问题如何处理?
min-slaves-to-write=1
,意为至少需存在1个slave时才让写数据集群选举原理:
若存在两个salve,出现票数一样,此时将重新选举
为防止多次选举票数一致,底层通过了延迟计算公式规避,延迟计算中带有一个随机数及slave_rank
DELAY = 500ms + random(0~500ms) + SLAVE_RANK * 1000ms
redis是AP架构设计,保证的是可用性,牺牲的是一致性,zk是CP
- // 新的主节点加入
- redis-cli -a xxx --cluster add-node new-node-IP node-IP
-
- // 分槽位,数据也会同步迁移
- redis-cli -a xxx --cluster reshard IP
-
- // 新的从节点加入
- cluster replicate node-id
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。