Redis 高可用之集群

1、简介

        在之前的文章里,通过主从复制和哨兵机制实现Redis 高可用架构,但是由于架构比较复杂,难以维护,引入集群架构模式,一个集群可以有多个 master ,一个master 可以有多个slave,集群支持故障转移机制,内置高可用支持,无需使用哨兵功能。

        Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis先对key使用crc16算法算出一个结果然后用结果对16384求余数[ CRC16(key) % 16384],这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。

2、集群搭建
2.1、集群搭建
# 1、构建集群命令
redis-cli -a 密码 --cluster create --cluster-replicas 1 192.168.30.88:6381 192.168.30.88:6382 192.168.30.89:6383 192.168.30.8:6384 192.168.30.90:6385 192.168.30.90:6386

--cluster-replicas 1  # 表示为每个master创建一个slave节点(6个节点三主三从)
# 2、查看主从复制关系
info replication
# 3、集群信息
cluster info
# 4、查看集群节点
cluster nodes
# 5、优化路由(当保存key的时候,slot不在当前节点会报错,添加-c参数)
redis-cli -a 密码 -p 端口 -c
# 6、查看key对应slot
cluster keyslot k1
# 7、节点从属调整/手动故障转移
cluster failover
2.2、集群扩容操作
# 1、增加节点到集群
redis-cli -a 密码 --cluster add-node 新节点ip:端口 集群里master的ip:端口
# 新节点ip:端口 (作为master 新增节点,此时未分配槽位)
# 集群里master的ip:端口 (原来集群领路人,引导新节点添加到集群)
# 2、检查集群
redis-cli -a 密码 --cluster check 集群里master的ip:端口
# 3、重新分配槽位
redis-cli -a 密码 --cluster reshard 集群里master的ip:端口
# 4、为新增master节点添加slave
redis-cli -a 密码 --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

注:扩容分配槽位,是从原有槽位划分出来的,不是再重新分配。

2.3、集群缩容操作
# 1、检查集群,获取slave节点的id
redis-cli -a 密码 --cluster check 从机ip:端口
# 2、删除从节点
redis-cli -a 密码 --cluster del-node 从机ip:端口 从机节点ID
# 3、将删除的节点槽位给指定节点
redis-cli -a 111111 --cluster reshard 指定节点ip:端口
# 4、将主节点删除
redis-cli -a 密码 --cluster del-node ip:端口 主节点ID
3、Redis 集群各种情况解释

1)、当 master 节点宕机时,其 slave 节点会变成 master 节点,当 master 节点重启后,以 slave 身份回归;

2)、Redis 集群不是强一致性,在特定条件下可能会丢失一些写命令;

3)、master 节点提供读写,slave 只提供读。

4)、Redis 为什么采用16384个槽位:因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽在消息头中最占空间的是myslots[CLUSTER_SLOTS/8]。 当槽位为65536时,这块的大小是: 65536÷8÷1024=8kb ;当槽位为16384时,这块的大小是: 16384÷8÷1024=2kb 。

4、总结

        本文详细介绍 Redis 集群含义,以及如何进行集群搭建、集群扩容、集群缩容进行详细操作说明,帮助大家快速完成集群搭建和 Redis 集群运维。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

相关推荐

  1. Redis的哨兵和实现

    2024-01-26 14:40:03       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-26 14:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-26 14:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-26 14:40:03       82 阅读
  4. Python语言-面向对象

    2024-01-26 14:40:03       91 阅读

热门阅读

  1. ubuntu 22.04 怎么安装websocat

    2024-01-26 14:40:03       56 阅读
  2. 【git】记录一个git error解决方法

    2024-01-26 14:40:03       54 阅读
  3. js中将回调地狱改装成promise方式的函数

    2024-01-26 14:40:03       53 阅读
  4. C语言sizeof 不是函数吗?

    2024-01-26 14:40:03       44 阅读
  5. YAML语法记录

    2024-01-26 14:40:03       55 阅读
  6. 关于SQLite 的下载与使用。配合python

    2024-01-26 14:40:03       60 阅读
  7. mysql面试题合集-分布式

    2024-01-26 14:40:03       54 阅读
  8. 玩转浏览器开发者工具

    2024-01-26 14:40:03       52 阅读
  9. shallowRef与shallowReactive

    2024-01-26 14:40:03       48 阅读
  10. IEC60870-5-104规约

    2024-01-26 14:40:03       48 阅读
  11. npm更换镜像

    2024-01-26 14:40:03       51 阅读