redis集群


redis集群

主从复制

1.何为主从复制

主从服务器

2.主从复制工作流程

  1. 建立连接

    步骤:

    序列 操作 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

    1. 启动时加参数 –slaveof ip port
    2. slave添加conf参数 slaveof ip port

    连接断开
    客户端发送 slaveof nono

  2. 数据同步
    步骤

    序列 操作 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.集群实现

弄一个三主三从的集群

  1. 复制六份配置文件 配置每一份的配置文件,增加.
# 开启集群模式
cluster-enabled yes
# 每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由redis自己维护,我们不用管。如果你要重新创建集群,那么把这个文件删了就行
cluster-config-file nodes-201.conf
# 超时时间,超时则认为master宕机,随后主备切换
cluster-node-timeout 5000
# 开启AOF
appendonly yes
  1. 启动6个redis

  2. 任一节点上执行以下命令,执行完会出现日志,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


Author: 向天歌
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source 向天歌 !
  TOC