1. 为什么要进行集群
      1. 防止单点故障
      2. 提高作业能力,实现高并发
      3. 数据的分布式存储,处理大量数据
    2. 什么是集群
      1. 集群概念:集群是指把应用复制成多个相同的应用一起工作来提高作业能力,多个应用部署在不同的服务器,做相同的事情
      2. 负载均衡:在集群后,通过负载均衡来分发请求
      3. 集群特点:
        1. 可扩展性:
          1. 集群的性能不限制于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能,或者减少服务器实现集群缩容- 动态扩容缩容
        2. 高可用性:
          1. 集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。当访问的服务器挂了时,集群要有能力找可以正常使用额服务器继续提供服务器。
      4. 集群具备的能力:
        1. 负载均衡
        2. 错误恢复:一个实体挂了,另一个继续执行完成任务
    3. 集群方案
      1. Redis 主从复制(主节点数据复制出一份到其他服务器作为从节点-单向)
        1. 工作机制:
          1. 写请求到主Redis,读请求到从Redis,读/写的路由需要负载均衡器(主Twemproxy/从Twemproxy) ,而主从Redis的负载均衡器需要做主备切换(keeplived)
        2. 优点:
          1. 从是数据的一种备份;防止数据丢失
          2. 读写分离,分担读的压力
          3. 主从是哨兵,cluster集群的基石
        3. 缺点:
          1. 无法分担写的压力
          2. 主机挂了集群不可用,没法自动切换
          3. 存储得不到扩容,存储
      2. Redis 哨兵
        1. Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
        2. 工作任务
          1. 监控 sentinel不停检查服务器是否正常
          2. 提醒 出问题了 sentinel向管理员或其他应用程序发送通知
          3. 自动故障迁移:主服务宕机,自动选举一个新的作为主服务器,并让其它的从服务器从新的主服务器复制数据,用户的请求会被变更为新的主服务器
        3. 工作机制
          1. 主观下线
            1. sentinel发送ping命令,服务器进行心跳回复,超过设定时间不回复,则被sentinel标记为主观下线
          2. 客观下线
            1. 超过半数sentinel标记为主观下线,则服务器标记为客观下线
            2. 在低于半数标记为主观下线时,客观下线状态被会被移除,服务器重新回复心跳,会移除主观下线
          3. 故障恢复
            1. 选取一个领导哨兵(保证进行故障恢复的sentinel只有一个)
            2. 选取一个优先级高的从数据库(数据完整性、id)
        4. 哨兵的优点
          1. 基于主从模式,具备主从模式所有的优点
          2. 哨兵可以自动切换,系统更健壮,可用性更高
        5. 哨兵的缺点
          1. 没有解决写的压力、只能减轻读的压力
          2. 存储得不到扩容,存储总量是主服务器的数据总量
          3. 当主服务器宕机时,从服务器切换为主服务器时,服务不可用
      3. Redis cluster 集群
        1. Redis 3.0加入 实现Redis的分布式存储,每个Redis节点上存储不同的内容
        2. 无中心结构(都是主服务器)
        3. 数据分散存储
          1. 多主多从,实现分布式存储
          2. 每个主服务器保存各自的数据和集群状态
          3. 没有使用传统的一致性哈希,使用哈希槽分配数据,cluster默认分配16384个slot槽位,当我们set一个key时,通过CRC16算法取模得到槽点位置具体算法是CRC16(key)%16384
        4. 容错机制-投票(哨兵)
        5. 面试题:为什么cluster分配16384
          1. hash值占16bit。该算法可以算出2^16=65536个值
          2. 如果槽位为65536,心跳机制的信号包太大,浪费贷款
          3. redis的集群节点数基本不可能超过1000
          4. 槽位越少,压缩比越高
          5. 总结:Redis的作者认为Redis的集群个数不宜超过1000个,因此16384个槽位已经足够了,如果使用它原来的hash算法中的65536个槽位,会导致ping消息的请求头过大,浪费带宽
    4. 集群搭建
    5. java操作集群
    6. Redisson连接 Redis集群

    面试题:

    1. 简单说一下你对分布式理解?
      1. 分布式服务顾名思义服务是分散部署在不同的机器上的,一个服务可能负责几个功能,是一种面向SOA架构的,服务之间也是通过rpc来交互或者是webservice来交互的。逻辑架构设计完后就该做物理架构设计,系统应用部署在超过一台服务器或虚拟机上,且各分开部署的部分彼此通过各种通讯协议交互信息,就可算作分布式部署,生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用
    2. 简单说一下你对集群理解?
    3. 项目中那些地方用到Redis,怎么用的?
      1. 登录、注册短信校验
      2. 登录信息
      3. 热点数据统计

    4. Redis有哪些存储结构?每种结构说4个命令
    5. Redis怎么实现栈和队列?
    6. 说一下Redis集群是怎么存储数据的?
    7. Redis内存不够了怎么办?
    8. Redis集群方式有哪些?
    9. 简单说一下主备切换时Redis如何选举master的?
    10. 说一下Redis持久化方案?
    11. 说一下Redis淘汰策略?
    12. Redis为什么那么快
    13. Redis主从有什么优缺点,哨兵有什么优缺点,cluster集群有什么优缺点?