BA 罗斯蒙特 ™ 2460 现场通讯单元 Rosemount Tank Gau… · 罗斯蒙特™ 2460 现场通讯单元 ... 方案 4+4 现场端口 现场端口 现场端口 现场端口 主机端口
Sheepdog内部实现机制
description
Transcript of Sheepdog内部实现机制
![Page 1: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/1.jpg)
泰来 ( 刘源 )核心系统部
2012 年 1 月 10 日
开源分布式块存储Sheepdog 内部实现机制
![Page 2: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/2.jpg)
提纲
● Sheepdog 介绍● 整体架构● 节点管理● 数据管理● 本地存储(持久化)
![Page 3: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/3.jpg)
Sheepdog 介绍● 开源的分布式块存储
● 专为虚拟机提供块存储
● 无单点
● 低运维开销
– “ 零”配置
– 对内核文件系统无特性假设
– 节点变化无须人工参与即可恢复
– 数据动态均衡负载
– 支持虚拟机的热迁移、镜像快照、模板 & 克隆(快速安装部署)、集群快照
– 计算节点和数据节点混合模式
● 线性扩展,支持上千级别节点
![Page 4: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/4.jpg)
图片来自 http://www.osrg.net/sheepdog/
![Page 5: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/5.jpg)
整体架构
SheepGateway
VM
Sheepstore
SheepGateway
VM
SheepStore
SheepGateway
VM
SheepStore
SheepGateway
VM
Sheepstore
SheepGateway
VM
SheepStore
节点 A 节点 B 节点 C
![Page 6: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/6.jpg)
节点内部
VCPU VCPU
内核
QEMU虚拟机地址空间
PCPU PCPU
VM_ENTRYVM_EXIT
块设备模拟
Sheepdog 存储
读写请求
以太网
KVMeventfd
![Page 7: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/7.jpg)
Sheepdog 线程模型● 两种上下文
– 主线程上下文● 接收请求,唤醒处理函数
– group_handler() ,处理节点变化和广播消息– client_handler() ,处理 IO 和数据恢复、迁移等
请求
– 工作线程上下文● 12 个,其中 4 个专门处理 IO 请求, 4 个专门
处理 Gateway 请求
![Page 8: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/8.jpg)
逻辑处理模型● 两种上下文,主线程同工作线程无竞争的全局变量
● 将请求处理逻辑中需要串行化的逻辑放到主线程中,可以并行的逻辑放到工作线程中
– 多线程、无锁的节点变化处理逻辑、数据恢复、迁移逻辑
– 复杂的分布式算法简单化,根除死锁的可能性
– 容易验证算法的正确性
![Page 9: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/9.jpg)
节点管理● Sheepdog 只提供节点变化后的处理机制
– 节点变化的检测依赖外部实现
– 消息机制依赖外部实现
● 节点变化消息● 节点广播消息
● 支持两种模型
– 全对称 (依赖 Corosync ,运行于 Sheepdog 的地址空间)● 缺点:规模小 [<100]
● 优点:无需配置
– 单独的控制集群 (依赖 Accord* 或者 Zookeeper ,运行于独立地址空间)
● 缺点:需要配置控制集群
● 优点:规模大 [>1000]
*Accord 为 Sheepdog 项目的一个子项目
![Page 10: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/10.jpg)
节点变化的处理
● 节点加入时,内部逻辑需要一个特殊的 master 节点来处理新节点是否可以加入
– 集群主动或被动关闭后,重新启动集群,也是节点变化的处理过程
● 每一个节点都有一致的成员视图
● 目前可以处理多个节点同时离开或者加入的事件(比如同时有 A , B加入, C 离开)
![Page 11: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/11.jpg)
节点加入● 节点加入
– 分为两个阶段● 1 新加入节点发送加入请求● 2 master 节点检查系统状态,核查能否加入,如果能,则
广播一个新的视图,各个节点更新视图和状态
– 新节点加入时,在节点 1 和 2 之间 master 节点离开, mastership 自动转移,不会影响系统运行
● 新的 master 节点继续检查状态以及广播视图
A
B
Cjoin(C) A
B C
new_view(A,B,C)
1. 2.
![Page 12: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/12.jpg)
节点离开● 节点离开
– 外部的节点检测机制发送成员变化视图
– 各个节点更新视图和状态
● 当多个节点变化事件发生时,外部检测机制确保离开和加入的消息的顺序一致
– 剩下的节点和新加入的节点看见一致的视图
● 比如集群有 (A,B,C,D)四个节点, E 在加入的同时D 因事故离开,那么 (A,B,C,E)四个节点都将看到最终如下的视图
– {member(A,B,C,E), join(E), left(D)}– 产生一个还是多个视图变化消息跟外部检测机制相关
![Page 13: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/13.jpg)
虚拟节点与一致性哈希● Sheepdog采用虚拟节点和一致性哈希存储块对象
– 节点和数据都放到哈希环上
– 一个物理节点分散成多个节点均匀到环上
图片来自 http://www.paperplanes.de/
![Page 14: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/14.jpg)
节点变化的影响
● 节点加入,数据需要重新均衡– 虚拟节点和一致性哈希算法保证
● 数据均匀分布在各个物理节点● 很大程度上减少数据迁移
● 节点离开,数据拷贝需要恢复,保证数据冗余度
– 通过节点变化的历史信息恢复数据
![Page 15: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/15.jpg)
数据管理● 虚拟机镜像被切分为 4M 大小的对象
– 对象稀疏存储– 每个对象由唯一的 64位数字索引
– 每个对象有多个拷贝复制到节点上
图片来自 http://www.osrg.net/sheepdog/
![Page 16: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/16.jpg)
数据的读写
● 由于一个镜像只有一个虚拟机操作,所以更新拷贝时可以并行执行写操作
● 读一个对象,可以从任何一个拷贝中返回
![Page 17: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/17.jpg)
拷贝修复● 分布式系统中,拷贝的修复通常有两种
– 急修复:收到节点离开消息,立刻进行修复● 优点:实现简单● 缺点:当离开的节点回来之后,造成带宽的浪费
– 懒修复:● 优点:能区分节点的临时错误和永久错误,减少带宽的浪费
● 缺点 :增加算法逻辑复杂度– 如何处理关于临时离开节点的数据请求
Sheepdog 目前采用的方法
![Page 18: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/18.jpg)
拷贝修复逻辑● 对象的时间轨迹
– 用 epoch 来记录每一次发生节点变化后的新视图
– 通过 epoch 来区分不同时间的数据对象
– 每一个对象都有一个以 epoch 为点的时间轨迹
E1
E2
E3
E4
A B C D F
D join
F join时间
Init: (A,B,C), 3份拷贝
Latest!
C left
![Page 19: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/19.jpg)
本地存储 -农场● 设计类似 GIT ,将数据对象分为普通对象和快照对象
– 普通对象存于当前活动目录,平时的读写操作将操作普通对象
● 拷贝恢复或迁移到当前活动目录
– 当系统发生节点变化时,将普通对象存入仓库,类似快照操作,各个数据拷贝都需要根据一致性哈希重新计算位置
● 恢复逻辑保证节点变化时,上层逻辑保证只存取恢复后的对象
● 节点变化时,集群仍能响应虚拟机的读写请求
● 快照对象去冗余,相同内容的对象指向同一个仓库文件
![Page 20: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/20.jpg)
农场架构
仓库当前活动
目录
SheepGateway
读写
节点变化或者用户集群快照请求
![Page 21: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/21.jpg)
新特性开发列表● 区分临时错误结点和永久错误节点
● 加强网裂 (network partition) 处理能力
● 本地 Cache 和 镜像预读到本地节点
● 高性能动态内部 Trace 机制
● 集群合并操作
● 实现子集群概念
● 增加更多后端 ( 如 LevelDB) 支持
● 高性能异步日志机制
● 更多需求驱动
表示在开发中
![Page 22: Sheepdog内部实现机制](https://reader034.fdocuments.net/reader034/viewer/2022052215/558a8e59d8b42a8f7a8b46b0/html5/thumbnails/22.jpg)
问答