Curve 块存储已在生产环境上线使用近三年,经受住了各种异常和极端场景的考验,性能和稳定性均超出核心业务需求预期

网易云音乐背景

网易云音乐是中国领先的在线音乐平台之一,为音乐爱好者提供互动的内容社区。网易云音乐打造了一个大型、富有活力且坚固、快速成长的业态,为用户提供以社区为中心的在线音乐服务及社交娱乐服务。其标志性重点产品包括 “网易云音乐” 及附属的社交娱乐产品,如 “LOOK 直播”、“声波” 及 “音街”,通过科技驱动的工具让音乐爱好者自主发掘、享受、分享并创作不同的音乐和音乐衍生内容,并与他人互动。

云音乐云盘业务背景

云音乐使用云盘的业务主要包括主站、UGC、曲库等 Java 应用,其中主站是云音乐核心业务,需要提供最高等级的 SLA 保障(年可用率 >=99.99%),面对提供上亿级用户量稳定的云音乐体验,这一直以来也是我们的重难点。2019 年之前云音乐主要使用 Ceph 云盘,众所周知,Ceph 在大规模场景下存在性能缺陷,且很难保证我们在各种异常 (坏盘慢盘、存储机宕机、存储网络拥塞等) 场景下云盘 IO 响应时延不受影响;Ceph 云盘的 IO 抖动问题,我们曾尝试花很多人力精力做优化改造,但都只是稍微有所缓解,无法彻底解决;性能问题也投入大量人力进行分析优化,但仍然不能达到预期,因此我们才立项了解 Curve 块存储分布式存储系统。

Curve 块存储介绍

Curve 块存储可以良好适配主流云计算平台,并且具备高性能、易运维、稳定不抖动等优势。我们在实际应用中,使用 Curve 块存储对接 Cinder 作为云主机云盘存储后端,对接 Nova 作为云主机系统盘,对接 Glance 作为镜像存储后端。在创建云主机过程中,Nova 会通过 Curve 块存储提供的 Python SDK 克隆出新卷作为云主机系统盘使用。在创建云盘过程中,Cinder 会通过 Python SDK 创建空卷或者通过已有的卷快照克隆出新卷,之后可以挂载到云主机上作为云盘使用。云主机使用 Libvirt 作为虚拟化管控服务,使用 QEMU/KVM 作为虚拟化引擎。Curve 块存储为 Libvirt/QEMU 提供了驱动库,编译后就可以直接使用 Curve 卷作为远端存储,不需要把 Curve 块存储卷挂载到本地。

为什么选择 Curve

1. 业务侧

i. 根据我们云音乐应用场景,Ceph 云盘主要存在二大痛点:

  • 性能差:由于单卷性能差(主要是 IO 时延高,IOPS 上不去,并且容易受到集群内其他高负载卷的影响),因此只能用于系统盘,或者作为云盘供应用打印日志,无法支撑中间件业务使用。

  • IO 抖动:经过我们观察发现 IO 时延超出 2s 就可能会导致磁盘 util 100%,业务就会大面积告警,请求堆积,严重情况下会引发雪崩效应;根据前 2 年的观察,Ceph 云盘 IO 抖动的非常频繁(基本每月都有),抖动时长也达分钟级,因此有很多核心应用都切换到了本地存储来规避类似问题。

ii. Curve 云盘优势:

  • 抖动:自从使用 Curve 云盘后,磁盘 IO util 监控再也没有出现过因分布式存储系统导致的 100% 告警,业务运行的稳定性得到极大提升,核心业务也逐步迁回了 Curve 云盘(毕竟云盘的高空间利用率、可靠性、可迁移性、快速恢复能力也是业务非常看重的)。

  • 性能:同等硬件下,Curve 单卷性能是 Ceph 卷的 2 倍 +,时延也大大低于 Ceph,具体性能对比可以参考下图:

2. 运维侧

i. 根据我们云音乐运维场景,Ceph 的痛点主要有如下:

  • 服务升级:常见的需要升级客户端的场景包括 bug 修复、新功能增强以及版本升级这几个方面,我们遇到过一个 Ceph 社区消息模块 32 位序号溢出的 bug,该 bug 会在长期运行的客户端出现,造成 IO hang,客户端和服务端都需要更新版本才能解决。更新客户端的时候有两种选择,一是重启云主机的 QEMU 进程,二是对云主机执行热迁移操作 live migration,这两个操作在少量云主机场景下可行性比较高,但如果对成百上千台云主机进行类似操作,显然可操作性非常低,业务显然无法接受。另外服务端升级在重启 OSD 进程时也会造成一定的 IO 抖动,需要在业务低峰期操作,并且需要业务临时关闭磁盘 util 告警。

  • 性能:运维人员主要关注存储集群整体性能,若集群总容量和总性能不匹配,容易导致容量充足的情况下性能却不足的问题,要么少创建卷导致容量浪费,要么继续创建卷但是会影响单卷的 IO 时延和吞吐,另外 Ceph 集群卷数量到达一定规模后,随着卷数量的增加,其集群整体性能也是逐渐下降的,这就导致单卷的性能受到更大的影响。

  • 算法:受限于 CRUSH 算法限制,Ceph 的 OSD 之间数据分布非常不均衡,空间浪费严重,据我们观察,最高和最低的 OSD 空间使用率差值可以达到 50%,经常需要进行数据均衡操作,但在数据均衡过程中会产生大量的数据迁移操作,导致 IO 抖动,另外数据均衡也不能完美的解决 OSD 容量使用不均衡问题。

  • IO 抖动:坏盘换盘,节点宕机,高 IO 负载,扩容(不新增 pool,新增太多 pool 会导致 OpenStack 维护变复杂)数据均衡,网卡丢包,慢盘等等。

ii. 相对来说 Curve 在上述几个方面具备显著优势:

  • 服务升级:客户端支持热升级,操作过程中 QEMU 进程不需要重启,也不需要迁移,毫秒级影响对云主机内业务几乎无感,热升级相关架构设计可以参考①。Curve 服务端升级时,得益于 quorum 机制的一致性协议 raft,只要做到按副本域升级,就可以保证对业务 IO 的影响在秒级,IO 时延不超过 2s 就不会导致 util 100%。

  • 性能:Curve 集群可以在同等容量规模下,创建更多的卷,并且保持稳定的性能输出。

  • 算法:Curve 数据分配由中心化的 MDS 服务进行,可以保证非常高的均衡性,最高和最低的 chunkserver 空间利用率偏差不超过 10%,也就不需要做数据均衡操作。

  • IO 抖动:Ceph 云盘容易发生 IO 抖动的场景下,Curve 云盘表现更稳定,Curve VS Ceph 具体如下图:

使用 Curve 落地成果

Curve 块存储已在生产环境上线使用近三年,经受住了各种异常和极端场景的考验,性能和稳定性均超出核心业务需求预期,常见故障场景下未产生明显 IO 抖动,服务端及客户端版本升级也未影响业务正常运行,这充分证明我们当时的选择是正确的,另外还要感谢 Curve 团队的同学在我们使用的过程中给予的帮助。目前:云音乐使用 Curve 块存储作为云主机的云盘和系统盘,其中系统盘通常为固定容量 40GB 或 60GB 两种规格,云盘容量最小 50GB,最大支持 4TB(此为软性限制,Curve 云盘实际支持创建 PB 级卷)。

后续规划

结合 Curve 块存储方面:

  • 探索基于 Curve 块存储的云原生中间件场景,例如将改造后的 Redis、Kafka、消息队列等服务运行在 Curve 块存储卷上,减少故障切换时间。

  • 上线基于 CurveBS+PolarFS+MySQL 的云原生数据库。

  • 其他存量使用 Ceph 云盘、本地存储的云主机切换到 Curve 块存储卷。

目前 Curve 团队也在全力开发共享文件存储服务,网易内部基于 OpenStack 的私有云 2.0 平台已经逐渐演进到基于 Kubernetes 的 3.0 平台,业务对于 ReadWriteMany 的类型的 PVC 卷的需求已经越来越迫切,Curve 团队开发了 Curve 分布式共享文件系统,该系统支持将数据存储到 Curve 块存储后端或者兼容 S3 协议的对象存储服务,后续也将尽快上线使用。

参考:

① https://github.com/opencurve/curve/blob/master/docs/cn/nebd.md

Curve 替换 Ceph 在网易云音乐的实践的更多相关文章

  1. RocketMQ 在网易云音乐的实践

    本文作者:蒋星韬,网易云音乐服务端开发工程师. 云音乐线上场景众多,比如直播.评论.广告,各个业务线都会有消息场景比如发奖券,也会有延迟消息和事务消息场景,以及大数据做埋点数据.数据清洗.离线处理等. ...

  2. Python爬虫小白入门(六)爬取披头士乐队历年专辑封面-网易云音乐

    一.前言 前文说过我的设计师小伙伴的设计需求,他想做一个披头士乐队历年专辑的瀑布图. 通过搜索,发现网易云音乐上有比较全的历年专辑信息加配图,图片质量还可以,虽然有大有小. 我的例子怎么都是爬取图片? ...

  3. 对网易云音乐参数(params,encSecKey)的分析

    我们如果对网易云音乐进行爬虫的话,我们会发现,提交的参数是(params,encSecKey),然而这两个参数是一串很长的东西 我们要对网易云进行爬虫,那么就一定要将这两个参数弄明白,然后才可以进行爬 ...

  4. 【java+selenium】网易云音乐刷累计听歌数

    背景应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了.当时试了下,直接一下子刷了有好几万.悲 ...

  5. python爬取网易云音乐歌曲评论信息

    网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了“它比我还懂我的音乐喜好”.“小清新的界面设计”就是它独有的评论区了——————各种故事汇,各种金句频出.我们可以透过歌曲的评 ...

  6. 网易云音乐 歌词制作软件 BesLyric (最新版本下载)

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦!Beslyric 为你排忧解难! 本文 ...

  7. 网易云音乐PC客户端加密API逆向解析

    1.前言 网上已经有大量的web端接口解析的方法了,但是对客户端的接口解析基本上找不到什么资料,本文主要分析网易云音乐PC客户端的API接口交互方式. 通过内部的代理设置,使用fiddler作为代理工 ...

  8. 基于Taro与Typescript开发的网易云音乐小程序

    基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...

  9. 基于Taro与typescript开发的网易云音乐小程序(持续更新)

    基于Taro与网易云音乐api开发,技术栈主要是:typescript+taro+taro-ui+redux,目前主要是着重小程序端的展示,主要也是借此项目强化下上述几个技术栈的使用,通过这个项目也可 ...

  10. arch linux下网易云音乐运行没反应,只能使用root用户运行

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/netease_music_can_not_open 最近打开网易 ...

随机推荐

  1. 4G EPS 中的消息类型

    目录 文章目录 目录 消息 MIB(主消息块) SIBs(多个系统消息块) 系统消息的映射和调度 系统信息的更改通知 消息 LTE 的系统消息是蜂窝网络与 UE 互相交互的与 LTE 系统相关的.特殊 ...

  2. 移动通信网络中的 3A 实现

    目录 文章目录 目录 3A RADIUS Diameter 基本概念 基本协议 应用协议 freeDiameter 3A AAA,即认证(Authentication).授权(Authorizatio ...

  3. OAI SDR LTE 基站部署

    目录 文章目录 目录 硬件设备要求 物料购买 部署架构图 安装 LTE/EPC 前期准备 运维相关 操作系统要求 内核要求 CPU Frequency scaling,将 CPU 频率打满 eNode ...

  4. 一套完整的中小级别的企业级监控prometheus

    一   相信有很多博客都已经详细的说明了prometheus的作用以及相关的作用以及原理,这里不在赘述,仅仅从部署和配置2个方面来记录一下,为公司产品组搭建的prometheus告警平台的过程以及踩过 ...

  5. Kubernetes 数据存储:从理论到实践的全面指南

    本文深入解析 Kubernetes (K8S) 数据存储机制,探讨其架构.管理策略及最佳实践.文章详细介绍了 K8S 数据存储的基础.架构组成.存储卷管理技巧,并通过具体案例阐述如何高效.安全地管理数 ...

  6. VSCode 圈复杂度插件 CodeMetrics

    前言 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准.它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测 ...

  7. Android OpenMAX(七)OMX Service

    上一篇文章我们分析了Android使用OMXStore来管理平台上的软件和硬件编解码组件,这一篇我们再向上一层了解应用层是如何获取调用OMXStore管理组件的.本篇文章代码参考自: framewor ...

  8. win11通过注册表禁用鼠标右键

    本经验分为5个步骤,详情如下. 工具/原料 华硕K5 win11专业版21H2 注册表22000.556 方法/步骤   同时按下"win"+"R"键,打开运行 ...

  9. Anaconda安装Python的seaborn库

      本文介绍在Anaconda的环境中,安装Python语言中,常用的一个绘图库seaborn模块的方法.   seaborn模块是基于Matplotlib的数据可视化库,它提供了一种更简单.更漂亮的 ...

  10. webpack externals忽略不打入的包

    例如项目中使用从 CDN 引入 jQuery,而不是把它打包进来使用 import $ from 'jquery' webpack.config.js externals: { jquery: 'jQ ...