| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Redis Clustor(集群) -> 正文阅读 |
|
[大数据]Redis Clustor(集群) |
目录 一、Redis 数据分区(虚拟槽分区)Redis Clustor 槽范围是0-16383。槽是集群内数据管理和迁移的基本单位,所有的键根据哈希函数映射到0-16383整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。 node(节点)→slot(槽)→key→value 二、集群功能限制1.mset、mget只支持在同一个槽内的key,因为不在一个槽内的key可能存在于不同节点上 2.key的事务操作只能在同一个节点上,不同节点不能使用事务操作 3.不能将一个大的键值对象hash、list等映射到不同节点上 4.单机下的redis支持16个数据库,集群模式下只能使用一个数据库,即db0\ 5.复制结构只支持一层,从节点只能复制主节点 三、搭建集群1.准备节点Redis集群一般由多个节点组成,节点数量至少为6个才能保证组成完整高可用的集群。每个节点需要开启配置 cluster-enabled yes,让Redis运行在集群模式下。建议为集群内所有节点统一目录,一般划分为三个目录:conf、data、log,分别存放配置、数据和日志相关文件。 2.节点握手节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。由客户端发起命令。例:cluster meet 127.0.0.1 6380 客户端让127.0.0.1 所代表的节点6379向6380节点发起握手
我们只需要在集群内任意节点上执行cluster meet 命令加入新节点,握手状态会通过消息在集群内传播,这样其他节点会自动发现新节点并发起握手流程。节点建立握手之后集群还不能正常工作,处于下线状态,数据读写都被禁止 3.分配槽Redis集群把所有数据映射到16384个槽中,每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过cluster addslots命令为节点分配槽 例:redis-cli? ?-h? 127.0.0.1? -p? 6379? cluster? addslots? {0...5461} 槽全部分配给节点后,当前集群状态是OK,集群进入在线状态 4.集群模式每个负责处理槽的节点为主节点,应该具有从节点,保证当它出现故障时可以自动进行故障转移。从节点负责复制主节点槽信息和相关的数据,使用cluster? replicate? {nodeId} 命令让一个节点成为从节点 5.搭建集群注意事项
6.节点通信Redis 集群采用P2P的Gossip协议,原理是节点彼此不断通信交换信息,一段时间之后所有的节点都会知道集群完整的信息,这种方式类似流言传播。通信过程:
Gossip消息:ping消息、pong消息、meet消息、fail消息
通信流程:接收ping/meet消息→解析消息头和消息体→判断是否为新节点→如果是发送meet消息进行节点握手→如果不是更新该节点状态到本地列表→最终都回复pong消息 节点选择流程:节点定时任务→每秒执行10次间隔1秒→选择发送节点(1.每秒随机5次找出最久没有通信节点 2.最后通信时间大于node-timeout/2)→ping消息数据(包含1.自身节点信息 2. 1/10其他节点信息)→发送ping消息 四、集群伸缩1.伸缩原理Redis集群提供了灵活的节点扩容和收缩方案,在不影响对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。其中原理可抽象为槽盒对应数据在不同节点之间灵活移动 2.扩容集群准备新节点→加入集群→迁移槽和数据 迁移槽和数据:
3.收缩集群收缩集群意味着缩减规模,需要从现有集群中安全下线部分节点。
五、请求路由1.请求重定向在集群模式下,Redis接收任何键相关的命令时首先计算键对应的槽,在根据槽找出对应的节点,如果节点是自身,则处理命令;否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为MOVED重定向。 重定向信息包含了键所对应的槽以及负责该槽的节点地址,根据这些信息客户端可以向正确的节点发送请求 2.计算槽Redis首先需要计算键所对应的槽,根据键的有效部分使用CRC16函数计算出散列值,再取对16383的余数,使每个键都可以映射到0-16383槽范围内。其中如果键内容包含{和}大括号字符,则计算槽的有效部分是括号内的内容;否则采用键的全内容计算槽 其中键内部使用大括号包含的内容又叫做hash_tag,它提供不同的键可以具备相同slot功能 例如:在集群模式下使用mget等命令优化批量调用时,键列表必须具有相同的slot,否则会报错。这时可以利用hash_tag让不同的键具有相同的slot达到优化的目的 mget? user : {10086} : friends? user : {10086} : videos 六、故障转移1.故障发现Redis集群内节点通过ping/pong消息实现节点通信,消息可以传播节点槽信息、主从状态、节点故障等。因此故障发现也是通过消息传播机制实现的,主要环节:主观下线(pfail)和客观下线(fail)
主观下线流程:
客观下线流程:
2.故障恢复如果持有槽的主节点故障下线后,它的所有从节点承担故障恢复的义务,当从节点通过内部定时任务发现自身复制的主节点进入客观下线时,将会触发故障恢复流程
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:56:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |