Curve 分布式存储设计
分布式存储设计 程义 — Curve Maintainer XAgenda 第二 第三 第四 第一 Curve的由来 Curve的设计目标 Curve块存储 和 Curve文件存储 Curve社区Curve的由来 1. 代码复杂/代码量大 2. 运维难度高 3. 无法满足高的性能需求Curve的设计目标 1. Curve云原生软件定义存储 2. Curve块存储 Curve文件存储 4. 高性能,易运维,云原生Curve块存储 1. 高性能分布式共享数据库场景 2. Curve块存储提供底层分布式共享存储 3. Polardb for PostgreSQL提供上层高性能数 据库服务 4. 性能测试 1. benchmarkSQL 每分钟事务数提升39% 2. pgbench 延迟降低21% TPS提升26% 研究现状Curve块存储 1. 分布式块存储服务 分布式块存储服务 2. KVM块存储服务 3. iSCSI协议 4. 容器云块存储(CSI) 应用场景Curve块存储 1. 高可用性/高可靠性 (易运维) 2. RAFT一致性协议 3. CopySet分配算法 4. 拓扑结构 5. 高性能 6. chunkfilepool (降低写放大) 7. data stripe (增大并发) 8. zerocopy 9. 云原生0 码力 | 20 页 | 4.13 MB | 5 月前3Raft在Curve存储中的工程实践
分布式存储系统,支持 块存储 和 文件存储 2018~2021 Curve块存储 2021~2022 Curve文件存储 • 基于Openstack构建云计算平台 • 底层存储使用Ceph块存储 • 稳定性挑战 • 算力平台kubernetes的迅速发展 • AI/大数据业务的快速增长 • 存储使用Ceph文件存储/HDFS • 成本/性能挑战 Curve块存储和文件存储均采用raft协议整体架构 对接OpenStack平台为云主机提供高性能块 存储服务 • 对接Kubernetes为其提供RWO、RWX等类 型的持久化存储卷 • 对接PolarFS作为云原生数据库的高性能存储 底座,完美支持云原生数据库的存算分离架 构 • Curve作为云存储中间件使用S3兼容的对象 存储作为数据存储引擎,为公有云用户提供 高性价比的共享文件存储 • 支持在物理机上挂载使用块设备或FUSE文件 系统开源社区 致已经被提交,系统切换到新的配置(new)。RAFT协议简介 日志压缩 • 日志会不断增长,占用空间 • 采用快照的方式压缩日志 • 在某个时间点,整个系统的状态都以快照的形式写入 到稳定的持久化存储中 • 完成一次快照之后,删除时间点之前的所有日志和快 照。BRAFT简介 • raft协议提出之后,涌现出了非常多的实现,比如etcd,braft,tikv等。 • braft是raft的一0 码力 | 29 页 | 2.20 MB | 5 月前3新一代云原生分布式存储
新一代云原生分布式存储—Curve 上 李小翠 网易数帆存储团队分布式存储介绍 01 存储的发展 | 分布式存储的分类 | 分布式存储的要素 02 03 04 Ceph 架构简介 | 场景介绍 | 使用中的问题 Curve 架构简介 | 数据对比 | 应用情况 FAQ 答疑存储的发展 互联网时代,数据大爆炸 大型主机 成本高 单点问题 扩容困难 各存储设备通过网络互联 各存储设备通过网络互联 大规模 弹性扩容 底层构建在分布式存储之上 云的概念 成本:共用基础设施 弹性:随意扩缩容 速度:更快的构建发布业务 底层构建在分布式存储之上 云原生的概念: 易用性:跨平台,超融合,弹性 小型主机 容量有限分布式存储的分类 按照各种应用场景所需的存储接口分类 对象 存储 文件 存储 块存储 接口为简单的 Get、PUT、DEL 和其他扩展 通常意义是支持 对指定地址空间进行随机读写 传统意义的块存储:磁盘分布式存储的要素 如何构建分布式文件系统? 以分布式块存储为例。 •提供大容量的块设备 •可以在指定地址空间内随机读写 write(offset, len) •服务质量要求:数据不能丢、服务随时可用、弹性扩缩容 要什么 •成百上千台存储节点 •磁盘故障、机器故障、网络故障概率性发生 有什么 分布式存储系统需要满足接口需求,并且有持续监控、错误检测、容错与自动恢复的能力0 码力 | 29 页 | 2.46 MB | 5 月前3Rust 程序设计语言 简体中文版 1.85.0
出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎! Rust 程序的结构 现在,让我们回过头来仔细看看这个 “Hello, world!” 程序。这是第一块拼图: fn main() { } 这几行定义了一个名叫 main 的函数。main 函数是一个特殊的函数:在可执行的 Rust 程序中, 它总是最先运行的代码。第一行代码声明了一个叫做 main 我们现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果,这个函数会返回一个 String 的新实例。String 是一个标准库提供的字 符串类型,它是 UTF-8 编码的可增长文本块。 ::new 那一行的 :: 语法表明 new 是 String 类型的一个 关联函数(associated function)。关 联函数是针对某个类型实现的函数,在这个例子中是 String。这个 println! 占位符打印值 除了位于结尾的右花括号,目前为止就只有这一行代码值得讨论一下了: println!("You guessed: {guess}"); 这行代码现在打印了存储用户输入的字符串。{} 这对大括号是一个占位符:把 {} 想象成小蟹 钳,可以夹住合适的值。当打印变量的值时,变量名可以写进大括号中。当打印表达式的执行 结果时,格式化字符串(format stri0 码力 | 562 页 | 3.23 MB | 8 天前3CurveFS方案设计
数据结构 索引设计 文件空间管理 开发计划及安排 背景 为更好的支持云原生的场景,Curve需要支持高性能通用文件系统,其中高性能主要是适配云原生数据库的场景。当前Curve是实现了块存储,向上提供块设备服务,CurveFS会基于此实现。第一阶段的目标是实现 满足数据库场景的文件接口。 调研 开源fs 当前对已有的开源分布式文件系统进行了调研,主要包括系统架构,元数据内存结构,元数据持久化,调研文档如下: 计会涉及到多次rpc的交互。这里需要确认的一点是:我们需要怎样的元数据节点的性能? 可行性分析 方案对比 根据上述调研和测试结果,我们考虑了三种curvefs的元数据设计方案: CurveFS kv方案设计 curve实现块设备时,元数据不是扁平化的设计,而是采用来有目录层级的 namespace 方式,namespace 已经实现了 fs 元数据管理的雏形,具备了基本的元数据管理功能。(当时为什么要设计为 namespace 的元数据缓存使用的 lru cache,因此 list 只能依赖 etcd 的 range 获取方式。如果需要对 list 加速,需要新的缓存结构 c. 扩展性/可用性/可靠性 依赖于第三方kv存储,目前是etcd CurveFS 单机内存元数据设计 类似 fastcfs 和 moosefs 的元数据设计方式,采用通用的 dentry,inode 两层映射关系,所有的元数据都缓存在内存中,持久化在0 码力 | 14 页 | 619.32 KB | 5 月前3Python 标准库参考指南 3.11.10
object;如果返回的值等于 sentinel,则 会引发StopIteration,否则将返回该值。 另请参阅迭代器类型。 适合iter() 的第二种形式的应用之一是构建块读取器。例如,从二进制数据库文件中读取固定宽度 的块,直至到达文件的末尾: 16 Chapter 2. 内置函数 The Python Library Reference, 发行版本 3.11.10 from functools 虽然被称为函数,list 实际上是一种可变序列类型,详情请参阅列表 和序列类型 --- list, tuple, range。 locals() 更新并返回表示当前本地符号表的字典。在函数代码块但不是类代码块中调用locals() 时将返回自 由变量。请注意在模块层级上,locals() 和globals() 是同一个字典。 备注: 不要更改此字典的内容;更改不会影响解释器使用的局部变量或自由变量的值。 关。 buffering 是一个可选的整数,用于设置缓冲策略。传入 0 来关闭缓冲(仅在二进制模式下允许),传 入 1 来选择行缓冲(仅在文本模式下写入时可用),传一个整数 > 1 来表示固定大小的块缓冲区的字 节大小。注意这样指定缓冲区的大小适用于二进制缓冲的 I/O, 但 TextIOWrapper (即用 mode='r+' 打开的文件) 会有另一种缓冲。要禁用 TextIOWrapper 中的缓冲,请考虑为io0 码力 | 2399 页 | 11.19 MB | 9 月前3Python 标准库参考指南 3.12
Python 解释器中;另一些模块则是用 Python 编写并以源码形式导入。有些模块提供专用于 Python 的接 口,例如打印栈追踪信息;有些模块提供专用于特定操作系统的接口,例如操作特定的硬件;另一些模 块则提供针对特定应用领域的接口,例如万维网。有些模块在所有更新和移植版本的 Python 中可用;另 一些模块仅在底层系统支持或要求时可用;还有些模块则仅当编译和安装 Python 时选择了特定配置选项 object;如果返回的值等于 sentinel,则会引发StopIteration,否则将返回该值。 另请参阅迭代器类型。 适合iter() 的第二种形式的应用之一是构建块读取器。例如,从二进制数据库文件中读取固定宽 度的块,直至到达文件的末尾: from functools import partial with open('mydata.db', 'rb') as f: for block 关。 buffering 是一个可选的整数,用于设置缓冲策略。传入 0 来关闭缓冲(仅在二进制模式下允许),传 入 1 来选择行缓冲(仅在文本模式下写入时可用),传一个整数 > 1 来表示固定大小的块缓冲区的字 节大小。注意这样指定缓冲区的大小适用于二进制缓冲的 I/O, 但 TextIOWrapper (即用 mode='r+' 打开的文件) 会有另一种缓冲。要禁用 TextIOWrapper 中的缓冲,请考虑为io0 码力 | 2253 页 | 11.81 MB | 9 月前3Python 标准库参考指南 3.12
Python 解释器中;另一些模块则是用 Python 编写并以源码形式导入。有些模块提供专用于 Python 的接 口,例如打印栈追踪信息;有些模块提供专用于特定操作系统的接口,例如操作特定的硬件;另一些模 块则提供针对特定应用领域的接口,例如万维网。有些模块在所有更新和移植版本的 Python 中可用;另 一些模块仅在底层系统支持或要求时可用;还有些模块则仅当编译和安装 Python 时选择了特定配置选项 object;如果返回的值等于 sentinel,则会引发StopIteration,否则将返回该值。 另请参阅迭代器类型。 适合iter() 的第二种形式的应用之一是构建块读取器。例如,从二进制数据库文件中读取固定宽 度的块,直至到达文件的末尾: from functools import partial with open('mydata.db', 'rb') as f: for block 关。 buffering 是一个可选的整数,用于设置缓冲策略。传入 0 来关闭缓冲(仅在二进制模式下允许),传 入 1 来选择行缓冲(仅在文本模式下写入时可用),传一个整数 > 1 来表示固定大小的块缓冲区的字 节大小。注意这样指定缓冲区的大小适用于二进制缓冲的 I/O, 但 TextIOWrapper (即用 mode='r+' 打开的文件) 会有另一种缓冲。要禁用 TextIOWrapper 中的缓冲,请考虑为io0 码力 | 2253 页 | 11.81 MB | 9 月前3Python 标准库参考指南 3.10.15
Python 解释器中;另一些模块则是用 Python 编写并以源码形式导入。有些模块提供专用于 Python 的接 口,例如打印栈追踪信息;有些模块提供专用于特定操作系统的接口,例如操作特定的硬件;另一些模 块则提供针对特定应用领域的接口,例如万维网。有些模块在所有更新和移植版本的 Python 中可用;另 一些模块仅在底层系统支持或要求时可用;还有些模块则仅当编译和安装 Python 时选择了特定配置选项 object;如果返回的结果是 sentinel 则触 发StopIteration,否则返回调用结果。 另请参阅迭代器类型。 适合iter() 的第二种形式的应用之一是构建块读取器。例如,从二进制数据库文件中读取固定宽 度的块,直至到达文件的末尾: from functools import partial with open('mydata.db', 'rb') as f: for block 虽然被称为函数,list 实际上是一种可变序列类型,详情请参阅列表 和序列类型 --- list, tuple, range。 locals() 更新并返回表示当前本地符号表的字典。在函数代码块但不是类代码块中调用locals() 时将返 回自由变量。请注意在模块层级上,locals() 和globals() 是同一个字典。 注解: 不要更改此字典的内容;更改不会影响解释器使用的局部变量或自由变量的值。0 码力 | 2072 页 | 10.39 MB | 9 月前3Python 标准库参考指南 3.8.20
Python 解释器中;另一些模块则是用 Python 编写并以源码形式导入。有些模块提供专用于 Python 的接 口,例如打印栈追踪信息;有些模块提供专用于特定操作系统的接口,例如操作特定的硬件;另一些模 块则提供针对特定应用领域的接口,例如万维网。有些模块在所有更新和移植版本的 Python 中可用;另 一些模块仅在底层系统支持或要求时可用;还有些模块则仅当编译和安装 Python 时选择了特定配置选项 用结果。 13 The Python Library Reference, 发布 3.8.20 另请参阅迭代器类型。 适合iter() 的第二种形式的应用之一是构建块读取器。例如,从二进制数据库文件中读取固定宽 度的块,直至到达文件的末尾: from functools import partial with open('mydata.db', 'rb') as f: for block 虽然被称为函数,list 实际上是一种可变序列类型,详情请参阅列表 和序列类型 --- list, tuple, range。 locals() 更新并返回表示当前本地符号表的字典。在函数代码块但不是类代码块中调用locals() 时将返 回自由变量。请注意在模块层级上,locals() 和globals() 是同一个字典。 注解: 不要更改此字典的内容;更改不会影响解释器使用的局部变量或自由变量的值。0 码力 | 1927 页 | 9.69 MB | 9 月前3
共 137 条
- 1
- 2
- 3
- 4
- 5
- 6
- 14