redis集群
主从复制
1.何为主从复制
主从服务器
2.主从复制工作流程
建立连接
步骤:
序列 操作 master 方向 slave 1 设置master地址和端口,保存信息. 2.收到指令响应对方接收信息的端口 <–> 1.发送指令:slaveof ip port 2 建立socket连接 4. <– 3保存master ip和port . 4.根据保存信息创建socket连接 3 ping pang定时器任务 6. 响应pang <–> 5. 发送ping 4 身份验证 8. 验证授权 <–> 7. 发送指令:auth password 5 发送slave监听端口信息 10. 保存slave发来的端口号 <–> 9. 发送指令:replconlistening-port:port s端监听的端口号 三种方式建立连接
1.slave端发送指令 slaveof ip port- 启动时加参数 –slaveof ip port
- slave添加conf参数 slaveof ip port
连接断开
客户端发送 slaveof nono数据同步
步骤序列 操作 master 方向 slave 1 slave请求同步 2.执行bgsave,3slave首次连接创建命令缓冲区 <–> 1.发送指令:psync2 2 rdb同步数据 4.生成rdb发送给slave <–> 5.接收rdb,恢复 3 部分同步数据 7. 发送复制缓冲区 <–> 6. 发送指令告知rdb恢复完成 4 slave恢复部分同步数据 <–> 8. 接收信息,恢复部分数据, 9. 发送指令完成同步 5 开始命令传播 10. 接收指令.响应,开始命令传播 <–> 注意事项
1 master数量巨大,要避开高峰区加slave.
2 缓冲区要设定合理,防止rdb同步阶段数据溢出,导致slave多次全量复制.
3 master要留一部分内存给bgsave用.
数据同步阶段部分复制是如何实现的
1. 一些概念
*服务器运行id:
运行时自动生成的随机40位16进制字符,在slave连接时,master会将runid发送给slave.
*主服务器的复制积压缓冲区:
是一个队列,用于存储服务器执行过的命令,传播命令时,master会将传播的命令记录下来,存储在缓冲区.
*主从服务器的复制偏移量
缓冲区的组成为偏移量(offset)和字节值两行组成.
master记录每个salve不同的偏移量,用来记录同步的位置.当然slave也会记录偏移量,
2. 部分复制
* 部分复制阶段的三要素
即为
runid 缓冲器 偏移量
或者说:
为了保证命令传播阶段不出错,不会数据丢失创造了这种方法,产生了这三个要素.
runid,用来识别唯一的服务.
缓冲区,防止数据传播丢失后有备份.
偏移量,出错后如何确定出错前的位置.
m在发送rdb文件时会发送offset和runid,同时本地的offset会随收到的客户端命令而变化.
1. s拿到offset和runid,发送一个请求.->psync runid offfset
2. m接受到请求,对比发送的runid和offset.
3. 如果offset不同则将缓冲区中不同的数据发送
3.命令传播
当连接建立,数据同步之后.
master数据变更后,发送变更命令给slave叫做命令传播.
心跳机制:
master心跳:
指令: ping
周期: 配置文件可以定义,默认10秒
作用:检查slave是否在线
slave心跳
指令:replconf ack (offset)
周期:一秒
作用:汇报偏移量,获取最新数据变更指令
最用:判断是否在线
* 命令传播阶段出现了断网
*闪断闪联 忽略
*长时中断 全量复制
*短时中断 部分复制
3. 主从复制常见问题
1. salve频繁全量复制 ->更改缓冲区合理
2. master占用cpu过高,与slave频繁断开 ->设置超时时间 repl-time
3. slave与master频繁断开 ->提高pin命令发送频度,慎用.
4. slave数据不同步,不一致. 网络延迟导致->优化网络.
2.哨兵
1.什么是哨兵
监控主从结构,当出现故障的时候通过投票机制选择新的master并将slave连接到新的master.
哨兵的作用
监控:不断的检查master和slave
通知:机器出现问题,发送通知(哨兵间 客户端)
自动故障转移:断开masterhe slave连接,选取新master,并通知其他slave连接到新的master,告知客户端.
哨兵也是redis服务器,只是不提供数据服务
2.配置哨兵
sentinel.conf 文件
redis-sentine sentinel.conf 即可启动哨兵
开启三个server,一主两从.
开启三个哨兵.
杀掉主服务器进程.
发现主服务器变了,且其他的从连接上了主.
3.哨兵的原理
将哨兵理解为一个客户端,通过指令来操作其他redis服务器.
1.监控
同步各个节点的状态信息
获取各个哨兵状态
获取master状态
runid
role
slave信息
其他哨兵
获取所有slave的状态
runid
role
master_host port
offset
哨兵之间建立信道
2. 通知
哨兵之间建立信道互相通知
3. 故障转移
内部投票:内部投票选出哨兵
如何投票?
竞选机制,谁越早通知谁票多,谁竞选次数多谁票多.
挑选:投票出的哨兵,来挑选新master.
如何挑选?
首先淘汰:
不在线的
响应慢的
与master断开时间久的.
接着以优先原则
优先级
offset
runid
挑选完后发送指令:
向新的master发送slaveof no one指令
向其他slave发送 slaveof 新master ip port
集群
1.什么是集群
1.集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,对外呈现单机的服务效果.
2. redis可以启动多个节点后在任意一个节点上开启集群会自动分配主从
2.redis集群的结构
1.数据是怎么存的
1. 通过算法设计,计算出key应该保存到额位置.
2. 将所有的存储空间切割成16384份,每台主机保存一部分,每份代表的是一个存储空间,不是一个key的保存的空间
3.按照key按照计算出的结果放到对应位置
2.相互之间是怎么联系的
如果加了机器,会将存储空间(槽)分到新机器,这就带来通讯的问题,其他机器怎么知道新的槽的位置呢?
通过相互联系,记录每台计算机拥有的槽.
若有条消息,取key,到一个服务器上
一次命中,直接返回.
一次未中,则告知具体位置.
3.集群实现
弄一个三主三从的集群
- 复制六份配置文件 配置每一份的配置文件,增加.
# 开启集群模式
cluster-enabled yes
# 每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由redis自己维护,我们不用管。如果你要重新创建集群,那么把这个文件删了就行
cluster-config-file nodes-201.conf
# 超时时间,超时则认为master宕机,随后主备切换
cluster-node-timeout 5000
# 开启AOF
appendonly yes
启动6个redis
任一节点上执行以下命令,执行完会出现日志,6台的主从关系都会显示。
#####
# 注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb来构建集群,最新版使用C语言来构建了,这个要注意
# 注意2:以下为新版的redis构建方式
#####
# 创建集群,主节点和从节点比例为1,主从的对应关系会自动分配。
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1
可以测试挂掉几台后依然可用,注意存取使用的是 redis-client -c