Redis 集群及Hash tags

简介:由于单个redis存在不稳定性,而且读写能力是有限的,所以集群是为了强化redis的读写能力。

一、集群

  1. 集群原理

    A. Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态;

    B. 所有的Redis节点彼此互联(ping-pong机制),内部使用二进制协议优化传输速度和带宽;

    C. 投票容错机制,节点的fail是通过集群中超过半数的节点检测失效时才失效;

    D. 客户端与redis节点直连,不需要中间件proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;

    E. 集群把所有的物理节点映射到0-16383slot上(不一定是均匀分配),cluster负责维护node -> solt ->value;

    F. Redis集群预先分配好16384个桶,当需要在redis集群中放置一个key-value时,根据CRC16(key) % 16384的值,决定将key放到哪个桶中。  

  2. 集群TCP端口

    A. 每个Redis集群中节点都需要打卡两个TCP连接,一个用于给客户端提供服务,另一个用于集群总线,两个端口的偏移量总是10000;

    B. 集群总线用于节点的失败侦测、配置更新、故障转移等,通信是靠Gossip协议。

  3. 集群数据分片

    A. 集群最少是3个节点,假设是3个节点,节点A覆盖0-5460个hash slot,节点B覆盖5461-10922个hash slot,节点C覆盖10923-16383个hash slot;

    B. 新增节点时,集群会从前面的各个节点中拿一部分槽出来给新的节点;

    C. 删除节点也是依次类推。

  4. 特性

    A. 优点:客户端只需要连接集群中任何一个可用节点即可、高性能、客户端直连Redis服务、无中心架构;

    B. 缺点:只能使用DB0数据库、不支持批量操作(pipeline)、数据迁移需要人工干预。

 

二、集群高可用

  1. 部署模式

    A. 单节点部署:只有一个节点提供服务,读写均在此节点,此节点宕机则数据全部丢失,直接影响业务;

    B. master-slave部署(读写分离):两个节点组成master-slave模式,在master上写入,slave上读取,读写分离提高访问性能,master宕机后,需要手动把slave提升为master,业务影响程度取决于手动提升master的延迟;

    C. master-slave + 哨兵方式部署:master-slave与上述相同,不同的是增加一组哨兵节点,用于实时检查master的健康状态,在master宕机后自动提升slave为新的master,最大程度降低不可用的时间,对业务影响时间较短。

  2. 集群主从模式

    A. Redis集群为了保证数据高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点上拉取数据备份,当这个主节点挂掉后,就会从对应的从节点上选取一个当主节点,从而保证集群可用;

    B. Redis提供了故障恢复机制哨兵,用来管理master-slave节点,并在master发生问题时,能够自动进行故障恢复操作;

    C. 搭建集群时一定要为主节点搭建从节点,否则若主节点没有从节点,一旦其中一个不可用,其他的也无法访问。

  3. 集群一致性

    A. 集群主从节点之间是使用异步复制,可能有部分数据还没复制到slave,master就宕机了,所以会丢失一些写操作数据,不能保证强一致性;

    B. Redis集群也支持同步复制,但性能会降低;

    C. 主从复制原理:

      一个Slave实例,无论是第一次连接还是重连Master,它都会发出一个PSYNC命令;

      当Master收到PSYNC命令之后,会先执行BGSAVE,即在后台保存数据到磁盘(RDB快照文件),同时将新收到的写入和修改数据集的命令写入缓冲区;

      当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传递给Slave,而Slave则把内存清空后,加载该文件到内存中;

      而Master也会把此前收集到缓冲区的命令,通过Redis命令协议形式转发给Slave,Slave执行到这些命令,实现和Master的同步;

      Master/Slave此后会不断通过异步方式进行命令的同步,达到最终数据的同步一致。

   4. 哨兵(Sentinel)

    A. 主要功能

      集群监控:负责监控redis master和slave进程是否正常工作;

      消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员;

      故障转移:如果master node挂掉了,会自动转移到slave node上;

      配置中心:如果故障转移发生了,通知client客户端新的master地址。

     B. 工作原理:

        每个sentinel会向其他sentinel、master、slave定时发送消息即心跳检测,以确认对方是否活着,如果发现对方在指定时间被未回应,则暂时认为对方宕机;

        若哨兵群(至少需要3个实例)中的多数sentinel都报告某一master没响应,系统才认为该maseter真正宕机,通过Raft算法即选择新的master,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置;

        即:状态感知 —> 心跳检测 —> 选取哨兵领导者 —> 选择新的master —> 故障恢复 —> 客户端感知新的master。

   5. 集群脑裂

    A. 定义:是指因为网络问题,导致Redis master节点跟Redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到master的存在,但是实际上master还运行着,此时sentinel认为master宕机了,然后开启选举,将slave节点提升为master节点,此时存在两个不同的master节点,就像一个大脑分裂成了两个。

    B. 危害:虽然某个slave被切换成了master,但是可能client还没来得及切换到新的master,还继续写向旧的master的数据可能丢失了,因此当旧的master再次恢复的时候,会被作为一个slave挂载到新的master上去,自己的数据会清空,重新从新的master复制数据。

    C. 解决措施      

# 表示连接到master的最小数量
min-replicas-to-write 3
# 表示slave连接到master的最大延迟时间
min-replicas-max-lag 10

      配置参数后,原master会在客户端写入操作的时候拒绝请求,这样可以避免大量数据丢失。

 

三、其他

  1. 常用命令

    A. 查询集群节点信息:cluster nodes;

    B. 查询集群状态信息:cluster info;

    C. 连接集群:redis-cli -c -h 127.0.0.1 -p 6379  -c参数,能实现节点之间跳转,服务器上使用命令时,实际上是主从节点之间跳转。

  2. Key hash tags

    A. 分片技术就是hash过程,对key做md5、sha1等hash算法,根据hash值分配到不同的机器中,为了实现将key分配到相同机器上,就得具有相同hash值;

    B. Hash tags标签是破坏分片计算规则的实现,是一种保证多个键被分配到同一个槽位的方法;

    C. Hash tags计算规则:取一对大括号{}之间的字符进行计算,若是key存在多对大括号,那么就取第一个左括号和第一个右括号之间的字符,若是大括号中没有字符,则会对整个字符串进行计算;

      如:rhxy:{tid:9986}:userId:1、rhxy:{tid:9986}:userId:2、rhxy:{tid:9986}:userId:3均会落在一个节点槽上,因为取tid:9986做hash运算;

    D. Hash tags特点

      优点:将某一固定特征数据存储到一台实例上,避免逐个查询集群中实例;

      缺点:可能会导致数据集中在一个实例中,造成集群数据倾斜;

 

可参考:Redis集群监控

 

posted @ 2020-01-18 17:37  如幻行云  阅读(447)  评论(0编辑  收藏  举报