diff --git a/404.html b/404.html index 6e63540..0ef7728 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ 找不到页面 | Curve Book - - + +
跳到主要内容

找不到页面

我们找不到您要找的页面。

请联系原始链接来源网站的所有者,并告知他们链接已损坏。

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-01-12.html b/Community/Double-Week-Meetings/01-2023/2023-01-12.html index 75a2eb5..56a3637 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-01-12.html +++ b/Community/Double-Week-Meetings/01-2023/2023-01-12.html @@ -4,13 +4,13 @@ 2023-01-12 | Curve Book - - + +
跳到主要内容

2023-01-12

时间

2023/01/12 19:00-19:30

加入会议

会议主题:curve双周会
会议时间:2023/01/12 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京
重复周期:2022/10/20-2023/07/27 19:00-19:30, 每两周 (周四)

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/DckjtgWnOM1o

#腾讯会议:493-3764-3146

会议内容

一、近期工作

主要内容

  1. curvebs/mds: add curvebs logicpool io metric
  2. curvebs/mds: add cluster io metrics
  3. curvebs/common: some mirror fixes and optimizations
  4. curvebs 性能调优指南
  5. avoid memcpy when using RocksDB slice

curve 版本

release2.4 已完成版本测试,预计这周发布

release2.5

详见 ChangeLog v2.5

bug修复

具体查阅开源周报

二、开源社区

curve开源周报

OpenCurve公众号文章:

关注OpenCurve公众号,查看更多Curve文章。

答疑 & 交流

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-02-09.html b/Community/Double-Week-Meetings/01-2023/2023-02-09.html index 736d672..9bde893 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-02-09.html +++ b/Community/Double-Week-Meetings/01-2023/2023-02-09.html @@ -4,13 +4,13 @@ 2023-02-09 | Curve Book - - + +
跳到主要内容

2023-02-09

时间

2023/02/09 19:00 ~ 20:00

加入会议

W 邀请您参加腾讯会议网络研讨会(Webinar)
会议主题:Curve 社区双周会|2023 Roadmap 解读
会议时间:2023/02/09 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京

点击专属链接入会,或添加至会议列表:
https://meeting.tencent.com/dw/8VUPUacQw4iR

#腾讯会议:792-313-318

复制该信息,打开手机腾讯会议即可参与

会议内容

一、Curve 2023 Roadmap

Curve Roadmap 2023

二、近期工作

已完成

  1. CurveFS 2.4 版本基本测试完成,CHANGELOG of v2.4
    • 新增CurveFS数据预热warmup功能
      • 主动通过命令行将指定文件/文件夹/文件列表文件中的内容加载进本地缓存中,以加速后续的访问请求
    • 优化CurveFS元数据均衡功能
      • 优化部分场景下元数据不均衡的问题
    • 升级aws s3 sdk至v1.9.x版本
      • 新的sdk使用eventloop的模型替换老sdk的threadpool模型
  2. curvefs/client:optimize warmup performance
  3. curvefs/tools-v2:fix warmpup single file
  4. docs: add .clangd template and configuration guide
  5. add clang-format and add some info to dev guides
  6. curvefs: should release s3adapter if we donot need compact
  7. (fix)fixcurvefs/client: fix client core dump
  8. curvebs/mds: constrains stripe in one segment
  9. QEMU: curve cbd support -blockdev

正在进行

  1. CurveBS 控制台
  2. CurveFS WarmUp 优化,支持任务查询和取消
  3. CurveFS BS存储后端性能优化

三、开源社区

开源周报

OpenCurve公众号文章

Google Summer of Code 2023

四、答疑 & 交流

Curve小助手微信

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-02-23.html b/Community/Double-Week-Meetings/01-2023/2023-02-23.html index dc3fc48..743e2f8 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-02-23.html +++ b/Community/Double-Week-Meetings/01-2023/2023-02-23.html @@ -4,14 +4,14 @@ 2023-02-23 | Curve Book - - + +
跳到主要内容

2023-02-23

时间

2023/02/23 19:00 ~ 19:30

加入会议

8毛 邀请您参加腾讯会议
会议主题:Curve 社区双周会
会议时间:2023/02/23 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/sI1hGHZ1msxC

#腾讯会议:341-233-112

复制该信息,打开手机腾讯会议即可参与

会议内容

一、近期工作

CurveFS

主要工作

Curve v2.5.0-beta 正式提测,目前正在修复相关测试暴露问题:

新增特性

  1. 支持共享缓存 memcache,提升 CTO 场景下数据写入的性能(CurveAdm 支持部署 memcache 集群)
  2. CurveBS 新工具 tool-v2 新增命令支持 (delete\list dir\list client\support create dir)

相关优化

  1. Braft 版本更新到 v1.1.2
  2. 优化本地缓存的读缓存模式(之前 diskCache.diskCacheType=1,只有读取的数据才得到缓存,写入的数据不做缓存)
  3. CurveBS 的刷盘逻辑优化
  4. 编译脚本合并

BugFix

  1. S3 版本回退,解决新版本的 S3 写入卡住的问题
master 分支

CurveBS

主要工作

内部正在推动 RDMA/SPDK 的开发优化,目前进入自测阶段,即将提测

master 分支

Curve 2023 Roadmap

为了让大家更好参与 Curve 社区,后续 roadmap 中一些方案将在社区中公开讨论。 相关的时间会提前在 roadmap 页面备注, 讨论之前也会在微信群中提示,欢迎大家参与,详见 Curve 2023 Roadmap

CurveBS 控制台

目前进展:

  • 目前正在推到一期功能的迭代开发
  • 一期主要提供信息展示功能,如集群总体概览、磁盘列表、存储池、卷等信息的展示
  • 目前开发已基本完成,即将提测给 QA,预计 3 月上旬会对外发布

CurveAdm v0.2.0

CurveAdm v0.2.0 Release

  • Improve: add CI (build and test action), thanks to Tsong Lew.
  • Improve: update go version since Go 1.18 is required to build rivo/uniseg, thanks to Tsong Lew.
  • Feature(exec): support execute command in specified container, thanks to Wangpan.
  • Feature(target): support specify target block size, thanks to mfordjody.
  • Feature(format): support stop formmating, thanks to DemoLiang.
  • Feature(mount): support setting environment variable for client container.
  • Feature(hosts): support setting SSH address which only for SSH connect.
  • Feature(playbook): add playbook which user can run any scripts in any hosts.
  • Feature(playbook): support deploy memcache by playbook, thanks to SiKu.
  • Feature(playbook): support setting host environment variable.
  • Feature(playbook): support pass arguments to run scripts.
  • Feature(playbook): support exclude and intersection pattern for playbook label.
  • Feature(playground): now we can run playground by specified container image.
  • Feature: add curvefs-fuse-bt bpftrace tool.
  • Fix: set environment variable failed while executing command.
  • Fix: its no need to become user when execute command in local.
  • Fix(map): map a volume which name contain underscore symbol.
  • Fix(format): wrong sed expression in become_user modle.

更新

CURVEADM_VERSION=v0.2.0 curveadm -u

二、开源社区

开源周报

OpenCurve公众号文章

三、答疑 & 交流

Curve小助手微信

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-03-09.html b/Community/Double-Week-Meetings/01-2023/2023-03-09.html index 2c6bd10..787c5e0 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-03-09.html +++ b/Community/Double-Week-Meetings/01-2023/2023-03-09.html @@ -4,14 +4,14 @@ 2023-03-09 | Curve Book - - + +
跳到主要内容

2023-03-09

时间

2023/03/09 19:00 ~ 19:30

加入会议

会议主题:curve双周会
会议时间:2023/03/09 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京
重复周期:2022/10/20-2023/07/27 19:00-19:30, 每两周 (周四)

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/DckjtgWnOM1o

#腾讯会议:493-3764-3146

会议内容

一、近期工作

CurveFS

主要工作

Curve v2.5.0-beta1 发布,主要是修复上个版本提测过程中发现的问题:

curvefs/client: bug fix about memcache

  1. When running the vdbech task, the memory usage of the mount point is very high
  2. When running the vdbech task, the mount will coredump or the task will have data inconsistency
  3. The memcache server fails over and then restarts and cannot be used by the client anymore
master 分支

CurveBS

主要工作

内部的 RDMA/SPDK 版本自测完成,已经提测

master 分支

Curve 2023 Roadmap

  • 完成 <CurveBS K8S 部署> 方案的社区讨论,当前的计划是优先完成集群的部署和清理,架构文档详见PR:Add architecture document

为了让大家更好参与 Curve 社区,后续 roadmap 中一些方案将在社区中公开讨论。 相关的时间会提前在 roadmap 页面备注, 讨论之前也会在微信群中提示,欢迎大家参与,详见 Curve 2023 Roadmap

CurveAdm

二、开源社区

开源周报

OpenCurve公众号文章

三、答疑 & 交流

Curve小助手微信

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-03-23.html b/Community/Double-Week-Meetings/01-2023/2023-03-23.html index 4d92198..66e00c5 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-03-23.html +++ b/Community/Double-Week-Meetings/01-2023/2023-03-23.html @@ -4,15 +4,15 @@ 2023-03-23 | Curve Book - - + +
跳到主要内容

2023-03-23

时间

2023/03/23 19:00 ~ 19:30

加入会议

会议主题:curve双周会
会议时间:2023/03/23 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京
重复周期:2022/10/20-2023/07/27 19:00-19:30, 每两周 (周四)

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/DckjtgWnOM1o

#腾讯会议:493-3764-3146

会议内容

一、近期工作

CurveFS

主要工作

Curve v2.5.0-beta1 发布,主要是修复上个版本提测过程中发现的问题:

curvefs/client: bug fix about memcache

  1. When running the vdbech task, the memory usage of the mount point is very high
  2. When running the vdbech task, the mount will coredump or the task will have data inconsistency
  3. The memcache server fails over and then restarts and cannot be used by the client anymore
master 分支

CurveBS

主要工作

内部的 RDMA/SPDK 版本已经提测。 正在定位测试中出现的问题。

master 分支

Curve 2023 Roadmap

  • 完成 <CurveBS K8S 部署> 方案的社区讨论,当前的计划是优先完成集群的部署和清理,架构文档详见PR:Add architecture document
  • 目前正在完成 operator 部署。

为了让大家更好参与 Curve 社区,后续 roadmap 中一些方案将在社区中公开讨论。 相关的时间会提前在 roadmap 页面备注, 讨论之前也会在微信群中提示,欢迎大家参与,详见 Curve 2023 Roadmap

CurveAdm

  • 暂无

二、开源社区

开源周报

OpenCurve公众号文章

Google 编程之夏 2023

三、答疑 & 交流

Curve小助手微信

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-04-13.html b/Community/Double-Week-Meetings/01-2023/2023-04-13.html index 0d8bcda..ee35c60 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-04-13.html +++ b/Community/Double-Week-Meetings/01-2023/2023-04-13.html @@ -4,15 +4,15 @@ 2023-04-13 | Curve Book - - + +
跳到主要内容

2023-04-13

时间

2023/04/13 19:00 ~ 19:30

加入会议

会议主题:curve双周会
会议时间:2023/04/13 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京
重复周期:2022/10/20-2023/07/27 19:00-19:30, 每两周 (周四)

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dw/MF2yU2kTt6pR

#腾讯会议:703-9861-0542

会议内容

一、近期工作

CurveFS

  • CurveFS 使用CurveBs作为存储后端

该工作预计本月底完成代码merge(开发,开发自测)

CurveBS

  • 内部快照

当前快照: s3 预期快照: 1. s3 2. 本地

社区伙伴Zstack童鞋贡献:CurveBS内部快照pr

  • RDMA/SPDK 版本

内部的 RDMA/SPDK 版本已经QA提测,已经完成基本功能测试,性能测试。异常测试过程中遇到几个bug,部分bug已fix,还有两个bug解决

云原生部署

Curve Operator上手初体验

curvebs部署和删除的功能已经实现,目前处于测试和优化阶段,以及curve-csi的测试。同时还有一些新功能需要添加,这些功能和优化点也是开发者活动的题目。

curveFS的部署和删除根预计本月月底完成。

二、开源社区

开源活动预告

开源周报

OpenCurve公众号文章

本期文章
上期文章

三、答疑 & 交流

Curve小助手微信

为了让大家更好参与 Curve 社区,后续 roadmap 中一些方案将在社区中公开讨论。 相关的时间会提前在 roadmap 页面备注, 讨论之前也会在微信群中提示,欢迎大家参与,详见 Curve 2023 Roadmap

四、专题交流: Curve tools开发实践

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-04-27.html b/Community/Double-Week-Meetings/01-2023/2023-04-27.html index 71b414a..7e686ab 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-04-27.html +++ b/Community/Double-Week-Meetings/01-2023/2023-04-27.html @@ -4,13 +4,13 @@ 2023-04-27 | Curve Book - - + +
跳到主要内容

2023-04-27

时间

2023/04/27 19:00~19:30

加入会议

Maggie 邀请您参加腾讯会议
会议主题:Curve社区双周会
会议时间:2023/04/27 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京
重复周期:2023/04/27-2023/12/21 19:00-19:30, 每两周 (周四)

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/eDgUO9uhntyu

#腾讯会议:548-7440-7396

复制该信息,打开手机腾讯会议即可参与

会议内容

一、近期工作

Curve文件存储

性能优化

功能支持

运维工具

Curve块存储

可视化

运维工具

  • curveadm 适配 rdma&spdk 版本镜像(初步可用,还未正式发布版本)@Wine93
  • curve_ops_tool重构(进行中,也是curve开发者活动的议题) @数名开发者

功能支持

  • 支持 PoolSet: 一个集群可以支持不同介质的物理池,可以指定卷的类型创建(开发中)@wu-hanqing

  • 支持rbd协议(开发中)@h0hmj

  • 支持本地快照(开发中,发起外部讨论)@xu-chaojie @David Lee

场景支持

  • 混闪场景支持 @zyb521(测试优化中)

    • NVME+HDD场景
    • wal独立部署: nvme分区独立做wal, 剩下的分区做bcache。极限性能会好一些,但性能不是很稳定,分区偏小的情况下容易被打满
    • bcache方案在内核 5.10(性能更低) 和 4.9 上表现不一致

二、开源社区

三、答疑 & 交流

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-05-18.html b/Community/Double-Week-Meetings/01-2023/2023-05-18.html index 4f0d26e..de47210 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-05-18.html +++ b/Community/Double-Week-Meetings/01-2023/2023-05-18.html @@ -4,15 +4,15 @@ 2023-05-18 | Curve Book - - + +
跳到主要内容

2023-05-18

时间

2023/05/18 19:00~19:30

加入会议

you! 邀请您参加腾讯会议
会议主题:you!预定的会议
会议时间:2023/05/18 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/SSKvFmc6rRGl

#腾讯会议:911-103-973

复制该信息,打开手机腾讯会议即可参与

会议内容

一、近期工作

Curve文件存储

Curve块存储

功能支持

  • 支持 PoolSet: 一个集群可以支持不同介质的物理池,可以指定卷的类型创建

    • 底层curvebs开发基本完成, 上层openstack适配中
    • 升级兼容性逻辑修改,并已自测完成,发起review
  • rdma & spdk版本修复若干问题

    • 定位并修复一个IO始终未返回导致IO卡住的问题
    • 定位和修复重启chunkserver后,raft日志一直追赶不上的问题
    • 重启chunkserver报日志损坏问题,持续定位中
    • 优化容器化部署,rdma网络参数调整
  • curvebs 适配支持rbd协议

    • 功能基本完成,目前调试中,glance,cinder目前功能都已正常,nova还有部分功能还在调试
  • 支持本地快照

    • ztack外部开发者正在进行快照部分功能实现
    • curve团队目前在进行从快照克隆部分功能的poc,主要关注从快照克隆出卷的性能是否满足设计需求,预期至少对标ceph

场景支持

  • 混闪场景支持

    • NVME+HDD场景
    • wal独立部署: nvme分区独立做wal, 剩下的分区做bcache。极限性能会好一些,但性能不是很稳定,分区偏小的情况下容易被打满. 进展:将raft快照时间调整为2分钟,50G分区可以正常使用,过程中bcache的gc触发频率明显降低。
    • bcache方案在内核 5.10(性能更低) 和 4.9 上表现不一致, 进展:使用回退后的内核,未再发现其他问题。

工具相关

  • curveadm 支持 rdma&spdk 版本镜像,已提交PR,待进一步完善
  • CurveAdm支持部署控制台功能完成,并已自测完成
  • 控制台支持多集群功能完成,并已自测
  • 新运维工具tools-v2进展,添加bs status chunkserver功能完成,
  • 支持云原生部署 目前已实现CurveBS和CurveFS的K8s部署, 本周期完成代码整理和测试

二、开源社区

  • 多个开发者活动

  • 新活动预告 GitLink开源夏令营活动(GLCC),面向全国高校学生的暑期编程活动,目前社区报名火热进行中,curve社区正在报名,计划提交5个选题,欢迎社区的学生开发者踊跃参加. 链接:https://www.gitlink.org.cn/glcc

三、近期公众号文章

  • 《Curve 基于 SPDK target 的 iSCSI 性能优化实践》 链接:https://mp.weixin.qq.com/s/GycKSdjF5JO1sOsLLSeFZg

    • curve团队为游戏部门提供的性能优化解决方案,通过基于SPDK target的iscsi性能优化,使得业务测试场景的在小IO场景下相比ceph iscsi性能又200%以上的提升。
  • 《支持 POSIX 和 S3 统一命名空间—— Curve 文件系统 S3 网关部署实践》 链接:https://mp.weixin.qq.com/s/UeixFLkyQLTLNwfQ9Mo34w

    • AI 训练业务场景下, CurveFS提供S3 协议和 Posix 协议的统一命名空间能力,两种协议上传/写入的文件可以互相访问。
  • 《我的 Google Summer of Code 2023(GSoC) 申请之路》链接:https://mp.weixin.qq.com/s/hvmTQd-ljiifacNoPXikTw

    • 来自申请google开源之夏curve社区唯一入选的选题的学生的文章

四、答疑 & 交流

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-06-01.html b/Community/Double-Week-Meetings/01-2023/2023-06-01.html index cffa42c..98068f0 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-06-01.html +++ b/Community/Double-Week-Meetings/01-2023/2023-06-01.html @@ -4,15 +4,15 @@ 2023-06-01 | Curve Book - - + +
跳到主要内容

2023-06-01

时间

2023 Jun 01, 19:00~19:30

加入会议

majie 邀请您参加腾讯会议
会议主题:majie预定的会议
会议时间:2023/06/01 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/glDOfgkpiwGe

#腾讯会议:467-801-402

复制该信息,打开手机腾讯会议即可参与

会议内容

一、近期工作

Curve文件存储

  1. close-to-open一致性场景下元数据性能优化

  2. 文件存储对接CurveBS后端

Curve块存储

  1. poolset支持 https://github.com/opencurve/curve/pull/1988 一个集群可以支持不同的物理池,可以指定卷的类型创建, review中

  2. rdma&spdk版本已开发完成,后续可用镜像将会上传发布,代码暂时不开源

  3. cbd接口模拟rbd接口用于支持OpenStack(Glance/Nova/Cinder)尝鲜使用 开发完成,在整理文档和代码中

  4. 支持本地快照 调研设计中

  5. web控制台开发完成,前后端联调中

  6. curvebs认证功能调研设计中

周边生态

  1. k8s curve operator积极开发中,现已能够支持部署curvebs和curvefs,正在开发监控相关
  2. curve运维新工具开发,进度18/27

二、开源社区

  • 多个开发者活动

  • 新活动预告 GitLink开源夏令营活动(GLCC),面向全国高校学生的暑期编程活动,目前社区报名火热进行中,curve社区正在报名,计划提交5个选题,欢迎社区的学生开发者踊跃参加. 链接:https://www.gitlink.org.cn/glcc

三、近期公众号文章

四、答疑 & 交流

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-06-15.html b/Community/Double-Week-Meetings/01-2023/2023-06-15.html index 1f036c9..85b709f 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-06-15.html +++ b/Community/Double-Week-Meetings/01-2023/2023-06-15.html @@ -4,13 +4,13 @@ 2023-06-15 | Curve Book - - + +
跳到主要内容

2023-06-15

时间

2023 Jun 15, 19:00~19:30

加入会议

Sean 邀请您参加腾讯会议
会议主题:Curve社区例会
会议时间:2023/06/15 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京
重复周期:2023/06/15-2024/05/02 19:00-20:00, 每两周 (周四)

点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/jdXoeG8gBWJp

#腾讯会议:718-2692-7827

复制该信息,打开手机腾讯会议即可参与

会议内容

一、近期工作

Curve块存储

  1. v1.2.7 版本,主要包括poolset支持和一个client支持挂载多个集群的卷。

  2. CurveBS 认证功能已完成方案设计,开发中

  3. 支持本地快照 开发中

  4. rdma&spdk版本已开发完成,进行性能和稳定性测试中,后续可用镜像将会上传发布,代码暂时不开源

  5. web控制台开发完成,测试中,预览

Curve文件存储

版本v2.6 已提测,具体内容见changelog

文件存储对接CurveBS后端,功能和性能测试中,代码分支:https://github.com/opencurve/curve/tree/fs_curvebs_storage_support

周边生态

  1. k8s curve operator完成开发。欢迎大家使用,代码仓库&文档

  2. curve运维新工具开发,进度

  3. CurveAdm v0.3.0 版本开发完成,测试中。主要包括支持多用户共享、分布式数据库。

二、开源社区

  • 6月3日,由 KubeSphere 社区、极狐GitLab、Curve 社区联合主办的云原生 Meetup 杭州站取得圆满成功。会议回顾

  • 开发者活动进行中

    GitLink开源夏令营活动(GLCC),面向全国高校学生的暑期编程活动,目前社区报名火热进行中,curve社区正在报名,计划提交5个选题,欢迎社区的学生开发者踊跃参加.

    链接:https://mp.weixin.qq.com/s/AdHQTWxd16gou2eAb7nyWQ

  • 往期活动(已结束报名)

三、近期公众号文章

四、答疑 & 交流

- - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-06-29.html b/Community/Double-Week-Meetings/01-2023/2023-06-29.html index de81d0b..3095077 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-06-29.html +++ b/Community/Double-Week-Meetings/01-2023/2023-06-29.html @@ -4,8 +4,8 @@ 2023-06-29 | Curve Book - - + +
@@ -15,7 +15,7 @@ changelog: https://github.com/opencurve/curve/pull/2526/files

主要特性:
* 优化元数据性能,特别是 CTO 场景下
* 支持 warmup 到 memcache
  • 文件存储对接CurveBS后端,功能和性能测试中,代码分支:https://github.com/opencurve/curve/tree/fs_curvebs_storage_support

  • 周边生态

    1. k8s curve operator基本能力完成开发。欢迎大家使用 代码仓库&文档

    2. curve运维新工具开发,剩余在开发/reivew外部开发者pr过程。进度

    3. curveadm v0.3.0 已经发布预览版,欢迎体验 升级详见:https://github.com/opencurve/curveadm/pull/243 changelog: https://github.com/opencurve/curveadm/pull/243/commits

    二、开源社区

    三、近期公众号文章

    四、答疑 & 交流

    - - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-07-13.html b/Community/Double-Week-Meetings/01-2023/2023-07-13.html index 32dbc1d..9320c7a 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-07-13.html +++ b/Community/Double-Week-Meetings/01-2023/2023-07-13.html @@ -4,13 +4,13 @@ 2023-07-13 | Curve Book - - + +
    跳到主要内容

    2023-07-13

    时间

    2023/07/13, 19:00-20:00

    加入会议

    W 邀请您参加腾讯会议
    会议主题:W预定的会议
    会议时间:2023/07/13 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京

    点击链接入会,或添加至会议列表:
    https://meeting.tencent.com/dm/Rvx4NU7xdkz6

    #腾讯会议:653-606-758

    复制该信息,打开手机腾讯会议即可参与

    会议内容

    一、近期工作

    Curve块存储

    1. v1.2.7 版本提测,https://github.com/opencurve/curve/releases/tag/v1.2.7-beta2

      1. 多存储池支持,资源隔离(不同存储介质 HDD/SSD/NVMe、或者不同租户支持)

      2. 支持单客户端挂载不同集群的卷

    2. 支持本地快照和克隆,目前正在 POC 测试中,后续完善后会同步方案和代码

    3. RDMA & SPDK 版本部署文档(基于 CentOS 7.9,5.4 内核版本),https://github.com/opencurve/curve-meetup-slides/blob/9d17e0eb42df2bee0ec8c7a6c6aaf95a340028f5/PrePaper/2023/CurveBS%20RDMA%26SPDK%20%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97.md

    Curve文件存储

    1. 文件存储对接Curve块存储,目前已完成所有测试:fio、vdbench、fstrash、删除功能;重要 bug 已修复

    2. v2.6 版本已提测,QA 正在测试中,预计 7 月中下旬全部测试完毕

      1. 主要特性:

        • 优化元数据性能,特别是 CTO 场景下

        • 支持 warmup 到 memcache

      2. 分支:https://github.com/opencurve/curve/tree/release2.6

    周边生态

    1. CurveAdm 0.3.0 版本提测

      • 主要针对块存储部署进行优化,支持多用户部署

      • 适配块存储 v1.2.7 版本功能

      • 一键体验 CURVEADM_VERSION=v0.3.0-rc4 curveadm -u

    2. k8s curve operator完成开发,欢迎大家使用体验

    3. Curve 新运维工具开发

    二、Curve控制台开源 🎉🎉🎉

    Curve 控制台(curve-manager)是一个相对独立的 Web 服务,提供基于 Web 的集群管理能力,使得存储集群的部署和管理门槛进相对 CLI方式一步降低,提供一种更加清晰直观的视图。

    项目仓库:

    前端代码仓库:https://github.com/opencurve/curve-dashboard

    后端代码仓库:https://github.com/opencurve/curve-manager

    控制台接口:

    前后端交互接口:https://github.com/opencurve/curve-manager/blob/master/api/curvebs/manager/bind.go

    后端与存储集群交互接口:

    1. RPC请求接口,主要与MDS通信获取信息

      https://github.com/SeanHai/curve-go-rpc/tree/ff4a19bed1392415310cd3636c0fee77e487adcd/rpc/curvebs

    2. HTTP请求接口,主要与监控组件Prometheus通信获取信

      https://github.com/opencurve/curve-manager/blob/master/internal/metrics/core/metrics.go

    三、开源社区

    1. Curve在夏季特别活动预热(08-09),目前在准备阶段,本次奖品丰厚,形式新颖,欢迎大家关注参与。
    2. 往期活动(已结束报名)

    四、近期公众号文章

    1. 使用 Curve 云上部署 Hadoop,轻松节约 50% 存储成本 https://mp.weixin.qq.com/s/xuH4O_UU3fNlYJhtrUlh0Q

    2. CurveAdm 离线部署 Curve 集群操作指南,https://mp.weixin.qq.com/s/jJNRIFt3DkKuJc_Zq6IgBw

    五、答疑 & 交流

    - - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-08-03.html b/Community/Double-Week-Meetings/01-2023/2023-08-03.html index dd82e7d..64fdee9 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-08-03.html +++ b/Community/Double-Week-Meetings/01-2023/2023-08-03.html @@ -4,14 +4,14 @@ 2023-08-03 | Curve Book - - + +
    跳到主要内容

    2023-08-03

    时间

    2023/08/03, 19:00-19:40

    加入会议

    W 邀请您参加腾讯会议
    会议主题:W预定的会议
    会议时间:2023/08/03 19:00-19:40 (GMT+08:00) 中国标准时间 - 北京

    点击链接入会,或添加至会议列表:
    https://meeting.tencent.com/dm/Rvx4NU7xdkz6

    #腾讯会议:653-606-758
    (可微信小程序入会)
    复制该信息,打开手机腾讯会议即可参与

    0:会议内容概要

    本次社区双周会主要包括以下几点:

    • 上半年社区roadmap总结与下半年工作展望
    • Curve自动化测试框架开源
    • Curve官方文档网站正式搭建
    • “社区活动 Summer Code Camp”正在持续招募报名

    会议内容

    一. 2023上半年社区Roadmap总结与下半年工作展望

    1. 感恩/致谢

    自开源以来,Curve 项目受到了社区小伙伴们的大量关注和讨论,项目的一些特色得到了部分社区小伙伴的认可,但是还有更多的小伙伴们给Curve 项目提出了更高的要求和期望,这些需求我们都已经收到并且牢记在心,只是限于社区开发者数量和能力,不能立刻满足。

    但我们一直在朝着更优秀的分布式存储项目在努力,也希望更多优秀的小伙伴一起加入社区,为这个年轻的社区添砖加瓦,争取让Curve从开源基础设施领域的新星成长为明星。

    Curve贡献者-2023H1

    2. Curve当前主推场景

    • Curve文件存储已经上线并支持机器学习,ES,NAS等以posix为接口的场景,即将支持以HDFS为接口的大数据场景;
    • Curve块存储已经上线并支持高随机的数据库,云盘等场景

    3. 上半年roadmap及下半年展望

    详见下文:

    Curve 社区上半年 Roadmap 进展及下半年规划

    二、近期主要工作

    1. Curve测试框架开源

    Curve 测试框架fsthrash

    类似与ceph的Teuthology,可以自动部署Curve服务,并自动进行功能测试,io测试,异常测试以及一致性测试等。

    2. Curve官方文档网站上线

    Curve官方文档网站

    Curve贡献者-2023H1

    Curve的文档目前有不少,但是散落于Curve githu主仓库,curveadm以及curve-meetup-slides等子仓库。我们深知文档易读性的重要性,同时也是应Curve社区很多小伙伴的要求,所以我们建立了这个官方文档网站

    框架本周刚搭建完成,内容有待补充,也欢迎社区同学们给文档库提pr,一起来完善这个唯一的入口。

    三、开源社区

    1. “社区活动 Summer Code Camp”正在持续招募报名,本次奖品丰厚,形式新颖,欢迎大家关注参与。

    本次开发者活动主要分为两大专题,如下:

    • Curve项目本身

    准备了非常多有意思且范围涵盖较广的议题,包括Curve web控制台方向,云原生方向,核心代码逻辑方向,Curveadm方向以及Curve的Ci方向。涉及的语言包括C/C++、go、python/shell等

    • 社区联动

    openEuler拥有非常好的开源生态系统。Curve期望在openEuler操作系统上运行,所以我们需要做一些适应和验证工作。

    开发活动详情见: Curve夏季特别活动

    四、近期公众号文章

    1. Curve 社区上半年 Roadmap 进展及下半年规划

    2. Curve 控制台详细部署使用指南

    五、答疑 & 交流

    Curve小助手微信

    - - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/2023-09-14.html b/Community/Double-Week-Meetings/01-2023/2023-09-14.html index 5f505a8..822e35c 100644 --- a/Community/Double-Week-Meetings/01-2023/2023-09-14.html +++ b/Community/Double-Week-Meetings/01-2023/2023-09-14.html @@ -4,13 +4,13 @@ 2023-09-14 | Curve Book - - + +
    跳到主要内容

    2023-09-14

    时间

    2023/09/14 19:00~19:30

    加入会议

    majie 邀请您参加腾讯会议
    会议主题:majie预定的会议
    会议时间:2023/09/14 19:00-19:30 (GMT+08:00) 中国标准时间 - 北京

    点击链接入会,或添加至会议列表:
    https://meeting.tencent.com/dm/hhSiD8xDJ5z3

    #腾讯会议:434-723-266

    复制该信息,打开手机腾讯会议即可参与

    会议内容

    一、近期工作

    Curve文件存储

    • CurveFS对接HDFS

      • HDFS基本对接完成
      • HDFS接口权限开发基本完成
      • 已有容器镜像可供测试,使用文档整理中
    • fs级别的quota积极开发中

    • bug修复

    Curve块存储

    二、开源社区活动和外部会议

    三、近期公众号文章

    四、答疑 & 交流

    - - + + \ No newline at end of file diff --git a/Community/Double-Week-Meetings/01-2023/README.html b/Community/Double-Week-Meetings/01-2023/README.html index 9223336..2151ba9 100644 --- a/Community/Double-Week-Meetings/01-2023/README.html +++ b/Community/Double-Week-Meetings/01-2023/README.html @@ -4,14 +4,14 @@ README | Curve Book - - + +
    跳到主要内容

    README

    Curve 双周会

    内容

    社区同步开发进度、版本规划、方案讨论

    时间

    每两周一次(通常在周四晚19:00~19:40),使用腾讯会议,提前用户群通知

    参与我们

    • 加入用户群,当前为微信群,由于群人数过多,需要先添加以下个人微信,再邀请进群。 Curve小助手微信

    • 周会议题提交:issue

    - - + + \ No newline at end of file diff --git a/Community/community-guideline.html b/Community/community-guideline.html index 30a7a44..3c2b57e 100644 --- a/Community/community-guideline.html +++ b/Community/community-guideline.html @@ -4,13 +4,13 @@ 社区准则 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveBS-with-RDMA-SPDK/release-intro.html b/CurveBS-with-RDMA-SPDK/release-intro.html index 71147e6..c2d0fc7 100644 --- a/CurveBS-with-RDMA-SPDK/release-intro.html +++ b/CurveBS-with-RDMA-SPDK/release-intro.html @@ -4,13 +4,13 @@ 版本介绍 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveBS/architecture/architecture-intro.html b/CurveBS/architecture/architecture-intro.html index b9c2f26..eed97d7 100644 --- a/CurveBS/architecture/architecture-intro.html +++ b/CurveBS/architecture/architecture-intro.html @@ -4,13 +4,13 @@ 架构介绍 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveBS/comparison/CurveBS-vs-Ceph-rbd.html b/CurveBS/comparison/CurveBS-vs-Ceph-rbd.html index 1108aa5..f88afe8 100644 --- a/CurveBS/comparison/CurveBS-vs-Ceph-rbd.html +++ b/CurveBS/comparison/CurveBS-vs-Ceph-rbd.html @@ -4,8 +4,8 @@ CurveBS对比Ceph RBD | Curve Book - - + +
    @@ -16,7 +16,7 @@ 单卷场景

    多卷场景: 多卷场景

  • 更稳定

  • 易运维

  • 云原生

  • TBD

    - - + + \ No newline at end of file diff --git a/CurveBS/deploy/quickstart.html b/CurveBS/deploy/quickstart.html index ecd4bcd..7b674cc 100644 --- a/CurveBS/deploy/quickstart.html +++ b/CurveBS/deploy/quickstart.html @@ -4,13 +4,13 @@ CurveBS 快速体验 | Curve Book - - + +
    跳到主要内容

    CurveBS 快速体验

    为了提升 Curve 的运维便利性,我们设计开发了 CurveAdm 项目,其主要用于部署和管理 Curve 集群,目前已支持部署CurveBS & CurveFS,相关使用文档请参考 CurveAdm用户手册,并根据手册首先安装CurveAdm工具之后再进行Curve集群的部署。

    部署All-in-one体验环境

    请参考CurveAdm用户手册中CurveBS集群部署步骤,单机体验环境请使用“集群拓扑文件-单机部署”模板。

    命令行工具

    curve 提供了命令行工具以查看集群状态和进行基本集群操作:命令行工具说明

    - - + + \ No newline at end of file diff --git a/CurveBS/maintenance/maintenance-tools.html b/CurveBS/maintenance/maintenance-tools.html index 2b03bf7..e5a1566 100644 --- a/CurveBS/maintenance/maintenance-tools.html +++ b/CurveBS/maintenance/maintenance-tools.html @@ -4,13 +4,13 @@ 运维工具 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveBS/performance/how-to-benchmark.html b/CurveBS/performance/how-to-benchmark.html index 9215d4c..752f0c4 100644 --- a/CurveBS/performance/how-to-benchmark.html +++ b/CurveBS/performance/how-to-benchmark.html @@ -4,13 +4,13 @@ benchmark指南 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git "a/CurveBS/test/curve\350\246\206\347\233\226\347\216\207\346\224\266\351\233\206.html" "b/CurveBS/test/curve\350\246\206\347\233\226\347\216\207\346\224\266\351\233\206.html" index d24140d..26046b3 100644 --- "a/CurveBS/test/curve\350\246\206\347\233\226\347\216\207\346\224\266\351\233\206.html" +++ "b/CurveBS/test/curve\350\246\206\347\233\226\347\216\207\346\224\266\351\233\206.html" @@ -4,13 +4,13 @@ curve覆盖率收集优化 | Curve Book - - + +
    跳到主要内容

    curve覆盖率收集优化

    curve主要从2个维度衡量单元测试覆盖率:行覆盖率和分支覆盖率。

    项目组内规定,所有模块行覆盖率需要达到70%;分支覆盖率mds模块需要达到70%,其他模块需要达到65%。否则ci自动失败,代码无需进入review阶段,更没法进入仓库。

    先看看效果:

    我们在ci配置了单元测试覆盖率收集的job,每次提交代码都会触发编译、单元测试和覆盖率收集。

    一些覆盖率收集的注意事项:

    1.因为我们是用bazel编译的,而bazel自带的coverage(继承自test, test继承自build)参数并不成熟,因此,不考虑使用coverage参数,直接使用build参数;build需要带上--collect_code_coverage参数

    2.bazel编译时,需要注意build文件的放置,因为覆盖率解析的时候需要gcno和gcda文件路径匹配,基本上src每个目录均会放置BUILD,层层依赖

    3.覆盖率收集会收集到很多第三方依赖等代码的覆盖率,影响我们自己的覆盖率,因此lcov需要通过--remove参数去除这些依赖的覆盖率收集

    4.分支覆盖的时候,所有跳转都被计算成分支,而我们真正的关心的是类似那些if...else的分支,因此需要通过脚本解析,去除这些不需要的分支,思路如下:

    (a.按照lcov常规的方法收集覆盖率

    b.解析lcov生成的文件中的每一行, SF:开头的行为源文件的名称 BRDA:开头的行为分支覆盖检测的那一行,其中分a,b,c,d,a代表源文件的代码行,b和c是内部定义的值,大概是代码块等信息;d代表是否覆盖,0表示未覆盖,其他数字代表覆盖次数

    c.去源文件中去除注释,搜索是否是if开头的,如果不是,则将这个BRDA去除 )

    d.我们已经直接提供了脚本filterbr.py gen-coverage.py,直接运行gen-coverage.py即可,所有文件保留在./coverage目录下面

    5.一些很难覆盖到的行或者分支,比如abort()等,可以通过参数过滤,但是不建议使用,参数配置如下,直接在源代码中添加"//LCOV_EXCL_BR_LINE"去除该行分支覆盖率统计或者"//LCOV_EXCL_LINE"去除该行行覆盖率统计。

    lcov_excl_br_line = LCOV_EXCL_BR_LINE|g_return_if_fail|g_return_val_if_fail

    lcov_excl_line = LCOV_EXCL_LINE|g_return_if_reached|g_return_val_if_reached|g_assert_not_reached

    - - + + \ No newline at end of file diff --git a/CurveBS/test/env-setup.html b/CurveBS/test/env-setup.html index c7108ee..1e8acd0 100644 --- a/CurveBS/test/env-setup.html +++ b/CurveBS/test/env-setup.html @@ -4,13 +4,13 @@ 测试环境配置 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git "a/CurveBS/test/\345\274\202\345\270\270\350\207\252\345\212\250\345\214\226\346\226\271\346\263\225.html" "b/CurveBS/test/\345\274\202\345\270\270\350\207\252\345\212\250\345\214\226\346\226\271\346\263\225.html" index f60f563..0fd25da 100644 --- "a/CurveBS/test/\345\274\202\345\270\270\350\207\252\345\212\250\345\214\226\346\226\271\346\263\225.html" +++ "b/CurveBS/test/\345\274\202\345\270\270\350\207\252\345\212\250\345\214\226\346\226\271\346\263\225.html" @@ -4,15 +4,15 @@ 异常自动化方法 | Curve Book - - + +
    跳到主要内容

    异常自动化方法

    #异常测试方法 ##测试目的

    • Curve是网易云存储产品组推出的新一代分布式存储平台,致力于打造一个支持块、对象、文件等存储形态的统一平台。本次测试对象主要为支持块设备功能。

    • 生产环境中,故障是一种常态,测试环境中需要尽可能的模拟生产环境中的故障,以此来评估系统的可用性、一致性等。

    ##测试方法

    • 异常测试的环境部署要求尽可能与真实环境一致,当前测试环境定义为6台chunkserver节点,1台mds节点(尚无failover),2台client节点,测试场景尽可能模拟用户使用的方式,读写io由云主机内部下发,管理接口直接采用openstack的接口。

    • 异常项主要通过人为注入的方式触发,有些异常为真实的异常,例如机器宕机、拔网线等;有些异常通过软件模拟的方式,如磁盘io卡顿、服务异常等;有些异常则是在代码侧注入,该部分异常测试主要在集成测试中,不在这里讨论。

    • 异常测试主要校验真实用户场景中,在异常触发情况下的系统行为,按影响面可以分为:用户无感知、影响管理面基本功能、引起性能衰减、引起io抖动、系统不可服务但可恢复、数据异常(ioerror、不一致、丢失)、系统无法恢复。

    • 借鉴混沌工程的理论,测试用例设计的时候也会尽量符合下面原则,当然我们目前只是在测试环境批跑,条件允许的情况下,可以在beta云环境批跑,直到稳定后,可以去A级环境批跑。

    • 建立稳定状态的假设;

    • 多样化现实世界事件;

    • 在生产环境运行实验;

    • 持续自动化运行实验;

    • 最小化“爆炸半径”。 ##测试用例

    • 一个最基本的异常测试用例格式如下:

    • 初始化集群 → 用户io注入 → 并发调用管理接口 → 触发异常 → sleep a random time → 异常恢复(恢复校验) → 数据校验(ioerror、读写一致性、三副本一致性、抖动) → 管理接口校验 → 资源回收校验

    - - + + \ No newline at end of file diff --git "a/CurveBS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" "b/CurveBS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" index 0eb2ef8..a3b1168 100644 --- "a/CurveBS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" +++ "b/CurveBS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" @@ -4,13 +4,13 @@ 性能测试 | Curve Book - - + +
    跳到主要内容

    性能测试

    背景知识

    • 单盘的性能测试基本与传统物理硬盘的测试方法无差异

    • 一般性能指标为:

      iops:每秒可以执行读写的次数

      带宽:每秒最大带宽

      延迟:每个io从发起请求到返回时的延迟时间

    基准测试的主要测试案例是:

    • 线性读写(大块,长队列),单位MB/s

    • IOPS(每秒输入/输出操作数)中的小块(4-8kb,iodepth=16-128)的高度并行随机读写

    • IOPS中的单线程事务性随机写入(4-8kb,iodepth = 1)和读取

    • 一般情况下,我们用4k随机写来测量iops和延迟,用大块(64k, 512k等)顺序写来测量带宽。

    • 云盘的性能测试也是梯度加压的模式,在加大iodepth的时候,当我们观察到iops或者带宽基本不再增长,而延迟还在持续上升,我们可以认为压到极限了。一般情况下,我们的测试深度不会超过128,再高基本就没有意义了,所以简单评测的时候,可以直接把深度压到128。

    • 测试工具一般使用fio

    测试工具

    测试工具适用场景说明下载地址
    fio适用于裸盘情况下的性能测试fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等http://freecode.com/projects/fio
    vdbench适用于文件系统盘情况下的性能测试vdbench是一个 I/O 工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试测试大量文件、目录的创建、删除性能,以及对文件的读写性能。https://www.oracle.com/technetwork/cn/server-storage/vdbench-downloads-1901681-zhs.html

    注意事项

    • 在测试之前尝试禁用驱动器缓存:hdparm -W 0 /dev/sdX(SATA驱动器),sdparm --set WCE=0 /dev/sdX(SAS驱动器)。通常,这是服务器固态硬盘(例如 INTEL SSDSC2BB80),因为它使随机写入iops 增加了两个数量级以上*(从288 iops到18000 iops!)。在某些情况下,它可能没有任何改善,因此请同时尝试使用-W0和-W1选项

    • 推荐的fio裸盘基准测试工具:

    • 从VM内部或通过内核RBD驱动程序(krbd)是相同的:

    1. fio -ioengine=libaio -direct=1 -name=test -bs=4M -iodepth=16 -rw=write -runtime=300 -filename=/dev/rbdX

    2. fio -ioengine=libaio -direct=1 -sync=1 -name=test -bs=4k -iodepth=1 -rw=randwrite -runtime=300 -filename=/dev/rbdX

    3. fio -ioengine=libaio -direct=1 -name=test -bs=4k -iodepth=128 -rw=randwrite -runtime=300 -filename=/dev/rbdX

      然后重复执行rw=read/randread

      这是为了进行如下测试:

      • 可能的最佳延迟
      • 线性带宽
      • 随机访问iops

      从空的卷读取非常快,因此在测试之前预先填满存储卷。

    • 切勿使用dd测试磁盘性能。

    • 不要使用一些存储自带的测试工具,例如ceph的rados bench。它创建少量对象(每个线程1-2个),因此所有对象始终驻留在缓存中,并且改善了结果,超出了应有的范围。

    • 除非绝对确定需要,否则请不要使用RAID。所有驱动器均应使用直通(HBA)模式进行连接

    • RAID和HBA/SATA之间的IOPS差异可能非常明显。损坏或旧的RAID控制器很容易成为瓶颈

    • 有一件事情可以一次减少2-3倍的延迟。它禁用了CPU的所有节能功能:

      • cpupower idle-set -D 1—— 这将禁用C状态(或者您可以将processor.max_cstate = 1 intel_idle.max_cstate = 0传递给内核命令行)
      • for i in $(seq 0 $((nproc-1))); do cpufreq-set -c $i -g performance; done ——这将禁用频率缩放。
    • 禁用节能功能后,CPU会作为GTX发热,但iops会增加2-3倍

    单块裸盘性能测试

    单块云硬盘的性能即将整个存储池的性能都给这块云硬盘使用,是测试client的极限性能。

    我们需要从多个维度去测量单块云硬盘的性能,包括块大小按4k~512k的梯度上升,iodepth从1~128梯度上升,同时测试不同的读写模式。

    可以参考如下测试方法:

    • 线性读取:fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=read -runtime=300 -filename=/dev/sdX
    • 线性写入:fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=write -runtime=300 -filename=/dev/sdX
    • 峰值并行随机读取:fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 -rw=randread -runtime=300 -filename=/dev/sdX
    • 单线程读取延迟:fio -ioengine=libaio -sync=1 -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -rw=randread -runtime=300 -filename=/dev/sdX
    • 峰值并行随机写入:fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 -rw=randwrite -runtime=300 -filename=/dev/sdX
    • 日志写入延迟:fio -ioengine=libaio -sync=1 -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -rw=write -runtime=300 -filename=/dev/sdX。还可以使用-fsync=1而不是-sync=1进行尝试,并记下最差的结果,因为有时syncfsync会被杂乱的硬件忽略。
    • 单线程随机写入延迟fio -ioengine=libaio -sync=1 -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -rw=randwrite -runtime=300 -filename=/dev/sdX

    多盘裸盘性能测试

    一般分布式的存储我们会考虑压测集群的性能,即通过增加client的数量,来获取server的极限性能。

    测试前,我们会根据当前集群的容量准备一些铺底数据,一般要达到总容量的20%以上。

    多盘性能测试与单盘在原理上无差异,可以理解为增加了压测client的数量。

    多盘的性能iops和带宽我们一般取所有被测云盘性能的总和,延迟我们取所有云盘延迟的平均值。

    单客户端文件系统盘性能测试

    (1)vdbench是java开发的测试工具,需要java环境。

    ​ apt-get install openjdk-7-jdk -y

    (2)做文件系统

    ​ mkfs.ext4 /dev/vdc (vdc为云盘)

    (3) mount设备

    ​ mount /dev/vdc /mnt

    (4)在vdbench文件目录下执行:./vdbench -t

    ​ 出现如下信息则说明可正常使用

    vdbench测试需要写测试配置文件。在vdbench 目录下创建profile文件。

    ​ 单节点配置可参考我的如下测试配置文件

    hd=default,vdbench=/home/chenyunhui/vdbench50406,user=root,shell=ssh
    fsd=fsd1,anchor=/mnt,depth=1,width=10,files=10,size=1000m,shared=yes,openflags=o_direct
    fwd=fwd1,fsd=fsd1,threads=4,xfersize=4k,fileio=random,fileselect=random,rdpct=50
    rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=3600,interval=1

    该配置为10 10 1G的文件数据,具体文件数据可以根据底层集群规模来定。

    其中比较重要的参数为:

    anchor= 将在其中创建目录结构的目录

    width= 要在定位符下创建的目录数

    depth= 要在定位符下创建的级别数(目录深度)

    files= 要在最低级别创建的文件数

    sizes= (size,size,...) 将创建的文件大小

    distribution= bottom(如果希望仅在最低级别创建文件)和 all(如果希望在所有目录中创建文件)

    fileio= random 或 sequential,表示文件 I/O 将执行的方式。

    fileselect= random 或 sequential,标识选择文件或目录的方式。

    xfersizes= 数据传输(读取和写入操作)处理的数据大小。

    rdpct= 读取和写入操作的百分比。0为全写

    threads= 此工作负载的并发线程数量。每个线程需要至少 1 个文件

    elapsed= 以秒为单位的运行持续时间。默认设置为 30

    vdbench可以在测试时增加-jn的参与用于测试时同时进行数据校验。vdbench每次写操作都会记录在一个表里,对每个512字节数据 的8字节逻辑字节地址和1字节的校验值进行记录,校验值中会记录为第几次写。第一次创建写为00,后续每次覆盖写加1。再次运行时会读出之前的校验日志并进行数据校验。

    读写数据测试和记录校验数据使用命令:

    ./vdbench -jn -f profile 执行该命令时同时会进行数据校验。

    但是需要注意,使用vdbench进行一致性校验测试更加适宜于稳定性测试和一致性测试,性能测试过程中使用会影响性能

    最后产生的测试结果都是output下面

    errorlog.html

    当为测试启用了数据验证时,它可包含一些数据块中的错误的相关信息:

    • 无效的密钥读取
    • 无效的 lba 读取(一个扇区的逻辑字节地址)
    • 无效的 SD 或 FSD 名称读取
    • 数据损坏,即使在使用错误的 lba 或密钥时
    • 数据损坏
    • 坏扇区

    flatfile.html

    包含 vdbench 生成的一种逐列的 ASCII 格式的信息。

    histogram.html

    一种包含报告柱状图的响应时间、文本格式的文件。

    logfile.html

    包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途

    parmfile.html

    显示已包含用于测试的每项内容的最终结果

    resourceN-M.html、resourceN.html、resourceN.var_adm_msgs.html

    • 摘要报告
    • stdout/stderr 报告
    • 主机 N 的摘要报告
    • 最后 “nn” 行文件 /var/adm/messages 和 /var/adm/messages。每个 M 个 JVM/Slave 的目标主机 N 和主机 N 上为 0。

    sdN.histogram.html、sdN.html

    每个 N 存储定义的柱状图和存储定义 “N” 报告。

    summary.html

    主要报告文件,显示为在每个报告间隔的每次运行生成的总工作负载,以及除第一个间隔外的所有间隔的加权平均值。

    • interval:报告间隔序号
    • I/O rate:每秒观察到的平均 I/O 速率
    • MB sec:传输的数据的平均 MB 数
    • bytes I/O:平均数据传输大小
    • read pct:平均读取百分比
    • resp time:以读/写请求持续时间度量的平均响应时间。所有 vdbench 时间都以毫秒为单位。
    • resp max:在此间隔中观察到的最大响应时间。最后一行包含最大值总数。
    • resp stddev:响应时间的标准偏差
    • cpu% sys+usr:处理器繁忙 = 100(系统 + 用户时间)(Solaris、Windows、Linux)
    • cpu% sys:处理器利用率:系统时间

    多客户端文件系统盘性能测试

    多数情况下我们会进行多客户端的测试。多客户端测试参数可配置如下:

    hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
    hd=hd1,system=183.136.181.150
    hd=hd2,system=115.238.123.189

    fsd=fsd1,anchor=/mnt1,depth=1,width=10,files=1,size=1000m,openflags=o_direct
    fsd=fsd2,anchor=/mnt2,depth=1,width=10,files=1,size=1000m,openflags=o_direct
    fwd=fwd1,fsd=fsd1,host=hd1,threads=4,xfersize=4k,fileio=random,fileselect=random,rdpct=50
    fwd=fwd2,fsd=fsd2,host=hd2,threads=4,xfersize=4k,fileio=random,fileselect=random,rdpct=50


    rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=3600,interval=1,warmup=300

    上面的例子是测试两台机器的云盘,每个云盘4个线程对110 1G的文件进行读写,4K的块大小,50%的写,50%随机,热身写300s,然后测试3600s

    相比于多个客户端上跑fio,使用vdbench进行多客户端测试的好处有:

    • 1、能够每秒显示整个测试的io叠加,这样测试整个集群的io的时候,可以把所有虚机启动起来,然后进行io的压测,而不是去压单个rbd的iops,那个没有太大的意义,只能是一个数值,真正的环境大多也不是给一个业务使用的,也可以跑起一个业务以后,再看剩余的机器还能跑多少性能
    • 2、在测试输出报告里面会根据主机统计一次io,这个面向的业务场景就是,比如某台主机上面可能挂载多块云盘,那么可以根据主机进行统计
    • 3、在报告里面还会根据设备显示io个延时的信息,也就是只要是测试设备,每一个的性能指标都能查到,这个的好处就是检测集群里面的io是不是均匀的,如果做了qos,设备的测试性能值是不是跟设置限制一样
    - - + + \ No newline at end of file diff --git a/CurveBS/usecase/scenario.html b/CurveBS/usecase/scenario.html index bef2833..367253a 100644 --- a/CurveBS/usecase/scenario.html +++ b/CurveBS/usecase/scenario.html @@ -4,13 +4,13 @@ 应用场景 | Curve Book - - + +
    跳到主要内容

    应用场景

    CurveBS的核心应用场景主要包括:

    • 虚拟机/容器的性能型、混合型、容量型云盘或持久化卷,以及物理机的远程存储盘
    • 高性能存算分离架构:基于RDMA+SPDK的高性能低时延架构,支撑MySQL、kafka等各类数据库、中间件的存算分离部署架构,提升实例交付效率和资源利用率

    TBD

    - - + + \ No newline at end of file diff --git a/CurveBS/usecase/usecase1.html b/CurveBS/usecase/usecase1.html index 0368346..7b79ab7 100644 --- a/CurveBS/usecase/usecase1.html +++ b/CurveBS/usecase/usecase1.html @@ -4,13 +4,13 @@ 用户案例1 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveFS/architecture/architecture-intro.html b/CurveFS/architecture/architecture-intro.html index 70854ca..0688621 100644 --- a/CurveFS/architecture/architecture-intro.html +++ b/CurveFS/architecture/architecture-intro.html @@ -4,13 +4,13 @@ 架构介绍 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveFS/comparison/CurveFS-vs-CephFS.html b/CurveFS/comparison/CurveFS-vs-CephFS.html index bef8dc9..09c954d 100644 --- a/CurveFS/comparison/CurveFS-vs-CephFS.html +++ b/CurveFS/comparison/CurveFS-vs-CephFS.html @@ -4,13 +4,13 @@ CurveFS 对比 CephFS | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveFS/deploy/offline-deploy.html b/CurveFS/deploy/offline-deploy.html index 47ea3b3..9c2c055 100644 --- a/CurveFS/deploy/offline-deploy.html +++ b/CurveFS/deploy/offline-deploy.html @@ -4,15 +4,15 @@ 离线部署文档 | Curve Book - - + +
    -
    跳到主要内容

    离线部署文档

    离线环境准备

    Curve镜像准备

    1. 拉取镜像 +

      离线部署文档

      离线环境准备

      Curve镜像准备

      1. 拉取镜像 Curve官方镜像(如opencurve/curve/curvefs:v2.4)到本地环境(可访问外网的机器)
      $ sudo docker pull opencurve/curve/curvefs:v2.4
      1. 导出镜像
      # 查看下载到的Curve镜像
      $ sudo docker image ls
      opencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB

      # 导出镜像
      $ sudo docker save -o curve_v2.4.tar 5717f16d4bec
      1. 拷贝镜像到本地仓库节点
      $ scp curve_v2.4.tar  ${desthost}:/path/to/save/image
      1. 导入镜像
      $ docker load --input curve_v2.4.tar

      # 查看导入的镜像
      $ sudo docker image ls
      opencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB

      本地镜像仓库搭建

      使用docker-registry来进行本地仓库的搭建,搭建完本地仓库后, 把前面步骤中下载的Curve镜像上传到本地仓库。主要有以下几步:

      1. 运行 docker-registry
      $ docker run -d -p 5000:5000 --restart=always --name registry registry
      1. 标记Curve镜像 -标记下载到的Curve镜像,比如把下载来的镜像(opencurve/curve/curvefs:v2.4)标记为127.0.0.1:5000/curvefs:v2.4_local(其中127.0.0.1为本地仓库服务IP,5000为本地仓库服务端口号,请根据实际环境修改)
      # 查看下载到的Curve镜像
      $ sudo docker image ls
      opencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB

      # 标记镜像
      $ sudo docker tag opencurve/curve/curvefs:v2.4 127.0.0.1:5000/curvefs:v2.4_local

      # 查看标记完的镜像
      $ sudo docker image ls
      127.0.0.1:5000/curvefs v2.4_local 5717f16d4bec 13 months ago 1.84GB
      1. 上传镜像
      $ docker push 127.0.0.1:5000/curvefs:v2.4_local

      更多详情可参考私有仓库搭建

      修改镜像地址

      修改客户端部署配置文件client.yaml以及服务端集群部署配置文件topology.yaml中的镜像地址配置项(container_image)为本地仓库镜像地址(如:127.0.0.1:5000/curvefs:v2.4_local

      部署

      安装CurveAdm

      CurveAdm是Curve部署工具,有外网的机器可以一键安装,具体安装参见CurveAdm安装

      但由于本文是介绍内网环境的部署,所以需按如下步骤操作:

      • 下载CurveAdm到本地可访问外网机器,下载地址(最新版本可咨询Curve社区成员): CurveAdm
      • 把CurveAdm拷贝到内网安装需部署Curve集群的主控机
      • 解压CurveAdm
      • 拷贝执行程序并设置环境变量
      $ mv curveadm ~/.curveadm

      # 可考虑更新到~/.bash_profile进行持久化
      $ export PATH=~/.curveadm/bin:$PATH

      主机配置

      配置Curve集群要使用的服务器列表,提交列表给CurveAdm管理。主机配置过程比较简单,在hosts.yaml中添加实际主机名和ip,然后提交就可以了。

      具体配置参考文档:主机管理

      Curve服务端部署

      需修改topology.yaml中的镜像为本地镜像地址,示例如下:

      kind: curvefs
      global:
      container_image: 127.0.0.1:5000/curvefs:v2.4_local ## 修改为本地镜像

      其他的配置项请参考文档 CurveFS集群部署CurveBS集群部署

      client端部署

      需修改client.yaml中的镜像为本地镜像地址,示例如下:

      kind: curvefs
      global:
      container_image: 127.0.0.1:5000/curvefs:v2.4_local ## 修改为本地镜像

      其他的配置项请参考文档 部署CurveFS客户端部署CurveBS客户端

    - - +标记下载到的Curve镜像,比如把下载来的镜像(opencurve/curve/curvefs:v2.4)标记为127.0.0.1:5000/curvefs:v2.4_local(其中127.0.0.1为本地仓库服务IP,5000为本地仓库服务端口号,请根据实际环境修改)
    # 查看下载到的Curve镜像
    $ sudo docker image ls
    opencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB

    # 标记镜像
    $ sudo docker tag opencurve/curve/curvefs:v2.4 127.0.0.1:5000/curvefs:v2.4_local

    # 查看标记完的镜像
    $ sudo docker image ls
    127.0.0.1:5000/curvefs v2.4_local 5717f16d4bec 13 months ago 1.84GB
    1. 上传镜像
    $ docker push 127.0.0.1:5000/curvefs:v2.4_local

    更多详情可参考私有仓库搭建

    修改镜像地址

    修改客户端部署配置文件client.yaml以及服务端集群部署配置文件topology.yaml中的镜像地址配置项(container_image)为本地仓库镜像地址(如:127.0.0.1:5000/curvefs:v2.4_local

    部署

    安装CurveAdm

    CurveAdm是Curve部署工具,有外网的机器可以一键安装,具体安装参见CurveAdm安装

    但由于本文是介绍内网环境的部署,所以需按如下步骤操作:

    • 下载CurveAdm到本地可访问外网机器,下载地址(最新版本可咨询Curve社区成员): CurveAdm
    • 把CurveAdm拷贝到内网安装需部署Curve集群的主控机
    • 解压CurveAdm
    • 拷贝执行程序并设置环境变量
    $ mv curveadm ~/.curveadm

    # 可考虑更新到~/.bash_profile进行持久化
    $ export PATH=~/.curveadm/bin:$PATH

    主机配置

    配置Curve集群要使用的服务器列表,提交列表给CurveAdm管理。主机配置过程比较简单,在hosts.yaml中添加实际主机名和ip,然后提交就可以了。

    具体配置参考文档:主机管理

    Curve服务端部署

    需修改topology.yaml中的镜像为本地镜像地址,示例如下:

    kind: curvefs
    global:
    container_image: 127.0.0.1:5000/curvefs:v2.4_local ## 修改为本地镜像

    其他的配置项请参考文档 CurveFS集群部署CurveBS集群部署

    client端部署

    需修改client.yaml中的镜像为本地镜像地址,示例如下:

    kind: curvefs
    global:
    container_image: 127.0.0.1:5000/curvefs:v2.4_local ## 修改为本地镜像

    其他的配置项请参考文档 部署CurveFS客户端部署CurveBS客户端

    + + \ No newline at end of file diff --git a/CurveFS/deploy/quickstart.html b/CurveFS/deploy/quickstart.html index 00fd643..4a3a69a 100644 --- a/CurveFS/deploy/quickstart.html +++ b/CurveFS/deploy/quickstart.html @@ -4,13 +4,13 @@ CurveFS 快速体验 | Curve Book - - + +
    -
    跳到主要内容

    CurveFS 快速体验

    为了提升 Curve 的运维便利性,我们设计开发了 CurveAdm 项目,其主要用于部署和管理 Curve 集群,目前已支持部署CurveBS & CurveFS,相关使用文档请参考 CurveAdm用户手册,并根据手册首先安装CurveAdm工具之后再进行Curve集群的部署。

    部署All-in-one体验环境

    请参考CurveAdm用户手册中CurveFS集群部署步骤,单机体验环境请使用“集群拓扑文件-单机部署”模板。

    命令行工具

    curve 提供了命令行工具以查看集群状态和进行基本集群操作:命令行工具说明

    - - +
    跳到主要内容

    CurveFS 快速体验

    为了提升 Curve 的运维便利性,我们设计开发了 CurveAdm 项目,其主要用于部署和管理 Curve 集群,目前已支持部署CurveBS & CurveFS,相关使用文档请参考 CurveAdm用户手册,并根据手册首先安装CurveAdm工具之后再进行Curve集群的部署。

    部署All-in-one体验环境

    请参考CurveAdm用户手册中CurveFS集群部署步骤,单机体验环境请使用“集群拓扑文件-单机部署”模板。

    命令行工具

    curve 提供了命令行工具以查看集群状态和进行基本集群操作:命令行工具说明

    + + \ No newline at end of file diff --git a/CurveFS/deploy/static-pv.html b/CurveFS/deploy/static-pv.html new file mode 100644 index 0000000..e8e21d7 --- /dev/null +++ b/CurveFS/deploy/static-pv.html @@ -0,0 +1,16 @@ + + + + + +静态PV配置 | Curve Book + + + + +
    +
    跳到主要内容

    静态PV配置

    CurveFS CSI使用node节点上的缓存盘

    如果client需要开启diskcache并使用宿主机额外的硬盘或云盘,需要在csi driver部署之前先把云盘或者本地盘挂载好。之后格式化硬盘或云盘然后mount到一个path(如/data/curvefs-diskcache),然后通过hostpath的方式映射进csi的daemonset pod里的/curvefs/client/data/cache路径,配置可以参考下面这个yaml:

    https://github.com/opencurve/curvefs-csi/blob/main/deploy/csi-node-daemonset-enable-cache.yaml

    上述配置文件中的 /data/curvefs-diskcache 对应的就是上面配置的缓存盘目录,可以修改为自己自定义的路径名称。

    一个开启diskcache的静态pv模板如下:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: static-pv-curvefs
    spec:
    accessModes:
    - ReadWriteMany
    capacity:
    storage: 1000Mi
    csi:
    driver: csi.curvefs.com
    volumeAttributes:
    fsType: s3
    mdsAddr: <mdsaddr>
    volumeHandle: <curvefs>
    mountOptions:
    - diskCache.diskCacheType=2 # 开启read和write缓存, 1为read缓存,默认为0是无缓存
    - fuseClient.supportKVcache: true # 以下配置可按需修改,下同
    - diskCache.forceFlush: false
    - enableSumInDir: false
    - diskCache.fullRatio: 95
    - diskCache.safeRatio: 50
    persistentVolumeReclaimPolicy: Retain # 不要修改该策略
    volumeMode: Filesystem

    静态PV实现跨namespace共享文件系统

    为了实现跨namespace共享文件系统,需要每一个namespace创建一组PVC和PV,其中PV指向的是后端的同一个FS。

    预先创建文件系统

    比如这里的文件系统名为curvefs,安装新工具并且配置配置文件,具体安装参考如下文档:

    https://github.com/opencurve/curve/tree/master/tools-v2#install

    安装完成后使用如下命令创建fs:

    curve fs create fs --fsname curvefs --fstype s3 --s3.ak ${AK} --s3.sk ${SK} --s3.endpoint http://localhost:9000 --s3.bucketname curvefs --s3.blocksize 4MiB --s3.chunksize 4MiB

    按照如下模板声明PV

    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: static-pv-curvefs
    spec:
    accessModes:
    - ReadWriteMany
    capacity:
    storage: 1000Mi
    csi:
    driver: csi.curvefs.com
    volumeAttributes:
    fsType: s3
    mdsAddr: <mdsaddr>
    volumeHandle: <curvefs>
    mountOptions:
    - diskCache.diskCacheType=2 # 开启read和write缓存,1为read缓存,默认为0是无缓存
    persistentVolumeReclaimPolicy: Retain # 不要修改该策略
    volumeMode: Filesystem

    需要自定义修改的字段:

    • mdsaddr:连接的fs集群的mds地址
    • volumeHandle:预先创建的fs的名字,比如curvefs

    其他重点说明:

    • persistentVolumeReclaiPolicy: 策略为Retain,不要试图修改

    声明PVC绑定上述PV

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: static-pvc-curvefs
    namespace: <namespace>
    spec:
    accessModes:
    - ReadWriteMany
    resources:
    requests:
    storage: 100Mi
    storageClassName: ""
    volumeMode: Filesystem
    volumeName: static-pv-curvefs

    需要自定义修改的字段:

    • namespace:指定pvc的namespace,比如ns1。

    对需要共享pv的namespace重复上述2-3步骤

    对于不同的namespace,需要重复上述的2,3步骤,新建的PV指定同一个FS,新建的PVC指定新的namespace即可。

    这样不同namespace的pod挂载各自namespace下PVC即可。

    + + + + \ No newline at end of file diff --git a/CurveFS/maintenance/maintenance-tools.html b/CurveFS/maintenance/maintenance-tools.html index f860251..9bc6523 100644 --- a/CurveFS/maintenance/maintenance-tools.html +++ b/CurveFS/maintenance/maintenance-tools.html @@ -4,13 +4,13 @@ 运维工具 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveFS/performance/how-to-benchmark.html b/CurveFS/performance/how-to-benchmark.html index 64ca34a..6aa0d99 100644 --- a/CurveFS/performance/how-to-benchmark.html +++ b/CurveFS/performance/how-to-benchmark.html @@ -4,13 +4,13 @@ benchmark指南 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/CurveFS/test/env-setup.html b/CurveFS/test/env-setup.html index 9bd501c..19e4c5f 100644 --- a/CurveFS/test/env-setup.html +++ b/CurveFS/test/env-setup.html @@ -4,13 +4,13 @@ 测试环境配置 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git "a/CurveFS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" "b/CurveFS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" index 480b5fa..6576aae 100644 --- "a/CurveFS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" +++ "b/CurveFS/test/\346\200\247\350\203\275\346\265\213\350\257\225.html" @@ -4,13 +4,13 @@ 性能测试 | Curve Book - - + +
    跳到主要内容

    性能测试

    测试工具

    测试工具适用场景说明下载地址
    fio适用于裸盘情况下的性能测试fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等http://freecode.com/projects/fio
    vdbench适用于文件系统盘情况下的性能测试vdbench是一个 I/O 工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。它是一个免费的工具,容易使用,而且常常用于测试测试大量文件、目录的创建、删除性能,以及对文件的读写性能。https://www.oracle.com/technetwork/cn/server-storage/vdbench-downloads-1901681-zhs.html

    单客户端文件系统盘性能测试

    (1)vdbench是java开发的测试工具,需要java环境。

    ​ apt-get install openjdk-7-jdk -y

    (2)做文件系统

    ​ mkfs.ext4 /dev/vdc (vdc为云盘)

    (3) mount设备

    ​ mount /dev/vdc /mnt

    (4)在vdbench文件目录下执行:./vdbench -t

    ​ 出现如下信息则说明可正常使用

    vdbench测试需要写测试配置文件。在vdbench 目录下创建profile文件。

    ​ 单节点配置可参考我的如下测试配置文件

    hd=default,vdbench=/home/chenyunhui/vdbench50406,user=root,shell=ssh
    fsd=fsd1,anchor=/mnt,depth=1,width=10,files=10,size=1000m,shared=yes,openflags=o_direct
    fwd=fwd1,fsd=fsd1,threads=4,xfersize=4k,fileio=random,fileselect=random,rdpct=50
    rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=3600,interval=1

    该配置为10 10 1G的文件数据,具体文件数据可以根据底层集群规模来定。

    其中比较重要的参数为:

    anchor= 将在其中创建目录结构的目录

    width= 要在定位符下创建的目录数

    depth= 要在定位符下创建的级别数(目录深度)

    files= 要在最低级别创建的文件数

    sizes= (size,size,...) 将创建的文件大小

    distribution= bottom(如果希望仅在最低级别创建文件)和 all(如果希望在所有目录中创建文件)

    fileio= random 或 sequential,表示文件 I/O 将执行的方式。

    fileselect= random 或 sequential,标识选择文件或目录的方式。

    xfersizes= 数据传输(读取和写入操作)处理的数据大小。

    rdpct= 读取和写入操作的百分比。0为全写

    threads= 此工作负载的并发线程数量。每个线程需要至少 1 个文件

    elapsed= 以秒为单位的运行持续时间。默认设置为 30

    vdbench可以在测试时增加-jn的参与用于测试时同时进行数据校验。vdbench每次写操作都会记录在一个表里,对每个512字节数据 的8字节逻辑字节地址和1字节的校验值进行记录,校验值中会记录为第几次写。第一次创建写为00,后续每次覆盖写加1。再次运行时会读出之前的校验日志并进行数据校验。

    读写数据测试和记录校验数据使用命令:

    ./vdbench -jn -f profile 执行该命令时同时会进行数据校验。

    但是需要注意,使用vdbench进行一致性校验测试更加适宜于稳定性测试和一致性测试,性能测试过程中使用会影响性能

    最后产生的测试结果都是output下面

    errorlog.html

    当为测试启用了数据验证时,它可包含一些数据块中的错误的相关信息:

    • 无效的密钥读取
    • 无效的 lba 读取(一个扇区的逻辑字节地址)
    • 无效的 SD 或 FSD 名称读取
    • 数据损坏,即使在使用错误的 lba 或密钥时
    • 数据损坏
    • 坏扇区

    flatfile.html

    包含 vdbench 生成的一种逐列的 ASCII 格式的信息。

    histogram.html

    一种包含报告柱状图的响应时间、文本格式的文件。

    logfile.html

    包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途

    parmfile.html

    显示已包含用于测试的每项内容的最终结果

    resourceN-M.html、resourceN.html、resourceN.var_adm_msgs.html

    • 摘要报告
    • stdout/stderr 报告
    • 主机 N 的摘要报告
    • 最后 “nn” 行文件 /var/adm/messages 和 /var/adm/messages。每个 M 个 JVM/Slave 的目标主机 N 和主机 N 上为 0。

    sdN.histogram.html、sdN.html

    每个 N 存储定义的柱状图和存储定义 “N” 报告。

    summary.html

    主要报告文件,显示为在每个报告间隔的每次运行生成的总工作负载,以及除第一个间隔外的所有间隔的加权平均值。

    • interval:报告间隔序号
    • I/O rate:每秒观察到的平均 I/O 速率
    • MB sec:传输的数据的平均 MB 数
    • bytes I/O:平均数据传输大小
    • read pct:平均读取百分比
    • resp time:以读/写请求持续时间度量的平均响应时间。所有 vdbench 时间都以毫秒为单位。
    • resp max:在此间隔中观察到的最大响应时间。最后一行包含最大值总数。
    • resp stddev:响应时间的标准偏差
    • cpu% sys+usr:处理器繁忙 = 100(系统 + 用户时间)(Solaris、Windows、Linux)
    • cpu% sys:处理器利用率:系统时间

    多客户端文件系统盘性能测试

    多数情况下我们会进行多客户端的测试。多客户端测试参数可配置如下:

    hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
    hd=hd1,system=183.136.181.150
    hd=hd2,system=115.238.123.189

    fsd=fsd1,anchor=/mnt1,depth=1,width=10,files=1,size=1000m,openflags=o_direct
    fsd=fsd2,anchor=/mnt2,depth=1,width=10,files=1,size=1000m,openflags=o_direct
    fwd=fwd1,fsd=fsd1,host=hd1,threads=4,xfersize=4k,fileio=random,fileselect=random,rdpct=50
    fwd=fwd2,fsd=fsd2,host=hd2,threads=4,xfersize=4k,fileio=random,fileselect=random,rdpct=50


    rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=3600,interval=1,warmup=300

    上面的例子是测试两台机器的云盘,每个云盘4个线程对110 1G的文件进行读写,4K的块大小,50%的写,50%随机,热身写300s,然后测试3600s

    相比于多个客户端上跑fio,使用vdbench进行多客户端测试的好处有:

    • 1、能够每秒显示整个测试的io叠加,这样测试整个集群的io的时候,可以把所有虚机启动起来,然后进行io的压测,而不是去压单个rbd的iops,那个没有太大的意义,只能是一个数值,真正的环境大多也不是给一个业务使用的,也可以跑起一个业务以后,再看剩余的机器还能跑多少性能
    • 2、在测试输出报告里面会根据主机统计一次io,这个面向的业务场景就是,比如某台主机上面可能挂载多块云盘,那么可以根据主机进行统计
    • 3、在报告里面还会根据设备显示io个延时的信息,也就是只要是测试设备,每一个的性能指标都能查到,这个的好处就是检测集群里面的io是不是均匀的,如果做了qos,设备的测试性能值是不是跟设置限制一样
    - - + + \ No newline at end of file diff --git a/CurveFS/usecase/jiangsu-nongxin-es.html b/CurveFS/usecase/jiangsu-nongxin-es.html index 1f43a8d..b4ec3c0 100644 --- a/CurveFS/usecase/jiangsu-nongxin-es.html +++ b/CurveFS/usecase/jiangsu-nongxin-es.html @@ -4,13 +4,13 @@ 江苏农信选择CurveFS实现ES冷数据长期存储 | Curve Book - - + +
    跳到主要内容

    江苏农信选择CurveFS实现ES冷数据长期存储

    一、需求背景

    运维大数据平台自构建以来,日志类数据越来越多,目前已超过200TB;日志的种类也越来越丰富,除了最初的业务日志,还有存储ceph日志,中间件nginx、IHS、Tomcat等日志。目前大部分日志的保留周期都在14天或7天左右,无法满足业务日志和运维操作类日志长期保留的需求。各日志条线负责人,对日志的长期存储需求越来越急迫,一个是为了符合监管审计要求,二是对历史日志也能方便的检索分析。从平台角度来看,现有的方式缺乏统一的日志归档管理,各个业务线自我维护,重复建设消耗的成本高。

    二、需求描述

    场景一:业务侧日志

    • 主要需求: 监管审计,历史日志查看和检索
    • 现阶段痛点:
      • 现有的业务日志备份方式,是通过crontab脚本,定期打包put到对象存储 S3中
      • 该备份流程每个业务系统单独自我管理;
      • 同时在需要恢复的时候,需要人为手动操作,下载解压分析备份日志,整个流程耗时比较长。

    场景二:运维侧日志

    • 主要需求: 监管审计,操作留档,历史回溯;例如网络设备相关日志,现要求保留半年以上。

    三、日志数据分层管理方案设计

    实现行内所有日志的统一备份管理,减少分散管理的压力和流程的混乱;同时运维大数据平台可以作为业务日志和对象存储中间的粘合剂,统一扎口,使之能更好的协同工作。 最后,基于数据分层处理,来大大减少索引存储大小以及内存的占用。

    arch

    3.1 方案调研比对

    compare

    选择CurveFS优势:

    1. 索引备份操作变为索引迁移,对用户查询使用均无感知
    2. 索引恢复速度快,直接打开索引即可被查询

    3.2 整体方案设计

    实现方案: 新增Cold层,实现日志长期留存。实现Cold层数据直接对接到对象存储,减少以前日志备份的中间过程,同时能加快对日志的恢复操作。

    arch

    实现通过ITSM工单,自动恢复历史索引数据。

    3.3 日志备份方案设计

    logbackup

    1. ES分层设计
    2. 冷节点层用于索引“备份”
    3. 通过CurveFS实现数据无缝迁移到对象存储

    3.4 日志恢复方案设计

    logrestore

    3.5 日志备份功能实现

    备份执行流程:

    logbackup

    1. 修改集群参数,更好的满足迁移速度
    2. 按照索引模式,循环迁移各个索引,并进行关闭
    3. 修改集群参数,切换回低速迁移模式

    功能实现:

    logbackup

    1. 新建索引备份策略,基于索引模式角度
    2. 新建备份迁移队列
    3. 备份迁移队列编排
    4. 队列定期执行

    四、实际效果

    4.1 日志备份功能

    4.1.1 迁移队列管理

    配置队列每日执行的时间点,关联的接口,以及是否启用;还可以查看历史执行记录:

    queue

    4.1.2 索引生命周期策略管理

    统一的生命周期策略管理,一目了然:

    lifecycle

    配置每个队列中,索引的迁移的顺序;队列之间是并行执行,队列中是串行执行。

    lifecycle

    另外,部分索引不需要长期存储,只需要通过配置迁移到温节点队列即可。

    灵活查看索引的整个生命周期阶段:

    lifecycle

    4.2 日志恢复功能

    4.2.1 用户工单流程配置

    ticket

    4.2.2 用户申请工单表单

    ticket

    五、方案总结

    • 统一管理: 对ES进行上层封装建设,减少对Kibana的依赖,对多集群、多版本ES可以进行统一管理;
    • 自主可控: 通过自研开发,更贴合实际场景;部分日志需要长期留存,转移到冷节点;部分不需要长期留存,在转移到温节点后,静待删除;
    • 更细粒度的控制: 队列配置了索引迁移开始时间,队列中的索引基于编排的顺序,串行开始迁移;
    • 并行控制: 基于队列的机制,实现备份迁移的并行。如果后端存储性能足够,可以多开几个队列,充分利用凌晨的空闲IO;
    • 统一的策略管理: 所有索引备份策略一目了然,方便全局掌控,快速调整;
    • 全生命周期管理: 索引从产生到最后删除,每一个阶段都留有记录,通过时间树的方式快速查看。

    带来的价值:

    • 灵活性,高效性: 都是从S3取数据,这个直接通过打开索引,就能恢复提供查询;
    • 流程数字化,自动化: 通过工单申请,能自动进行接口调用,实现索引恢复和定期关闭;
    • 优化日志数据存储分层,实现降本增效: 对本地SATA盘的依赖减少,依靠云存储的稳定性,ES本地节点存储容量为0,全部存储到S3;
    - - + + \ No newline at end of file diff --git a/CurveFS/usecase/scenario.html b/CurveFS/usecase/scenario.html index 74f846c..301e917 100644 --- a/CurveFS/usecase/scenario.html +++ b/CurveFS/usecase/scenario.html @@ -4,13 +4,13 @@ 应用场景 | Curve Book - - + +
    跳到主要内容

    应用场景

    CurveFS的核心应用场景主要包括:

    • AI训练(含机器学习等)场景下的高性价比存储
    • 大数据场景下的冷热数据自动化分层存储
    • 公有云上高性价比的共享文件存储:可用于AI、大数据、文件共享等业务场景
    • 混合云存储:热数据存储在本地IDC,冷数据存储在公有云

    TBD

    - - + + \ No newline at end of file diff --git a/Develop/code-walkthrough-xxx.html b/Develop/code-walkthrough-xxx.html index 54bc984..f1f4343 100644 --- a/Develop/code-walkthrough-xxx.html +++ b/Develop/code-walkthrough-xxx.html @@ -4,13 +4,13 @@ 代码走读 - xxx | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/Develop/how-to-contribute.html b/Develop/how-to-contribute.html index 5b6fd05..0bf92b9 100644 --- a/Develop/how-to-contribute.html +++ b/Develop/how-to-contribute.html @@ -4,13 +4,13 @@ 参与贡献 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/Release/release-intro.html b/Release/release-intro.html index 1a8047c..1f182ef 100644 --- a/Release/release-intro.html +++ b/Release/release-intro.html @@ -4,13 +4,13 @@ 版本发布周期 | Curve Book - - + +
    跳到主要内容

    版本发布周期

    • CURVE版本发布周期:大版本半年,小版本1~2个月
    • 版本号规则:采用3段式版本号,x.y.z{-后缀},x是大版本,y是小版本,z是bugfix,后缀用来区beta版本(-beta)、rc版本(-rc)、和稳定版本(没有后缀)。每半年的大版本是指x增加1,每1~2个月的小版本是y增加1。正式版本发布之后,如果有bugfix是z增加1。

    分支规则

    所有的开发都在master分支开发,如果需要发布版本,从master拉取新的分支release-x.y。版本发布从release-x.y分支发布。

    - - + + \ No newline at end of file diff --git a/Release/release-notes-v2.6.html b/Release/release-notes-v2.6.html index 6102740..8f6d130 100644 --- a/Release/release-notes-v2.6.html +++ b/Release/release-notes-v2.6.html @@ -4,13 +4,13 @@ CHANGELOG of v2.6 | Curve Book - - + +
    跳到主要内容

    CHANGELOG of v2.6

    Previous change logs can be found at CHANGELOG-2.5

    Features

    Improve

    Bugfix

    Performance

    Hardware

    3 nodes (3mds, 9metaserver), each with:

    • Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
    • 256G RAM
    • disk cache: INTEL SSDSC2BB80 800G (IOPS is about 30000+, bandwidth is about 300 MiB)

    Configure

    fs.cto: true
    fs.lookupCache.negativeTimeoutSec: 1
    fs.lookupCache.minUses: 3
    fuseClient.supportKVcache: true
    client.loglevel: 0

    fio

    [global]
    rw=randread
    direct=1
    size=50G
    iodepth=128
    ioengine=libaio
    bsrange=4k-4k
    ramp_time=10
    runtime=300
    group_reporting

    [disk01]
    filename=/path/to/mountpoint/1.txt
    fioIOPS/bandwidthavg-latency(ms)clat 99.00th (ms)clat 99.99th (ms)
    numjobs=1 / size=50GB / 4k randwrite42430.230.1762
    numjobs=1 / size=50GB / 4k randwrite9081.03.5104
    numjobs=1 / size=50GB / 512k write412 MiB/s2.419566
    numjobs=1 / size=50GB / 512k read333 MiB/s2.920115

    mdtest

    for i in 1 4 8; do mpirun --allow-run-as-root -np $i mdtest -z 2 -b 3 -I 10000 -d /path/to/mountpoint; done
    CaseDir creationDir statDir removalFile creationFile statFile readFile removalTree creationTree removal
    client*13413959912913343838443694309322851
    client*438512326628836115155921505631036316
    client*8415221383144002811416209763473558
    - - + + \ No newline at end of file diff --git a/Roadmap/roadmap-2023.html b/Roadmap/roadmap-2023.html index 980a77e..6700296 100644 --- a/Roadmap/roadmap-2023.html +++ b/Roadmap/roadmap-2023.html @@ -4,13 +4,13 @@ Curve Roadmap 2023 | Curve Book - - + +
    跳到主要内容
    - - + + \ No newline at end of file diff --git a/assets/js/4f9e475d.9ec1a735.js b/assets/js/4f9e475d.0c5dd0bb.js similarity index 86% rename from assets/js/4f9e475d.9ec1a735.js rename to assets/js/4f9e475d.0c5dd0bb.js index 36c6494..b9ad6db 100644 --- a/assets/js/4f9e475d.9ec1a735.js +++ b/assets/js/4f9e475d.0c5dd0bb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[8812],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>v});var a=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=a.createContext({}),l=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,s=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),p=l(r),d=o,v=p["".concat(s,".").concat(d)]||p[d]||h[d]||n;return r?a.createElement(v,i(i({ref:t},c),{},{components:r})):a.createElement(v,i({ref:t},c))}));function v(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,i=new Array(n);i[0]=d;var u={};for(var s in t)hasOwnProperty.call(t,s)&&(u[s]=t[s]);u.originalType=e,u[p]="string"==typeof e?e:o,i[1]=u;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>u,toc:()=>l});var a=r(7462),o=(r(7294),r(3905));const n={slug:"/faq"},i="\u5e38\u89c1FAQ",u={unversionedId:"FAQ",id:"FAQ",title:"\u5e38\u89c1FAQ",description:"\u5173\u4e8eCurve",source:"@site/docs/08-FAQ.md",sourceDirName:".",slug:"/faq",permalink:"/faq",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{slug:"/faq"},sidebar:"tutorialSidebar",previous:{title:"CHANGELOG of v2.6",permalink:"/Release/release-notes-v2.6"},next:{title:"Roadmap",permalink:"/category/roadmap"}},s={},l=[{value:"\u5173\u4e8eCurve",id:"\u5173\u4e8ecurve",level:2},{value:"1. Curve\u662f\u4ec0\u4e48\uff1f/ What is Curve?",id:"1-curve\u662f\u4ec0\u4e48-what-is-curve",level:3},{value:"2. Curve\u4e0eCeph\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and Ceph?",id:"2-curve\u4e0eceph\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-ceph",level:3},{value:"3. Curve\u4e0eCubeFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and CubeFS?",id:"3-curve\u4e0ecubefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-cubefs",level:3},{value:"4. Curve\u4e0eOpenEBS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and OpenEBS?",id:"4-curve\u4e0eopenebs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-openebs",level:3},{value:"5. Curve\u4e0eJuiceFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and JuiceFS?",id:"5-curve\u4e0ejuicefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-juicefs",level:3},{value:"6. Curve\u4e0eHDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and HDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\uff1f",id:"6-curve\u4e0ehdfss3fsjindofsrapidfsgoosefsalluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-hdfss3fsjindofsrapidfsgoosefsalluxio",level:3},{value:"7. Curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b\uff1f / In what scenarios can Curve be used?",id:"7-curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b--in-what-scenarios-can-curve-be-used",level:3},{value:"8. Curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684\uff1f / How does Curve's cloud-native storage capability manifest?",id:"8-curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684--how-does-curves-cloud-native-storage-capability-manifest",level:3},{value:"9. Curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\uff1f\u89c4\u6a21\u5982\u4f55\uff1f\u7a33\u5b9a\u6027\u5982\u4f55\uff1f\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c\uff1f / Has Curve been used in a production environment? What is the scale? How is the stability? Has there been a massive failure?",id:"9-curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\u89c4\u6a21\u5982\u4f55\u7a33\u5b9a\u6027\u5982\u4f55\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c--has-curve-been-used-in-a-production-environment-what-is-the-scale-how-is-the-stability-has-there-been-a-massive-failure",level:3},{value:"10. Curve\u7684Roadmap\u662f\u4ec0\u4e48\uff1f / What is Curve's Roadmap?",id:"10-curve\u7684roadmap\u662f\u4ec0\u4e48--what-is-curves-roadmap",level:3},{value:"11. Curve\u5f00\u6e90\u7684\u76ee\u6807/\u76ee\u7684\u662f\u4ec0\u4e48\uff1f / What is the goal/purpose of Curve open source?",id:"11-curve\u5f00\u6e90\u7684\u76ee\u6807\u76ee\u7684\u662f\u4ec0\u4e48--what-is-the-goalpurpose-of-curve-open-source",level:3},{value:"12. Curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b\uff1f / What are the communication channels of the Curve community?",id:"12-curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b--what-are-the-communication-channels-of-the-curve-community",level:3},{value:"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173",id:"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173",level:2},{value:"1. Curve \u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the minimum requirements for deploy curve cluster?",id:"1-curve-\u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-minimum-requirements-for-deploy-curve-cluster",level:3},{value:"2. Curve \u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the recommended configuration for Curve production environment?",id:"2-curve-\u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-recommended-configuration-for-curve-production-environment",level:3},{value:"3. Curve \u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\uff1f\u6709\u65e0\u6307\u5bfc\u624b\u518c\uff1f/ What is the deployment tools for Curve? Is there an instruction manual?",id:"3-curve-\u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\u6709\u65e0\u6307\u5bfc\u624b\u518c-what-is-the-deployment-tools-for-curve-is-there-an-instruction-manual",level:3},{value:"4. Curve \u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\uff1f\u5982\u547d\u4ee4\u884c\u3001dashboard\u3001\u76d1\u63a7\u7cfb\u7edf\u7b49\uff1f/ What are the Curve O&M troubleshooting tools? Such as command line, dashboard, monitoring system, etc.",id:"4-curve-\u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\u5982\u547d\u4ee4\u884cdashboard\u76d1\u63a7\u7cfb\u7edf\u7b49-what-are-the-curve-om-troubleshooting-tools-such-as-command-line-dashboard-monitoring-system-etc",level:3},{value:"5. \u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u5982\u4f55\u83b7\u53d6 Curve \u793e\u533a\u7684\u652f\u6301\uff1f/ How can I get support from the Curve community if I encounter an unsolvable problem during deployment or O&M?",id:"5-\u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\u5982\u4f55\u83b7\u53d6-curve-\u793e\u533a\u7684\u652f\u6301-how-can-i-get-support-from-the-curve-community-if-i-encounter-an-unsolvable-problem-during-deployment-or-om",level:3},{value:"6. Curve \u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72\uff1f/ Does Curve support manual deployment of physical machine installation packages?",id:"6-curve-\u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72-does-curve-support-manual-deployment-of-physical-machine-installation-packages",level:3},{value:"7. Curve \u5982\u4f55\u6269\u5bb9\uff1f\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How does Curve scale out? Will capacity expansion affect IO?",id:"7-curve-\u5982\u4f55\u6269\u5bb9\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1-io-how-does-curve-scale-out-will-capacity-expansion-affect-io",level:3},{value:"8. Curve \u5982\u4f55\u5347\u7ea7\uff1f\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How to upgrade Curve? Does the upgrade process affect IO?",id:"8-curve-\u5982\u4f55\u5347\u7ea7\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1-io-how-to-upgrade-curve-does-the-upgrade-process-affect-io",level:3},{value:"9. Curve \u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f/ Does Curve support scale in cluster?",id:"9-curve-\u662f\u5426\u652f\u6301\u7f29\u5bb9-does-curve-support-scale-in-cluster",level:3},{value:"10. Curve \u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\uff1f\u5f02\u5730\u5bb9\u707e\uff1f\u4e24\u5730\u4e09\u4e2d\u5fc3\uff1f/ Does Curve support dual-active in the same city? Disaster recovery in different places? Three centers in two places?",id:"10-curve-\u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\u5f02\u5730\u5bb9\u707e\u4e24\u5730\u4e09\u4e2d\u5fc3-does-curve-support-dual-active-in-the-same-city-disaster-recovery-in-different-places-three-centers-in-two-places",level:3},{value:"11. Curve \u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72\uff1f/ Does Curve support hyperconverged deployment?",id:"11-curve-\u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72-does-curve-support-hyperconverged-deployment",level:3},{value:"12. Curve \u662f\u5426\u652f\u6301 rook\uff1f\u662f\u5426\u53ef\u4ee5\u7528 k8s \u90e8\u7f72\uff1f/ Does Curve support rook? Is it possible to deploy with k8s?",id:"12-curve-\u662f\u5426\u652f\u6301-rook\u662f\u5426\u53ef\u4ee5\u7528-k8s-\u90e8\u7f72-does-curve-support-rook-is-it-possible-to-deploy-with-k8s",level:3},{value:"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173",id:"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173",level:2},{value:"1\u3001Curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684\uff1f/ What is the release cycle of Curve version? How is the version number defined?",id:"1curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684-what-is-the-release-cycle-of-curve-version-how-is-the-version-number-defined",level:3},{value:"2\u3001Curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\uff1f\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248\uff1f/ Which is the current stable version of Curve? How to find the latest stable version?",id:"2curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248-which-is-the-current-stable-version-of-curve-how-to-find-the-latest-stable-version",level:3},{value:"3\u3001Curve 1.x\u548c2.x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between Curve 1.x and 2.x versions?",id:"3curve-1x\u548c2x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-curve-1x-and-2x-versions",level:3},{value:"4\u3001Curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\uff1f\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\uff1f\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301\uff1f/ Is there a commercial version of Curve? Is there a commercial version development plan? Can I get commercialization support?",id:"4curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301-is-there-a-commercial-version-of-curve-is-there-a-commercial-version-development-plan-can-i-get-commercialization-support",level:3},{value:"5\u3001Curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\uff1f\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248\uff1f/ Are the versions of Curve block storage and file storage released independently? How can I get the distributions of both?",id:"5curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248-are-the-versions-of-curve-block-storage-and-file-storage-released-independently-how-can-i-get-the-distributions-of-both",level:3},{value:"6\u3001\u6211\u6539\u4e86Curve\u4ee3\u7801\uff0c\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c\uff1f/ I changed the Curve code, how do I release my own version?",id:"6\u6211\u6539\u4e86curve\u4ee3\u7801\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c-i-changed-the-curve-code-how-do-i-release-my-own-version",level:3},{value:"7\u3001Curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248\uff1f/ Which operating system distributions are supported by the versions released by Curve?",id:"7curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248-which-operating-system-distributions-are-supported-by-the-versions-released-by-curve",level:3},{value:"\u67b6\u6784\u76f8\u5173",id:"\u67b6\u6784\u76f8\u5173",level:2},{value:"1. Curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u6211\u80fd\u628aCurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f\uff1f/ What is the deployment architecture of Curve? What infrastructure scenarios can I use Curve for?",id:"1-curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u6211\u80fd\u628acurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f-what-is-the-deployment-architecture-of-curve-what-infrastructure-scenarios-can-i-use-curve-for",level:3},{value:"2. Curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b\uff1f/ What are the business scenarios supported by Curve",id:"2-curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b-what-are-the-business-scenarios-supported-by-curve",level:3},{value:"3. Curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1fCurve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b\uff1f/ What is the technical architecture of Curve? What is the difference between the technical architecture of Curve block storage and file storage?",id:"3-curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b-what-is-the-technical-architecture-of-curve-what-is-the-difference-between-the-technical-architecture-of-curve-block-storage-and-file-storage",level:3},{value:"4. Curve\u548cCeph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between the technical architecture of Curve and Ceph",id:"4-curve\u548cceph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-the-technical-architecture-of-curve-and-ceph",level:3},{value:"5. Curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc\uff1f/ Where is the advanced nature of Curve's technical architecture reflected?",id:"5-curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc-where-is-the-advanced-nature-of-curves-technical-architecture-reflected",level:3},{value:"6. Curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\uff1f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u3001\u53ef\u7528\u6027\u3001\u6027\u80fd\u7b49\u65b9\u9762\uff1f/ Are there any shortcomings in Curve's technical architecture? such as reliability, availability, performance, etc.",id:"6-curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u53ef\u7528\u6027\u6027\u80fd\u7b49\u65b9\u9762-are-there-any-shortcomings-in-curves-technical-architecture-such-as-reliability-availability-performance-etc",level:3},{value:"7. Curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\uff1f\u5bf9\u65b0\u786c\u4ef6\u3001\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212\uff1f/ What is the evolution direction of Curve's technical architecture? What are the plans for support for new hardware and new platforms?",id:"7-curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\u5bf9\u65b0\u786c\u4ef6\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212-what-is-the-evolution-direction-of-curves-technical-architecture-what-are-the-plans-for-support-for-new-hardware-and-new-platforms",level:3},{value:"8. CurveBS\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae\uff1f / Is CurveBS compatible with librbd protocol?",id:"8-curvebs\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae--is-curvebs-compatible-with-librbd-protocol",level:3},{value:"\u529f\u80fd\u76f8\u5173",id:"\u529f\u80fd\u76f8\u5173",level:2},{value:"1. Curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230\uff1f / Where can I find a list of Curve's features?",id:"1-curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230--where-can-i-find-a-list-of-curves-features",level:3},{value:"2. Curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt\uff1f / Can Curve be used by kubevirt?",id:"2-curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt--can-curve-be-used-by-kubevirt",level:3},{value:"3. Curve\u5bf9\u63a5QEMU\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1QEMU\uff1f\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01\uff1f / Do I need to compile QEMU by myself when connecting to QEMU? Where can I find relevant patches?",id:"3-curve\u5bf9\u63a5qemu\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1qemu\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01--do-i-need-to-compile-qemu-by-myself-when-connecting-to-qemu-where-can-i-find-relevant-patches",level:3},{value:"4. Curve\u5bf9\u63a5Libvirt\u662f\u5426\u8981\u7f16\u8bd1Libvirt\uff1f\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6\uff1f / Do I need to compile Libvirt by myself when connecting to Libvirt? Where can I find relevant patches?",id:"4-curve\u5bf9\u63a5libvirt\u662f\u5426\u8981\u7f16\u8bd1libvirt\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6--do-i-need-to-compile-libvirt-by-myself-when-connecting-to-libvirt-where-can-i-find-relevant-patches",level:3},{value:"5. Curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\uff1f\u6587\u4ef6\u5b58\u50a8\uff1f\u5bf9\u8c61\u5b58\u50a8\uff1f / Does Curve support block storage? file storage? Object storage?",id:"5-curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\u6587\u4ef6\u5b58\u50a8\u5bf9\u8c61\u5b58\u50a8--does-curve-support-block-storage-file-storage-object-storage",level:3},{value:"6. Curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff1f\u7f13\u5b58\u7684\u53ef\u9760\u6027\u3001\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1\uff1f / Does Curve support client-side caching? How to ensure cache reliability and data consistency?",id:"6-curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\u7f13\u5b58\u7684\u53ef\u9760\u6027\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1--does-curve-support-client-side-caching-how-to-ensure-cache-reliability-and-data-consistency",level:3},{value:"7. Curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\uff1f\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684wal/db\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e\uff1f / Does the Curve server support disk caching? Or how to configure the wal/db cache disk similar to ceph?",id:"7-curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684waldb\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e--does-the-curve-server-support-disk-caching-or-how-to-configure-the-waldb-cache-disk-similar-to-ceph",level:3},{value:"8. Curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60\uff1f / Does Curve support different disk types to form different storage pools?",id:"8-curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60--does-curve-support-different-disk-types-to-form-different-storage-pools",level:3},{value:"9. Curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\uff1f\u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f / Does Curve support storage pool scale-out? Does it support scale-in?",id:"9-curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\u662f\u5426\u652f\u6301\u7f29\u5bb9--does-curve-support-storage-pool-scale-out-does-it-support-scale-in",level:3},{value:"10. Curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\uff1f\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de\uff1f / Does Curve support RecycleBin? Can the deleted volume or directory be recovered?",id:"10-curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de--does-curve-support-recyclebin-can-the-deleted-volume-or-directory-be-recovered",level:3},{value:"11. Curve\u662f\u5426\u652f\u6301XX\u786c\u4ef6\uff08\u5982Optane\u3001NVMe\u3001RDMA\u7f51\u5361\u7b49\uff09\uff1f / Does Curve support XX hardware (such as Optane, NVMe, RDMA network cards, etc.)?",id:"11-curve\u662f\u5426\u652f\u6301xx\u786c\u4ef6\u5982optanenvmerdma\u7f51\u5361\u7b49--does-curve-support-xx-hardware-such-as-optane-nvme-rdma-network-cards-etc",level:3},{value:"12. Curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f\uff1f / How much storage resources does Curvefs metadata occupy?",id:"12-curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f--how-much-storage-resources-does-curvefs-metadata-occupy",level:3},{value:"\u6027\u80fd\u76f8\u5173",id:"\u6027\u80fd\u76f8\u5173",level:2},{value:"1. Curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684\uff1f/ What does Curve's performance metrics look like?",id:"1-curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684-what-does-curves-performance-metrics-look-like",level:3},{value:"2. Curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd\uff1f/ What hardware specifications Curve has tested for performance?",id:"2-curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd-what-hardware-specifications-curve-has-tested-for-performance",level:3},{value:"3. Curve\u7684\u6027\u80fd\u76f8\u6bd4Ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684\uff1f/ The performance of Curve is much higher than that of Ceph. How is it done?",id:"3-curve\u7684\u6027\u80fd\u76f8\u6bd4ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684-the-performance-of-curve-is-much-higher-than-that-of-ceph-how-is-it-done",level:3},{value:"4. Curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\uff1f\u6f14\u8fdb\u65b9\u5411\u662f\uff1f/ What are Curve's plans for performance optimization? What is the direction of evolution",id:"4-curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\u6f14\u8fdb\u65b9\u5411\u662f-what-are-curves-plans-for-performance-optimization-what-is-the-direction-of-evolution",level:3},{value:"5. Curve \u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\uff1f\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd\uff1f",id:"5-curve-\u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd",level:3},{value:"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173",id:"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173",level:2},{value:"1. Curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff08\u4ee5polardb for pg\u4e3a\u4f8b\uff09\uff1f",id:"1-curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u4ee5polardb-for-pg\u4e3a\u4f8b",level:3},{value:"2. Curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\uff1f\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e\uff1f",id:"2-curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e",level:3},{value:"3. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f",id:"3-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7",level:3},{value:"4. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafka\u3001redis\u3001Elastic Search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f",id:"4-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafkarediselastic-search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7",level:3},{value:"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173",id:"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173",level:2},{value:"1. Curve \u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f/ How to build the Curve compilation environment?",id:"1-curve-\u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa-how-to-build-the-curve-compilation-environment",level:3},{value:"2. Curve \u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f\u6211\u60f3\u8c03\u8bd5 Curve \u4ee3\u7801\uff0c\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4\uff1f/ How to build the Curve development environment? I want to debug Curve code, how do I deploy a minimal development cluster?",id:"2-curve-\u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\u6211\u60f3\u8c03\u8bd5-curve-\u4ee3\u7801\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4-how-to-build-the-curve-development-environment-i-want-to-debug-curve-code-how-do-i-deploy-a-minimal-development-cluster",level:3},{value:"3. Curve \u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\uff1f\u6211\u5982\u679c\u8981\u7ed9 Curve \u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801\uff1f/ What are the types of Curve test codes? If I want to contribute code to Curve, what test cases or test code do I need to add?",id:"3-curve-\u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\u6211\u5982\u679c\u8981\u7ed9-curve-\u8d21\u732e\u4ee3\u7801\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801-what-are-the-types-of-curve-test-codes-if-i-want-to-contribute-code-to-curve-what-test-cases-or-test-code-do-i-need-to-add",level:3},{value:"\u5982\u4f55\u8d21\u732e\u4ee3\u7801",id:"\u5982\u4f55\u8d21\u732e\u4ee3\u7801",level:2},{value:"1. \u6211\u60f3\u7ed9Curve\u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c\uff1f/ I want to contribute code to Curve, what preparations need to be done in advance",id:"1-\u6211\u60f3\u7ed9curve\u8d21\u732e\u4ee3\u7801\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c-i-want-to-contribute-code-to-curve-what-preparations-need-to-be-done-in-advance",level:3},{value:"2. \u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408Curve\u9879\u76ee\u8981\u6c42\uff1f/ How to ensure that the quality of the code I contribute meets the requirements of the Curve project",id:"2-\u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408curve\u9879\u76ee\u8981\u6c42-how-to-ensure-that-the-quality-of-the-code-i-contribute-meets-the-requirements-of-the-curve-project",level:3},{value:"3. \u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abCurve\u793e\u533amerge\uff1f/ How can my contributed code be merged by the Curve community?",id:"3-\u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abcurve\u793e\u533amerge-how-can-my-contributed-code-be-merged-by-the-curve-community",level:3},{value:"4. \u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bCurve\u9879\u76ee\uff1f\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48\uff1f/ How should novice participants get started with the Curve project step by step? What is the recommended path?",id:"4-\u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bcurve\u9879\u76ee\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48-how-should-novice-participants-get-started-with-the-curve-project-step-by-step-what-is-the-recommended-path",level:3},{value:"5. \u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9Curve\u9879\u76ee\u5916\uff0c\u6211\u8fd8\u80fd\u7ed9Curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5\uff1f/ In addition to submitting code to the Curve project, what other meaningful things can I do for the Curve community?",id:"5-\u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9curve\u9879\u76ee\u5916\u6211\u8fd8\u80fd\u7ed9curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5-in-addition-to-submitting-code-to-the-curve-project-what-other-meaningful-things-can-i-do-for-the-curve-community",level:3}],c={toc:l},p="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u5e38\u89c1faq"},"\u5e38\u89c1FAQ"),(0,o.kt)("h2",{id:"\u5173\u4e8ecurve"},"\u5173\u4e8eCurve"),(0,o.kt)("h3",{id:"1-curve\u662f\u4ec0\u4e48-what-is-curve"},"1. Curve\u662f\u4ec0\u4e48\uff1f/ What is Curve?"),(0,o.kt)("p",null,"Curve \u662f\u4e00\u6b3e\u9ad8\u6027\u80fd\u3001\u6613\u8fd0\u7ef4\u3001\u4e91\u539f\u751f\u7684\u5f00\u6e90\u5206\u5e03\u5f0f\u5b58\u50a8\u7cfb\u7edf\u3002\u53ef\u5e94\u7528\u4e8e\u4e3b\u6d41\u7684\u4e91\u539f\u751f\u57fa\u7840\u8bbe\u65bd\u5e73\u53f0\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 OpenStack \u5e73\u53f0\u4e3a\u4e91\u4e3b\u673a\u63d0\u4f9b\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u670d\u52a1\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 Kubernetes \u4e3a\u5176\u63d0\u4f9b RWO\u3001RWX \u7b49\u7c7b\u578b\u7684\u6301\u4e45\u5316\u5b58\u50a8\u5377\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 PolarFS \u4f5c\u4e3a\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u9ad8\u6027\u80fd\u5b58\u50a8\u5e95\u5ea7\uff0c\u5b8c\u7f8e\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u7b97\u5206\u79bb\u67b6\u6784\uff1b"),(0,o.kt)("li",{parentName:"ul"},"Curve \u4ea6\u53ef\u4f5c\u4e3a\u4e91\u5b58\u50a8\u4e2d\u95f4\u4ef6\u4f7f\u7528 S3 \u517c\u5bb9\u7684\u5bf9\u8c61\u5b58\u50a8\u4f5c\u4e3a\u6570\u636e\u5b58\u50a8\u5f15\u64ce\uff0c\u4e3a\u516c\u6709\u4e91\u7528\u6237\u63d0\u4f9b\u9ad8\u6027\u4ef7\u6bd4\u7684\u5171\u4eab\u6587\u4ef6\u5b58\u50a8\u3002")),(0,o.kt)("p",null,"Curve is a high-performance, easy-to-operate, cloud-native open source distributed storage system. Applicable to mainstream cloud-native infrastructure platforms:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Connect to the OpenStack platform to provide high-performance block storage services for cloud VM;"),(0,o.kt)("li",{parentName:"ul"},"Connect to Kubernetes to provide persistent storage volumes of RWO, RWX and other types;"),(0,o.kt)("li",{parentName:"ul"},"Connecting with PolarFS as a high-performance storage base for cloud-native databases, it perfectly supports the storage-computation separation architecture of cloud-native databases;"),(0,o.kt)("li",{parentName:"ul"},"Curve can also be used as a cloud storage middleware to use S3-compatible object storage as a data storage engine, providing cost-effective shared file storage for public cloud users.")),(0,o.kt)("h3",{id:"2-curve\u4e0eceph\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-ceph"},"2. Curve\u4e0eCeph\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and Ceph?"),(0,o.kt)("p",null,"Curve\u4e0eCeph\u4ece\u67b6\u6784\u8bbe\u8ba1\u5230\u5177\u4f53\u7684\u529f\u80fd\u5b9e\u73b0\u90fd\u6709\u6bd4\u8f83\u5927\u7684\u533a\u522b\uff0c\u4ee5\u4e0b\u4ec5\u5217\u51fa\u4e00\u4e9b\u5927\u6982\u533a\u522b\uff0c\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4ece\u4e00\u81f4\u6027\u534f\u8bae\u6765\u8bf4\uff0cCurve\u4f7f\u7528Raft\u534f\u8bae\u5b9e\u73b0\u4e00\u81f4\u6027\uff0cCeph\u662fPaxos\u534f\u8bae\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u4ece\u7a7a\u95f4\u5206\u914d\u65b9\u5f0f\u6765\u8bf4\uff0cCurve\u662f\u901a\u8fc7\u4e2d\u5fc3\u5316\u7684\u5143\u6570\u636e\u670d\u52a1\u6765\u8c03\u5ea6\u5206\u914d\uff0cCeph\u662f\u901a\u8fc7CRUSH\u7b97\u6cd5hash\u65b9\u5f0f\u5206\u914d\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u4ece\u5b58\u50a8\u5f62\u6001\u4e0a\u6765\u8bf4\uff0cCurve\u76ee\u524d\u652f\u6301\u5757\u5b58\u50a8\uff08CurveBS\uff09\u3001\u6587\u4ef6\u5b58\u50a8\uff08CurveFS\uff09\uff0cCeph\u5728\u8fd9\u4e24\u4e2a\u5f62\u6001\u4e4b\u5916\u8fd8\u652f\u6301\u5bf9\u8c61\u5b58\u50a8"),(0,o.kt)("li",{parentName:"ul"},"\u5176\u4ed6\u5927\u7684\u5dee\u5f02\u5305\u62ec\uff1aCurveBS\u652f\u6301\u57fa\u4e8ePolarFS\u7684\u4e91\u539f\u751f\u6570\u636e\u5e93\u5b58\u50a8\u5e95\u5ea7\uff08\u5982PolarDB for postgresql\u7b49\uff09\uff1bCurveBS\u5feb\u7167\u4f1a\u8f6c\u5b58\u5230\u5bf9\u8c61\u5b58\u50a8\u7cfb\u7edf\uff1bCurve FS\u652f\u6301\u5c06\u6570\u636e\u4fdd\u5b58\u5230\u517c\u5bb9S3\u534f\u8bae\u7684\u5bf9\u8c61\u5b58\u50a8\u7cfb\u7edf\uff08\u53ef\u4ee5\u5728\u516c\u6709\u4e91\u573a\u666f\u4e0b\u90e8\u7f72\uff09\uff0c\u540e\u7eed\u8fd8\u4f1a\u652f\u6301\u5728CurveBS\u548cS3\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u751f\u547d\u5468\u671f\u7ba1\u7406\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5177\u4f53\u5230\u8be6\u7ec6\u7684\u529f\u80fd\u5bf9\u6bd4\uff0c\u53ef\u4ee5\u53c2\u8003\u201cCurve\u529f\u80fd\u6e05\u5355\u201d\uff0c\u53e6\u5916\u8fd8\u6709\u4e00\u4e9b\u529f\u80fd\u5728\u5f00\u53d1\u8ba1\u5212\u4e2d")),(0,o.kt)("p",null,"Curve and Ceph are quite different from architecture design to specific function implementation. The following only lists some general differences. If you want to know some details, you can contact us through WeChat group/slack/forum to communicate and confirm:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"From the perspective of the consistency protocol, Curve uses the Raft protocol to achieve consistency, and Ceph is the Paxos protocol;"),(0,o.kt)("li",{parentName:"ul"},"From the perspective of space allocation, Curve is allocated through a centralized metadata service, and Ceph is allocated by hashing the CRUSH algorithm;"),(0,o.kt)("li",{parentName:"ul"},"In terms of storage form, Curve currently supports block storage(CurveBS) and file storage(CurveFS), and Ceph supports object storage in addition to these two forms"),(0,o.kt)("li",{parentName:"ul"},"Other major differences include: Curve BS supports PolarFS-based cloud-native database storage bases (such as PolarDB for postgresql, etc.); CurveBS snapshots will be transferred to object storage systems; CurveFS supports saving data to object storage systems compatible with the S3 protocol (can be deployed in public cloud scenarios), and will support data lifecycle management between CurveBS and S3 in the future;"),(0,o.kt)("li",{parentName:"ul"},'For detailed function comparison, you can refer to "Curve function list", and some functions are in the development plan')),(0,o.kt)("h3",{id:"3-curve\u4e0ecubefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-cubefs"},"3. Curve\u4e0eCubeFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and CubeFS?"),(0,o.kt)("p",null,"\u6700\u5927\u7684\u533a\u522b\u662f\uff1a Curve\u652f\u6301\u5757\u5b58\u50a8\uff0c\u4e0d\u652f\u6301\u5bf9\u8c61\u5b58\u50a8\uff0cCubeFS\u53cd\u4e4b\uff1b\u53e6\u5916Curve FS\u53ef\u4ee5\u5728\u516c\u6709\u4e91\u573a\u666f\u4e0b\u5bf9\u63a5S3\u5b58\u50a8\u5f15\u64ce\u90e8\u7f72\u4f7f\u7528\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\u3002"),(0,o.kt)("p",null,"The biggest difference is that Curve supports block storage, but not object storage, while CubeFS is the other way around. In addition, Curve FS can be deployed with S3 storage engines in public cloud scenarios. If you want to know some differences in details, you can contact us through WeChat group/slack/forum to communicate and confirm."),(0,o.kt)("h3",{id:"4-curve\u4e0eopenebs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-openebs"},"4. Curve\u4e0eOpenEBS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and OpenEBS?"),(0,o.kt)("p",null,"\u6700\u5927\u7684\u533a\u522b\u662f\uff1a Curve\u652f\u6301\u6587\u4ef6\u5b58\u50a8\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\u3002"),(0,o.kt)("p",null,"The biggest difference: Curve supports file storage. If you want to know some differences in details, you can contact us through WeChat group/slack/forum to communicate and confirm."),(0,o.kt)("h3",{id:"5-curve\u4e0ejuicefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-juicefs"},"5. Curve\u4e0eJuiceFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and JuiceFS?"),(0,o.kt)("p",null,"\u4e3b\u8981\u533a\u522b\u6709\u4ee5\u4e0b\u51e0\u70b9\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve\u652f\u6301\u5757\u5b58\u50a8\uff0cCurveFS\u652f\u6301CurveBS\u5b58\u50a8\u540e\u7aef\uff0c\u4e5f\u652f\u6301S3\u5b58\u50a8\u540e\u7aef\uff0c\u540e\u7eed\u8fd8\u4f1a\u652f\u6301\u5728CurveBS\u548cS3\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u751f\u547d\u5468\u671f\u7ba1\u7406\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\u3002"),(0,o.kt)("li",{parentName:"ul"},"CurveFS\u7684\u5143\u6570\u636e\u5f15\u64ce\u662f\u81ea\u7814\u7684\uff0c\u57fa\u4e8eraft\u5b9e\u73b0\u76843\u526f\u672c\u5b58\u50a8\uff0c\u5177\u6709\u9ad8\u53ef\u7528\u9ad8\u53ef\u9760\u9ad8\u53ef\u6269\u7b49\u7279\u6027\u3002"),(0,o.kt)("li",{parentName:"ul"},"CurveFS\u7684\u7f13\u5b58\u652f\u6301\u5185\u5b58buffer\u3001\u672c\u5730\u78c1\u76d8\u3001\u5206\u5e03\u5f0fkv\u7f13\u5b58\u8fd9\u51e0\u4e2a\u7b49\u7ea7\uff0c\u7c7b\u4f3cCPU\u7684L1\u3001L2\u3001L3 cache\u8bbe\u8ba1")),(0,o.kt)("p",null,"The main differences are as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve supports block storage, and CurveFS supports CurveBS storage backend and S3 storage backend. It will also support data life cycle management between CurveBS and S3 in the future. If you want to know about some detailed differences, you can contact us through WeChat group/slack/forum for communication and confirmation."),(0,o.kt)("li",{parentName:"ul"},"CurveFS's metadata engine is self-developed and is based on 3-copy storage implemented in raft. It has the characteristics of high availability, high reliability and high scalability."),(0,o.kt)("li",{parentName:"ul"},"CurveFS's cache supports memory buffer, local disk, and distributed kv cache levels, similar to the CPU's L1, L2, and L3 cache design.")),(0,o.kt)("h3",{id:"6-curve\u4e0ehdfss3fsjindofsrapidfsgoosefsalluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-hdfss3fsjindofsrapidfsgoosefsalluxio"},"6. Curve\u4e0eHDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and HDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\uff1f"),(0,o.kt)("p",null,"\u9996\u5148Curve\u5305\u62ecCurveBS\u5757\u5b58\u50a8\u548cCurveFS\u6587\u4ef6\u5b58\u50a8\uff0c\u56e0\u6b64CurveFS\u53ef\u4ee5\u4e0e\u8fd9\u51e0\u4e2aFS\u8fdb\u884c\u6bd4\u8f83\uff0c\u6211\u4eec\u7684\u4f18\u52bf\u4e3b\u8981\u5305\u62ec\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"CurveFS\u63d0\u4f9b\u4e0eHDFS API\u5b8c\u5168\u517c\u5bb9\u7684SDK\uff0c\u652f\u6301 Hadoop \u751f\u6001\u7528\u6237\u65e0\u7f1d\u8fc1\u79fb"),(0,o.kt)("li",{parentName:"ul"},"\u4e0eHDFS\u76f8\u6bd4\uff1aCurveFS\u652f\u6301\u5b58\u50a8\u8ba1\u7b97\u5206\u79bb\uff0c\u8ba1\u7b97\u8d44\u6e90\u53ef\u4ee5\u7075\u6d3b\u914d\u7f6e\u548c\u4f38\u7f29\uff0c\u5b58\u50a8\u8d44\u6e90\u7531\u5bf9\u8c61\u5b58\u50a8\u63d0\u4f9b\u4e5f\u53ef\u72ec\u7acb\u4f38\u7f29\uff1b\u5c24\u5176\u9002\u5408\u4e91\u4e0a\u4e1a\u52a1\u66ff\u6362HDFS\uff0c\u5e76\u4e14\u901a\u8fc7\u6570\u636e\u548c\u5143\u6570\u636e\u7f13\u5b58\u52a0\u901fIO\u8bbf\u95ee\uff0c\u6027\u80fd\u4f18\u5f02\uff1b\u5143\u6570\u636e\u65e0\u5355\u70b9\u74f6\u9888\uff0c\u53ef\u6269\u5c55\u6027\u5f3a\uff0c\u652f\u6301\u767e\u4ebf\u7ea7\u7684\u6587\u4ef6\u5b58\u50a8\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u76f8\u6bd4\u5bf9\u8c61\u5b58\u50a8\uff1a\u63d0\u4f9b\u5b8c\u6574\u7684POSIX\u8bed\u4e49\u652f\u6301\uff0c\u826f\u597d\u9002\u914d\u5927\u6570\u636e\u751f\u6001\u7ec4\u4ef6\uff1b\u5143\u6570\u636e\u64cd\u4f5c\u6027\u80fd\u4f18\u5f02\u4e14\u5f3a\u4e00\u81f4\u6027\uff1bN \u500d\u4ee5\u4e0a\u7684\u5143\u6570\u636e\u64cd\u4f5c\uff08list\u3001rename \u7b49\uff09\u6027\u80fd\u63d0\u5347\uff0c\u6570\u636e\u8bfb\u5199\u6027\u80fd\u4e5f\u80fd\u63d0\u5347N\u500d\uff0c\u6b22\u8fce\u5b9e\u6d4b\u4f53\u9a8c\u3002")),(0,o.kt)("p",null,"\u4e0e\u5176\u4ed6\u51e0\u4e2aFS\u7684\u533a\u522b\u662f\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"JindoFS/RapidFS\u7b49\u7684block\u6a21\u5f0f\u4e0eCurveFS\u67b6\u6784\u6bd4\u8f83\u7c7b\u4f3c\uff0c\u4f46\u76f8\u6bd4\u516c\u6709\u4e91\u5382\u5546\u7684\u4ea7\u54c1\uff0cCurveFS\u66f4\u52a0\u4e2d\u7acb\uff0c\u4e14\u5b8c\u5168\u5f00\u6e90\uff08\u76ee\u524d\u5df2\u6350\u732e\u7ed9CNCF\u57fa\u91d1\u4f1a\uff09\uff0c\u53e6\u5916CurveFS\u9664\u4e86\u652f\u6301\u5bf9\u8c61\u5b58\u50a8\u5916\uff0c\u4e5f\u652f\u6301\u81ea\u7814\u6570\u636e\u5b58\u50a8\u5f15\u64ceCurveBS\uff0c\u53ef\u4ee5\u79c1\u6709\u5316\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"Alluxio\u4e0eJindoFS/RapidFS\u7b49\u7684\u7f13\u5b58\u6a21\u5f0f\u7c7b\u4f3c\uff0c\u4ec5\u4f5c\u4e3a\u5bf9\u8c61\u5b58\u50a8\u7684\u7f13\u5b58\u52a0\u901f\u7ec4\u4ef6\u800c\u4e0d\u4fdd\u5b58\u5143\u6570\u636e\uff0c\u5bf9\u8c61\u5b58\u50a8\u7684\u5143\u6570\u636e\u64cd\u4f5c\u7684\u4e00\u81f4\u6027\u95ee\u9898\u548c\u6027\u80fd\u74f6\u9888\u5747\u65e0\u6cd5\u89e3\u51b3")),(0,o.kt)("p",null,"First of all, Curve includes CurveBS block storage and CurveFS file storage, so CurveFS can be compared with these FS. Our advantages mainly include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Fully compatible with HDFS API and seamlessly adapted to Hadoop ecological components."),(0,o.kt)("li",{parentName:"ul"},"Compared with HDFS: elastic scaling of capacity; separation of storage and computing, computing resources can be flexibly configured and scaled; compared with self-built HDFS on the cloud using cloud disks, the cost is saved by more than 60%, while providing read and write performance comparable to HDFS; support POSIX and S3 interfaces use one storage to adapt to the access needs of different businesses; JuiceFS commercial version provides fully managed SaaS services with zero operation and maintenance, and can support tens of billions of file storage in a single command space."),(0,o.kt)("li",{parentName:"ul"},"Compared with object storage: it provides complete POSIX semantic support, good adaptability of big data ecological components; strong consistency of metadata operations; more than N times the performance of metadata operations (list, rename, etc.) is improved, and the data reading and writing performance is also improved It can be improved by N times. Real test experience is welcome.")),(0,o.kt)("p",null,"The differences from other FS are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The block mode of JindoFS/RapidFS is similar to the CurveFS architecture, but compared to the products of public cloud vendors, CurveFS is more neutral and completely open source (currently donated to the CNCF Foundation). In addition, CurveFS also supports object storage. Self-developed data storage engine CurveBS can be deployed privately"),(0,o.kt)("li",{parentName:"ul"},"The caching mode of Alluxio is similar to that of JindoFS/RapidFS. It only serves as a cache acceleration component of object storage without saving metadata. The consistency problem and performance bottleneck of metadata operations of object storage cannot be solved.")),(0,o.kt)("h3",{id:"7-curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b--in-what-scenarios-can-curve-be-used"},"7. Curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b\uff1f / In what scenarios can Curve be used?"),(0,o.kt)("p",null,"Curve\u80fd\u4f7f\u7528\u7684\u4e3b\u8981\u573a\u666f\u5982\u4e0b\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 OpenStack \u5e73\u53f0\u4e3a\u4e91\u4e3b\u673a\u63d0\u4f9b\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u670d\u52a1\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 Kubernetes \u4e3a\u5176\u63d0\u4f9b RWO\u3001RWX \u7b49\u7c7b\u578b\u7684\u6301\u4e45\u5316\u5b58\u50a8\u5377\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 PolarFS \u4f5c\u4e3a\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u9ad8\u6027\u80fd\u5b58\u50a8\u5e95\u5ea7\uff0c\u5b8c\u7f8e\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u7b97\u5206\u79bb\u67b6\u6784\uff1b"),(0,o.kt)("li",{parentName:"ul"},"Curve \u4ea6\u53ef\u4f5c\u4e3a\u4e91\u5b58\u50a8\u4e2d\u95f4\u4ef6\u4f7f\u7528 S3 \u517c\u5bb9\u7684\u5bf9\u8c61\u5b58\u50a8\u4f5c\u4e3a\u6570\u636e\u5b58\u50a8\u5f15\u64ce\uff0c\u4e3a\u516c\u6709\u4e91\u3001\u79c1\u6709\u4e91\u7528\u6237\u63d0\u4f9b\u9ad8\u6027\u4ef7\u6bd4\u7684\u5171\u4eab\u6587\u4ef6\u5b58\u50a8\uff1b\u6838\u5fc3\u5e94\u7528\u573a\u666f\u5305\u62ecAI\u8bad\u7ec3\u5b58\u50a8\u3001\u5927\u6570\u636eHDFS\u66ff\u6362\u3001ElasticSearch/ClickHouse\u51b7\u6570\u636e\u5b58\u50a8\u7b49\uff0c\u53ef\u4e3a\u6b64\u7c7b\u5e94\u7528\u5b9e\u73b0\u964d\u672c\u589e\u6548"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u5728\u7269\u7406\u673a\u4e0a\u6302\u8f7d\u4f7f\u7528\u5757\u8bbe\u5907\u6216FUSE\u6587\u4ef6\u7cfb\u7edf\uff0c\u4f5c\u4e3a\u66ff\u6362NAS\u5b58\u50a8\u3001NFS\u7b49\u7684\u5171\u4eab\u5b58\u50a8\uff0c\u540c\u65f6\u4e5f\u652f\u6301SMB\u534f\u8bae")),(0,o.kt)("p",null,"The main scenarios where Curve can be used are as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Connect to the OpenStack platform to provide high-performance block storage services for cloud hosts;"),(0,o.kt)("li",{parentName:"ul"},"Connect to Kubernetes to provide persistent storage volumes of RWO, RWX and other types;"),(0,o.kt)("li",{parentName:"ul"},"Connecting with PolarFS as a high-performance storage base for cloud-native databases, it perfectly supports the storage-computation separation architecture of cloud-native databases;"),(0,o.kt)("li",{parentName:"ul"},"Curve can also be used as cloud storage middleware using S3-compatible object storage as a data storage engine to provide cost-effective shared file storage for public cloud and private cloud users; core application scenarios include AI training storage, big data HDFS replacement, ElasticSearch / ClickHouse cold data storage, etc., can reduce costs and increase efficiency for such applications."),(0,o.kt)("li",{parentName:"ul"},"Supports mounting block devices or FUSE file systems on physical machines as shared storage to replace NAS storage, NFS, etc., and also supports the SMB protocol.")),(0,o.kt)("h3",{id:"8-curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684--how-does-curves-cloud-native-storage-capability-manifest"},"8. Curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684\uff1f / How does Curve's cloud-native storage capability manifest?"),(0,o.kt)("p",null,"\u4e3b\u8981\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u70b9\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4e91\u539f\u751f\u90e8\u7f72\uff1a\u652f\u6301curveadm+docker\u90e8\u7f72\u65b9\u5f0f\uff1b\u652f\u6301k8s operator\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"\u4e91\u539f\u751f\u4f7f\u7528\uff1a\u652f\u6301CSI\u914d\u5408K8S\u4f5c\u4e3a\u6301\u4e45\u5316\u5377\u4f7f\u7528\uff08RWO\u3001RWX\u7b49\uff09"),(0,o.kt)("li",{parentName:"ul"},"\u4e91\u539f\u751f\u8fd0\u7ef4\uff1a\u652f\u6301curveadm+docker\u8fd0\u7ef4\uff0c\u652f\u6301k8s operator\u65e5\u5e38\u8fd0\u7ef4\u53ca\u76d1\u63a7")),(0,o.kt)("p",null,"Mainly reflected in the following points:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Cloud native deployment: support curveadm+docker deployment method; support k8s+operator deployment method"),(0,o.kt)("li",{parentName:"ul"},"Cloud native use: support CSI with K8S as persistent volume (RWO, RWX, etc.)"),(0,o.kt)("li",{parentName:"ul"},"Cloud native O&M: support curveadm+docker O&M, k8s+operator O&M")),(0,o.kt)("h3",{id:"9-curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\u89c4\u6a21\u5982\u4f55\u7a33\u5b9a\u6027\u5982\u4f55\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c--has-curve-been-used-in-a-production-environment-what-is-the-scale-how-is-the-stability-has-there-been-a-massive-failure"},"9. Curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\uff1f\u89c4\u6a21\u5982\u4f55\uff1f\u7a33\u5b9a\u6027\u5982\u4f55\uff1f\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c\uff1f / Has Curve been used in a production environment? What is the scale? How is the stability? Has there been a massive failure?"),(0,o.kt)("p",null,"CurveBS\u5757\u5b58\u50a8\u5df2\u5728\u7f51\u6613\u5185\u90e8\u4f7f\u7528\u8fd13\u5e74\uff0c\u8fd0\u884c\u7a33\u5b9a\uff0c\u5b58\u50a8\u6570\u636e\u91cf\u6570PB\uff0c\u65e0\u5927\u89c4\u6a21\u6545\u969c\u3002\u53e6\u5916\u4e5f\u6709\u591a\u5bb6\u793e\u533a\u7528\u6237\u5728\u4f7f\u7528CurveBS\uff0c\u76ee\u524d\u672a\u6536\u5230\u5927\u89c4\u6a21\u6545\u969c\u53cd\u9988\u3002"),(0,o.kt)("p",null,"CurveFS\u76ee\u524d\u5df2\u53d1\u5e03\u591a\u4e2a\u7a33\u5b9a\u7248\u672c\uff0c\u5df2\u5728\u7f51\u6613\u5185\u5916\u90e8AI\u8bad\u7ec3\u5b58\u50a8\u3001HDFS\u66ff\u6362\u3001ES\u51b7\u6570\u636e\u7b49\u4e1a\u52a1\u843d\u5730\u4f7f\u7528\u4e2d\u3002"),(0,o.kt)("p",null,"CurveBS block storage has been used within NetEase for 4 years (since mid-2019), with serveral PB data storage, and no large-scale failures. In addition, many community users are using CurveBS, and no large-scale failure feedback has been received so far."),(0,o.kt)("p",null,"CurveFS has currently released multiple stable versions and is being used in NetEase's internal and external AI training storage, HDFS replacement, ES cold data and other businesses."),(0,o.kt)("h3",{id:"10-curve\u7684roadmap\u662f\u4ec0\u4e48--what-is-curves-roadmap"},"10. Curve\u7684Roadmap\u662f\u4ec0\u4e48\uff1f / What is Curve's Roadmap?"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://docs.opencurve.io/category/roadmap"},"https://docs.opencurve.io/category/roadmap"))),(0,o.kt)("h3",{id:"11-curve\u5f00\u6e90\u7684\u76ee\u6807\u76ee\u7684\u662f\u4ec0\u4e48--what-is-the-goalpurpose-of-curve-open-source"},"11. Curve\u5f00\u6e90\u7684\u76ee\u6807/\u76ee\u7684\u662f\u4ec0\u4e48\uff1f / What is the goal/purpose of Curve open source?"),(0,o.kt)("p",null,"\u5728\u73b0\u4eca\u7684\u4e91\u57fa\u7840\u8bbe\u65bd\u9886\u57df\uff0c\u4e91\u539f\u751f\u5e94\u7528\u5982\u706b\u5982\u837c\u7684\u5728\u4e92\u8054\u7f51\u884c\u4e1a\u843d\u5730\uff0c\u4f20\u7edf\u884c\u4e1a\u4e5f\u5f00\u59cb\u6709\u6240\u5b9e\u8df5\u3002\u4f46\u662f\u5982\u679c\u6211\u4eec\u6df1\u5165\u8c03\u67e5\u4e91\u539f\u751f\u57fa\u7840\u8bbe\u65bd3\u5927\u677f\u5757\uff1a\u8ba1\u7b97\u3001\u5b58\u50a8\u3001\u7f51\u7edc\uff0c\u4f60\u5c31\u80fd\u53d1\u73b0\uff0c\u4e91\u539f\u751f\u5b58\u50a8\u9879\u76ee\u975e\u5e38\u7a00\u7f3a\uff0c\u5f00\u6e90\u7684\u66f4\u5c11\uff0c\u5982\u679c\u518d\u9644\u52a0\u4e0a\u7a33\u5b9a\u3001\u9ad8\u6027\u80fd\u3001\u516c\u6709\u4e91\u79c1\u6709\u4e91\u5747\u53ef\u4f7f\u7528\u7684\u7075\u6d3b\u5f39\u6027\u3001\u7b80\u5355\u6613\u8fd0\u7ef4\u8fd9\u4e9b\u4e91\u539f\u751f\u573a\u666f\u4e0b\u5bf9\u5b58\u50a8\u7cfb\u7edf\u7684\u57fa\u7840\u8981\u6c42\uff0c\u5219\u5e02\u9762\u4e0a\u57fa\u672c\u6ca1\u6709\u5408\u9002\u7684\u7cfb\u7edf\u53ef\u4f9b\u9009\u62e9\u3002\u57fa\u4e8e\u4e0a\u8ff0\u539f\u56e0\uff0c\u6211\u4eec\u57282018\u5e74\u51b3\u5b9a\u7acb\u9879\u7814\u53d1\u66f4\u597d\u7528\u7684\u4e91\u539f\u751f\u5b58\u50a8\u7cfb\u7edf\uff1aCurve\u3002"),(0,o.kt)("p",null,"Curve\u6700\u521d\u7684\u7acb\u9879\u76ee\u6807\u53ea\u662f\u89e3\u51b3\u7f51\u6613\u96c6\u56e2\u5185\u90e8\u4f7f\u7528\u5f00\u6e90Ceph\u5b58\u50a8\u7684\u75db\u70b9\uff0c\u7f51\u6613\u6570\u5e06\u4f5c\u4e3a\u4e91\u539f\u751f\u9886\u57df\u7684\u5b9e\u8df5\u8005\u548c\u9886\u5934\u7f8a\uff0c\u5728\u7ed9\u5404\u7c7b\u884c\u4e1a\u5ba2\u6237\u843d\u5730\u8fc7\u7a0b\u4e2d\uff0c\u4e5f\u6df1\u523b\u7406\u89e3\u4e86\u4e0a\u8ff0\u5ba2\u6237\u75db\u70b9\u3002\u4e3a\u6b64\u6211\u4eec\u51b3\u5b9a\u5c06\u5185\u90e8\u7684Curve\u9879\u76ee\u5f00\u6e90\u51fa\u6765\uff0c\u8ba9\u66f4\u591a\u7684\u5ba2\u6237\u4eab\u53d7\u5230Curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u4f18\u52bf\u3002"),(0,o.kt)("p",null,"Curve\u7684\u613f\u666f\uff1a\u5c06Curve\u6253\u9020\u6210\u4e3a\u6027\u80fd\u5353\u8d8a\u3001\u5168\u573a\u666f\u9002\u7528\u3001\u7a33\u5b9a\u6613\u8fd0\u7ef4\u7684\u5f00\u6e90\u4e91\u539f\u751f\u5206\u5e03\u5f0f\u5b58\u50a8\u7cfb\u7edf\u3002"),(0,o.kt)("p",null,"In today's cloud infrastructure field, cloud native applications are in full swing in the Internet industry, and traditional industries have begun to practice. But if we deeply investigate the three major sectors of cloud-native infrastructure: computing, storage, and network, you can find that cloud-native storage projects are very scarce, and even less open source. The basic requirements for storage systems in cloud-native scenarios such as usable flexibility, simplicity and ease of operation and maintenance, there are basically no suitable systems on the market to choose from. Based on the above reasons, in 2018, we decided to establish a project to develop a better cloud-native storage system: Curve."),(0,o.kt)("p",null,"The initial goal of Curve was to solve the pain points of using open source Ceph storage within NetEase Group. NetEase Shufan, as a practitioner and leader in the cloud native field, has also deeply understood the above-mentioned customer pain points in the process of landing for customers in various industries. For this reason, we decided to open source the internal Curve project so that more customers can enjoy the advantages of Curve's cloud-native storage."),(0,o.kt)("p",null,"Curve's vision: to build Curve into an open source cloud-native distributed storage system with excellent performance, applicable to all scenarios, stable and easy operation and maintenance."),(0,o.kt)("h3",{id:"12-curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b--what-are-the-communication-channels-of-the-curve-community"},"12. Curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b\uff1f / What are the communication channels of the Curve community?"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5fae\u4fe1\u7fa4\uff1a\u6dfb\u52a0\u5fae\u4fe1\u53f7opencurve_bot\u9080\u8bf7\u8fdb\u7fa4"),(0,o.kt)("li",{parentName:"ul"},"\u8bba\u575b\uff1a",(0,o.kt)("a",{parentName:"li",href:"https://ask.opencurve.io/"},"https://ask.opencurve.io/")),(0,o.kt)("li",{parentName:"ul"},"slack\uff1acloud-native.slack.com\uff0cchannel #project_curve"),(0,o.kt)("li",{parentName:"ul"},"GitHub isue\uff1a",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/issues"},"https://github.com/opencurve/curve/issues")),(0,o.kt)("li",{parentName:"ul"},"\u90ae\u4ef6\u5217\u8868\uff1a\u5373\u5c06\u4e0a\u7ebf")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"}," ")),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"WeChat group: add WeChat opencurve_bot to invite into the group"),(0,o.kt)("li",{parentName:"ul"},"Forum: ",(0,o.kt)("a",{parentName:"li",href:"https://ask.opencurve.io/"},"https://ask.opencurve.io/")),(0,o.kt)("li",{parentName:"ul"},"slack: cloud-native.slack.com, channel #project_curve"),(0,o.kt)("li",{parentName:"ul"},"GitHub isue: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/issues"},"https://github.com/opencurve/curve/issues")),(0,o.kt)("li",{parentName:"ul"},"Mailing list: Coming soon")),(0,o.kt)("h2",{id:"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173"},"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve-\u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-minimum-requirements-for-deploy-curve-cluster"},"1. Curve \u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the minimum requirements for deploy curve cluster?"),(0,o.kt)("p",null,"\u4f60\u53ea\u9700\u8981\u62e5\u6709\u4e00\u53f0\u673a\u5668\uff0c\u5c31\u53ef\u4ee5\u90e8\u7f72\u4f53\u9a8c\u6211\u4eec\u7684 Curve \u7cfb\u7edf\uff0c\u5f53\u7136\u4e86\uff0c\u8fd9\u4ec5\u9650\u4e8e\u4f53\u9a8c\u6211\u4eec Curve \u7cfb\u7edf\u7684\u7279\u6027\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\u6216\u90e8\u7f72\u7ebf\u4e0a\u73af\u5883\uff0c\u8bf7\u53c2\u8003\u6211\u4eec\u4ee5\u4e0b Curve \u751f\u4ea7\u73af\u5883\u7684\u63a8\u4ecb\u914d\u7f6e\u3002"),(0,o.kt)("p",null,"\u7279\u522b\u5730\uff0c\u6211\u4eec\u5bf9\u7cfb\u7edf\u5185\u6838\u6709\u4e00\u5b9a\u7684\u8981\u6c42\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u6587\u6863\u786e\u4fdd\u64cd\u4f5c\u7cfb\u7edf\u7684\u5185\u6838\u7248\u672c\u6ee1\u8db3\u8981\u6c42\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/install-curveadm#%E8%BD%AF%E7%A1%AC%E4%BB%B6%E7%8E%AF%E5%A2%83%E9%9C%80%E6%B1%82"},"\u8f6f\u786c\u4ef6\u73af\u5883\u9700\u6c42"))),(0,o.kt)("p",null,"You only need one machine to deploy and experience our curve system. Of course, this is only for experiencing the features of our curve system. If you need to perform performance testing or deploy in online environment, please refer to our curve production environment recommended configuration."),(0,o.kt)("p",null,"In particular, we have certain requirements for the system kernel, please refer to the following documents to ensure that the kernel version of the operating system meets the requirements:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/install-curveadm#%E8%BD%AF%E7%A1%AC%E4%BB%B6%E7%8E%AF%E5%A2%83%E9%9C%80%E6%B1%82"},"software&hardware requirements"))),(0,o.kt)("h3",{id:"2-curve-\u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-recommended-configuration-for-curve-production-environment"},"2. Curve \u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the recommended configuration for Curve production environment?"),(0,o.kt)("p",null,"\u9488\u5bf9 CurveBS, \u6211\u4eec\u5c06\u4ece\u4ee5\u4e0b\u51e0\u4e2a\u90e8\u5206\u7ed9\u6211\u51fa\u6211\u4eec\u7684\u63a8\u4ecb\u914d\u7f6e\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u6570\u636e\u76d8\u78c1\u76d8\uff1a"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"\u5c3d\u53ef\u80fd\u4fdd\u8bc1\u6bcf\u4e2a chunkserver \u670d\u52a1\u5355\u72ec\u62e5\u6709\u4e00\u5757 SSD"),(0,o.kt)("li",{parentName:"ul"},"\u5173\u95ed\u6570\u636e\u76d8\u7f13\u5b58"),(0,o.kt)("li",{parentName:"ul"},"\u78c1\u76d8\u8c03\u5ea6\u7b56\u7565\uff0cSSD \u76d8 noop\uff0cHDD \u76d8 deadline"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u6570\u636e\u76d8 raid \u5361\u914d\u7f6e\uff1a"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"\u6570\u636e\u76d8\u5168\u90e8\u4e3a JBOD \u6a21\u5f0f"),(0,o.kt)("li",{parentName:"ul"},"RAID \u5361\u5173\u95ed consistent check"),(0,o.kt)("li",{parentName:"ul"},"RAID\u5361\u7f13\u5b58\u7b56\u7565\uff1aWriteThrough"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u64cd\u4f5c\u7cfb\u7edf\u8bbe\u7f6e\uff1a"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"\u7cfb\u7edf\u5141\u8bb8\u7684\u6700\u5927 fd \u6570\u91cf\u5efa\u8bae\u8bbe\u4e3a 10000000"),(0,o.kt)("li",{parentName:"ul"},"\u5355\u4e2a\u8fdb\u7a0b\u5141\u8bb8\u7684\u6700\u5927 fd \u6570\u91cf\uff0c\u4e0d\u8981\u4f4e\u4e8e 2500000"),(0,o.kt)("li",{parentName:"ul"},"\u8c03\u6574 mmap \u6570\u91cf\uff0c\u5efa\u8bae\u8c03\u6574\u4e3a 5642720")))),(0,o.kt)("p",null,"\u9488\u5bf9 CurveFS\uff0c\u6211\u4eec\u63a8\u4ecb\u7ed9\u5143\u6570\u636e\u670d\u52a1 MetaServer \u5206\u914d 3 \u53f0\u670d\u52a1\u5668\uff0c\u6bcf\u53f0\u670d\u52a1\u5668\u8fd0\u884c 4 \u4e2a MetaServer\uff0c\u6bcf\u4e2a MetaServer \u5c3d\u53ef\u80fd\u62e5\u6709\u4e00\u5757\u5355\u72ec\u7684 SSD\u3002"),(0,o.kt)("p",null,"For CurveBS, we will give me our recommended configuration from the following sections:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Data disk disk:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"As much as possible, ensure that each chunkserver service has a separate SSD"),(0,o.kt)("li",{parentName:"ul"},"Turn off the data disk cache"),(0,o.kt)("li",{parentName:"ul"},"Disk scheduling policy, SSD disk noop, HDD disk deadline"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Data disk raid card configuration:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"All data disks are in JBOD mode"),(0,o.kt)("li",{parentName:"ul"},"RAID card off consistent check"),(0,o.kt)("li",{parentName:"ul"},"RAID card cache policy: WriteThrough"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Operating system settings:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"The maximum number of fds allowed by the system is recommended to be set to 10000000"),(0,o.kt)("li",{parentName:"ul"},"The maximum number of fds allowed by a single process, not less than 2500000"),(0,o.kt)("li",{parentName:"ul"},"Adjust the number of mmap, it is recommended to adjust to 5642720")))),(0,o.kt)("p",null,"For CurveFS, we recommend to allocate 3 servers to the metadata service MetaServer, each server runs 4 MetaServers, and each MetaServer has a separate SSD as much as possible."),(0,o.kt)("h3",{id:"3-curve-\u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\u6709\u65e0\u6307\u5bfc\u624b\u518c-what-is-the-deployment-tools-for-curve-is-there-an-instruction-manual"},"3. Curve \u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\uff1f\u6709\u65e0\u6307\u5bfc\u624b\u518c\uff1f/ What is the deployment tools for Curve? Is there an instruction manual?"),(0,o.kt)("p",null,"\u4e3a\u4e86\u63d0\u9ad8 Curve \u7cfb\u7edf\u7684\u6613\u7528\u6027\uff0c\u6211\u4eec\u7279\u5730\u5f00\u53d1\u4e86\u90e8\u7f72\u8fd0\u7ef4\u5de5\u5177 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm"),"\uff0c\u76ee\u524d CurveAdm \u5177\u5907\u5b8c\u5584\u7684 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki"},"WiKi")," \u4e3b\u9875\uff0c\u4f60\u53ef\u4ee5\u5728 WiKi \u4e2d\u627e\u5230\u90e8\u7f72 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvebs-cluster-deployment"},"CurveBS"),"/",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment"},"CurveFS")," \u7684\u8be6\u7ec6\u6b65\u9aa4\u3002\u540e\u7eed\uff0c\u6211\u4eec\u8fd8\u4f1a\u5728 Curve \u8bba\u575b\u4e2d\u63a8\u51fa ",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/t/topic/49"},"SOP (Standard Operation Procedure)")," \u7cfb\u5217\u6559\u7a0b\uff0c\u6765\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u4f7f\u7528 Curve\uff0c\u656c\u8bf7\u671f\u5f85\u3002"),(0,o.kt)("p",null,"In order to improve the usability of the Curve system, we have specially developed the deployment operation and maintenance tool ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm"),". Currently, CurveAdm has a complete ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki"},"WiKi")," homepage. You can find the detailed steps for deploying CurveBS/CurveFS in WiKi. In the future, we will also launch a series of ",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/t/topic/49"},"SOP (Standard Operation Procedure)")," tutorials in the Curve forum to help you use Curve better, so stay tuned."),(0,o.kt)("h3",{id:"4-curve-\u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\u5982\u547d\u4ee4\u884cdashboard\u76d1\u63a7\u7cfb\u7edf\u7b49-what-are-the-curve-om-troubleshooting-tools-such-as-command-line-dashboard-monitoring-system-etc"},"4. Curve \u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\uff1f\u5982\u547d\u4ee4\u884c\u3001dashboard\u3001\u76d1\u63a7\u7cfb\u7edf\u7b49\uff1f/ What are the Curve O&M troubleshooting tools? Such as command line, dashboard, monitoring system, etc."),(0,o.kt)("p",null,"Curve \u7684\u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u4e3b\u8981\u5206\u4e3a\u4ee5\u4e3a 3 \u5927\u7c7b\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve \u81ea\u5e26\u7684\u914d\u5957\u8fd0\u7ef4\u5de5\u5177\uff1aCurveBS \u7684 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curve_ops_tool.md"},"curve_ops_tool")," \u4ee5\u53ca CurveFS \u7684 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs/src/tools#readme"},"curvefs_tool")),(0,o.kt)("li",{parentName:"ul"},"Prometheus\uff1aCurve \u63d0\u4f9b\u4e00\u6574\u5957\u5b8c\u6574\u7684 metric \u4f53\u7cfb\uff0c\u7531 Prometheus \u91c7\u96c6\uff0c\u6700\u7ec8\u7531 Grafana \u9762\u677f\u5c55\u793a\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/monitor.md"},"\u76d1\u63a7\u4f53\u7cfb")),(0,o.kt)("li",{parentName:"ul"},"CurveAdm: CurveAdm \u76ee\u524d\u6b63\u5728\u5c1d\u8bd5\u63d0\u4f9b\u9ad8\u7ea7\u7684 troubleshooting \u5de5\u5177\uff0c\u8be6\u89c1 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve"},"CurveAdm \u5e38\u89c1\u8fd0\u7ef4\u64cd\u4f5c"))),(0,o.kt)("p",null,"Curve's operation and maintenance troubleshooting tools are mainly divided into three categories:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve's own supporting O&M tools: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curve_ops_tool.md"},"curve_ops_tool")," of CurveBS and ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs/src/tools#readme"},"curvefs_tool")," of CurveFS"),(0,o.kt)("li",{parentName:"ul"},"Prometheus: Curve provides a complete set of metric systems, which are collected by Prometheus and finally displayed on the Grafana panel. See ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/monitor.md"},"Monitoring System")," for details"),(0,o.kt)("li",{parentName:"ul"},"CurveAdm: CurveAdm is currently trying to provide advanced troubleshooting tools, see ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve"},"CurveAdm common operation and maintenance operations"))),(0,o.kt)("h3",{id:"5-\u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\u5982\u4f55\u83b7\u53d6-curve-\u793e\u533a\u7684\u652f\u6301-how-can-i-get-support-from-the-curve-community-if-i-encounter-an-unsolvable-problem-during-deployment-or-om"},"5. \u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u5982\u4f55\u83b7\u53d6 Curve \u793e\u533a\u7684\u652f\u6301\uff1f/ How can I get support from the Curve community if I encounter an unsolvable problem during deployment or O&M?"),(0,o.kt)("p",null,"Curve \u793e\u533a\u76ee\u524d\u6b63\u5728\u63a8\u52a8\u5b8c\u5584\u90e8\u7f72\u8fd0\u7ef4\u5de5\u5177 CurveAdm\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u7528\u6237\u90e8\u7f72\u8fd0\u7ef4\u96f6\u95ee\u9898\uff0c\u4e3a\u4e86\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\uff0c\u540e\u7eed CurveAdm \u5c06\u63a8\u51fa\u4e00\u7cfb\u5217\u4f18\u5316\u6539\u8fdb\u63aa\u65bd\uff0c\u5982\u9519\u8bef\u72b6\u6001\u7801\u3001\u5b8c\u5584\u7684\u73af\u5883\u68c0\u6d4b\u7b49\u3002\u5f53\u7136\u4e86\uff0c\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u4f60\u5982\u679c\u5728\u90e8\u7f72\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u4e09\u79cd\u65b9\u5f0f\u4e2d\u7684\u4efb\u4e00\u4e00\u79cd\u6765\u83b7\u53d6\u5e2e\u52a9\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5728 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve"},"Curve")," \u6216 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," \u4e3b\u9875\u63d0\u4ea4\u76f8\u5173 Issue"),(0,o.kt)("li",{parentName:"ul"},"\u901a\u8fc7\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\uff0c\u6dfb\u52a0\u5fae\u4fe1\u7fa4\uff0c\u5728\u5fae\u4fe1\u7fa4\u4e2d\u4e0e\u6211\u4eec\u53d6\u5f97\u8054\u7cfb")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Curve\u5c0f\u52a9\u624b\u5fae\u4fe1",src:r(2207).Z,width:"423",height:"549"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u8fd0\u884c CurveAdm \u7684 ",(0,o.kt)("inlineCode",{parentName:"li"},"support")," \u547d\u4ee4\u76f4\u63a5\u83b7\u53d6 Curve \u56e2\u961f\u6280\u672f\u652f\u6301\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve#%E8%8E%B7%E5%BE%97-curve-%E5%9B%A2%E9%98%9F%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81"},"\u83b7\u5f97 Curve \u56e2\u961f\u6280\u672f\u652f\u6301"))),(0,o.kt)("p",null,"The Curve community is currently promoting the improvement of the deployment and operation and maintenance tool CurveAdm. Our goal is to eliminate user deployment and operation and maintenance problems. In order to achieve this goal, CurveAdm will introduce a series of optimization and improvement measures in the future, such as error status codes and perfect environment detection. Of course, in the current state, if you encounter an unsolvable problem during deployment and operation, you can get help in any of the following three ways:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Submit relevant issues on the ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm"},"Curve")," or ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," homepage"),(0,o.kt)("li",{parentName:"ul"},"Slack: ",(0,o.kt)("a",{parentName:"li",href:"https://cloud-native.slack.com/archives/C03LFPT6BJM"},"https://cloud-native.slack.com/archives/C03LFPT6BJM")),(0,o.kt)("li",{parentName:"ul"},"Add a WeChat group by scanning the QR code below, and get in touch with us in the WeChat group")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Curve\u5c0f\u52a9\u624b\u5fae\u4fe1",src:r(2207).Z,width:"423",height:"549"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Run the support command of CurveAdm to directly obtain technical support from the Curve team. For details, see ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve#%E8%8E%B7%E5%BE%97-curve-%E5%9B%A2%E9%98%9F%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81"},"Obtaining Technical Support from the Curve Team"))),(0,o.kt)("h3",{id:"6-curve-\u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72-does-curve-support-manual-deployment-of-physical-machine-installation-packages"},"6. Curve \u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72\uff1f/ Does Curve support manual deployment of physical machine installation packages?"),(0,o.kt)("p",null,"\u76ee\u524d\u901a\u8fc7 CurveAdm \u90e8\u7f72\u7684\u96c6\u7fa4\u548c\u5ba2\u6237\u7aef\u90fd\u662f\u8dd1\u5728 Docker \u5bb9\u5668\u5185\uff0c\u540e\u7eed CurveAdm \u4e5f\u5c06\u63a8\u51fa\u7269\u7406\u673a\u5b89\u88c5\u63d2\u4ef6\uff0c\u8fd9\u4e2a\u63d2\u4ef6\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5c06\u5ba2\u6237\u7aef\u90e8\u7f72\u5728\u5404\u7c7b\u7269\u7406\u673a\u4e0a\uff08\u670d\u52a1\u7aef\u4ecd\u7136\u4f1a\u8dd1\u5728\u5bb9\u5668\u5185\uff09\u3002\u53e6\u5916\uff0c\u5982\u679c\u76ee\u524d\u4f60\u6709\u8fd9\u65b9\u9762\u7684\u9700\u6c42\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6211\u4eec\u7684 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/deploy.md"},"Ansible")," \u90e8\u7f72\u65b9\u5f0f\uff0c\u867d\u7136\u8be5\u90e8\u7f72\u65b9\u5f0f\u5373\u5c06\u88ab\u5e9f\u5f03\uff0c\u4f46\u5b83\u4ecd\u7136\u662f\u6709\u6548\u7684\u3002"),(0,o.kt)("p",null,"\u5f53\u7136\u4e86\uff0c\u5982\u679c\u4f60\u6709\u90e8\u7f72\u65b9\u9762\u7684\u4efb\u4f55\u9700\u6c42\uff0c\u90fd\u53ef\u4ee5\u901a\u8fc7\u63d0\u4ea4 Issue \u6216\u5fae\u4fe1\u7fa4\u6c9f\u901a\u7684\u65b9\u5f0f\u544a\u8bc9\u6211\u4eec\u3002"),(0,o.kt)("p",null,"Now, the clusters and clients deployed by CurveAdm are running in Docker containers. In the future, CurveAdm will also launch a physical machine installation plug-in. This plug-in can help us deploy clients on various physical machines (the server will still run in the container). ). In addition, if you currently have this need, you can also use our ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/deploy.md"},"Ansible")," deployment method, although this deployment method is about to be deprecated, it is still valid."),(0,o.kt)("p",null,"Of course, if you have any deployment requirements, you can let us know by submitting an Issue or communicating in the WeChat group."),(0,o.kt)("h3",{id:"7-curve-\u5982\u4f55\u6269\u5bb9\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1-io-how-does-curve-scale-out-will-capacity-expansion-affect-io"},"7. Curve \u5982\u4f55\u6269\u5bb9\uff1f\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How does Curve scale out? Will capacity expansion affect IO?"),(0,o.kt)("p",null,"\u4f60\u53ef\u4ee5\u901a\u8fc7 CurveAdm \u4e00\u952e\u6269\u5bb9\u96c6\u7fa4\uff0c\u5e76\u4e14\u8be5\u64cd\u4f5c\u5e76\u4e0d\u5f71\u54cd\u4e1a\u52a1 IO\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/scale-curve"},"\u6269\u7f29\u5bb9"),"\u3002"),(0,o.kt)("p",null,"You can scale out the cluster with one click through CurveAdm, and this operation does not affect IO. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/scale-curve"},"scaling")," for details."),(0,o.kt)("h3",{id:"8-curve-\u5982\u4f55\u5347\u7ea7\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1-io-how-to-upgrade-curve-does-the-upgrade-process-affect-io"},"8. Curve \u5982\u4f55\u5347\u7ea7\uff1f\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How to upgrade Curve? Does the upgrade process affect IO?"),(0,o.kt)("p",null,"\u4f60\u53ef\u4ee5\u901a\u8fc7 CurveAdm \u4e00\u952e\u5347\u7ea7\u96c6\u7fa4\u670d\u52a1\uff0c\u5e76\u4e14\u8be5\u64cd\u4f5c\u5e76\u4e0d\u5f71\u54cd\u4e1a\u52a1 IO\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/upgrade-curve"},"\u5347\u7ea7\u670d\u52a1"),"\u3002"),(0,o.kt)("p",null,"You can upgrade cluster services with one click through CurveAdm, and this operation does not affect IO. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/scale-curve"},"upgrading services")," for details."),(0,o.kt)("h3",{id:"9-curve-\u662f\u5426\u652f\u6301\u7f29\u5bb9-does-curve-support-scale-in-cluster"},"9. Curve \u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f/ Does Curve support scale in cluster?"),(0,o.kt)("p",null,"Curve \u76ee\u524d\u4e0d\u652f\u6301\u7f29\u5bb9\uff0c\u6211\u4eec\u5e76\u6ca1\u6709\u5728\u7ebf\u4e0a\u5c1d\u8bd5\u8fc7\u6b64\u7c7b\u64cd\u4f5c\u3002\u4e0d\u8fc7\uff0c\u4e3a\u4e86\u6ee1\u8db3\u66f4\u591a\u7528\u6237\u9700\u6c42\uff0c\u540e\u7eed CurveAdm \u5c06\u4f1a\u8003\u8651\u63d0\u4f9b\u7f29\u5bb9\u63a5\u53e3\u3002"),(0,o.kt)("p",null,"Now curve doesn't support scale in cluster, and we haven't tried this online. However, in order to meet the needs of more users, CurveAdm will consider providing a scaling interface in the future."),(0,o.kt)("h3",{id:"10-curve-\u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\u5f02\u5730\u5bb9\u707e\u4e24\u5730\u4e09\u4e2d\u5fc3-does-curve-support-dual-active-in-the-same-city-disaster-recovery-in-different-places-three-centers-in-two-places"},"10. Curve \u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\uff1f\u5f02\u5730\u5bb9\u707e\uff1f\u4e24\u5730\u4e09\u4e2d\u5fc3\uff1f/ Does Curve support dual-active in the same city? Disaster recovery in different places? Three centers in two places?"),(0,o.kt)("p",null,"Curve \u91c7\u7528 Raft \u5f3a\u4e00\u81f4\u6027\u534f\u8bae\uff0c\u5177\u5907\u4e09\u526f\u672c\uff0c\u53ef\u4ee5\u5f88\u597d\u7684\u5b9e\u73b0\u6570\u636e\u7684\u5bb9\u707e\uff0c\u5e76\u4e14 Curve \u7684\u526f\u672c\u653e\u7f6e\u7b56\u7565\u53ef\u7531\u7528\u6237\u7075\u6d3b\u914d\u7f6e\uff0c\u5b9e\u73b0\u5404\u7c7b\u9ad8\u53ef\u7528\u7684\u9700\u6c42\uff0c\u4e3a\u5173\u952e\u4e1a\u52a1\u63d0\u4f9b 7x24 \u4e0d\u95f4\u65ad\u670d\u52a1\u3002"),(0,o.kt)("p",null,"Curve adopts Raft strong consistency protocol and has three copies, which can well realize disaster recovery of data, and the copy placement strategy of Curve can be flexibly configured by users to meet various high-availability requirements and provide 7x24 uninterrupted services for key businesses."),(0,o.kt)("h3",{id:"11-curve-\u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72-does-curve-support-hyperconverged-deployment"},"11. Curve \u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72\uff1f/ Does Curve support hyperconverged deployment?"),(0,o.kt)("p",null,"Curve \u652f\u6301\u8ba1\u7b97\u5b58\u50a8\u6df7\u5408\u90e8\u7f72\u3002"),(0,o.kt)("p",null,"Curve supports compute-storage hybrid deployment."),(0,o.kt)("h3",{id:"12-curve-\u662f\u5426\u652f\u6301-rook\u662f\u5426\u53ef\u4ee5\u7528-k8s-\u90e8\u7f72-does-curve-support-rook-is-it-possible-to-deploy-with-k8s"},"12. Curve \u662f\u5426\u652f\u6301 rook\uff1f\u662f\u5426\u53ef\u4ee5\u7528 k8s \u90e8\u7f72\uff1f/ Does Curve support rook? Is it possible to deploy with k8s?"),(0,o.kt)("p",null,"Curve \u76ee\u524d\u5e76\u4e0d\u652f\u6301 rook\uff0c\u4f46\u5df2\u652f\u6301\u901a\u8fc7 operator \u5728 K8S \u4e0a\u90e8\u7f72 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-operator"},"curve-operator"),"\uff0c\u76ee\u524d Curve \u5df2\u63d0\u4f9b\u76f8\u5e94\u7684 CSI\uff0c\u5305\u62ec ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"curvebs-csi")," \u548c ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/h0hmj/curvefs-csi"},"curvefs-csi"),"\u3002"),(0,o.kt)("p",null,"Curve currently does not support rook, but it has supported deployment of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-operator"},"curve-operator")," on K8S through operator. Currently Curve has provided corresponding CSI, including ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"curvebs-csi ")," and ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/h0hmj/curvefs-csi"},"curvefs-csi"),"."),(0,o.kt)("h2",{id:"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173"},"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173"),(0,o.kt)("h3",{id:"1curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684-what-is-the-release-cycle-of-curve-version-how-is-the-version-number-defined"},"1\u3001Curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684\uff1f/ What is the release cycle of Curve version? How is the version number defined?"),(0,o.kt)("p",null,"Curve\u6309\u7167\u6bcf3\u4e2a\u6708\u53d1\u5e03\u4e00\u4e2a\u7248\u672c\u7684\u8282\u594f\u53d1\u5e03\u3002\n\u91c7\u75283\u6bb5\u5f0f\u7248\u672c\u53f7\uff0cx.y.z{-\u540e\u7f00}\uff0cx\u662f\u5927\u7248\u672c\uff0cy\u662f\u5c0f\u7248\u672c\uff0cz\u662fbugfix\uff0c\u540e\u7f00\u7528\u6765\u533abeta\u7248\u672c(-beta)\u3001rc\u7248\u672c(-rc)\u3001\u548c\u7a33\u5b9a\u7248\u672c(\u6ca1\u6709\u540e\u7f00)\u3002"),(0,o.kt)("p",null,"\u53d1\u5e03\u5927\u7248\u672c\u65f6x\u589e\u52a01\uff0c\u6240\u8c13\u5927\u7248\u672c\u662f\u6307\u6709\u91cd\u5927\u7684\u529f\u80fd\u66f4\u65b0\uff1b\u5e73\u65f6\u6bcf3\u6708\u7684\u5c0f\u7248\u672c\u7684\u66f4\u65b0y\u589e\u52a01\u3002\u6b63\u5f0f\u7248\u672c\u53d1\u5e03\u4e4b\u540e\uff0c\u5982\u679c\u6709bugfix\uff0c\u65b0\u53d1\u5e03\u7684\u7248\u672cz\u589e\u52a01\u3002"),(0,o.kt)("p",null,"Curve releases at a frequency of one version every 3 months.\nUse a 3-segment version number, x.y.z{-suffix}, x is a major version, y is a minor version, z is a bugfix, and the suffix is used to distinguish beta version (-beta), rc version (-rc), and stable version (no suffix)."),(0,o.kt)("p",null,"When a major version is released, x increases by 1. The so-called major version refers to a major function update; usually every 3-month minor version update y increases by 1. After the official version is released, if there are bugfixes, the newly released version z is increased by 1."),(0,o.kt)("h3",{id:"2curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248-which-is-the-current-stable-version-of-curve-how-to-find-the-latest-stable-version"},"2\u3001Curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\uff1f\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248\uff1f/ Which is the current stable version of Curve? How to find the latest stable version?"),(0,o.kt)("p",null,"Curve\u5757\u5b58\u50a8\u5f53\u524d\u7684\u7a33\u5b9a\u7248\u4e3aV1.2.4\u7248\u672c\uff0c",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases/tag/v1.2.4"},"https://github.com/opencurve/curve/releases/tag/v1.2.4")),(0,o.kt)("p",null,"Curve\u6700\u65b0\u7684\u7a33\u5b9a\u7248\uff08\u542bCurve\u6587\u4ef6\u5b58\u50a8\uff09\u53ef\u4ee5\u53bbrelease\u9875\u9762\u67e5\u627e\uff0c",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")),(0,o.kt)("p",null,"The current stable version is V1.2.4, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases/tag/v1.2.4"},"https://github.com/opencurve/curve/releases/tag/v1.2.4")),(0,o.kt)("p",null,"The latest stable version can be found on the release page, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")),(0,o.kt)("h3",{id:"3curve-1x\u548c2x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-curve-1x-and-2x-versions"},"3\u3001Curve 1.x\u548c2.x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between Curve 1.x and 2.x versions?"),(0,o.kt)("p",null,"Curve 1.x\u7248\u672c\u53ea\u6709Curve\u5757\u5b58\u50a8\u7684\u4ee3\u7801\uff0c\u53ea\u5305\u542bCurve\u5757\u5b58\u50a8\u7684\u529f\u80fd\u3002Curve 2.x\u589e\u52a0\u4e86Curve\u6587\u4ef6\u7cfb\u7edf\u7684\u529f\u80fd\u3002"),(0,o.kt)("p",null,"The Curve 1.x version only has the code of Curve block storage, and only contains the function of Curve block storage. Curve 2.x adds the functionality of the Curve file system."),(0,o.kt)("h3",{id:"4curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301-is-there-a-commercial-version-of-curve-is-there-a-commercial-version-development-plan-can-i-get-commercialization-support"},"4\u3001Curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\uff1f\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\uff1f\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301\uff1f/ Is there a commercial version of Curve? Is there a commercial version development plan? Can I get commercialization support?"),(0,o.kt)("p",null,"Curve\u6682\u65f6\u6ca1\u6709\u5546\u4e1a\u5316\u7248\u672c\uff0c\u77ed\u671f\u4e5f\u6ca1\u6709\u5546\u4e1a\u5316\u7248\u672c\u7684\u5f00\u53d1\u8ba1\u5212\u3002\u5982\u679c\u4f60\u9700\u8981\u5546\u4e1a\u5316\u7684\u652f\u6301\uff0c\u53ef\u4ee5\u8054\u7cfb\u6211\u4eec\uff0c\u6211\u4eec\u518d\u8be6\u7ec6\u6c9f\u901a\u3002"),(0,o.kt)("p",null,"There is no commercial version of Curve for the time being, and there is no development plan for a commercial version in the short term. If you need commercialization support, you can contact us and we will communicate in detail."),(0,o.kt)("h3",{id:"5curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248-are-the-versions-of-curve-block-storage-and-file-storage-released-independently-how-can-i-get-the-distributions-of-both"},"5\u3001Curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\uff1f\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248\uff1f/ Are the versions of Curve block storage and file storage released independently? How can I get the distributions of both?"),(0,o.kt)("p",null,"2.x\u7248\u672c\u4e4b\u524d\uff0cCurve\u53ea\u6709\u5757\u5b58\u50a8\u3002\n\u4ece2.X\u4e4b\u540e\uff0cCurve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u4f1a\u4f7f\u7528\u7edf\u4e00\u7684\u7248\u672c\u53f7\uff0c\u5728\u540c\u4e00\u4e2arelease\u53d1\u5e03\u3002\u53d1\u884c\u7248\u53ef\u5728 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")," \u83b7\u53d6\u3002"),(0,o.kt)("p",null,"Before version 2.x, Curve only had block storage.\nAfter 2.X, Curve block storage and file storage will use a unified version number and release in the same release. Releases are available at\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")),(0,o.kt)("h3",{id:"6\u6211\u6539\u4e86curve\u4ee3\u7801\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c-i-changed-the-curve-code-how-do-i-release-my-own-version"},"6\u3001\u6211\u6539\u4e86Curve\u4ee3\u7801\uff0c\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c\uff1f/ I changed the Curve code, how do I release my own version?"),(0,o.kt)("p",null,"\u4f7f\u7528docker\u7f16\u8bd1\u955c\u50cf\uff0c\u4fee\u6539\u4ee3\u7801\u3001\u7f16\u8bd1\u3001\u6253\u955c\u50cf\u3001\u63a8\u9001\u955c\u50cf\u3002"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u62c9\u53d6docker\u7f16\u8bd1\u955c\u50cf\uff0c\u5e76\u8fdb\u5165\u955c\u50cf",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ docker pull opencurvedocker/curve-base:build-debian9\n$ docker run -it opencurvedocker/curve-base:build-debian9 /bin/bash\n"))),(0,o.kt)("li",{parentName:"ol"},"\u62c9\u53d6curve\u4ee3\u7801\uff0c\u5e76\u4fee\u6539\u4ee3\u7801",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ cd \n$ git clone https://github.com/opencurve/curve.git\n$ cd curve\nmodify your code\n"))),(0,o.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u4fee\u6539\u7684curve bs\u4ee3\u7801\uff0c\u5728curve\u76ee\u5f55\u6267\u884c\u64cd\u4f5c5~7\uff1b"),(0,o.kt)("li",{parentName:"ol"},"\u5982\u679c\u4fee\u6539\u7684\u662fcurve fs\u4ee3\u7801\uff0c\u8fdb\u5165curvefs\u76ee\u5f55\uff0c\u6267\u884c\u64cd\u4f5c5~7\u3002",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ cd curvefs"))),(0,o.kt)("li",{parentName:"ol"},"\u4ee3\u7801\u7f16\u8bd1\uff0c\u5982\u679c\u7f16\u8bd1release\u7248\u672c\uff0c\u5728\u540e\u9762\u52a0\u4e0arelease=1",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make build ","[release=1]"))),(0,o.kt)("li",{parentName:"ol"},"\u6253\u955c\u50cf\uff0cTAG",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make image tag=TAG"))),(0,o.kt)("li",{parentName:"ol"},"\u63a8\u9001\u955c\u50cf",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ docker push TAG")))),(0,o.kt)("p",null,"Use docker to compile images, modify code, compile, make image, and push images."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Pull docker to compile the image and enter the image",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ docker pull opencurvedocker/curve-base:build-debian9\n$ docker run -it opencurvedocker/curve-base:build-debian9 /bin/bash\n"))),(0,o.kt)("li",{parentName:"ol"},"Pull the curve code and modify the code",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ cd \n$ git clone https://github.com/opencurve/curve.git\n$ cd curve\nmodify your code\n"))),(0,o.kt)("li",{parentName:"ol"},"If it is the modified curve bs code, perform operations 5~7 in the curve directory;"),(0,o.kt)("li",{parentName:"ol"},"If you modify the curve fs code, enter the curvefs directory and perform operations 5~7.",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ cd curvefs"))),(0,o.kt)("li",{parentName:"ol"},"Code compilation, if the release version is compiled, add release=1 after",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make build ","[release=1]"))),(0,o.kt)("li",{parentName:"ol"},"Mirroring, TAG",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make image tag=TAG"))),(0,o.kt)("li",{parentName:"ol"},"Push image",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ docker push TAG")))),(0,o.kt)("h3",{id:"7curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248-which-operating-system-distributions-are-supported-by-the-versions-released-by-curve"},"7\u3001Curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248\uff1f/ Which operating system distributions are supported by the versions released by Curve?"),(0,o.kt)("p",null,"Curve\u53d1\u884c\u7684\u7248\u672c\u652f\u6301Debian 9\u53ca\u4ee5\u4e0a\u7248\u672c\uff0cCentOs 8\u53ca\u4ee5\u4e0a\u7248\u672c\u3002\u5176\u4ed6\u7248\u672c\u672a\u6d4b\u8bd5\u8fc7\u3002"),(0,o.kt)("p",null,"The version released by Curve supports Debian 9 and above, and CentOs 8 and above. Other versions have not been tested."),(0,o.kt)("p",null,"8\u3001Curve\u662f\u5426\u53ef\u4ee5\u5728ARM64\u5e73\u53f0\u8fd0\u884c\uff1f\u76f8\u5173\u7248\u672c\u5982\u4f55\u83b7\u53d6\uff1f/ Can Curve run on ARM64 platform? How to get the relevant version?"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/arm64"},"https://github.com/opencurve/curve/tree/arm64")," \uff0c\u8fd9\u4e2a\u5206\u652f\u6709Curve\u7684\u5bf9ARM64\u5e73\u53f0\u7684\u652f\u6301\u3002"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/arm64"},"https://github.com/opencurve/curve/tree/arm64")," , this branch has Curve's support for the ARM64 platform."),(0,o.kt)("p",null,"doc to build curvebs v1.2.5 on arm64 platform: ",(0,o.kt)("a",{parentName:"p",href:"https://gist.github.com/h0hmj/f8764c082c9ecd03c074efe557cf3048"},"https://gist.github.com/h0hmj/f8764c082c9ecd03c074efe557cf3048")),(0,o.kt)("p",null,"9\u3001Curve\u9664\u4e86AMD64\u3001ARM64\u5e73\u53f0\u4e4b\u5916\uff0c\u8fd8\u652f\u6301\u54ea\u4e9bCPU\u67b6\u6784\u7684\u5e73\u53f0\uff1f/ In addition to AMD64 and ARM64 platforms, what CPU architecture platforms does Curve support?"),(0,o.kt)("p",null,"\u5176\u4ed6\u7684CPU\u67b6\u6784\u5e73\u53f0\u672a\u6d4b\u8bd5\u8fc7\uff08\u5df2\u6709\u7528\u6237\u6210\u529f\u79fb\u690d\u5230\u7533\u5a01\u5904\u7406\u5668\u5e73\u53f0\uff09\u3002\u5982\u679c\u60a8\u6709\u5174\u8da3\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u79fb\u690dCurve\u5230\u5176\u4ed6CPU\u67b6\u6784\u7684\u5e73\u53f0\u3002"),(0,o.kt)("p",null,"Other CPU architecture platforms have not been tested. If you are interested, you can help test other CPU architecture platforms."),(0,o.kt)("h2",{id:"\u67b6\u6784\u76f8\u5173"},"\u67b6\u6784\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u6211\u80fd\u628acurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f-what-is-the-deployment-architecture-of-curve-what-infrastructure-scenarios-can-i-use-curve-for"},"1. Curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u6211\u80fd\u628aCurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f\uff1f/ What is the deployment architecture of Curve? What infrastructure scenarios can I use Curve for?"),(0,o.kt)("p",null,"\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"\u5173\u4e8eCurve"),"\u7684\u95ee\u98981\uff1a",(0,o.kt)("inlineCode",{parentName:"p"},"Curve\u662f\u4ec0\u4e48\uff1f")),(0,o.kt)("p",null,"Refer to Question 1 of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"About Curve"),": ",(0,o.kt)("inlineCode",{parentName:"p"},"What is Curve? ")),(0,o.kt)("h3",{id:"2-curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b-what-are-the-business-scenarios-supported-by-curve"},"2. Curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b\uff1f/ What are the business scenarios supported by Curve"),(0,o.kt)("p",null,"\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"\u5173\u4e8eCurve"),"\u7684\u95ee\u98981\uff1a",(0,o.kt)("inlineCode",{parentName:"p"},"Curve\u662f\u4ec0\u4e48\uff1f")),(0,o.kt)("p",null,"Refer to Question 1 of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"About Curve"),": ",(0,o.kt)("inlineCode",{parentName:"p"},"What is Curve? ")),(0,o.kt)("h3",{id:"3-curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b-what-is-the-technical-architecture-of-curve-what-is-the-difference-between-the-technical-architecture-of-curve-block-storage-and-file-storage"},"3. Curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1fCurve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b\uff1f/ What is the technical architecture of Curve? What is the difference between the technical architecture of Curve block storage and file storage?"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-meetup-slides/blob/main/2020/1030-Curve%E8%AE%BE%E8%AE%A1%E8%A6%81%E7%82%B9-%E7%BD%91%E6%98%93%E6%95%B0%E5%B8%86-%E6%9D%8E%E5%B0%8F%E7%BF%A0.pdf"},"CurveBS\u67b6\u6784")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curvefs_architecture.md"},"CurveFS\u67b6\u6784")),(0,o.kt)("p",null,"CurveBS\u7684\u67b6\u6784\u548cCurveFS\u7684\u67b6\u6784\u662f\u7c7b\u4f3c\u7684\u3002CurveBS\u53ef\u4ee5\u4f5c\u4e3aCurveFS\u7684\u540e\u7aef\uff0c\u7528\u4e8e\u5b58\u50a8\u6587\u4ef6\u6570\u636e\u3002"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-meetup-slides/blob/main/2020/1030-Curve%E8%AE%BE%E8%AE%A1%E8%A6%81%E7%82%B9-%E7%BD%91%E6%98%93%E6%95%B0%E5%B8%86-%E6%9D%8E%E5%B0%8F%E7%BF%A0.pdf"},"CurveBS Architecture")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curvefs_architecture.md"},"CurveFS Architecture")),(0,o.kt)("p",null,"The architecture of CurveBS is similar to that of CurveFS. CurveBS can be used as the backend of CurveFS \u200b\u200bto store file data."),(0,o.kt)("h3",{id:"4-curve\u548cceph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-the-technical-architecture-of-curve-and-ceph"},"4. Curve\u548cCeph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between the technical architecture of Curve and Ceph"),(0,o.kt)("p",null,"\u67b6\u6784\u4e0a\u4e3b\u8981\u7684\u533a\u522b\u6709\u4e24\u4e2a\uff1a\u4e00\u4e2a\u662f\u6570\u636e\u653e\u7f6e\u65b9\u9762\uff0cCurve\u7531\u4e2d\u5fc3\u8282\u70b9\u9009\u62e9\uff0cCeph\u4f7f\u7528\u54c8\u5e0c\u7b97\u6cd5\u8ba1\u7b97\u5f97\u51fa\uff1b\u53e6\u4e00\u4e2a\u591a\u526f\u672c\u4e00\u81f4\u6027\u65b9\u9762\uff0cCurve\u4f7f\u7528Quorum\u673a\u5236\u534f\u8bae\uff0cCeph\u4f7f\u7528\u5f3a\u4e00\u81f4\u534f\u8bae.\u5176\u4ed6\u529f\u80fd\u548c\u5b9e\u73b0\u4e0a\uff08\u5ba2\u6237\u7aef\u652f\u6301\u70ed\u5347\u7ea7\u3001\u5feb\u7167\u3001\u6587\u4ef6\u5143\u6570\u636e\u3001\u6570\u636e\u8282\u70b9\u4f7f\u7528\u7684\u6587\u4ef6\u7cfb\u7edf\u7b49\u7b49\uff09\u7684\u533a\u522b\u8fd8\u6709\u5f88\u591a\uff0c\u5efa\u8bae\u9605\u8bfb\u5bf9\u6bd4",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#design-documentation"},"Curve"),"\u548cCeph\u7684\u8bbe\u8ba1\u6587\u6863\u3002"),(0,o.kt)("p",null,"There are two main differences in architecture: one is data placement, Curve is selected by the central node, and Ceph uses a hash algorithm to calculate; the other is multi-copy consistency, Curve uses the Quorum mechanism protocol, and Ceph uses a strong consensus protocol.There are many differences in other functions and implementations (Client supports hot upgrade\n, snapshots, file metadata, file systems used by data nodes, etc.), it is recommended to read the comparison ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#design-documentation"},"Curve")," and Ceph's design documentation."),(0,o.kt)("h3",{id:"5-curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc-where-is-the-advanced-nature-of-curves-technical-architecture-reflected"},"5. Curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc\uff1f/ Where is the advanced nature of Curve's technical architecture reflected?"),(0,o.kt)("p",null,"\u5757\u5b58\u50a8"),(0,o.kt)("p",null,"\u670d\u52a1\u7aef\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4e2d\u6027\u5316\u8282\u70b9\u67b6\u6784\u3002\u5229\u7528\u4e2d\u5fc3\u8282\u70b9\u611f\u77e5\u96c6\u7fa4\u8282\u70b9\u548c\u8d1f\u8f7d\u3001\u5bb9\u91cf\u3001\u5f02\u5e38\uff0c\u8fdb\u884c\u8d44\u6e90\u7684\u5b9e\u65f6\u8c03\u5ea6\u4e0e\u6062\u590d"),(0,o.kt)("li",{parentName:"ul"},"Quorum\u673a\u5236\u7684\u4e00\u81f4\u6027\u534f\u8bae\u3002\u5f02\u5e38\u60c5\u51b5\u5bb9\u9519\u66f4\u4f18\u5f02\uff0c\u5728\u5f02\u5e38\u60c5\u51b5\u4e0b\u6062\u590d\u8f83\u5feb\uff0c\u4fdd\u8bc1\u53ef\u9760\u6027\u7684\u540c\u65f6\uff0c\u63d0\u9ad8\u670d\u52a1\u53ef\u7528\u6027"),(0,o.kt)("li",{parentName:"ul"},"\u6587\u4ef6\u6c60\u3002\u96c6\u7fa4\u521d\u59cb\u5316\u65f6\uff0c\u521b\u5efa\u6307\u5b9a\u5927\u5c0f\u7684\u6587\u4ef6\uff0c\u964d\u4f4eIO\u8fc7\u7a0b\u4e2d\u6587\u4ef6\u5143\u6570\u636e\u7684\u66f4\u65b0\u5f00\u9500\uff0c\u964d\u4f4eIO\u5ef6\u8fdf"),(0,o.kt)("li",{parentName:"ul"},"IO\u8def\u5f84\u4e00\u6b21\u6301\u4e45\u5316\u3002\u5bf9\u4e8e\u7528\u6237io, raft\u4e2d\u5927\u591a\u6570\u8282\u70b9\u5199\u5b8cwal, apply\u5199\u5165\u7f13\u5b58\u5373\u53ef\u8fd4\u56de"),(0,o.kt)("li",{parentName:"ul"},"raft\u8f7b\u91cf\u7ea7\u5feb\u7167\u3002\u8bfb\u5199\u64cd\u4f5c\u662f\u5e42\u7b49\u7684\uff0craft\u5feb\u7167\u53ea\u9700\u8981\u4fdd\u5b58\u6587\u4ef6\u540d\uff0c\u5bf9io\u65e0\u5f71\u54cd"),(0,o.kt)("li",{parentName:"ul"},"\u5feb\u7167\u4e0a\u4f20S3\u3002\u5feb\u7167\u5b58\u50a8\u5230\u652f\u6301S3\u63a5\u53e3\u7684\u5bf9\u8c61\u5b58\u50a8\uff0c\u4e0d\u9650\u5236\u6570\u91cf")),(0,o.kt)("p",null,"\u5ba2\u6237\u7aef\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u6761\u5e26\u5316\u8bbe\u8ba1\u3002\u5927io\u4f7f\u7528\u6761\u5e26\u5316\u6280\u672f\uff0c\u5728\u5ba2\u6237\u7aef\u8fdb\u884c\u5206\u7247\uff0c\u63d0\u9ad8IO\u7684\u5e76\u53d1\u5ea6\uff0c\u8ba9\u66f4\u591a\u7684\u8282\u70b9\u53c2\u4e0eIO\u5904\u7406"),(0,o.kt)("li",{parentName:"ul"},"ApplyIndex\u8bfb\u3002\u5ba2\u6237\u7aef\u5e26\u7740applyIndex\u8bfb\uff0c\u65e0\u9700\u8d70\u4e00\u81f4\u6027\u534f\u8bae\uff0c\u4f7f\u7684\u8bfb\u4e0d\u4f1a\u88ab\u5199\u963b\u585e\uff0c\u6781\u5927\u7684\u63d0\u9ad8\u4e86\u8bfb\u6027\u80fd"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u6302\u8f7d\u3002\u4e00\u4e2a\u6587\u4ef6\u53ef\u4ee5\u6302\u8f7d\u5230\u591a\u4e2a\u5ba2\u6237\u7aef\uff0c\u63d0\u4f9b\u5757\u7ea7\u522b\u7684\u4e00\u5199\u591a\u8bfb"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u70ed\u5347\u7ea7\u3002client\u7aef\u4f7f\u7528client-server\u67b6\u6784\uff0c\u7248\u672c\u5347\u7ea7\u53ea\u9700\u8981\u66f4\u65b0server\uff0c\u65e0\u9700\u4e1a\u52a1\u505c\u670d\uff0c\u5bf9io\u79d2\u7ea7\u5f71\u54cd")),(0,o.kt)("p",null,"\u6587\u4ef6\u5b58\u50a8"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u79cd\u5b58\u50a8\u540e\u7aef\uff0c\u652f\u6301\u516c\u6709\u4e91\u3001\u79c1\u6709\u4e91\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u7ea7\u7f13\u5b58"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u539f\u5b50\u6027rename"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u6302\u8f7d"),(0,o.kt)("li",{parentName:"ul"},"\u5143\u6570\u636e\u548c\u6570\u636e\u8282\u70b9\u5f39\u6027\u53ef\u6269\u5c55")),(0,o.kt)("p",null,"Block Storage"),(0,o.kt)("p",null,"Server:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Neutral node architecture. Use the central node to sense cluster nodes, load, capacity, and anomalies, and perform real-time scheduling and recovery of resources"),(0,o.kt)("li",{parentName:"ul"},"Consistency protocol for Quorum mechanism. Better fault tolerance for abnormal conditions, faster recovery under abnormal conditions, and improved service availability while ensuring reliability"),(0,o.kt)("li",{parentName:"ul"},"File pool. When the cluster is initialized, a file of a specified size is created to reduce the update overhead of file metadata during the IO process and reduce the IO delay."),(0,o.kt)("li",{parentName:"ul"},"IO paths are persisted once. For user io, most nodes in raft finish writing wal, and apply write to the cache to return"),(0,o.kt)("li",{parentName:"ul"},"raft lightweight snapshot. Read and write operations are idempotent, and raft snapshots only need to save the file name, which has no effect on io"),(0,o.kt)("li",{parentName:"ul"},"Snapshot upload to S3. Snapshots are stored to object storage that supports the S3 interface, and the number is not limited")),(0,o.kt)("p",null,"Client:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Striped design. Big io uses striping technology to shard on the client side to improve IO concurrency and allow more nodes to participate in IO processing"),(0,o.kt)("li",{parentName:"ul"},"ApplyIndex read. The client reads with applyIndex, without the need to follow the consistency protocol, so that the read will not be blocked by the write, which greatly improves the read performance"),(0,o.kt)("li",{parentName:"ul"},"Support multiple mounts. A file can be mounted to multiple clients, providing block-level write-once read-many"),(0,o.kt)("li",{parentName:"ul"},"Support hot upgrade. The client side uses the client-server architecture, and the version upgrade only needs to update the server, without the need to stop the service, which has a second-level impact on io")),(0,o.kt)("p",null,"File Storage"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Support multiple storage backends, support public cloud, private cloud deployment"),(0,o.kt)("li",{parentName:"ul"},"Support multi-level cache"),(0,o.kt)("li",{parentName:"ul"},"Support atomic rename"),(0,o.kt)("li",{parentName:"ul"},"Support multiple mounts"),(0,o.kt)("li",{parentName:"ul"},"Metadata and data nodes are elastically scalable")),(0,o.kt)("h3",{id:"6-curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u53ef\u7528\u6027\u6027\u80fd\u7b49\u65b9\u9762-are-there-any-shortcomings-in-curves-technical-architecture-such-as-reliability-availability-performance-etc"},"6. Curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\uff1f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u3001\u53ef\u7528\u6027\u3001\u6027\u80fd\u7b49\u65b9\u9762\uff1f/ Are there any shortcomings in Curve's technical architecture? such as reliability, availability, performance, etc."),(0,o.kt)("p",null,"\u4ece\u67b6\u6784\u4e0a\u6765\u8bf4\u662f\u6ca1\u6709\u7684\uff0c\u4ece\u5de5\u7a0b\u5b9e\u8df5\u4e0a\u6765\u770b\u8fd8\u6709\u5f88\u591a\u53ef\u4ee5\u4f18\u5316\u7684\u5730\u65b9\u3002\u6bd4\u5982bypass-kernel(spdk, rdma), curvefs\u4e00\u81f4\u6027\u534f\u8bae\u7684\u5feb\u7167\u4f18\u5316\u7b49"),(0,o.kt)("p",null,"There is no such thing in terms of architecture, and there are still many places that can be optimized in terms of engineering practice. For example, bypass-kernel (spdk, rdma), snapshot optimization of curvefs consistency protocol, etc."),(0,o.kt)("h3",{id:"7-curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\u5bf9\u65b0\u786c\u4ef6\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212-what-is-the-evolution-direction-of-curves-technical-architecture-what-are-the-plans-for-support-for-new-hardware-and-new-platforms"},"7. Curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\uff1f\u5bf9\u65b0\u786c\u4ef6\u3001\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212\uff1f/ What is the evolution direction of Curve's technical architecture? What are the plans for support for new hardware and new platforms?"),(0,o.kt)("p",null,"\u53ef\u4ee5\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Roadmap_CN"},"roadmap")),(0,o.kt)("p",null,"You can refer to the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Roadmap"},"roadmap")),(0,o.kt)("h3",{id:"8-curvebs\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae--is-curvebs-compatible-with-librbd-protocol"},"8. CurveBS\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae\uff1f / Is CurveBS compatible with librbd protocol?"),(0,o.kt)("p",null,"\u6211\u4eec\u505a\u4e86\u63a2\u7d22\uff0c\u76ee\u524d\u5df2\u6709demo\u65b9\u6848\uff0c\u53ef\u4ee5\u5728openstack+libirt+qemu\u7684\u7ec4\u5408\u573a\u666f\u4e0b\u4f7f\u7528\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u6d4b\u8bd5\u4f18\u5316\uff0c\u76f8\u5173\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\u5b98\u7f51\u6216\u8005\u516c\u4f17\u53f7\u6587\u7ae0\u3002"),(0,o.kt)("p",null,"We have done some research and now have a demo solution that can be used in the combination scenario of openstack+libirt+qemu. Those who are interested can test the optimization. For relevant details, please refer to the official website or official account article."),(0,o.kt)("h2",{id:"\u529f\u80fd\u76f8\u5173"},"\u529f\u80fd\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230--where-can-i-find-a-list-of-curves-features"},"1. Curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230\uff1f / Where can I find a list of Curve's features?"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/wiki/Feature-list"},"https://github.com/opencurve/curve/wiki/Feature-list"))),(0,o.kt)("h3",{id:"2-curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt--can-curve-be-used-by-kubevirt"},"2. Curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt\uff1f / Can Curve be used by kubevirt?"),(0,o.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7Curve-CSI\u8fdb\u884c\u5bf9\u63a5\uff08\u4f9d\u8d56nbd\u5185\u6838\u6a21\u5757\uff09\uff0cCurve-CSI\u4ed3\u5e93\u5730\u5740\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"https://github.com/opencurve/curve-csi")),(0,o.kt)("p",null,"Can be connected through Curve-CSI (depending on nbd kernel module), Curve-CSI repository: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"https://github.com/opencurve/curve-csi")),(0,o.kt)("h3",{id:"3-curve\u5bf9\u63a5qemu\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1qemu\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01--do-i-need-to-compile-qemu-by-myself-when-connecting-to-qemu-where-can-i-find-relevant-patches"},"3. Curve\u5bf9\u63a5QEMU\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1QEMU\uff1f\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01\uff1f / Do I need to compile QEMU by myself when connecting to QEMU? Where can I find relevant patches?"),(0,o.kt)("p",null,"\u662f\u7684\uff0c\u9700\u8981\u7f16\u8bd1QEMU\uff0c\u8865\u4e01\u4ed3\u5e93\u5730\u5740\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("p",null,"Yes, you need to compile QEMU, patches repository: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("h3",{id:"4-curve\u5bf9\u63a5libvirt\u662f\u5426\u8981\u7f16\u8bd1libvirt\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6--do-i-need-to-compile-libvirt-by-myself-when-connecting-to-libvirt-where-can-i-find-relevant-patches"},"4. Curve\u5bf9\u63a5Libvirt\u662f\u5426\u8981\u7f16\u8bd1Libvirt\uff1f\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6\uff1f / Do I need to compile Libvirt by myself when connecting to Libvirt? Where can I find relevant patches?"),(0,o.kt)("p",null,"\u662f\u7684\uff0c\u9700\u8981\u7f16\u8bd1Libvirt\uff0c\u8865\u4e01\u4ed3\u5e93\u5730\u5740\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("p",null,"Yes, you need to compile Libvirt, patches repository: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("h3",{id:"5-curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\u6587\u4ef6\u5b58\u50a8\u5bf9\u8c61\u5b58\u50a8--does-curve-support-block-storage-file-storage-object-storage"},"5. Curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\uff1f\u6587\u4ef6\u5b58\u50a8\uff1f\u5bf9\u8c61\u5b58\u50a8\uff1f / Does Curve support block storage? file storage? Object storage?"),(0,o.kt)("p",null,"Curve\u652f\u6301\u5757\u5b58\u50a8\u3001\u6587\u4ef6\u5b58\u50a8\uff0c\u4e0d\u652f\u6301\u5bf9\u8c61\u5b58\u50a8\uff08\u57fa\u4e8e\u6587\u4ef6\u5b58\u50a8\u6269\u5c55\u652f\u6301S3\u534f\u8bae\u53ef\u901a\u8fc7\u7b2c\u4e09\u65b9gateway\u5b9e\u73b0\uff0c\u53ef\u67e5\u8be2Curve\u5b98\u7f51\u6587\u6863\u6216\u516c\u4f17\u53f7\u6587\u7ae0\u4e86\u89e3\u8be6\u60c5\uff09\u3002"),(0,o.kt)("p",null,"Curve supports block storage and file storage, but does not support object storage (supporting the S3 protocol based on the file storage extension can be implemented through a third-party gateway. You can check the Curve official website documentation or public account articles for details)."),(0,o.kt)("h3",{id:"6-curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\u7f13\u5b58\u7684\u53ef\u9760\u6027\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1--does-curve-support-client-side-caching-how-to-ensure-cache-reliability-and-data-consistency"},"6. Curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff1f\u7f13\u5b58\u7684\u53ef\u9760\u6027\u3001\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1\uff1f / Does Curve support client-side caching? How to ensure cache reliability and data consistency?"),(0,o.kt)("p",null,"CurveBS\u5757\u5b58\u50a8\u4e0d\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff0c\u670d\u52a1\u7aef\u7f13\u5b58\u53ef\u4ee5\u7406\u89e3\u4e3a\u662f\u6587\u4ef6\u7cfb\u7edf\u7684pagecache\u3002"),(0,o.kt)("p",null,"CurveFS\u6587\u4ef6\u5b58\u50a8\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff0c\u5305\u62ec\u5185\u5b58\u3001\u78c1\u76d8\u3001\u5206\u5e03\u5f0fkv \u4e09\u79cd\u5f62\u6001\uff1a\u5185\u5b58\u7f13\u5b58\u7684\u6570\u636e\u53ef\u9760\u6027\u65e0\u6cd5\u4fdd\u8bc1\uff08\u9075\u5faaPOSIX\u8bed\u4e49\uff0c\u672aflush\u6216\u8005close\u7684\u6570\u636e\u53ef\u80fd\u4e22\u5931\uff09\uff1b\u78c1\u76d8\u7f13\u5b58\u9700\u8981\u7531\u78c1\u76d8\u672c\u8eab\u53ef\u9760\u6027\u4fdd\u8bc1\uff08\u5efa\u8bae\u4f7f\u7528RAID1\u7b49\u5197\u4f59\u6a21\u5f0f\uff09\u3002\u591a\u5ba2\u6237\u7aef\u7684\u7f13\u5b58\u6570\u636e\u4e00\u81f4\u6027\u65e0\u6cd5\u4fdd\u8bc1\uff0c\u4f46\u4f1a\u5b9a\u671f\u66f4\u65b0\uff0c\u5982\u679c\u6709\u5f3a\u4e00\u81f4\u6027\u9700\u6c42\uff0c\u5efa\u8bae\u5173\u95ed\u78c1\u76d8\u7f13\u5b58\u3002"),(0,o.kt)("p",null,"\u6709\u5173\u7f13\u5b58\u7684\u5b9e\u73b0\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve%E6%BA%90%E7%A0%81%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BB#16-caches"},"Caches")),(0,o.kt)("p",null,"CurveBS block storage does not support client-side caching, and server-side caching can be understood as the pagecache of the file system."),(0,o.kt)("p",null,"CurveFS file storage supports client-side caching, including memory and disk: the data reliability of memory cache cannot be guaranteed (following POSIX semantics, data that is not flushed or closed may be lost); disk caching needs to be guaranteed by the reliability of the disk itself (recommended Use redundant modes such as RAID1). The cache data consistency of multiple clients cannot be guaranteed, but it will be updated regularly. If there is a strong consistency requirement, it is recommended to turn off the disk cache."),(0,o.kt)("p",null,"The implementation details of the cache can refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve%E6%BA%90%E7%A0%81%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BB#16-caches"},"Caches"),"."),(0,o.kt)("h3",{id:"7-curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684waldb\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e--does-the-curve-server-support-disk-caching-or-how-to-configure-the-waldb-cache-disk-similar-to-ceph"},"7. Curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\uff1f\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684wal/db\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e\uff1f / Does the Curve server support disk caching? Or how to configure the wal/db cache disk similar to ceph?"),(0,o.kt)("p",null,"CurveBS 1.2.7\u7248\u672c\u5df2\u652f\u6301\u6df7\u5408\u5b58\u50a8\uff08\u6df7\u95ea\uff09\uff0c\u652f\u6301\u4f7f\u7528NVME\u505aHDD\u7684\u7f13\u5b58\u76d8\u8fdb\u884c\u52a0\u901f\uff0ccurveadm\u5de5\u5177\u5df2\u652f\u6301\u90e8\u7f72\uff0c\u5982\u6709\u95ee\u9898\u6b22\u8fce\u5fae\u4fe1\u7b49\u6e20\u9053\u8054\u7cfb\u6211\u4eec\u3002"),(0,o.kt)("p",null,"CurveBS version 1.2.7 already supports hybrid storage (mixed flash) and supports the use of NVME as HDD cache disk for acceleration. The curveadm tool has supported deployment. If you have any questions, please contact us through WeChat and other channels."),(0,o.kt)("h3",{id:"8-curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60--does-curve-support-different-disk-types-to-form-different-storage-pools"},"8. Curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60\uff1f / Does Curve support different disk types to form different storage pools?"),(0,o.kt)("p",null,"CurveBS 1.2.7\u7248\u672c\u5df2\u652f\u6301poolset\u529f\u80fd\uff0c\u6bcf\u4e2apoolset\u5bf9\u5e94\u4e00\u4e2a\u78c1\u76d8\u7c7b\u578b\uff0c\u53ef\u5305\u542b\u591a\u4e2apool\uff0c\u652f\u6301\u589e\u52a0pool\u7684\u65b9\u5f0f\u6765\u6269\u5bb9poolset\u3002"),(0,o.kt)("p",null,"CurveBS version 1.2.7 already supports the poolset function. Each poolset corresponds to a disk type and can contain multiple pools. It supports adding pools to expand the poolset."),(0,o.kt)("h3",{id:"9-curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\u662f\u5426\u652f\u6301\u7f29\u5bb9--does-curve-support-storage-pool-scale-out-does-it-support-scale-in"},"9. Curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\uff1f\u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f / Does Curve support storage pool scale-out? Does it support scale-in?"),(0,o.kt)("p",null,"\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\uff0c\u6682\u4e0d\u652f\u6301\u7f29\u5bb9\u3002"),(0,o.kt)("p",null,"Storage pool scale-out is supported, but shrinking(or scale-in) is not currently supported."),(0,o.kt)("h3",{id:"10-curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de--does-curve-support-recyclebin-can-the-deleted-volume-or-directory-be-recovered"},"10. Curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\uff1f\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de\uff1f / Does Curve support RecycleBin? Can the deleted volume or directory be recovered?"),(0,o.kt)("p",null,"CurveBS\u5377\u652f\u6301\u56de\u6536\u7ad9\u529f\u80fd\uff0c\u5220\u9664\u7684\u5377\u5728\u56de\u6536\u7ad9\u6e05\u7406\u524d\u53ef\u4ee5\u627e\u56de\u3002CurveFS\u56de\u6536\u7ad9\u529f\u80fd\u4e5f\u5728\u5f00\u53d1\u4e2d\u3002"),(0,o.kt)("p",null,"CurveBS volumes support RecycleBin, and deleted volumes can be retrieved before the RecycleBin is cleaned. CurveFS RecycleBin feature is also under development."),(0,o.kt)("h3",{id:"11-curve\u662f\u5426\u652f\u6301xx\u786c\u4ef6\u5982optanenvmerdma\u7f51\u5361\u7b49--does-curve-support-xx-hardware-such-as-optane-nvme-rdma-network-cards-etc"},"11. Curve\u662f\u5426\u652f\u6301XX\u786c\u4ef6\uff08\u5982Optane\u3001NVMe\u3001RDMA\u7f51\u5361\u7b49\uff09\uff1f / Does Curve support XX hardware (such as Optane, NVMe, RDMA network cards, etc.)?"),(0,o.kt)("p",null,"Curve\u672c\u8eab\u5bf9\u786c\u4ef6\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u4f46\u8981\u5229\u7528\u597d\u8fd9\u4e9b\u65b0\u578b\u786c\u4ef6\uff0c\u8fd8\u9700\u8981\u8f6f\u4ef6\u7684\u4f18\u5316\u914d\u5408\uff0c\u8fd9\u4e9b\u90fd\u5728\u8ba1\u5212\u4e2d\uff0c\u6709\u4e9b\u5df2\u7ecf\u5728\u5f00\u53d1\u4e2d\uff0c\u5177\u4f53\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u8bba\u575b\u3001\u5fae\u4fe1\u7fa4\u7b49\u6e20\u9053\u8054\u7cfb\u6211\u4eec\u8fdb\u884c\u8be6\u7ec6\u4ea4\u6d41\u3002"),(0,o.kt)("p",null,"Curve itself has no special requirements for hardware, but to make good use of these new hardware, software optimization is also required. These are all planned, and some are already under development. For specific questions, please contact us through forums, WeChat groups and other channels for detailed communication."),(0,o.kt)("h3",{id:"12-curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f--how-much-storage-resources-does-curvefs-metadata-occupy"},"12. Curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f\uff1f / How much storage resources does Curvefs metadata occupy?"),(0,o.kt)("p",null,"\u6211\u4eec\u4e4b\u524d\u6d4b\u8bd59\u4e2ametaserver\u7684\u96c6\u7fa4\uff0c\u901a\u8fc7mdtest\u6d4b\u8bd5\uff0c\u5927\u6982\u521b\u5efa2.2 Bil\u6587\u4ef6\u65f6\uff0c\u5355metaesrver\u5360\u7528\u5185\u5b5811GB\uff0c\u5360\u7528\u78c1\u76d8330GB\u3002"),(0,o.kt)("p",null,"We tested a cluster of 9 metaservers before. Through the mdtest test, when creating a 2.2 Bil file, a single metaesrver occupies 11GB of memory and 330GB of disk."),(0,o.kt)("h2",{id:"\u6027\u80fd\u76f8\u5173"},"\u6027\u80fd\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684-what-does-curves-performance-metrics-look-like"},"1. Curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684\uff1f/ What does Curve's performance metrics look like?"),(0,o.kt)("p",null,"\u5757\u5b58\u50a8\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md"},"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md")),(0,o.kt)("p",null,"\u6587\u4ef6\u5b58\u50a8\uff1arelease2.3\u6d4b\u8bd5\u4e4b\u540e\u66f4\u65b0\u6570\u636e"),(0,o.kt)("p",null,"Block Storage: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md"},"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md")),(0,o.kt)("p",null,"File storage: update data after release2.3 test"),(0,o.kt)("h3",{id:"2-curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd-what-hardware-specifications-curve-has-tested-for-performance"},"2. Curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd\uff1f/ What hardware specifications Curve has tested for performance?"),(0,o.kt)("p",null,"\u5757\u5b58\u50a8\uff1aNVME+HDD\u3001Sata SSD\u3001NVME"),(0,o.kt)("p",null,"\u6587\u4ef6\u5b58\u50a8\uff1a\u5143\u6570\u636e Sata SSD; \u6570\u636e S3"),(0,o.kt)("p",null,"Block Storage: NVME+HDD, Sata SSD, NVME"),(0,o.kt)("p",null,"File Storage: Metadata Sata SSD; Data S3"),(0,o.kt)("h3",{id:"3-curve\u7684\u6027\u80fd\u76f8\u6bd4ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684-the-performance-of-curve-is-much-higher-than-that-of-ceph-how-is-it-done"},"3. Curve\u7684\u6027\u80fd\u76f8\u6bd4Ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684\uff1f/ The performance of Curve is much higher than that of Ceph. How is it done?"),(0,o.kt)("p",null,"\u4ece\u67b6\u6784\u4e0a\u6765\u8bf4\uff0cCurveBS\u4f7f\u7528Quorum\u673a\u5236\u7684\u4e00\u81f4\u6027\u534f\u8bae\uff0c\u5199\u5927\u591a\u6570\u8fd4\u56de\uff0c\u5ef6\u8fdf\u53d6\u51b3\u4e8e\u591a\u526f\u672c\u6700\u5feb\u7684\u5927\u591a\u6570; Ceph\u4f7f\u7528\u5f3a\u4e00\u81f4\u534f\u8bae\uff0c\u5199\u6240\u6709\u526f\u672c\u8fd4\u56de\uff0c\u5ef6\u8fdf\u53d6\u51b3\u4e8e\u6700\u6162\u7684\u90a3\u4e00\u4e2a\u3002\u5de5\u7a0b\u5b9e\u8df5\u7684\u7ec6\u8282\u4e0a\u5c31\u5f88\u96be\u4e00\u4e00\u505a\u5bf9\u6bd4\u4e86"),(0,o.kt)("p",null,"Architecturally, CurveBS uses the consensus protocol of the Quorum mechanism, writing the majority to return, and the delay depends on the fastest majority of multiple copies; Ceph uses a strong consensus protocol, writing all copies to return, and the delay depends on the slowest one. It is difficult to compare the details of engineering practice."),(0,o.kt)("p",null,"CurveFS \u5219\u4e3b\u8981\u901a\u8fc7\u8f7b\u91cf\u7ea7\u7684CTO\u4e00\u81f4\u6027\u4fdd\u8bc1\uff0c\u4ee5\u53ca\u5143\u6570\u636e\u548c\u6570\u636e\u591a\u7ea7\u7f13\u5b58\u6765\u5b9e\u73b0\u66f4\u4f18\u5f02\u7684\u6027\u80fd\u3002"),(0,o.kt)("p",null,"CurveFS mainly achieves better performance through lightweight CTO consistency guarantees and multi-level caching of metadata and data."),(0,o.kt)("h3",{id:"4-curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\u6f14\u8fdb\u65b9\u5411\u662f-what-are-curves-plans-for-performance-optimization-what-is-the-direction-of-evolution"},"4. Curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\uff1f\u6f14\u8fdb\u65b9\u5411\u662f\uff1f/ What are Curve's plans for performance optimization? What is the direction of evolution"),(0,o.kt)("p",null,"\u91cd\u70b9\u8003\u8651\u70b9\u662f\u5de5\u7a0b\u5b9e\u8df5\u4e0a\u7684\uff1a\u78c1\u76d8io\u548c\u7f51\u7edcio\u53ef\u4ee5bypass kernel\uff0c\u652f\u6301\u66f4\u9ad8\u6027\u80fd\u7684\u78c1\u76d8"),(0,o.kt)("p",null,"\u66f4\u591a\u5730\u53ef\u4ee5\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://docs.opencurve.io/category/roadmap"},"roadmap")),(0,o.kt)("p",null,"The key consideration is engineering practice: disk io and network io can bypass the kernel and support higher-performance disks."),(0,o.kt)("p",null,"For more information, please refer to the ",(0,o.kt)("a",{parentName:"p",href:"https://docs.opencurve.io/category/roadmap"},"roadmap"),"."),(0,o.kt)("h3",{id:"5-curve-\u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd"},"5. Curve \u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\uff1f\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd\uff1f"),(0,o.kt)("p",null,"CurveBS\u7684\u6027\u80fd\u74f6\u9888\u9700\u8981\u9488\u5bf9\u5177\u4f53\u7684\u5b58\u50a8\u4ecb\u8d28\u6765\u8ba8\u8bba\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u4e8e\u56fa\u6001\u76d8\u6bd4\u5982NVMe\u76d8\uff0c\u74f6\u9888\u70b9\u4e00\u822c\u5728\u7f51\u7edc\u65f6\u5ef6\u548cIO\u534f\u8bae\u6808\u4ee5\u53caIO\u5904\u7406\u7684\u7ebf\u7a0b\u6a21\u578b\u7b49\u51e0\u4e2a\u65b9\u9762\uff0c\u6211\u4eec\u5728\u7f51\u7edc\u65b9\u9762\u652f\u6301\u4e86RDMA\uff0c\u5728IO\u534f\u8bae\u6808\u65b9\u9762\u652f\u6301\u4e86SPDK\uff0cIO\u5904\u7406\u7ebf\u7a0b\u6211\u4eec\u57fa\u4e8eBRPC\u548cSPDK\u6846\u67b6\u5b9e\u73b0\u4e86\u96f6\u62f7\u8d1d\uff0c\u5f53\u7136\u8fd8\u6709\u5f88\u591a\u9700\u8981\u4f18\u5316\u7684\u70b9\uff0c\u6b22\u8fce\u53c2\u4e0e\u8d21\u732e\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u4e8eHDD\uff0c\u6211\u4eec\u76ee\u524d\u8fd8\u6ca1\u6709\u5f88\u597d\u7684\u652f\u6301\uff0c\u56e0\u6b64\u4e0d\u63a8\u8350\u4f7f\u7528\uff0c\u5efa\u8bae\u914d\u5408NVMe\u7f13\u5b58\u76d8\u505a\u6df7\u95ea\uff08\u6df7\u5408\u5b58\u50a8\uff09\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"\u53e6\u5916\u6211\u4eec\u5728\u987a\u5e8f\u5927IO\u7684\u5199\u5165\u65b9\u9762\u4e5f\u6709\u4e00\u5b9a\u7684\u6027\u80fd\u74f6\u9888\uff0c\u539f\u56e0\u5728\u7528raft\u7684wal\u548cdata\u53cc\u5199\u5bfc\u81f4\u7684\u5199\u653e\u5927\u95ee\u9898\uff0c\u6211\u4eec\u5df2\u7ecf\u5728\u8bbe\u8ba1\u65b9\u6848\u89e3\u51b3\u4e2d")),(0,o.kt)("p",null,"CurveFS\u7684\u6027\u80fd\u74f6\u9888\u4e3b\u8981\u5305\u62ec\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5143\u6570\u636e\u7684rename\u64cd\u4f5c\uff0c\u76ee\u524d\u5df2\u7ecf\u5728\u5f00\u53d1\u4f18\u5316\u4e2d"),(0,o.kt)("li",{parentName:"ul"},"\u5143\u6570\u636e\u7684\u7f51\u7edc\u8bbf\u95ee\u65f6\u5ef6\uff0c\u6211\u4eec\u8ba1\u5212\u652f\u6301\u5ba2\u6237\u7aef\u5230\u5143\u6570\u636e\u670d\u52a1\u7aef\u7684RDMA\u7f51\u7edc"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u8c61\u5b58\u50a8\u6570\u636e\u540e\u7aef\u7684\u541e\u5410\u548cIOPS\u9650\u5236\uff0c\u76ee\u524d\u6211\u4eec\u662f\u901a\u8fc7\u591a\u7ea7\u7f13\u5b58\u6765\u52a0\u901f")),(0,o.kt)("p",null,"\u8fd9\u4e9b\u74f6\u9888\u70b9\u4e00\u822c\u4e0d\u5f71\u54cd\u666e\u901a\u4e1a\u52a1\u7684\u4f7f\u7528\uff0c\u5982\u679c\u6709\u6781\u7aef\u7684\u6027\u80fd\u9700\u6c42\uff0c\u6b22\u8fce\u4e0e\u6211\u4eec\u4ea4\u6d41\u63a2\u8ba8\u3002"),(0,o.kt)("p",null,"The performance bottleneck of CurveBS needs to be discussed based on specific storage media:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"- For solid-state disks such as NVMe disks, bottlenecks generally lie in network latency, IO protocol stack, and IO processing thread model. We support RDMA in the network, SPDK in the IO protocol stack, and IO processing threads. We have implemented zero copy based on the BRPC and SPDK frameworks. Of course, there are still many points that need to be optimized. Welcome to contribute.\n- For HDD, we currently do not have good support, so it is not recommended to use it. It is recommended to use NVMe cache disk for hybrid flash (hybrid storage) deployment\n- In addition, we also have certain performance bottlenecks in sequential large IO writing. The reason is the write amplification problem caused by double writing of wal and data in raft, which we are already solving in the design plan.\n")),(0,o.kt)("p",null,"The performance bottlenecks of CurveFS mainly include:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"- The rename operation of metadata is currently under development and optimization.\n- Metadata network access delay, we plan to support RDMA network from client to metadata server\n- The throughput and IOPS limitations of the object storage data backend are currently accelerated by multi-level caching.\n")),(0,o.kt)("p",null,"These bottlenecks generally do not affect the use of ordinary services. If you have extreme performance requirements, please feel free to discuss them with us."),(0,o.kt)("h2",{id:"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173"},"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u4ee5polardb-for-pg\u4e3a\u4f8b"},"1. Curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff08\u4ee5polardb for pg\u4e3a\u4f8b\uff09\uff1f"),(0,o.kt)("p",null,"Curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u65b9\u5f0f\u662f\u91c7\u7528\u4e86curvebs + polarfs + pg\u7684\u67b6\u6784\uff0c\u5373\u4f7f\u7528curve\u5757\u5b58\u50a8\u4f5c\u4e3a\u5e95\u5c42\u5b58\u50a8\u5f15\u64ce\uff0c\u5728\u6b64\u4e4b\u4e0a\u901a\u8fc7\u9002\u914dpolarfs\u63d0\u4f9b\u9ad8\u6027\u80fd\u6587\u4ef6\u63a5\u53e3\uff08\u8fd9\u90e8\u5206\u5de5\u4f5c\u5f00\u6e90\u5728\u8fd9\u4e2a\u4ed3\u5e93 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio"},"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio")," \uff09\uff0c\u4ece\u800c\u652f\u6301\u8fd0\u884cpolardb for pg\u7b49\u57fa\u4e8e\u5171\u4eab\u5b58\u50a8\u7684\u4e91\u539f\u751f\u6570\u636e\u5e93\u3002"),(0,o.kt)("p",null,"What is the architecture of Curve supporting cloud native database (take polardb for pg as an example)?"),(0,o.kt)("p",null,"Curve supports cloud native database architecture by using curvebs + polarfs + pg architecture, that is, using curve block storage as the underlying storage engine, on top of which it provides a high-performance file interface by adapting polarfs (this part of the work is open source in this warehouse ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio"},"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio")," ), which supports running cloud-native databases based on shared storage such as polardb for pg."),(0,o.kt)("h3",{id:"2-curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e"},"2. Curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\uff1f\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e\uff1f"),(0,o.kt)("p",null,"curvebs\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\uff0c\u4ece\u521d\u6b65\u6027\u80fd\u6d4b\u8bd5\u6765\u770b\uff08\u4e09\u8282\u70b9sata SSD\uff09\uff0c\u5199\u6027\u80fd\u8fbe\u5230800\u81f3900us\u7684\u65f6\u5ef6\uff0c\u8bfb\u6027\u80fd\u53ef\u4ee5\u8fbe\u5230200\u81f3300us\u7684\u65f6\u5ef6\u3002"),(0,o.kt)("p",null,"How does Curve perform in cloud native database scenarios? Is there any relevant indicator data?"),(0,o.kt)("p",null,"In the cloud native database scenario of curvebs, from the preliminary performance test, the write performance can reach a latency of 800 to 900us, and the read performance can reach a latency of 200 to 300us."),(0,o.kt)("h3",{id:"3-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7"},"3. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f"),(0,o.kt)("p",null,"curvebs + polarfs\u7684\u65b9\u6848\uff0c\u4f5c\u4e3a\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5c42\uff0c\u662f\u6bd4\u8f83\u901a\u7528\u7684\u65b9\u6848\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7\u7684\u3002"),(0,o.kt)("p",null,"Can Curve be used as a storage base for other cloud-native databases?"),(0,o.kt)("p",null,"The solution of curvebs + polarfs, as the storage bottom layer of cloud-native databases, is a relatively general solution and can be used as a storage base for other cloud-native databases."),(0,o.kt)("h3",{id:"4-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafkarediselastic-search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7"},"4. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafka\u3001redis\u3001Elastic Search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f"),(0,o.kt)("p",null,"curvebs + polarfs\u4f5c\u4e3a\u5b58\u50a8\u5e95\u5c42\uff0c\u540c\u6837\u53ef\u4ee5\u63d0\u4f9b\u4f5c\u4e3akafka\u3001redis\u3001Elastic Search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7\uff0c\u4f46\u662f\u76f8\u5e94\u7684\uff0c\u7c7b\u6bd4\u4e0e\u4e91\u539f\u751f\u6570\u636e\u5e93\u4e4b\u4e8emysql\u548cpgsql\uff0c\u9700\u8981\u5bf9\u8fd9\u4e9b\u7ec4\u4ef6\u7684\u5b58\u50a8\u5c42\u8fdb\u884c\u4e00\u5b9a\u7684\u9002\u914d\u6539\u9020\u3002"),(0,o.kt)("p",null,"Can Curve be used as a storage base for middleware such as kafka, redis, and Elastic Search?"),(0,o.kt)("p",null,"As the storage bottom layer, curvebs + polarfs can also provide a storage base for middleware such as kafka, redis, and Elastic Search, but correspondingly, analogy with cloud native databases for mysql and pgsql, the storage layer of these components needs to be retrofit."),(0,o.kt)("h2",{id:"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173"},"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve-\u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa-how-to-build-the-curve-compilation-environment"},"1. Curve \u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f/ How to build the Curve compilation environment?"),(0,o.kt)("p",null,"\u5173\u4e8e CurveBS \u7f16\u8bd1\u73af\u5883\u7684\u642d\u5efa\uff0c\u53ef\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/build_and_run.md"},"\u7f16\u8bd1\u73af\u5883\u642d\u5efa"),"\uff0c\u6587\u6863\u4e2d\u63d0\u4f9b\u4e86\u7269\u7406\u673a\u548c Docker \u4e24\u79cd\u7f16\u8bd1\u65b9\u5f0f\u3002"),(0,o.kt)("p",null,"\u800c CurveFS \u6211\u4eec\u6b63\u5728\u5feb\u901f\u8fed\u4ee3\u4e2d\uff0c\u76ee\u524d\u4e5f\u5df2\u63d0\u4f9b\u7269\u7406\u673a\u548c Docker \u4e24\u79cd\u7f16\u8bd1\u65b9\u5f0f\uff0c\u4f46\u76f8\u5e94\u6587\u6863\u4ecd\u5728\u5b8c\u5584\u4e2d\uff0c\u4e0d\u8fc7\u4f60\u53ef\u4ee5\u5728\u4ee5\u4e0b 2 \u4e2a\u76ee\u5f55\u4e2d\u627e\u5230\u4f60\u9700\u8981\u7684\u4fe1\u606f\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs"},"CurveFS \u4e3b\u76ee\u5f55")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs/docker"},"CurveFS Docker \u76ee\u5f55"))),(0,o.kt)("p",null,"\u7279\u522b\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u4e3a\u7269\u7406\u673a\u7f16\u8bd1\u73af\u5883\uff0c\u63d0\u4f9b\u4e86 Makefile\uff0c\u4f60\u53ef\u4ee5\u5229\u7528\u6b64\u6765\u5feb\u901f\u7f16\u8bd1\u3001\u6253\u955c\u50cf\u7528\u6765\u6d4b\u8bd5\uff0c\u4f60\u53ef\u4ee5\u67e5\u770b\u76f8\u5e94\u7684 Makefile \u6765\u719f\u6089\u76f8\u5173\u7684\u4f7f\u7528\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/Makefile"},"Makefile for CurveBS")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/curvefs/Makefile"},"Makefile for CurveFS"))),(0,o.kt)("p",null,"For the construction of the CurveBS compilation environment, please refer to Compilation Environment Construction. The documentation provides two compilation methods: physical machine and Docker."),(0,o.kt)("p",null,"As for CurveFS, we are iterating rapidly. Currently, we have provided two compilation methods: physical machine and Docker, but the corresponding documents are still being perfected, but you can find the information you need in the following two directories:"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/master/curvefs"},"CurveFS home directory"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/master/curvefs/docker"},"CurveFS Docker Directory")),(0,o.kt)("p",null,"It should be noted that we provide a Makefile for the physical machine compilation environment. You can use this to quickly compile and mirror images for testing. You can view the corresponding Makefile to familiarize yourself with related uses:"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/Makefile"},"Makefile for CurveBS"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/curvefs/Makefile"},"Makefile for CurveFS")),(0,o.kt)("h3",{id:"2-curve-\u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\u6211\u60f3\u8c03\u8bd5-curve-\u4ee3\u7801\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4-how-to-build-the-curve-development-environment-i-want-to-debug-curve-code-how-do-i-deploy-a-minimal-development-cluster"},"2. Curve \u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f\u6211\u60f3\u8c03\u8bd5 Curve \u4ee3\u7801\uff0c\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4\uff1f/ How to build the Curve development environment? I want to debug Curve code, how do I deploy a minimal development cluster?"),(0,o.kt)("p",null,"\u4f60\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0a\u642d\u5efa\u4e00\u4e2a\u7f16\u8bd1\u73af\u5883\uff0c\u5e76\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," \u90e8\u7f72\u4e00\u4e2a\u5355\u673a\u5668\u7684\u96c6\u7fa4\u3002"),(0,o.kt)("p",null,"You can refer to the above to build a compilation environment and use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," to deploy a single-machine cluster."),(0,o.kt)("h3",{id:"3-curve-\u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\u6211\u5982\u679c\u8981\u7ed9-curve-\u8d21\u732e\u4ee3\u7801\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801-what-are-the-types-of-curve-test-codes-if-i-want-to-contribute-code-to-curve-what-test-cases-or-test-code-do-i-need-to-add"},"3. Curve \u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\uff1f\u6211\u5982\u679c\u8981\u7ed9 Curve \u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801\uff1f/ What are the types of Curve test codes? If I want to contribute code to Curve, what test cases or test code do I need to add?"),(0,o.kt)("p",null,"Curve \u7684\u6d4b\u8bd5\u4ee3\u7801\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u7c7b\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5355\u5143\u6d4b\u8bd5"),(0,o.kt)("li",{parentName:"ul"},"\u96c6\u6210\u6d4b\u8bd5"),(0,o.kt)("li",{parentName:"ul"},"\u5f02\u5e38\u6d4b\u8bd5")),(0,o.kt)("p",null,"\u6211\u4eec\u6b22\u8fce\u5927\u5bb6\u7ed9 Curve \u793e\u533a\u505a\u4efb\u4f55\u8d21\u732e\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4ee3\u7801\u3001\u6587\u6863\u3001issue\u3002\u5982\u679c\u4f60\u7684\u8d21\u732e\u6709\u6d89\u53ca\u4ee3\u7801\u7684\u4fee\u6539\uff0c\u6211\u4eec\u5e0c\u671b\u4f60\u80fd\u8865\u5145\u8fd9\u90e8\u5206\u4ee3\u7801\u6240\u6d89\u53ca\u7684\u5355\u5143\u6d4b\u8bd5\uff0c\u5e76\u5c3d\u53ef\u80fd\u5730\u63d0\u9ad8\u6d4b\u8bd5\u7684\u8986\u76d6\u7387\uff0c\u5c06\u5176\u4fdd\u6301\u5728 ",(0,o.kt)("inlineCode",{parentName:"p"},"85%")," \u4ee5\u4e0a\uff08\u5f53\u4f60\u63d0\u4ea4\u76f8\u5173 PR \u89e6\u53d1\u6211\u4eec\u7684 CI \u65f6\uff0c\u6211\u4eec\u4f1a\u81ea\u52a8\u7edf\u8ba1\u4ee3\u7801\u7684\u8986\u76d6\u7387\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u6b64\u6765\u6821\u6b63\u8986\u76d6\u7387\uff09\u3002"),(0,o.kt)("p",null,"Curve's test code mainly includes the following categories:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"unit test"),(0,o.kt)("li",{parentName:"ul"},"Integration Testing"),(0,o.kt)("li",{parentName:"ul"},"exception test")),(0,o.kt)("p",null,"We welcome everyone to make any contributions to the Curve community, including but not limited to code, documentation, and issues. If your contribution involves modification of code, we hope you can supplement the unit tests involved in this part of the code, and improve the test coverage as much as possible, keeping it above 85% (when you submit the relevant PR, we will trigger our During CI, we will automatically count the coverage of the code, you can use this to correct the coverage)."),(0,o.kt)("h2",{id:"\u5982\u4f55\u8d21\u732e\u4ee3\u7801"},"\u5982\u4f55\u8d21\u732e\u4ee3\u7801"),(0,o.kt)("h3",{id:"1-\u6211\u60f3\u7ed9curve\u8d21\u732e\u4ee3\u7801\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c-i-want-to-contribute-code-to-curve-what-preparations-need-to-be-done-in-advance"},"1. \u6211\u60f3\u7ed9Curve\u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c\uff1f/ I want to contribute code to Curve, what preparations need to be done in advance"),(0,o.kt)("p",null,"\u4ee3\u7801\u5f00\u53d1\u5b8c\u6210\u4e4b\u540e\uff0c\u63d0",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/compare"},"pr"),"\u5230curve\u7684master\u5206\u652f\u3002\u63d0\u4ea4pr\u65f6\uff0c\u8bf7\u586b\u5199pr\u6a21\u677f\u3002pr\u63d0\u4ea4\u4e4b\u540e\u4f1a\u81ea\u52a8\u89e6\u53d1CI\uff0cCI\u901a\u8fc7\u5e76\u4e14\u7ecf\u8fc7review\u4e4b\u540e\uff0c\u4ee3\u7801\u624d\u53ef\u5408\u5165\u3002CI\u7684Jenkins\u7528\u6237\u540d\u5bc6\u7801\u4e3anetease/netease\uff0c\u5982\u9047\u5230CI\u8fd0\u884c\u5931\u8d25\u53ef\u4ee5\u767b\u5f55Jenkins\u5e73\u53f0\u67e5\u770b\u5931\u8d25\u539f\u56e0\u3002 \u5177\u4f53\u89c4\u5219\u8bf7\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CONTRIBUTING.md"},"CONTRIBUTING"),"."),(0,o.kt)("p",null,"After finishing the development of your code, you should submit a pull request to master branch of CURVE and fill out a pull request template. The pull request will trigger the CI automatically, and the code will only be merged after passing the CI and being reviewed. The Jenkins username and password of CI is netease/netease. If the CI fails to run, you can login to the Jenkins platform to view the reason for the failure."),(0,o.kt)("p",null,"For more detail, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CONTRIBUTING.md"},"CONTRIBUTING"),"."),(0,o.kt)("h3",{id:"2-\u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408curve\u9879\u76ee\u8981\u6c42-how-to-ensure-that-the-quality-of-the-code-i-contribute-meets-the-requirements-of-the-curve-project"},"2. \u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408Curve\u9879\u76ee\u8981\u6c42\uff1f/ How to ensure that the quality of the code I contribute meets the requirements of the Curve project"),(0,o.kt)("p",null,"\u8bf7\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README_cn.md#%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83"},"\u7f16\u7801\u89c4\u8303")),(0,o.kt)("p",null,"\u8bf7\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README_cn.md#%E6%B5%8B%E8%AF%95%E8%A6%86%E7%9B%96%E7%8E%87%E8%A6%81%E6%B1%82"},"\u8986\u76d6\u7387\u6d4b\u8bd5\u8981\u6c42")),(0,o.kt)("p",null,"please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#coding-style-guides"},"Coding style guides")),(0,o.kt)("p",null,"please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#code-coverage-requirement"},"Code coverage requirement")),(0,o.kt)("h3",{id:"3-\u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abcurve\u793e\u533amerge-how-can-my-contributed-code-be-merged-by-the-curve-community"},"3. \u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abCurve\u793e\u533amerge\uff1f/ How can my contributed code be merged by the Curve community?"),(0,o.kt)("p",null,"Please refer to the above two questions."),(0,o.kt)("h3",{id:"4-\u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bcurve\u9879\u76ee\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48-how-should-novice-participants-get-started-with-the-curve-project-step-by-step-what-is-the-recommended-path"},"4. \u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bCurve\u9879\u76ee\uff1f\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48\uff1f/ How should novice participants get started with the Curve project step by step? What is the recommended path?"),(0,o.kt)("p",null,"\u53ef\u4ee5\u5148\u4ece\u6807\u6709 ",(0,o.kt)("inlineCode",{parentName:"p"},"good first issue")," \u7684issue\u5165\u624b\uff0c\u8fd9\u4e9bissue\u6bd4\u8f83\u72ec\u7acb\uff0c\u5e76\u4e14\u9700\u6c42\u5f88\u660e\u786e\u3002"),(0,o.kt)("p",null,"You can start with the issues marked ",(0,o.kt)("inlineCode",{parentName:"p"},"good first issue"),", which are relatively independent and have clear requirements."),(0,o.kt)("h3",{id:"5-\u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9curve\u9879\u76ee\u5916\u6211\u8fd8\u80fd\u7ed9curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5-in-addition-to-submitting-code-to-the-curve-project-what-other-meaningful-things-can-i-do-for-the-curve-community"},"5. \u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9Curve\u9879\u76ee\u5916\uff0c\u6211\u8fd8\u80fd\u7ed9Curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5\uff1f/ In addition to submitting code to the Curve project, what other meaningful things can I do for the Curve community?"),(0,o.kt)("p",null,"\u5e2e\u52a9\u5b8c\u5584Curve\u6587\u6863\uff0c\u53c2\u4e0eCurve\u7684\u5404\u79cd\u7248\u672c\u6d4b\u8bd5\u5e76\u63d0\u4ea4\u53d1\u73b0\u7684\u95ee\u9898\u6216\u5efa\u8bae\uff0c\u7ed9Curve\u7684\u5fae\u4fe1\u516c\u4f17\u53f7(OpenCurve)\u6295\u7a3f\uff0c\u5728",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/"},"Curve\u8bba\u575b"),"\u4e2d\u63d0\u51fa\u95ee\u9898\u6216\u8005\u56de\u7b54\u7528\u6237\u95ee\u9898\uff0c\u53c2\u4e0eCurve\u793e\u533a\u7684\u7cfb\u5217\u76f4\u64ad\u6d3b\u52a8"),(0,o.kt)("p",null,"You can help to write documents for Curve, participate in various version tests of Curve and then post issues or advices, contribute articles to Curve's WeChat public account (OpenCurve), ask questions or answer user questions in the ",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/"},"Curve Forum"),", and participate in the Curve community Series of live events."))}h.isMDXComponent=!0},2207:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/curve-wechat-b4e692f587cfbd1bbc2e3e87a44b66dc.jpeg"}}]); \ No newline at end of file +"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[8812],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>v});var a=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=a.createContext({}),l=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=l(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,o=e.mdxType,n=e.originalType,s=e.parentName,c=u(e,["components","mdxType","originalType","parentName"]),p=l(r),d=o,v=p["".concat(s,".").concat(d)]||p[d]||h[d]||n;return r?a.createElement(v,i(i({ref:t},c),{},{components:r})):a.createElement(v,i({ref:t},c))}));function v(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var n=r.length,i=new Array(n);i[0]=d;var u={};for(var s in t)hasOwnProperty.call(t,s)&&(u[s]=t[s]);u.originalType=e,u[p]="string"==typeof e?e:o,i[1]=u;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>u,toc:()=>l});var a=r(7462),o=(r(7294),r(3905));const n={slug:"/faq"},i="\u5e38\u89c1FAQ",u={unversionedId:"FAQ",id:"FAQ",title:"\u5e38\u89c1FAQ",description:"\u5173\u4e8eCurve",source:"@site/docs/08-FAQ.md",sourceDirName:".",slug:"/faq",permalink:"/faq",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{slug:"/faq"},sidebar:"tutorialSidebar",previous:{title:"CHANGELOG of v2.6",permalink:"/Release/release-notes-v2.6"},next:{title:"Roadmap",permalink:"/category/roadmap"}},s={},l=[{value:"\u5173\u4e8eCurve",id:"\u5173\u4e8ecurve",level:2},{value:"1. Curve\u662f\u4ec0\u4e48\uff1f/ What is Curve?",id:"1-curve\u662f\u4ec0\u4e48-what-is-curve",level:3},{value:"2. Curve\u4e0eCeph\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and Ceph?",id:"2-curve\u4e0eceph\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-ceph",level:3},{value:"3. Curve\u4e0eCubeFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and CubeFS?",id:"3-curve\u4e0ecubefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-cubefs",level:3},{value:"4. Curve\u4e0eOpenEBS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and OpenEBS?",id:"4-curve\u4e0eopenebs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-openebs",level:3},{value:"5. Curve\u4e0eJuiceFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and JuiceFS?",id:"5-curve\u4e0ejuicefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-juicefs",level:3},{value:"6. Curve\u4e0eHDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and HDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\uff1f",id:"6-curve\u4e0ehdfss3fsjindofsrapidfsgoosefsalluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-hdfss3fsjindofsrapidfsgoosefsalluxio",level:3},{value:"7. Curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b\uff1f / In what scenarios can Curve be used?",id:"7-curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b--in-what-scenarios-can-curve-be-used",level:3},{value:"8. Curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684\uff1f / How does Curve's cloud-native storage capability manifest?",id:"8-curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684--how-does-curves-cloud-native-storage-capability-manifest",level:3},{value:"9. Curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\uff1f\u89c4\u6a21\u5982\u4f55\uff1f\u7a33\u5b9a\u6027\u5982\u4f55\uff1f\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c\uff1f / Has Curve been used in a production environment? What is the scale? How is the stability? Has there been a massive failure?",id:"9-curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\u89c4\u6a21\u5982\u4f55\u7a33\u5b9a\u6027\u5982\u4f55\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c--has-curve-been-used-in-a-production-environment-what-is-the-scale-how-is-the-stability-has-there-been-a-massive-failure",level:3},{value:"10. Curve\u7684Roadmap\u662f\u4ec0\u4e48\uff1f / What is Curve's Roadmap?",id:"10-curve\u7684roadmap\u662f\u4ec0\u4e48--what-is-curves-roadmap",level:3},{value:"11. Curve\u5f00\u6e90\u7684\u76ee\u6807/\u76ee\u7684\u662f\u4ec0\u4e48\uff1f / What is the goal/purpose of Curve open source?",id:"11-curve\u5f00\u6e90\u7684\u76ee\u6807\u76ee\u7684\u662f\u4ec0\u4e48--what-is-the-goalpurpose-of-curve-open-source",level:3},{value:"12. Curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b\uff1f / What are the communication channels of the Curve community?",id:"12-curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b--what-are-the-communication-channels-of-the-curve-community",level:3},{value:"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173",id:"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173",level:2},{value:"1. Curve \u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the minimum requirements for deploy curve cluster?",id:"1-curve-\u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-minimum-requirements-for-deploy-curve-cluster",level:3},{value:"2. Curve \u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the recommended configuration for Curve production environment?",id:"2-curve-\u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-recommended-configuration-for-curve-production-environment",level:3},{value:"3. Curve \u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\uff1f\u6709\u65e0\u6307\u5bfc\u624b\u518c\uff1f/ What is the deployment tools for Curve? Is there an instruction manual?",id:"3-curve-\u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\u6709\u65e0\u6307\u5bfc\u624b\u518c-what-is-the-deployment-tools-for-curve-is-there-an-instruction-manual",level:3},{value:"4. Curve \u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\uff1f\u5982\u547d\u4ee4\u884c\u3001dashboard\u3001\u76d1\u63a7\u7cfb\u7edf\u7b49\uff1f/ What are the Curve O&M troubleshooting tools? Such as command line, dashboard, monitoring system, etc.",id:"4-curve-\u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\u5982\u547d\u4ee4\u884cdashboard\u76d1\u63a7\u7cfb\u7edf\u7b49-what-are-the-curve-om-troubleshooting-tools-such-as-command-line-dashboard-monitoring-system-etc",level:3},{value:"5. \u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u5982\u4f55\u83b7\u53d6 Curve \u793e\u533a\u7684\u652f\u6301\uff1f/ How can I get support from the Curve community if I encounter an unsolvable problem during deployment or O&M?",id:"5-\u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\u5982\u4f55\u83b7\u53d6-curve-\u793e\u533a\u7684\u652f\u6301-how-can-i-get-support-from-the-curve-community-if-i-encounter-an-unsolvable-problem-during-deployment-or-om",level:3},{value:"6. Curve \u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72\uff1f/ Does Curve support manual deployment of physical machine installation packages?",id:"6-curve-\u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72-does-curve-support-manual-deployment-of-physical-machine-installation-packages",level:3},{value:"7. Curve \u5982\u4f55\u6269\u5bb9\uff1f\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How does Curve scale out? Will capacity expansion affect IO?",id:"7-curve-\u5982\u4f55\u6269\u5bb9\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1-io-how-does-curve-scale-out-will-capacity-expansion-affect-io",level:3},{value:"8. Curve \u5982\u4f55\u5347\u7ea7\uff1f\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How to upgrade Curve? Does the upgrade process affect IO?",id:"8-curve-\u5982\u4f55\u5347\u7ea7\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1-io-how-to-upgrade-curve-does-the-upgrade-process-affect-io",level:3},{value:"9. Curve \u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f/ Does Curve support scale in cluster?",id:"9-curve-\u662f\u5426\u652f\u6301\u7f29\u5bb9-does-curve-support-scale-in-cluster",level:3},{value:"10. Curve \u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\uff1f\u5f02\u5730\u5bb9\u707e\uff1f\u4e24\u5730\u4e09\u4e2d\u5fc3\uff1f/ Does Curve support dual-active in the same city? Disaster recovery in different places? Three centers in two places?",id:"10-curve-\u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\u5f02\u5730\u5bb9\u707e\u4e24\u5730\u4e09\u4e2d\u5fc3-does-curve-support-dual-active-in-the-same-city-disaster-recovery-in-different-places-three-centers-in-two-places",level:3},{value:"11. Curve \u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72\uff1f/ Does Curve support hyperconverged deployment?",id:"11-curve-\u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72-does-curve-support-hyperconverged-deployment",level:3},{value:"12. Curve \u662f\u5426\u652f\u6301 rook\uff1f\u662f\u5426\u53ef\u4ee5\u7528 k8s \u90e8\u7f72\uff1f/ Does Curve support rook? Is it possible to deploy with k8s?",id:"12-curve-\u662f\u5426\u652f\u6301-rook\u662f\u5426\u53ef\u4ee5\u7528-k8s-\u90e8\u7f72-does-curve-support-rook-is-it-possible-to-deploy-with-k8s",level:3},{value:"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173",id:"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173",level:2},{value:"1\u3001Curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684\uff1f/ What is the release cycle of Curve version? How is the version number defined?",id:"1curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684-what-is-the-release-cycle-of-curve-version-how-is-the-version-number-defined",level:3},{value:"2\u3001Curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\uff1f\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248\uff1f/ Which is the current stable version of Curve? How to find the latest stable version?",id:"2curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248-which-is-the-current-stable-version-of-curve-how-to-find-the-latest-stable-version",level:3},{value:"3\u3001Curve 1.x\u548c2.x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between Curve 1.x and 2.x versions?",id:"3curve-1x\u548c2x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-curve-1x-and-2x-versions",level:3},{value:"4\u3001Curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\uff1f\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\uff1f\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301\uff1f/ Is there a commercial version of Curve? Is there a commercial version development plan? Can I get commercialization support?",id:"4curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301-is-there-a-commercial-version-of-curve-is-there-a-commercial-version-development-plan-can-i-get-commercialization-support",level:3},{value:"5\u3001Curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\uff1f\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248\uff1f/ Are the versions of Curve block storage and file storage released independently? How can I get the distributions of both?",id:"5curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248-are-the-versions-of-curve-block-storage-and-file-storage-released-independently-how-can-i-get-the-distributions-of-both",level:3},{value:"6\u3001\u6211\u6539\u4e86Curve\u4ee3\u7801\uff0c\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c\uff1f/ I changed the Curve code, how do I release my own version?",id:"6\u6211\u6539\u4e86curve\u4ee3\u7801\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c-i-changed-the-curve-code-how-do-i-release-my-own-version",level:3},{value:"7\u3001Curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248\uff1f/ Which operating system distributions are supported by the versions released by Curve?",id:"7curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248-which-operating-system-distributions-are-supported-by-the-versions-released-by-curve",level:3},{value:"\u67b6\u6784\u76f8\u5173",id:"\u67b6\u6784\u76f8\u5173",level:2},{value:"1. Curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u6211\u80fd\u628aCurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f\uff1f/ What is the deployment architecture of Curve? What infrastructure scenarios can I use Curve for?",id:"1-curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u6211\u80fd\u628acurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f-what-is-the-deployment-architecture-of-curve-what-infrastructure-scenarios-can-i-use-curve-for",level:3},{value:"2. Curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b\uff1f/ What are the business scenarios supported by Curve",id:"2-curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b-what-are-the-business-scenarios-supported-by-curve",level:3},{value:"3. Curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1fCurve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b\uff1f/ What is the technical architecture of Curve? What is the difference between the technical architecture of Curve block storage and file storage?",id:"3-curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b-what-is-the-technical-architecture-of-curve-what-is-the-difference-between-the-technical-architecture-of-curve-block-storage-and-file-storage",level:3},{value:"4. Curve\u548cCeph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between the technical architecture of Curve and Ceph",id:"4-curve\u548cceph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-the-technical-architecture-of-curve-and-ceph",level:3},{value:"5. Curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc\uff1f/ Where is the advanced nature of Curve's technical architecture reflected?",id:"5-curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc-where-is-the-advanced-nature-of-curves-technical-architecture-reflected",level:3},{value:"6. Curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\uff1f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u3001\u53ef\u7528\u6027\u3001\u6027\u80fd\u7b49\u65b9\u9762\uff1f/ Are there any shortcomings in Curve's technical architecture? such as reliability, availability, performance, etc.",id:"6-curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u53ef\u7528\u6027\u6027\u80fd\u7b49\u65b9\u9762-are-there-any-shortcomings-in-curves-technical-architecture-such-as-reliability-availability-performance-etc",level:3},{value:"7. Curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\uff1f\u5bf9\u65b0\u786c\u4ef6\u3001\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212\uff1f/ What is the evolution direction of Curve's technical architecture? What are the plans for support for new hardware and new platforms?",id:"7-curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\u5bf9\u65b0\u786c\u4ef6\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212-what-is-the-evolution-direction-of-curves-technical-architecture-what-are-the-plans-for-support-for-new-hardware-and-new-platforms",level:3},{value:"8. CurveBS\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae\uff1f / Is CurveBS compatible with librbd protocol?",id:"8-curvebs\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae--is-curvebs-compatible-with-librbd-protocol",level:3},{value:"\u529f\u80fd\u76f8\u5173",id:"\u529f\u80fd\u76f8\u5173",level:2},{value:"1. Curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230\uff1f / Where can I find a list of Curve's features?",id:"1-curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230--where-can-i-find-a-list-of-curves-features",level:3},{value:"2. Curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt\uff1f / Can Curve be used by kubevirt?",id:"2-curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt--can-curve-be-used-by-kubevirt",level:3},{value:"3. Curve\u5bf9\u63a5QEMU\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1QEMU\uff1f\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01\uff1f / Do I need to compile QEMU by myself when connecting to QEMU? Where can I find relevant patches?",id:"3-curve\u5bf9\u63a5qemu\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1qemu\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01--do-i-need-to-compile-qemu-by-myself-when-connecting-to-qemu-where-can-i-find-relevant-patches",level:3},{value:"4. Curve\u5bf9\u63a5Libvirt\u662f\u5426\u8981\u7f16\u8bd1Libvirt\uff1f\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6\uff1f / Do I need to compile Libvirt by myself when connecting to Libvirt? Where can I find relevant patches?",id:"4-curve\u5bf9\u63a5libvirt\u662f\u5426\u8981\u7f16\u8bd1libvirt\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6--do-i-need-to-compile-libvirt-by-myself-when-connecting-to-libvirt-where-can-i-find-relevant-patches",level:3},{value:"5. Curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\uff1f\u6587\u4ef6\u5b58\u50a8\uff1f\u5bf9\u8c61\u5b58\u50a8\uff1f / Does Curve support block storage? file storage? Object storage?",id:"5-curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\u6587\u4ef6\u5b58\u50a8\u5bf9\u8c61\u5b58\u50a8--does-curve-support-block-storage-file-storage-object-storage",level:3},{value:"6. Curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff1f\u7f13\u5b58\u7684\u53ef\u9760\u6027\u3001\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1\uff1f / Does Curve support client-side caching? How to ensure cache reliability and data consistency?",id:"6-curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\u7f13\u5b58\u7684\u53ef\u9760\u6027\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1--does-curve-support-client-side-caching-how-to-ensure-cache-reliability-and-data-consistency",level:3},{value:"7. Curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\uff1f\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684wal/db\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e\uff1f / Does the Curve server support disk caching? Or how to configure the wal/db cache disk similar to ceph?",id:"7-curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684waldb\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e--does-the-curve-server-support-disk-caching-or-how-to-configure-the-waldb-cache-disk-similar-to-ceph",level:3},{value:"8. Curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60\uff1f / Does Curve support different disk types to form different storage pools?",id:"8-curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60--does-curve-support-different-disk-types-to-form-different-storage-pools",level:3},{value:"9. Curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\uff1f\u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f / Does Curve support storage pool scale-out? Does it support scale-in?",id:"9-curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\u662f\u5426\u652f\u6301\u7f29\u5bb9--does-curve-support-storage-pool-scale-out-does-it-support-scale-in",level:3},{value:"10. Curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\uff1f\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de\uff1f / Does Curve support RecycleBin? Can the deleted volume or directory be recovered?",id:"10-curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de--does-curve-support-recyclebin-can-the-deleted-volume-or-directory-be-recovered",level:3},{value:"11. Curve\u662f\u5426\u652f\u6301XX\u786c\u4ef6\uff08\u5982Optane\u3001NVMe\u3001RDMA\u7f51\u5361\u7b49\uff09\uff1f / Does Curve support XX hardware (such as Optane, NVMe, RDMA network cards, etc.)?",id:"11-curve\u662f\u5426\u652f\u6301xx\u786c\u4ef6\u5982optanenvmerdma\u7f51\u5361\u7b49--does-curve-support-xx-hardware-such-as-optane-nvme-rdma-network-cards-etc",level:3},{value:"12. Curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f\uff1f / How much storage resources does Curvefs metadata occupy?",id:"12-curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f--how-much-storage-resources-does-curvefs-metadata-occupy",level:3},{value:"\u6027\u80fd\u76f8\u5173",id:"\u6027\u80fd\u76f8\u5173",level:2},{value:"1. Curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684\uff1f/ What does Curve's performance metrics look like?",id:"1-curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684-what-does-curves-performance-metrics-look-like",level:3},{value:"2. Curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd\uff1f/ What hardware specifications Curve has tested for performance?",id:"2-curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd-what-hardware-specifications-curve-has-tested-for-performance",level:3},{value:"3. Curve\u7684\u6027\u80fd\u76f8\u6bd4Ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684\uff1f/ The performance of Curve is much higher than that of Ceph. How is it done?",id:"3-curve\u7684\u6027\u80fd\u76f8\u6bd4ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684-the-performance-of-curve-is-much-higher-than-that-of-ceph-how-is-it-done",level:3},{value:"4. Curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\uff1f\u6f14\u8fdb\u65b9\u5411\u662f\uff1f/ What are Curve's plans for performance optimization? What is the direction of evolution",id:"4-curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\u6f14\u8fdb\u65b9\u5411\u662f-what-are-curves-plans-for-performance-optimization-what-is-the-direction-of-evolution",level:3},{value:"5. Curve \u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\uff1f\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd\uff1f",id:"5-curve-\u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd",level:3},{value:"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173",id:"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173",level:2},{value:"1. Curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff08\u4ee5polardb for pg\u4e3a\u4f8b\uff09\uff1f",id:"1-curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u4ee5polardb-for-pg\u4e3a\u4f8b",level:3},{value:"2. Curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\uff1f\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e\uff1f",id:"2-curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e",level:3},{value:"3. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f",id:"3-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7",level:3},{value:"4. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafka\u3001redis\u3001Elastic Search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f",id:"4-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafkarediselastic-search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7",level:3},{value:"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173",id:"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173",level:2},{value:"1. Curve \u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f/ How to build the Curve compilation environment?",id:"1-curve-\u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa-how-to-build-the-curve-compilation-environment",level:3},{value:"2. Curve \u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f\u6211\u60f3\u8c03\u8bd5 Curve \u4ee3\u7801\uff0c\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4\uff1f/ How to build the Curve development environment? I want to debug Curve code, how do I deploy a minimal development cluster?",id:"2-curve-\u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\u6211\u60f3\u8c03\u8bd5-curve-\u4ee3\u7801\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4-how-to-build-the-curve-development-environment-i-want-to-debug-curve-code-how-do-i-deploy-a-minimal-development-cluster",level:3},{value:"3. Curve \u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\uff1f\u6211\u5982\u679c\u8981\u7ed9 Curve \u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801\uff1f/ What are the types of Curve test codes? If I want to contribute code to Curve, what test cases or test code do I need to add?",id:"3-curve-\u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\u6211\u5982\u679c\u8981\u7ed9-curve-\u8d21\u732e\u4ee3\u7801\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801-what-are-the-types-of-curve-test-codes-if-i-want-to-contribute-code-to-curve-what-test-cases-or-test-code-do-i-need-to-add",level:3},{value:"\u5982\u4f55\u8d21\u732e\u4ee3\u7801",id:"\u5982\u4f55\u8d21\u732e\u4ee3\u7801",level:2},{value:"1. \u6211\u60f3\u7ed9Curve\u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c\uff1f/ I want to contribute code to Curve, what preparations need to be done in advance",id:"1-\u6211\u60f3\u7ed9curve\u8d21\u732e\u4ee3\u7801\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c-i-want-to-contribute-code-to-curve-what-preparations-need-to-be-done-in-advance",level:3},{value:"2. \u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408Curve\u9879\u76ee\u8981\u6c42\uff1f/ How to ensure that the quality of the code I contribute meets the requirements of the Curve project",id:"2-\u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408curve\u9879\u76ee\u8981\u6c42-how-to-ensure-that-the-quality-of-the-code-i-contribute-meets-the-requirements-of-the-curve-project",level:3},{value:"3. \u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abCurve\u793e\u533amerge\uff1f/ How can my contributed code be merged by the Curve community?",id:"3-\u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abcurve\u793e\u533amerge-how-can-my-contributed-code-be-merged-by-the-curve-community",level:3},{value:"4. \u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bCurve\u9879\u76ee\uff1f\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48\uff1f/ How should novice participants get started with the Curve project step by step? What is the recommended path?",id:"4-\u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bcurve\u9879\u76ee\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48-how-should-novice-participants-get-started-with-the-curve-project-step-by-step-what-is-the-recommended-path",level:3},{value:"5. \u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9Curve\u9879\u76ee\u5916\uff0c\u6211\u8fd8\u80fd\u7ed9Curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5\uff1f/ In addition to submitting code to the Curve project, what other meaningful things can I do for the Curve community?",id:"5-\u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9curve\u9879\u76ee\u5916\u6211\u8fd8\u80fd\u7ed9curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5-in-addition-to-submitting-code-to-the-curve-project-what-other-meaningful-things-can-i-do-for-the-curve-community",level:3}],c={toc:l},p="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"\u5e38\u89c1faq"},"\u5e38\u89c1FAQ"),(0,o.kt)("h2",{id:"\u5173\u4e8ecurve"},"\u5173\u4e8eCurve"),(0,o.kt)("h3",{id:"1-curve\u662f\u4ec0\u4e48-what-is-curve"},"1. Curve\u662f\u4ec0\u4e48\uff1f/ What is Curve?"),(0,o.kt)("p",null,"Curve \u662f\u4e00\u6b3e\u9ad8\u6027\u80fd\u3001\u6613\u8fd0\u7ef4\u3001\u4e91\u539f\u751f\u7684\u5f00\u6e90\u5206\u5e03\u5f0f\u5b58\u50a8\u7cfb\u7edf\u3002\u53ef\u5e94\u7528\u4e8e\u4e3b\u6d41\u7684\u4e91\u539f\u751f\u57fa\u7840\u8bbe\u65bd\u5e73\u53f0\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 OpenStack \u5e73\u53f0\u4e3a\u4e91\u4e3b\u673a\u63d0\u4f9b\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u670d\u52a1\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 Kubernetes \u4e3a\u5176\u63d0\u4f9b RWO\u3001RWX \u7b49\u7c7b\u578b\u7684\u6301\u4e45\u5316\u5b58\u50a8\u5377\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 PolarFS \u4f5c\u4e3a\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u9ad8\u6027\u80fd\u5b58\u50a8\u5e95\u5ea7\uff0c\u5b8c\u7f8e\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u7b97\u5206\u79bb\u67b6\u6784\uff1b"),(0,o.kt)("li",{parentName:"ul"},"Curve \u4ea6\u53ef\u4f5c\u4e3a\u4e91\u5b58\u50a8\u4e2d\u95f4\u4ef6\u4f7f\u7528 S3 \u517c\u5bb9\u7684\u5bf9\u8c61\u5b58\u50a8\u4f5c\u4e3a\u6570\u636e\u5b58\u50a8\u5f15\u64ce\uff0c\u4e3a\u516c\u6709\u4e91\u7528\u6237\u63d0\u4f9b\u9ad8\u6027\u4ef7\u6bd4\u7684\u5171\u4eab\u6587\u4ef6\u5b58\u50a8\u3002")),(0,o.kt)("p",null,"Curve is a high-performance, easy-to-operate, cloud-native open source distributed storage system. Applicable to mainstream cloud-native infrastructure platforms:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Connect to the OpenStack platform to provide high-performance block storage services for cloud VM;"),(0,o.kt)("li",{parentName:"ul"},"Connect to Kubernetes to provide persistent storage volumes of RWO, RWX and other types;"),(0,o.kt)("li",{parentName:"ul"},"Connecting with PolarFS as a high-performance storage base for cloud-native databases, it perfectly supports the storage-computation separation architecture of cloud-native databases;"),(0,o.kt)("li",{parentName:"ul"},"Curve can also be used as a cloud storage middleware to use S3-compatible object storage as a data storage engine, providing cost-effective shared file storage for public cloud users.")),(0,o.kt)("h3",{id:"2-curve\u4e0eceph\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-ceph"},"2. Curve\u4e0eCeph\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and Ceph?"),(0,o.kt)("p",null,"Curve\u4e0eCeph\u4ece\u67b6\u6784\u8bbe\u8ba1\u5230\u5177\u4f53\u7684\u529f\u80fd\u5b9e\u73b0\u90fd\u6709\u6bd4\u8f83\u5927\u7684\u533a\u522b\uff0c\u4ee5\u4e0b\u4ec5\u5217\u51fa\u4e00\u4e9b\u5927\u6982\u533a\u522b\uff0c\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4ece\u4e00\u81f4\u6027\u534f\u8bae\u6765\u8bf4\uff0cCurve\u4f7f\u7528Raft\u534f\u8bae\u5b9e\u73b0\u4e00\u81f4\u6027\uff0cCeph\u662fPaxos\u534f\u8bae\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u4ece\u7a7a\u95f4\u5206\u914d\u65b9\u5f0f\u6765\u8bf4\uff0cCurve\u662f\u901a\u8fc7\u4e2d\u5fc3\u5316\u7684\u5143\u6570\u636e\u670d\u52a1\u6765\u8c03\u5ea6\u5206\u914d\uff0cCeph\u662f\u901a\u8fc7CRUSH\u7b97\u6cd5hash\u65b9\u5f0f\u5206\u914d\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u4ece\u5b58\u50a8\u5f62\u6001\u4e0a\u6765\u8bf4\uff0cCurve\u76ee\u524d\u652f\u6301\u5757\u5b58\u50a8\uff08CurveBS\uff09\u3001\u6587\u4ef6\u5b58\u50a8\uff08CurveFS\uff09\uff0cCeph\u5728\u8fd9\u4e24\u4e2a\u5f62\u6001\u4e4b\u5916\u8fd8\u652f\u6301\u5bf9\u8c61\u5b58\u50a8"),(0,o.kt)("li",{parentName:"ul"},"\u5176\u4ed6\u5927\u7684\u5dee\u5f02\u5305\u62ec\uff1aCurveBS\u652f\u6301\u57fa\u4e8ePolarFS\u7684\u4e91\u539f\u751f\u6570\u636e\u5e93\u5b58\u50a8\u5e95\u5ea7\uff08\u5982PolarDB for postgresql\u7b49\uff09\uff1bCurveBS\u5feb\u7167\u4f1a\u8f6c\u5b58\u5230\u5bf9\u8c61\u5b58\u50a8\u7cfb\u7edf\uff1bCurve FS\u652f\u6301\u5c06\u6570\u636e\u4fdd\u5b58\u5230\u517c\u5bb9S3\u534f\u8bae\u7684\u5bf9\u8c61\u5b58\u50a8\u7cfb\u7edf\uff08\u53ef\u4ee5\u5728\u516c\u6709\u4e91\u573a\u666f\u4e0b\u90e8\u7f72\uff09\uff0c\u540e\u7eed\u8fd8\u4f1a\u652f\u6301\u5728CurveBS\u548cS3\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u751f\u547d\u5468\u671f\u7ba1\u7406\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5177\u4f53\u5230\u8be6\u7ec6\u7684\u529f\u80fd\u5bf9\u6bd4\uff0c\u53ef\u4ee5\u53c2\u8003\u201cCurve\u529f\u80fd\u6e05\u5355\u201d\uff0c\u53e6\u5916\u8fd8\u6709\u4e00\u4e9b\u529f\u80fd\u5728\u5f00\u53d1\u8ba1\u5212\u4e2d")),(0,o.kt)("p",null,"Curve and Ceph are quite different from architecture design to specific function implementation. The following only lists some general differences. If you want to know some details, you can contact us through WeChat group/slack/forum to communicate and confirm:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"From the perspective of the consistency protocol, Curve uses the Raft protocol to achieve consistency, and Ceph is the Paxos protocol;"),(0,o.kt)("li",{parentName:"ul"},"From the perspective of space allocation, Curve is allocated through a centralized metadata service, and Ceph is allocated by hashing the CRUSH algorithm;"),(0,o.kt)("li",{parentName:"ul"},"In terms of storage form, Curve currently supports block storage(CurveBS) and file storage(CurveFS), and Ceph supports object storage in addition to these two forms"),(0,o.kt)("li",{parentName:"ul"},"Other major differences include: Curve BS supports PolarFS-based cloud-native database storage bases (such as PolarDB for postgresql, etc.); CurveBS snapshots will be transferred to object storage systems; CurveFS supports saving data to object storage systems compatible with the S3 protocol (can be deployed in public cloud scenarios), and will support data lifecycle management between CurveBS and S3 in the future;"),(0,o.kt)("li",{parentName:"ul"},'For detailed function comparison, you can refer to "Curve function list", and some functions are in the development plan')),(0,o.kt)("h3",{id:"3-curve\u4e0ecubefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-cubefs"},"3. Curve\u4e0eCubeFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and CubeFS?"),(0,o.kt)("p",null,"\u6700\u5927\u7684\u533a\u522b\u662f\uff1a Curve\u652f\u6301\u5757\u5b58\u50a8\uff0c\u4e0d\u652f\u6301\u5bf9\u8c61\u5b58\u50a8\uff0cCubeFS\u53cd\u4e4b\uff1b\u53e6\u5916Curve FS\u53ef\u4ee5\u5728\u516c\u6709\u4e91\u573a\u666f\u4e0b\u5bf9\u63a5S3\u5b58\u50a8\u5f15\u64ce\u90e8\u7f72\u4f7f\u7528\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\u3002"),(0,o.kt)("p",null,"The biggest difference is that Curve supports block storage, but not object storage, while CubeFS is the other way around. In addition, Curve FS can be deployed with S3 storage engines in public cloud scenarios. If you want to know some differences in details, you can contact us through WeChat group/slack/forum to communicate and confirm."),(0,o.kt)("h3",{id:"4-curve\u4e0eopenebs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-openebs"},"4. Curve\u4e0eOpenEBS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and OpenEBS?"),(0,o.kt)("p",null,"\u6700\u5927\u7684\u533a\u522b\u662f\uff1a Curve\u652f\u6301\u6587\u4ef6\u5b58\u50a8\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\u3002"),(0,o.kt)("p",null,"The biggest difference: Curve supports file storage. If you want to know some differences in details, you can contact us through WeChat group/slack/forum to communicate and confirm."),(0,o.kt)("h3",{id:"5-curve\u4e0ejuicefs\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-juicefs"},"5. Curve\u4e0eJuiceFS\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and JuiceFS?"),(0,o.kt)("p",null,"\u4e3b\u8981\u533a\u522b\u6709\u4ee5\u4e0b\u51e0\u70b9\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve\u652f\u6301\u5757\u5b58\u50a8\uff0cCurveFS\u652f\u6301CurveBS\u5b58\u50a8\u540e\u7aef\uff0c\u4e5f\u652f\u6301S3\u5b58\u50a8\u540e\u7aef\uff0c\u540e\u7eed\u8fd8\u4f1a\u652f\u6301\u5728CurveBS\u548cS3\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u751f\u547d\u5468\u671f\u7ba1\u7406\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u67d0\u4e9b\u7ec6\u8282\u5dee\u5f02\uff0c\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u7fa4/slack/\u8bba\u575b\u8054\u7cfb\u6211\u4eec\u6c9f\u901a\u786e\u8ba4\u3002"),(0,o.kt)("li",{parentName:"ul"},"CurveFS\u7684\u5143\u6570\u636e\u5f15\u64ce\u662f\u81ea\u7814\u7684\uff0c\u57fa\u4e8eraft\u5b9e\u73b0\u76843\u526f\u672c\u5b58\u50a8\uff0c\u5177\u6709\u9ad8\u53ef\u7528\u9ad8\u53ef\u9760\u9ad8\u53ef\u6269\u7b49\u7279\u6027\u3002"),(0,o.kt)("li",{parentName:"ul"},"CurveFS\u7684\u7f13\u5b58\u652f\u6301\u5185\u5b58buffer\u3001\u672c\u5730\u78c1\u76d8\u3001\u5206\u5e03\u5f0fkv\u7f13\u5b58\u8fd9\u51e0\u4e2a\u7b49\u7ea7\uff0c\u7c7b\u4f3cCPU\u7684L1\u3001L2\u3001L3 cache\u8bbe\u8ba1")),(0,o.kt)("p",null,"The main differences are as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve supports block storage, and CurveFS supports CurveBS storage backend and S3 storage backend. It will also support data life cycle management between CurveBS and S3 in the future. If you want to know about some detailed differences, you can contact us through WeChat group/slack/forum for communication and confirmation."),(0,o.kt)("li",{parentName:"ul"},"CurveFS's metadata engine is self-developed and is based on 3-copy storage implemented in raft. It has the characteristics of high availability, high reliability and high scalability."),(0,o.kt)("li",{parentName:"ul"},"CurveFS's cache supports memory buffer, local disk, and distributed kv cache levels, similar to the CPU's L1, L2, and L3 cache design.")),(0,o.kt)("h3",{id:"6-curve\u4e0ehdfss3fsjindofsrapidfsgoosefsalluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48--what-is-the-difference-between-curve-and-hdfss3fsjindofsrapidfsgoosefsalluxio"},"6. Curve\u4e0eHDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f / What is the difference between Curve and HDFS/S3FS/JindoFS/RapidFS/GooseFS/Alluxio\uff1f"),(0,o.kt)("p",null,"\u9996\u5148Curve\u5305\u62ecCurveBS\u5757\u5b58\u50a8\u548cCurveFS\u6587\u4ef6\u5b58\u50a8\uff0c\u56e0\u6b64CurveFS\u53ef\u4ee5\u4e0e\u8fd9\u51e0\u4e2aFS\u8fdb\u884c\u6bd4\u8f83\uff0c\u6211\u4eec\u7684\u4f18\u52bf\u4e3b\u8981\u5305\u62ec\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"CurveFS\u63d0\u4f9b\u4e0eHDFS API\u5b8c\u5168\u517c\u5bb9\u7684SDK\uff0c\u652f\u6301 Hadoop \u751f\u6001\u7528\u6237\u65e0\u7f1d\u8fc1\u79fb"),(0,o.kt)("li",{parentName:"ul"},"\u4e0eHDFS\u76f8\u6bd4\uff1aCurveFS\u652f\u6301\u5b58\u50a8\u8ba1\u7b97\u5206\u79bb\uff0c\u8ba1\u7b97\u8d44\u6e90\u53ef\u4ee5\u7075\u6d3b\u914d\u7f6e\u548c\u4f38\u7f29\uff0c\u5b58\u50a8\u8d44\u6e90\u7531\u5bf9\u8c61\u5b58\u50a8\u63d0\u4f9b\u4e5f\u53ef\u72ec\u7acb\u4f38\u7f29\uff1b\u5c24\u5176\u9002\u5408\u4e91\u4e0a\u4e1a\u52a1\u66ff\u6362HDFS\uff0c\u5e76\u4e14\u901a\u8fc7\u6570\u636e\u548c\u5143\u6570\u636e\u7f13\u5b58\u52a0\u901fIO\u8bbf\u95ee\uff0c\u6027\u80fd\u4f18\u5f02\uff1b\u5143\u6570\u636e\u65e0\u5355\u70b9\u74f6\u9888\uff0c\u53ef\u6269\u5c55\u6027\u5f3a\uff0c\u652f\u6301\u767e\u4ebf\u7ea7\u7684\u6587\u4ef6\u5b58\u50a8\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u76f8\u6bd4\u5bf9\u8c61\u5b58\u50a8\uff1a\u63d0\u4f9b\u5b8c\u6574\u7684POSIX\u8bed\u4e49\u652f\u6301\uff0c\u826f\u597d\u9002\u914d\u5927\u6570\u636e\u751f\u6001\u7ec4\u4ef6\uff1b\u5143\u6570\u636e\u64cd\u4f5c\u6027\u80fd\u4f18\u5f02\u4e14\u5f3a\u4e00\u81f4\u6027\uff1bN \u500d\u4ee5\u4e0a\u7684\u5143\u6570\u636e\u64cd\u4f5c\uff08list\u3001rename \u7b49\uff09\u6027\u80fd\u63d0\u5347\uff0c\u6570\u636e\u8bfb\u5199\u6027\u80fd\u4e5f\u80fd\u63d0\u5347N\u500d\uff0c\u6b22\u8fce\u5b9e\u6d4b\u4f53\u9a8c\u3002")),(0,o.kt)("p",null,"\u4e0e\u5176\u4ed6\u51e0\u4e2aFS\u7684\u533a\u522b\u662f\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"JindoFS/RapidFS\u7b49\u7684block\u6a21\u5f0f\u4e0eCurveFS\u67b6\u6784\u6bd4\u8f83\u7c7b\u4f3c\uff0c\u4f46\u76f8\u6bd4\u516c\u6709\u4e91\u5382\u5546\u7684\u4ea7\u54c1\uff0cCurveFS\u66f4\u52a0\u4e2d\u7acb\uff0c\u4e14\u5b8c\u5168\u5f00\u6e90\uff08\u76ee\u524d\u5df2\u6350\u732e\u7ed9CNCF\u57fa\u91d1\u4f1a\uff09\uff0c\u53e6\u5916CurveFS\u9664\u4e86\u652f\u6301\u5bf9\u8c61\u5b58\u50a8\u5916\uff0c\u4e5f\u652f\u6301\u81ea\u7814\u6570\u636e\u5b58\u50a8\u5f15\u64ceCurveBS\uff0c\u53ef\u4ee5\u79c1\u6709\u5316\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"Alluxio\u4e0eJindoFS/RapidFS\u7b49\u7684\u7f13\u5b58\u6a21\u5f0f\u7c7b\u4f3c\uff0c\u4ec5\u4f5c\u4e3a\u5bf9\u8c61\u5b58\u50a8\u7684\u7f13\u5b58\u52a0\u901f\u7ec4\u4ef6\u800c\u4e0d\u4fdd\u5b58\u5143\u6570\u636e\uff0c\u5bf9\u8c61\u5b58\u50a8\u7684\u5143\u6570\u636e\u64cd\u4f5c\u7684\u4e00\u81f4\u6027\u95ee\u9898\u548c\u6027\u80fd\u74f6\u9888\u5747\u65e0\u6cd5\u89e3\u51b3")),(0,o.kt)("p",null,"First of all, Curve includes CurveBS block storage and CurveFS file storage, so CurveFS can be compared with these FS. Our advantages mainly include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Fully compatible with HDFS API and seamlessly adapted to Hadoop ecological components."),(0,o.kt)("li",{parentName:"ul"},"Compared with HDFS: elastic scaling of capacity; separation of storage and computing, computing resources can be flexibly configured and scaled; compared with self-built HDFS on the cloud using cloud disks, the cost is saved by more than 60%, while providing read and write performance comparable to HDFS; support POSIX and S3 interfaces use one storage to adapt to the access needs of different businesses; JuiceFS commercial version provides fully managed SaaS services with zero operation and maintenance, and can support tens of billions of file storage in a single command space."),(0,o.kt)("li",{parentName:"ul"},"Compared with object storage: it provides complete POSIX semantic support, good adaptability of big data ecological components; strong consistency of metadata operations; more than N times the performance of metadata operations (list, rename, etc.) is improved, and the data reading and writing performance is also improved It can be improved by N times. Real test experience is welcome.")),(0,o.kt)("p",null,"The differences from other FS are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The block mode of JindoFS/RapidFS is similar to the CurveFS architecture, but compared to the products of public cloud vendors, CurveFS is more neutral and completely open source (currently donated to the CNCF Foundation). In addition, CurveFS also supports object storage. Self-developed data storage engine CurveBS can be deployed privately"),(0,o.kt)("li",{parentName:"ul"},"The caching mode of Alluxio is similar to that of JindoFS/RapidFS. It only serves as a cache acceleration component of object storage without saving metadata. The consistency problem and performance bottleneck of metadata operations of object storage cannot be solved.")),(0,o.kt)("h3",{id:"7-curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b--in-what-scenarios-can-curve-be-used"},"7. Curve\u80fd\u7528\u5728\u4ec0\u4e48\u573a\u666f\u4e0b\uff1f / In what scenarios can Curve be used?"),(0,o.kt)("p",null,"Curve\u80fd\u4f7f\u7528\u7684\u4e3b\u8981\u573a\u666f\u5982\u4e0b\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 OpenStack \u5e73\u53f0\u4e3a\u4e91\u4e3b\u673a\u63d0\u4f9b\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u670d\u52a1\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 Kubernetes \u4e3a\u5176\u63d0\u4f9b RWO\u3001RWX \u7b49\u7c7b\u578b\u7684\u6301\u4e45\u5316\u5b58\u50a8\u5377\uff1b"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u63a5 PolarFS \u4f5c\u4e3a\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u9ad8\u6027\u80fd\u5b58\u50a8\u5e95\u5ea7\uff0c\u5b8c\u7f8e\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u7b97\u5206\u79bb\u67b6\u6784\uff1b"),(0,o.kt)("li",{parentName:"ul"},"Curve \u4ea6\u53ef\u4f5c\u4e3a\u4e91\u5b58\u50a8\u4e2d\u95f4\u4ef6\u4f7f\u7528 S3 \u517c\u5bb9\u7684\u5bf9\u8c61\u5b58\u50a8\u4f5c\u4e3a\u6570\u636e\u5b58\u50a8\u5f15\u64ce\uff0c\u4e3a\u516c\u6709\u4e91\u3001\u79c1\u6709\u4e91\u7528\u6237\u63d0\u4f9b\u9ad8\u6027\u4ef7\u6bd4\u7684\u5171\u4eab\u6587\u4ef6\u5b58\u50a8\uff1b\u6838\u5fc3\u5e94\u7528\u573a\u666f\u5305\u62ecAI\u8bad\u7ec3\u5b58\u50a8\u3001\u5927\u6570\u636eHDFS\u66ff\u6362\u3001ElasticSearch/ClickHouse\u51b7\u6570\u636e\u5b58\u50a8\u7b49\uff0c\u53ef\u4e3a\u6b64\u7c7b\u5e94\u7528\u5b9e\u73b0\u964d\u672c\u589e\u6548"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u5728\u7269\u7406\u673a\u4e0a\u6302\u8f7d\u4f7f\u7528\u5757\u8bbe\u5907\u6216FUSE\u6587\u4ef6\u7cfb\u7edf\uff0c\u4f5c\u4e3a\u66ff\u6362NAS\u5b58\u50a8\u3001NFS\u7b49\u7684\u5171\u4eab\u5b58\u50a8\uff0c\u540c\u65f6\u4e5f\u652f\u6301SMB\u534f\u8bae")),(0,o.kt)("p",null,"The main scenarios where Curve can be used are as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Connect to the OpenStack platform to provide high-performance block storage services for cloud hosts;"),(0,o.kt)("li",{parentName:"ul"},"Connect to Kubernetes to provide persistent storage volumes of RWO, RWX and other types;"),(0,o.kt)("li",{parentName:"ul"},"Connecting with PolarFS as a high-performance storage base for cloud-native databases, it perfectly supports the storage-computation separation architecture of cloud-native databases;"),(0,o.kt)("li",{parentName:"ul"},"Curve can also be used as cloud storage middleware using S3-compatible object storage as a data storage engine to provide cost-effective shared file storage for public cloud and private cloud users; core application scenarios include AI training storage, big data HDFS replacement, ElasticSearch / ClickHouse cold data storage, etc., can reduce costs and increase efficiency for such applications."),(0,o.kt)("li",{parentName:"ul"},"Supports mounting block devices or FUSE file systems on physical machines as shared storage to replace NAS storage, NFS, etc., and also supports the SMB protocol.")),(0,o.kt)("h3",{id:"8-curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684--how-does-curves-cloud-native-storage-capability-manifest"},"8. Curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u80fd\u529b\u662f\u5982\u4f55\u4f53\u73b0\u7684\uff1f / How does Curve's cloud-native storage capability manifest?"),(0,o.kt)("p",null,"\u4e3b\u8981\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u70b9\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4e91\u539f\u751f\u90e8\u7f72\uff1a\u652f\u6301curveadm+docker\u90e8\u7f72\u65b9\u5f0f\uff1b\u652f\u6301k8s operator\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"\u4e91\u539f\u751f\u4f7f\u7528\uff1a\u652f\u6301CSI\u914d\u5408K8S\u4f5c\u4e3a\u6301\u4e45\u5316\u5377\u4f7f\u7528\uff08RWO\u3001RWX\u7b49\uff09"),(0,o.kt)("li",{parentName:"ul"},"\u4e91\u539f\u751f\u8fd0\u7ef4\uff1a\u652f\u6301curveadm+docker\u8fd0\u7ef4\uff0c\u652f\u6301k8s operator\u65e5\u5e38\u8fd0\u7ef4\u53ca\u76d1\u63a7")),(0,o.kt)("p",null,"Mainly reflected in the following points:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Cloud native deployment: support curveadm+docker deployment method; support k8s+operator deployment method"),(0,o.kt)("li",{parentName:"ul"},"Cloud native use: support CSI with K8S as persistent volume (RWO, RWX, etc.)"),(0,o.kt)("li",{parentName:"ul"},"Cloud native O&M: support curveadm+docker O&M, k8s+operator O&M")),(0,o.kt)("h3",{id:"9-curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\u89c4\u6a21\u5982\u4f55\u7a33\u5b9a\u6027\u5982\u4f55\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c--has-curve-been-used-in-a-production-environment-what-is-the-scale-how-is-the-stability-has-there-been-a-massive-failure"},"9. Curve\u662f\u5426\u6709\u5728\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u8fc7\uff1f\u89c4\u6a21\u5982\u4f55\uff1f\u7a33\u5b9a\u6027\u5982\u4f55\uff1f\u6709\u65e0\u51fa\u73b0\u8fc7\u5927\u89c4\u6a21\u6545\u969c\uff1f / Has Curve been used in a production environment? What is the scale? How is the stability? Has there been a massive failure?"),(0,o.kt)("p",null,"CurveBS\u5757\u5b58\u50a8\u5df2\u5728\u7f51\u6613\u5185\u90e8\u4f7f\u7528\u8fd13\u5e74\uff0c\u8fd0\u884c\u7a33\u5b9a\uff0c\u5b58\u50a8\u6570\u636e\u91cf\u6570PB\uff0c\u65e0\u5927\u89c4\u6a21\u6545\u969c\u3002\u53e6\u5916\u4e5f\u6709\u591a\u5bb6\u793e\u533a\u7528\u6237\u5728\u4f7f\u7528CurveBS\uff0c\u76ee\u524d\u672a\u6536\u5230\u5927\u89c4\u6a21\u6545\u969c\u53cd\u9988\u3002"),(0,o.kt)("p",null,"CurveFS\u76ee\u524d\u5df2\u53d1\u5e03\u591a\u4e2a\u7a33\u5b9a\u7248\u672c\uff0c\u5df2\u5728\u7f51\u6613\u5185\u5916\u90e8AI\u8bad\u7ec3\u5b58\u50a8\u3001HDFS\u66ff\u6362\u3001ES\u51b7\u6570\u636e\u7b49\u4e1a\u52a1\u843d\u5730\u4f7f\u7528\u4e2d\u3002"),(0,o.kt)("p",null,"CurveBS block storage has been used within NetEase for 4 years (since mid-2019), with serveral PB data storage, and no large-scale failures. In addition, many community users are using CurveBS, and no large-scale failure feedback has been received so far."),(0,o.kt)("p",null,"CurveFS has currently released multiple stable versions and is being used in NetEase's internal and external AI training storage, HDFS replacement, ES cold data and other businesses."),(0,o.kt)("h3",{id:"10-curve\u7684roadmap\u662f\u4ec0\u4e48--what-is-curves-roadmap"},"10. Curve\u7684Roadmap\u662f\u4ec0\u4e48\uff1f / What is Curve's Roadmap?"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://docs.opencurve.io/category/roadmap"},"https://docs.opencurve.io/category/roadmap"))),(0,o.kt)("h3",{id:"11-curve\u5f00\u6e90\u7684\u76ee\u6807\u76ee\u7684\u662f\u4ec0\u4e48--what-is-the-goalpurpose-of-curve-open-source"},"11. Curve\u5f00\u6e90\u7684\u76ee\u6807/\u76ee\u7684\u662f\u4ec0\u4e48\uff1f / What is the goal/purpose of Curve open source?"),(0,o.kt)("p",null,"\u5728\u73b0\u4eca\u7684\u4e91\u57fa\u7840\u8bbe\u65bd\u9886\u57df\uff0c\u4e91\u539f\u751f\u5e94\u7528\u5982\u706b\u5982\u837c\u7684\u5728\u4e92\u8054\u7f51\u884c\u4e1a\u843d\u5730\uff0c\u4f20\u7edf\u884c\u4e1a\u4e5f\u5f00\u59cb\u6709\u6240\u5b9e\u8df5\u3002\u4f46\u662f\u5982\u679c\u6211\u4eec\u6df1\u5165\u8c03\u67e5\u4e91\u539f\u751f\u57fa\u7840\u8bbe\u65bd3\u5927\u677f\u5757\uff1a\u8ba1\u7b97\u3001\u5b58\u50a8\u3001\u7f51\u7edc\uff0c\u4f60\u5c31\u80fd\u53d1\u73b0\uff0c\u4e91\u539f\u751f\u5b58\u50a8\u9879\u76ee\u975e\u5e38\u7a00\u7f3a\uff0c\u5f00\u6e90\u7684\u66f4\u5c11\uff0c\u5982\u679c\u518d\u9644\u52a0\u4e0a\u7a33\u5b9a\u3001\u9ad8\u6027\u80fd\u3001\u516c\u6709\u4e91\u79c1\u6709\u4e91\u5747\u53ef\u4f7f\u7528\u7684\u7075\u6d3b\u5f39\u6027\u3001\u7b80\u5355\u6613\u8fd0\u7ef4\u8fd9\u4e9b\u4e91\u539f\u751f\u573a\u666f\u4e0b\u5bf9\u5b58\u50a8\u7cfb\u7edf\u7684\u57fa\u7840\u8981\u6c42\uff0c\u5219\u5e02\u9762\u4e0a\u57fa\u672c\u6ca1\u6709\u5408\u9002\u7684\u7cfb\u7edf\u53ef\u4f9b\u9009\u62e9\u3002\u57fa\u4e8e\u4e0a\u8ff0\u539f\u56e0\uff0c\u6211\u4eec\u57282018\u5e74\u51b3\u5b9a\u7acb\u9879\u7814\u53d1\u66f4\u597d\u7528\u7684\u4e91\u539f\u751f\u5b58\u50a8\u7cfb\u7edf\uff1aCurve\u3002"),(0,o.kt)("p",null,"Curve\u6700\u521d\u7684\u7acb\u9879\u76ee\u6807\u53ea\u662f\u89e3\u51b3\u7f51\u6613\u96c6\u56e2\u5185\u90e8\u4f7f\u7528\u5f00\u6e90Ceph\u5b58\u50a8\u7684\u75db\u70b9\uff0c\u7f51\u6613\u6570\u5e06\u4f5c\u4e3a\u4e91\u539f\u751f\u9886\u57df\u7684\u5b9e\u8df5\u8005\u548c\u9886\u5934\u7f8a\uff0c\u5728\u7ed9\u5404\u7c7b\u884c\u4e1a\u5ba2\u6237\u843d\u5730\u8fc7\u7a0b\u4e2d\uff0c\u4e5f\u6df1\u523b\u7406\u89e3\u4e86\u4e0a\u8ff0\u5ba2\u6237\u75db\u70b9\u3002\u4e3a\u6b64\u6211\u4eec\u51b3\u5b9a\u5c06\u5185\u90e8\u7684Curve\u9879\u76ee\u5f00\u6e90\u51fa\u6765\uff0c\u8ba9\u66f4\u591a\u7684\u5ba2\u6237\u4eab\u53d7\u5230Curve\u7684\u4e91\u539f\u751f\u5b58\u50a8\u4f18\u52bf\u3002"),(0,o.kt)("p",null,"Curve\u7684\u613f\u666f\uff1a\u5c06Curve\u6253\u9020\u6210\u4e3a\u6027\u80fd\u5353\u8d8a\u3001\u5168\u573a\u666f\u9002\u7528\u3001\u7a33\u5b9a\u6613\u8fd0\u7ef4\u7684\u5f00\u6e90\u4e91\u539f\u751f\u5206\u5e03\u5f0f\u5b58\u50a8\u7cfb\u7edf\u3002"),(0,o.kt)("p",null,"In today's cloud infrastructure field, cloud native applications are in full swing in the Internet industry, and traditional industries have begun to practice. But if we deeply investigate the three major sectors of cloud-native infrastructure: computing, storage, and network, you can find that cloud-native storage projects are very scarce, and even less open source. The basic requirements for storage systems in cloud-native scenarios such as usable flexibility, simplicity and ease of operation and maintenance, there are basically no suitable systems on the market to choose from. Based on the above reasons, in 2018, we decided to establish a project to develop a better cloud-native storage system: Curve."),(0,o.kt)("p",null,"The initial goal of Curve was to solve the pain points of using open source Ceph storage within NetEase Group. NetEase Shufan, as a practitioner and leader in the cloud native field, has also deeply understood the above-mentioned customer pain points in the process of landing for customers in various industries. For this reason, we decided to open source the internal Curve project so that more customers can enjoy the advantages of Curve's cloud-native storage."),(0,o.kt)("p",null,"Curve's vision: to build Curve into an open source cloud-native distributed storage system with excellent performance, applicable to all scenarios, stable and easy operation and maintenance."),(0,o.kt)("h3",{id:"12-curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b--what-are-the-communication-channels-of-the-curve-community"},"12. Curve\u793e\u533a\u7684\u6c9f\u901a\u6e20\u9053\u6709\u54ea\u4e9b\uff1f / What are the communication channels of the Curve community?"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5fae\u4fe1\u7fa4\uff1a\u6dfb\u52a0\u5fae\u4fe1\u53f7opencurve_bot\u9080\u8bf7\u8fdb\u7fa4"),(0,o.kt)("li",{parentName:"ul"},"\u8bba\u575b\uff1a",(0,o.kt)("a",{parentName:"li",href:"https://ask.opencurve.io/"},"https://ask.opencurve.io/")),(0,o.kt)("li",{parentName:"ul"},"slack\uff1acloud-native.slack.com\uff0cchannel #project_curve"),(0,o.kt)("li",{parentName:"ul"},"GitHub isue\uff1a",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/issues"},"https://github.com/opencurve/curve/issues")),(0,o.kt)("li",{parentName:"ul"},"\u90ae\u4ef6\u5217\u8868\uff1a\u5373\u5c06\u4e0a\u7ebf")),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"}," ")),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"WeChat group: add WeChat opencurve_bot to invite into the group"),(0,o.kt)("li",{parentName:"ul"},"Forum: ",(0,o.kt)("a",{parentName:"li",href:"https://ask.opencurve.io/"},"https://ask.opencurve.io/")),(0,o.kt)("li",{parentName:"ul"},"slack: cloud-native.slack.com, channel #project_curve"),(0,o.kt)("li",{parentName:"ul"},"GitHub isue: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/issues"},"https://github.com/opencurve/curve/issues")),(0,o.kt)("li",{parentName:"ul"},"Mailing list: Coming soon")),(0,o.kt)("h2",{id:"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173"},"\u90e8\u7f72\u8fd0\u7ef4\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve-\u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-minimum-requirements-for-deploy-curve-cluster"},"1. Curve \u90e8\u7f72\u7684\u6700\u4f4e\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the minimum requirements for deploy curve cluster?"),(0,o.kt)("p",null,"\u4f60\u53ea\u9700\u8981\u62e5\u6709\u4e00\u53f0\u673a\u5668\uff0c\u5c31\u53ef\u4ee5\u90e8\u7f72\u4f53\u9a8c\u6211\u4eec\u7684 Curve \u7cfb\u7edf\uff0c\u5f53\u7136\u4e86\uff0c\u8fd9\u4ec5\u9650\u4e8e\u4f53\u9a8c\u6211\u4eec Curve \u7cfb\u7edf\u7684\u7279\u6027\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\u6216\u90e8\u7f72\u7ebf\u4e0a\u73af\u5883\uff0c\u8bf7\u53c2\u8003\u6211\u4eec\u4ee5\u4e0b Curve \u751f\u4ea7\u73af\u5883\u7684\u63a8\u4ecb\u914d\u7f6e\u3002"),(0,o.kt)("p",null,"\u7279\u522b\u5730\uff0c\u6211\u4eec\u5bf9\u7cfb\u7edf\u5185\u6838\u6709\u4e00\u5b9a\u7684\u8981\u6c42\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u6587\u6863\u786e\u4fdd\u64cd\u4f5c\u7cfb\u7edf\u7684\u5185\u6838\u7248\u672c\u6ee1\u8db3\u8981\u6c42\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/install-curveadm#%E8%BD%AF%E7%A1%AC%E4%BB%B6%E7%8E%AF%E5%A2%83%E9%9C%80%E6%B1%82"},"\u8f6f\u786c\u4ef6\u73af\u5883\u9700\u6c42"))),(0,o.kt)("p",null,"You only need one machine to deploy and experience our curve system. Of course, this is only for experiencing the features of our curve system. If you need to perform performance testing or deploy in online environment, please refer to our curve production environment recommended configuration."),(0,o.kt)("p",null,"In particular, we have certain requirements for the system kernel, please refer to the following documents to ensure that the kernel version of the operating system meets the requirements:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/install-curveadm#%E8%BD%AF%E7%A1%AC%E4%BB%B6%E7%8E%AF%E5%A2%83%E9%9C%80%E6%B1%82"},"software&hardware requirements"))),(0,o.kt)("h3",{id:"2-curve-\u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48-what-is-the-recommended-configuration-for-curve-production-environment"},"2. Curve \u751f\u4ea7\u73af\u5883\u7684\u63a8\u8350\u914d\u7f6e\u662f\u4ec0\u4e48\uff1f/ What is the recommended configuration for Curve production environment?"),(0,o.kt)("p",null,"\u9488\u5bf9 CurveBS, \u6211\u4eec\u5c06\u4ece\u4ee5\u4e0b\u51e0\u4e2a\u90e8\u5206\u7ed9\u6211\u51fa\u6211\u4eec\u7684\u63a8\u4ecb\u914d\u7f6e\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u6570\u636e\u76d8\u78c1\u76d8\uff1a"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"\u5c3d\u53ef\u80fd\u4fdd\u8bc1\u6bcf\u4e2a chunkserver \u670d\u52a1\u5355\u72ec\u62e5\u6709\u4e00\u5757 SSD"),(0,o.kt)("li",{parentName:"ul"},"\u5173\u95ed\u6570\u636e\u76d8\u7f13\u5b58"),(0,o.kt)("li",{parentName:"ul"},"\u78c1\u76d8\u8c03\u5ea6\u7b56\u7565\uff0cSSD \u76d8 noop\uff0cHDD \u76d8 deadline"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u6570\u636e\u76d8 raid \u5361\u914d\u7f6e\uff1a"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"\u6570\u636e\u76d8\u5168\u90e8\u4e3a JBOD \u6a21\u5f0f"),(0,o.kt)("li",{parentName:"ul"},"RAID \u5361\u5173\u95ed consistent check"),(0,o.kt)("li",{parentName:"ul"},"RAID\u5361\u7f13\u5b58\u7b56\u7565\uff1aWriteThrough"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"\u64cd\u4f5c\u7cfb\u7edf\u8bbe\u7f6e\uff1a"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"\u7cfb\u7edf\u5141\u8bb8\u7684\u6700\u5927 fd \u6570\u91cf\u5efa\u8bae\u8bbe\u4e3a 10000000"),(0,o.kt)("li",{parentName:"ul"},"\u5355\u4e2a\u8fdb\u7a0b\u5141\u8bb8\u7684\u6700\u5927 fd \u6570\u91cf\uff0c\u4e0d\u8981\u4f4e\u4e8e 2500000"),(0,o.kt)("li",{parentName:"ul"},"\u8c03\u6574 mmap \u6570\u91cf\uff0c\u5efa\u8bae\u8c03\u6574\u4e3a 5642720")))),(0,o.kt)("p",null,"\u9488\u5bf9 CurveFS\uff0c\u6211\u4eec\u63a8\u4ecb\u7ed9\u5143\u6570\u636e\u670d\u52a1 MetaServer \u5206\u914d 3 \u53f0\u670d\u52a1\u5668\uff0c\u6bcf\u53f0\u670d\u52a1\u5668\u8fd0\u884c 4 \u4e2a MetaServer\uff0c\u6bcf\u4e2a MetaServer \u5c3d\u53ef\u80fd\u62e5\u6709\u4e00\u5757\u5355\u72ec\u7684 SSD\u3002"),(0,o.kt)("p",null,"For CurveBS, we will give me our recommended configuration from the following sections:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Data disk disk:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"As much as possible, ensure that each chunkserver service has a separate SSD"),(0,o.kt)("li",{parentName:"ul"},"Turn off the data disk cache"),(0,o.kt)("li",{parentName:"ul"},"Disk scheduling policy, SSD disk noop, HDD disk deadline"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Data disk raid card configuration:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"All data disks are in JBOD mode"),(0,o.kt)("li",{parentName:"ul"},"RAID card off consistent check"),(0,o.kt)("li",{parentName:"ul"},"RAID card cache policy: WriteThrough"))),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"Operating system settings:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"The maximum number of fds allowed by the system is recommended to be set to 10000000"),(0,o.kt)("li",{parentName:"ul"},"The maximum number of fds allowed by a single process, not less than 2500000"),(0,o.kt)("li",{parentName:"ul"},"Adjust the number of mmap, it is recommended to adjust to 5642720")))),(0,o.kt)("p",null,"For CurveFS, we recommend to allocate 3 servers to the metadata service MetaServer, each server runs 4 MetaServers, and each MetaServer has a separate SSD as much as possible."),(0,o.kt)("h3",{id:"3-curve-\u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\u6709\u65e0\u6307\u5bfc\u624b\u518c-what-is-the-deployment-tools-for-curve-is-there-an-instruction-manual"},"3. Curve \u7684\u90e8\u7f72\u5de5\u5177\u662f\u4ec0\u4e48\uff1f\u6709\u65e0\u6307\u5bfc\u624b\u518c\uff1f/ What is the deployment tools for Curve? Is there an instruction manual?"),(0,o.kt)("p",null,"\u4e3a\u4e86\u63d0\u9ad8 Curve \u7cfb\u7edf\u7684\u6613\u7528\u6027\uff0c\u6211\u4eec\u7279\u5730\u5f00\u53d1\u4e86\u90e8\u7f72\u8fd0\u7ef4\u5de5\u5177 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm"),"\uff0c\u76ee\u524d CurveAdm \u5177\u5907\u5b8c\u5584\u7684 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki"},"WiKi")," \u4e3b\u9875\uff0c\u4f60\u53ef\u4ee5\u5728 WiKi \u4e2d\u627e\u5230\u90e8\u7f72 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvebs-cluster-deployment"},"CurveBS"),"/",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment"},"CurveFS")," \u7684\u8be6\u7ec6\u6b65\u9aa4\u3002\u540e\u7eed\uff0c\u6211\u4eec\u8fd8\u4f1a\u5728 Curve \u8bba\u575b\u4e2d\u63a8\u51fa ",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/t/topic/49"},"SOP (Standard Operation Procedure)")," \u7cfb\u5217\u6559\u7a0b\uff0c\u6765\u5e2e\u52a9\u5927\u5bb6\u66f4\u597d\u5730\u4f7f\u7528 Curve\uff0c\u656c\u8bf7\u671f\u5f85\u3002"),(0,o.kt)("p",null,"In order to improve the usability of the Curve system, we have specially developed the deployment operation and maintenance tool ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm"),". Currently, CurveAdm has a complete ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki"},"WiKi")," homepage. You can find the detailed steps for deploying CurveBS/CurveFS in WiKi. In the future, we will also launch a series of ",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/t/topic/49"},"SOP (Standard Operation Procedure)")," tutorials in the Curve forum to help you use Curve better, so stay tuned."),(0,o.kt)("h3",{id:"4-curve-\u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\u5982\u547d\u4ee4\u884cdashboard\u76d1\u63a7\u7cfb\u7edf\u7b49-what-are-the-curve-om-troubleshooting-tools-such-as-command-line-dashboard-monitoring-system-etc"},"4. Curve \u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u6709\u54ea\u4e9b\uff1f\u5982\u547d\u4ee4\u884c\u3001dashboard\u3001\u76d1\u63a7\u7cfb\u7edf\u7b49\uff1f/ What are the Curve O&M troubleshooting tools? Such as command line, dashboard, monitoring system, etc."),(0,o.kt)("p",null,"Curve \u7684\u8fd0\u7ef4\u6392\u969c\u5de5\u5177\u4e3b\u8981\u5206\u4e3a\u4ee5\u4e3a 3 \u5927\u7c7b\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve \u81ea\u5e26\u7684\u914d\u5957\u8fd0\u7ef4\u5de5\u5177\uff1aCurveBS \u7684 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curve_ops_tool.md"},"curve_ops_tool")," \u4ee5\u53ca CurveFS \u7684 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs/src/tools#readme"},"curvefs_tool")),(0,o.kt)("li",{parentName:"ul"},"Prometheus\uff1aCurve \u63d0\u4f9b\u4e00\u6574\u5957\u5b8c\u6574\u7684 metric \u4f53\u7cfb\uff0c\u7531 Prometheus \u91c7\u96c6\uff0c\u6700\u7ec8\u7531 Grafana \u9762\u677f\u5c55\u793a\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/monitor.md"},"\u76d1\u63a7\u4f53\u7cfb")),(0,o.kt)("li",{parentName:"ul"},"CurveAdm: CurveAdm \u76ee\u524d\u6b63\u5728\u5c1d\u8bd5\u63d0\u4f9b\u9ad8\u7ea7\u7684 troubleshooting \u5de5\u5177\uff0c\u8be6\u89c1 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve"},"CurveAdm \u5e38\u89c1\u8fd0\u7ef4\u64cd\u4f5c"))),(0,o.kt)("p",null,"Curve's operation and maintenance troubleshooting tools are mainly divided into three categories:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Curve's own supporting O&M tools: ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curve_ops_tool.md"},"curve_ops_tool")," of CurveBS and ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs/src/tools#readme"},"curvefs_tool")," of CurveFS"),(0,o.kt)("li",{parentName:"ul"},"Prometheus: Curve provides a complete set of metric systems, which are collected by Prometheus and finally displayed on the Grafana panel. See ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/docs/cn/monitor.md"},"Monitoring System")," for details"),(0,o.kt)("li",{parentName:"ul"},"CurveAdm: CurveAdm is currently trying to provide advanced troubleshooting tools, see ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve"},"CurveAdm common operation and maintenance operations"))),(0,o.kt)("h3",{id:"5-\u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\u5982\u4f55\u83b7\u53d6-curve-\u793e\u533a\u7684\u652f\u6301-how-can-i-get-support-from-the-curve-community-if-i-encounter-an-unsolvable-problem-during-deployment-or-om"},"5. \u5982\u679c\u6211\u5728\u90e8\u7f72\u6216\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u5982\u4f55\u83b7\u53d6 Curve \u793e\u533a\u7684\u652f\u6301\uff1f/ How can I get support from the Curve community if I encounter an unsolvable problem during deployment or O&M?"),(0,o.kt)("p",null,"Curve \u793e\u533a\u76ee\u524d\u6b63\u5728\u63a8\u52a8\u5b8c\u5584\u90e8\u7f72\u8fd0\u7ef4\u5de5\u5177 CurveAdm\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u7528\u6237\u90e8\u7f72\u8fd0\u7ef4\u96f6\u95ee\u9898\uff0c\u4e3a\u4e86\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\uff0c\u540e\u7eed CurveAdm \u5c06\u63a8\u51fa\u4e00\u7cfb\u5217\u4f18\u5316\u6539\u8fdb\u63aa\u65bd\uff0c\u5982\u9519\u8bef\u72b6\u6001\u7801\u3001\u5b8c\u5584\u7684\u73af\u5883\u68c0\u6d4b\u7b49\u3002\u5f53\u7136\u4e86\uff0c\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u4f60\u5982\u679c\u5728\u90e8\u7f72\u8fd0\u7ef4\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u65e0\u6cd5\u89e3\u51b3\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u4e09\u79cd\u65b9\u5f0f\u4e2d\u7684\u4efb\u4e00\u4e00\u79cd\u6765\u83b7\u53d6\u5e2e\u52a9\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5728 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve"},"Curve")," \u6216 ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," \u4e3b\u9875\u63d0\u4ea4\u76f8\u5173 Issue"),(0,o.kt)("li",{parentName:"ul"},"\u901a\u8fc7\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\uff0c\u6dfb\u52a0\u5fae\u4fe1\u7fa4\uff0c\u5728\u5fae\u4fe1\u7fa4\u4e2d\u4e0e\u6211\u4eec\u53d6\u5f97\u8054\u7cfb")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Curve\u5c0f\u52a9\u624b\u5fae\u4fe1",src:r(2207).Z,width:"423",height:"549"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u8fd0\u884c CurveAdm \u7684 ",(0,o.kt)("inlineCode",{parentName:"li"},"support")," \u547d\u4ee4\u76f4\u63a5\u83b7\u53d6 Curve \u56e2\u961f\u6280\u672f\u652f\u6301\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve#%E8%8E%B7%E5%BE%97-curve-%E5%9B%A2%E9%98%9F%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81"},"\u83b7\u5f97 Curve \u56e2\u961f\u6280\u672f\u652f\u6301"))),(0,o.kt)("p",null,"The Curve community is currently promoting the improvement of the deployment and operation and maintenance tool CurveAdm. Our goal is to eliminate user deployment and operation and maintenance problems. In order to achieve this goal, CurveAdm will introduce a series of optimization and improvement measures in the future, such as error status codes and perfect environment detection. Of course, in the current state, if you encounter an unsolvable problem during deployment and operation, you can get help in any of the following three ways:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Submit relevant issues on the ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm"},"Curve")," or ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," homepage"),(0,o.kt)("li",{parentName:"ul"},"Slack: ",(0,o.kt)("a",{parentName:"li",href:"https://cloud-native.slack.com/archives/C03LFPT6BJM"},"https://cloud-native.slack.com/archives/C03LFPT6BJM")),(0,o.kt)("li",{parentName:"ul"},"Add a WeChat group by scanning the QR code below, and get in touch with us in the WeChat group")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Curve\u5c0f\u52a9\u624b\u5fae\u4fe1",src:r(2207).Z,width:"423",height:"549"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Run the support command of CurveAdm to directly obtain technical support from the Curve team. For details, see ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curveadm/wiki/maintain-curve#%E8%8E%B7%E5%BE%97-curve-%E5%9B%A2%E9%98%9F%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81"},"Obtaining Technical Support from the Curve Team"))),(0,o.kt)("h3",{id:"6-curve-\u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72-does-curve-support-manual-deployment-of-physical-machine-installation-packages"},"6. Curve \u662f\u5426\u652f\u6301\u7269\u7406\u673a\u5b89\u88c5\u5305\u65b9\u5f0f\u7684\u624b\u5de5\u90e8\u7f72\uff1f/ Does Curve support manual deployment of physical machine installation packages?"),(0,o.kt)("p",null,"\u76ee\u524d\u901a\u8fc7 CurveAdm \u90e8\u7f72\u7684\u96c6\u7fa4\u548c\u5ba2\u6237\u7aef\u90fd\u662f\u8dd1\u5728 Docker \u5bb9\u5668\u5185\uff0c\u540e\u7eed CurveAdm \u4e5f\u5c06\u63a8\u51fa\u7269\u7406\u673a\u5b89\u88c5\u63d2\u4ef6\uff0c\u8fd9\u4e2a\u63d2\u4ef6\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5c06\u5ba2\u6237\u7aef\u90e8\u7f72\u5728\u5404\u7c7b\u7269\u7406\u673a\u4e0a\uff08\u670d\u52a1\u7aef\u4ecd\u7136\u4f1a\u8dd1\u5728\u5bb9\u5668\u5185\uff09\u3002\u53e6\u5916\uff0c\u5982\u679c\u76ee\u524d\u4f60\u6709\u8fd9\u65b9\u9762\u7684\u9700\u6c42\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u6211\u4eec\u7684 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/deploy.md"},"Ansible")," \u90e8\u7f72\u65b9\u5f0f\uff0c\u867d\u7136\u8be5\u90e8\u7f72\u65b9\u5f0f\u5373\u5c06\u88ab\u5e9f\u5f03\uff0c\u4f46\u5b83\u4ecd\u7136\u662f\u6709\u6548\u7684\u3002"),(0,o.kt)("p",null,"\u5f53\u7136\u4e86\uff0c\u5982\u679c\u4f60\u6709\u90e8\u7f72\u65b9\u9762\u7684\u4efb\u4f55\u9700\u6c42\uff0c\u90fd\u53ef\u4ee5\u901a\u8fc7\u63d0\u4ea4 Issue \u6216\u5fae\u4fe1\u7fa4\u6c9f\u901a\u7684\u65b9\u5f0f\u544a\u8bc9\u6211\u4eec\u3002"),(0,o.kt)("p",null,"Now, the clusters and clients deployed by CurveAdm are running in Docker containers. In the future, CurveAdm will also launch a physical machine installation plug-in. This plug-in can help us deploy clients on various physical machines (the server will still run in the container). ). In addition, if you currently have this need, you can also use our ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/deploy.md"},"Ansible")," deployment method, although this deployment method is about to be deprecated, it is still valid."),(0,o.kt)("p",null,"Of course, if you have any deployment requirements, you can let us know by submitting an Issue or communicating in the WeChat group."),(0,o.kt)("h3",{id:"7-curve-\u5982\u4f55\u6269\u5bb9\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1-io-how-does-curve-scale-out-will-capacity-expansion-affect-io"},"7. Curve \u5982\u4f55\u6269\u5bb9\uff1f\u6269\u5bb9\u662f\u5426\u4f1a\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How does Curve scale out? Will capacity expansion affect IO?"),(0,o.kt)("p",null,"\u4f60\u53ef\u4ee5\u901a\u8fc7 CurveAdm \u4e00\u952e\u6269\u5bb9\u96c6\u7fa4\uff0c\u5e76\u4e14\u8be5\u64cd\u4f5c\u5e76\u4e0d\u5f71\u54cd\u4e1a\u52a1 IO\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/scale-curve"},"\u6269\u7f29\u5bb9"),"\u3002"),(0,o.kt)("p",null,"You can scale out the cluster with one click through CurveAdm, and this operation does not affect IO. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/scale-curve"},"scaling")," for details."),(0,o.kt)("h3",{id:"8-curve-\u5982\u4f55\u5347\u7ea7\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1-io-how-to-upgrade-curve-does-the-upgrade-process-affect-io"},"8. Curve \u5982\u4f55\u5347\u7ea7\uff1f\u5347\u7ea7\u8fc7\u7a0b\u4e2d\u662f\u5426\u5f71\u54cd\u4e1a\u52a1 IO\uff1f/ How to upgrade Curve? Does the upgrade process affect IO?"),(0,o.kt)("p",null,"\u4f60\u53ef\u4ee5\u901a\u8fc7 CurveAdm \u4e00\u952e\u5347\u7ea7\u96c6\u7fa4\u670d\u52a1\uff0c\u5e76\u4e14\u8be5\u64cd\u4f5c\u5e76\u4e0d\u5f71\u54cd\u4e1a\u52a1 IO\uff0c\u8be6\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/upgrade-curve"},"\u5347\u7ea7\u670d\u52a1"),"\u3002"),(0,o.kt)("p",null,"You can upgrade cluster services with one click through CurveAdm, and this operation does not affect IO. See ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/scale-curve"},"upgrading services")," for details."),(0,o.kt)("h3",{id:"9-curve-\u662f\u5426\u652f\u6301\u7f29\u5bb9-does-curve-support-scale-in-cluster"},"9. Curve \u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f/ Does Curve support scale in cluster?"),(0,o.kt)("p",null,"Curve \u76ee\u524d\u4e0d\u652f\u6301\u7f29\u5bb9\uff0c\u6211\u4eec\u5e76\u6ca1\u6709\u5728\u7ebf\u4e0a\u5c1d\u8bd5\u8fc7\u6b64\u7c7b\u64cd\u4f5c\u3002\u4e0d\u8fc7\uff0c\u4e3a\u4e86\u6ee1\u8db3\u66f4\u591a\u7528\u6237\u9700\u6c42\uff0c\u540e\u7eed CurveAdm \u5c06\u4f1a\u8003\u8651\u63d0\u4f9b\u7f29\u5bb9\u63a5\u53e3\u3002"),(0,o.kt)("p",null,"Now curve doesn't support scale in cluster, and we haven't tried this online. However, in order to meet the needs of more users, CurveAdm will consider providing a scaling interface in the future."),(0,o.kt)("h3",{id:"10-curve-\u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\u5f02\u5730\u5bb9\u707e\u4e24\u5730\u4e09\u4e2d\u5fc3-does-curve-support-dual-active-in-the-same-city-disaster-recovery-in-different-places-three-centers-in-two-places"},"10. Curve \u662f\u5426\u652f\u6301\u540c\u57ce\u53cc\u6d3b\uff1f\u5f02\u5730\u5bb9\u707e\uff1f\u4e24\u5730\u4e09\u4e2d\u5fc3\uff1f/ Does Curve support dual-active in the same city? Disaster recovery in different places? Three centers in two places?"),(0,o.kt)("p",null,"Curve \u91c7\u7528 Raft \u5f3a\u4e00\u81f4\u6027\u534f\u8bae\uff0c\u5177\u5907\u4e09\u526f\u672c\uff0c\u53ef\u4ee5\u5f88\u597d\u7684\u5b9e\u73b0\u6570\u636e\u7684\u5bb9\u707e\uff0c\u5e76\u4e14 Curve \u7684\u526f\u672c\u653e\u7f6e\u7b56\u7565\u53ef\u7531\u7528\u6237\u7075\u6d3b\u914d\u7f6e\uff0c\u5b9e\u73b0\u5404\u7c7b\u9ad8\u53ef\u7528\u7684\u9700\u6c42\uff0c\u4e3a\u5173\u952e\u4e1a\u52a1\u63d0\u4f9b 7x24 \u4e0d\u95f4\u65ad\u670d\u52a1\u3002"),(0,o.kt)("p",null,"Curve adopts Raft strong consistency protocol and has three copies, which can well realize disaster recovery of data, and the copy placement strategy of Curve can be flexibly configured by users to meet various high-availability requirements and provide 7x24 uninterrupted services for key businesses."),(0,o.kt)("h3",{id:"11-curve-\u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72-does-curve-support-hyperconverged-deployment"},"11. Curve \u662f\u5426\u652f\u6301\u8d85\u878d\u5408\u90e8\u7f72\uff1f/ Does Curve support hyperconverged deployment?"),(0,o.kt)("p",null,"Curve \u652f\u6301\u8ba1\u7b97\u5b58\u50a8\u6df7\u5408\u90e8\u7f72\u3002"),(0,o.kt)("p",null,"Curve supports compute-storage hybrid deployment."),(0,o.kt)("h3",{id:"12-curve-\u662f\u5426\u652f\u6301-rook\u662f\u5426\u53ef\u4ee5\u7528-k8s-\u90e8\u7f72-does-curve-support-rook-is-it-possible-to-deploy-with-k8s"},"12. Curve \u662f\u5426\u652f\u6301 rook\uff1f\u662f\u5426\u53ef\u4ee5\u7528 k8s \u90e8\u7f72\uff1f/ Does Curve support rook? Is it possible to deploy with k8s?"),(0,o.kt)("p",null,"Curve \u76ee\u524d\u5e76\u4e0d\u652f\u6301 rook\uff0c\u4f46\u5df2\u652f\u6301\u901a\u8fc7 operator \u5728 K8S \u4e0a\u90e8\u7f72 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-operator"},"curve-operator"),"\uff0c\u76ee\u524d Curve \u5df2\u63d0\u4f9b\u76f8\u5e94\u7684 CSI\uff0c\u5305\u62ec ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"curvebs-csi")," \u548c ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/h0hmj/curvefs-csi"},"curvefs-csi"),"\u3002"),(0,o.kt)("p",null,"Curve currently does not support rook, but it has supported deployment of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-operator"},"curve-operator")," on K8S through operator. Currently Curve has provided corresponding CSI, including ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"curvebs-csi ")," and ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/h0hmj/curvefs-csi"},"curvefs-csi"),"."),(0,o.kt)("h2",{id:"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173"},"\u7248\u672c\u53d1\u5e03\u53ca\u6253\u5305\u76f8\u5173"),(0,o.kt)("h3",{id:"1curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684-what-is-the-release-cycle-of-curve-version-how-is-the-version-number-defined"},"1\u3001Curve\u7248\u672c\u53d1\u5e03\u5468\u671f\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u7248\u672c\u53f7\u662f\u5982\u4f55\u5b9a\u4e49\u7684\uff1f/ What is the release cycle of Curve version? How is the version number defined?"),(0,o.kt)("p",null,"Curve\u6309\u7167\u6bcf3\u4e2a\u6708\u53d1\u5e03\u4e00\u4e2a\u7248\u672c\u7684\u8282\u594f\u53d1\u5e03\u3002\n\u91c7\u75283\u6bb5\u5f0f\u7248\u672c\u53f7\uff0cx.y.z{-\u540e\u7f00}\uff0cx\u662f\u5927\u7248\u672c\uff0cy\u662f\u5c0f\u7248\u672c\uff0cz\u662fbugfix\uff0c\u540e\u7f00\u7528\u6765\u533abeta\u7248\u672c(-beta)\u3001rc\u7248\u672c(-rc)\u3001\u548c\u7a33\u5b9a\u7248\u672c(\u6ca1\u6709\u540e\u7f00)\u3002"),(0,o.kt)("p",null,"\u53d1\u5e03\u5927\u7248\u672c\u65f6x\u589e\u52a01\uff0c\u6240\u8c13\u5927\u7248\u672c\u662f\u6307\u6709\u91cd\u5927\u7684\u529f\u80fd\u66f4\u65b0\uff1b\u5e73\u65f6\u6bcf3\u6708\u7684\u5c0f\u7248\u672c\u7684\u66f4\u65b0y\u589e\u52a01\u3002\u6b63\u5f0f\u7248\u672c\u53d1\u5e03\u4e4b\u540e\uff0c\u5982\u679c\u6709bugfix\uff0c\u65b0\u53d1\u5e03\u7684\u7248\u672cz\u589e\u52a01\u3002"),(0,o.kt)("p",null,"Curve releases at a frequency of one version every 3 months.\nUse a 3-segment version number, x.y.z{-suffix}, x is a major version, y is a minor version, z is a bugfix, and the suffix is used to distinguish beta version (-beta), rc version (-rc), and stable version (no suffix)."),(0,o.kt)("p",null,"When a major version is released, x increases by 1. The so-called major version refers to a major function update; usually every 3-month minor version update y increases by 1. After the official version is released, if there are bugfixes, the newly released version z is increased by 1."),(0,o.kt)("h3",{id:"2curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248-which-is-the-current-stable-version-of-curve-how-to-find-the-latest-stable-version"},"2\u3001Curve\u76ee\u524d\u7684\u7a33\u5b9a\u7248\u672c\u662f\u54ea\u4e2a\uff1f\u5982\u4f55\u627e\u5230\u6700\u65b0\u7684\u7a33\u5b9a\u7248\uff1f/ Which is the current stable version of Curve? How to find the latest stable version?"),(0,o.kt)("p",null,"Curve\u5757\u5b58\u50a8\u5f53\u524d\u7684\u7a33\u5b9a\u7248\u4e3aV1.2.4\u7248\u672c\uff0c",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases/tag/v1.2.4"},"https://github.com/opencurve/curve/releases/tag/v1.2.4")),(0,o.kt)("p",null,"Curve\u6700\u65b0\u7684\u7a33\u5b9a\u7248\uff08\u542bCurve\u6587\u4ef6\u5b58\u50a8\uff09\u53ef\u4ee5\u53bbrelease\u9875\u9762\u67e5\u627e\uff0c",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")),(0,o.kt)("p",null,"The current stable version is V1.2.4, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases/tag/v1.2.4"},"https://github.com/opencurve/curve/releases/tag/v1.2.4")),(0,o.kt)("p",null,"The latest stable version can be found on the release page, ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")),(0,o.kt)("h3",{id:"3curve-1x\u548c2x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-curve-1x-and-2x-versions"},"3\u3001Curve 1.x\u548c2.x\u7248\u672c\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between Curve 1.x and 2.x versions?"),(0,o.kt)("p",null,"Curve 1.x\u7248\u672c\u53ea\u6709Curve\u5757\u5b58\u50a8\u7684\u4ee3\u7801\uff0c\u53ea\u5305\u542bCurve\u5757\u5b58\u50a8\u7684\u529f\u80fd\u3002Curve 2.x\u589e\u52a0\u4e86Curve\u6587\u4ef6\u7cfb\u7edf\u7684\u529f\u80fd\u3002"),(0,o.kt)("p",null,"The Curve 1.x version only has the code of Curve block storage, and only contains the function of Curve block storage. Curve 2.x adds the functionality of the Curve file system."),(0,o.kt)("h3",{id:"4curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301-is-there-a-commercial-version-of-curve-is-there-a-commercial-version-development-plan-can-i-get-commercialization-support"},"4\u3001Curve\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\uff1f\u662f\u5426\u6709\u5546\u4e1a\u5316\u7248\u672c\u5f00\u53d1\u8ba1\u5212\uff1f\u6211\u662f\u5426\u53ef\u4ee5\u83b7\u53d6\u5546\u4e1a\u5316\u652f\u6301\uff1f/ Is there a commercial version of Curve? Is there a commercial version development plan? Can I get commercialization support?"),(0,o.kt)("p",null,"Curve\u6682\u65f6\u6ca1\u6709\u5546\u4e1a\u5316\u7248\u672c\uff0c\u77ed\u671f\u4e5f\u6ca1\u6709\u5546\u4e1a\u5316\u7248\u672c\u7684\u5f00\u53d1\u8ba1\u5212\u3002\u5982\u679c\u4f60\u9700\u8981\u5546\u4e1a\u5316\u7684\u652f\u6301\uff0c\u53ef\u4ee5\u8054\u7cfb\u6211\u4eec\uff0c\u6211\u4eec\u518d\u8be6\u7ec6\u6c9f\u901a\u3002"),(0,o.kt)("p",null,"There is no commercial version of Curve for the time being, and there is no development plan for a commercial version in the short term. If you need commercialization support, you can contact us and we will communicate in detail."),(0,o.kt)("h3",{id:"5curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248-are-the-versions-of-curve-block-storage-and-file-storage-released-independently-how-can-i-get-the-distributions-of-both"},"5\u3001Curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u7248\u672c\u662f\u72ec\u7acb\u53d1\u5e03\u7684\u5417\uff1f\u5982\u4f55\u83b7\u53d6\u4e24\u8005\u7684\u53d1\u884c\u7248\uff1f/ Are the versions of Curve block storage and file storage released independently? How can I get the distributions of both?"),(0,o.kt)("p",null,"2.x\u7248\u672c\u4e4b\u524d\uff0cCurve\u53ea\u6709\u5757\u5b58\u50a8\u3002\n\u4ece2.X\u4e4b\u540e\uff0cCurve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u4f1a\u4f7f\u7528\u7edf\u4e00\u7684\u7248\u672c\u53f7\uff0c\u5728\u540c\u4e00\u4e2arelease\u53d1\u5e03\u3002\u53d1\u884c\u7248\u53ef\u5728 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")," \u83b7\u53d6\u3002"),(0,o.kt)("p",null,"Before version 2.x, Curve only had block storage.\nAfter 2.X, Curve block storage and file storage will use a unified version number and release in the same release. Releases are available at\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/releases"},"https://github.com/opencurve/curve/releases")),(0,o.kt)("h3",{id:"6\u6211\u6539\u4e86curve\u4ee3\u7801\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c-i-changed-the-curve-code-how-do-i-release-my-own-version"},"6\u3001\u6211\u6539\u4e86Curve\u4ee3\u7801\uff0c\u5982\u4f55\u53d1\u5e03\u81ea\u5df1\u7684\u7248\u672c\uff1f/ I changed the Curve code, how do I release my own version?"),(0,o.kt)("p",null,"\u4f7f\u7528docker\u7f16\u8bd1\u955c\u50cf\uff0c\u4fee\u6539\u4ee3\u7801\u3001\u7f16\u8bd1\u3001\u6253\u955c\u50cf\u3001\u63a8\u9001\u955c\u50cf\u3002"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"\u62c9\u53d6docker\u7f16\u8bd1\u955c\u50cf\uff0c\u5e76\u8fdb\u5165\u955c\u50cf",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ docker pull opencurvedocker/curve-base:build-debian9\n$ docker run -it opencurvedocker/curve-base:build-debian9 /bin/bash\n"))),(0,o.kt)("li",{parentName:"ol"},"\u62c9\u53d6curve\u4ee3\u7801\uff0c\u5e76\u4fee\u6539\u4ee3\u7801",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ cd \n$ git clone https://github.com/opencurve/curve.git\n$ cd curve\nmodify your code\n"))),(0,o.kt)("li",{parentName:"ol"},"\u5982\u679c\u662f\u4fee\u6539\u7684curve bs\u4ee3\u7801\uff0c\u5728curve\u76ee\u5f55\u6267\u884c\u64cd\u4f5c5~7\uff1b"),(0,o.kt)("li",{parentName:"ol"},"\u5982\u679c\u4fee\u6539\u7684\u662fcurve fs\u4ee3\u7801\uff0c\u8fdb\u5165curvefs\u76ee\u5f55\uff0c\u6267\u884c\u64cd\u4f5c5~7\u3002",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ cd curvefs"))),(0,o.kt)("li",{parentName:"ol"},"\u4ee3\u7801\u7f16\u8bd1\uff0c\u5982\u679c\u7f16\u8bd1release\u7248\u672c\uff0c\u5728\u540e\u9762\u52a0\u4e0arelease=1",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make build ","[release=1]"))),(0,o.kt)("li",{parentName:"ol"},"\u6253\u955c\u50cf\uff0cTAG",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make image tag=TAG"))),(0,o.kt)("li",{parentName:"ol"},"\u63a8\u9001\u955c\u50cf",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ docker push TAG")))),(0,o.kt)("p",null,"Use docker to compile images, modify code, compile, make image, and push images."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Pull docker to compile the image and enter the image",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ docker pull opencurvedocker/curve-base:build-debian9\n$ docker run -it opencurvedocker/curve-base:build-debian9 /bin/bash\n"))),(0,o.kt)("li",{parentName:"ol"},"Pull the curve code and modify the code",(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"},"$ cd \n$ git clone https://github.com/opencurve/curve.git\n$ cd curve\nmodify your code\n"))),(0,o.kt)("li",{parentName:"ol"},"If it is the modified curve bs code, perform operations 5~7 in the curve directory;"),(0,o.kt)("li",{parentName:"ol"},"If you modify the curve fs code, enter the curvefs directory and perform operations 5~7.",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ cd curvefs"))),(0,o.kt)("li",{parentName:"ol"},"Code compilation, if the release version is compiled, add release=1 after",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make build ","[release=1]"))),(0,o.kt)("li",{parentName:"ol"},"Mirroring, TAG",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ make image tag=TAG"))),(0,o.kt)("li",{parentName:"ol"},"Push image",(0,o.kt)("blockquote",{parentName:"li"},(0,o.kt)("p",{parentName:"blockquote"},"$ docker push TAG")))),(0,o.kt)("h3",{id:"7curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248-which-operating-system-distributions-are-supported-by-the-versions-released-by-curve"},"7\u3001Curve\u53d1\u5e03\u7684\u7248\u672c\u90fd\u652f\u6301\u54ea\u4e9b\u64cd\u4f5c\u7cfb\u7edf\u53d1\u884c\u7248\uff1f/ Which operating system distributions are supported by the versions released by Curve?"),(0,o.kt)("p",null,"Curve\u53d1\u884c\u7684\u7248\u672c\u652f\u6301Debian 9\u53ca\u4ee5\u4e0a\u7248\u672c\uff0cCentOs 8\u53ca\u4ee5\u4e0a\u7248\u672c\u3002\u5176\u4ed6\u7248\u672c\u672a\u6d4b\u8bd5\u8fc7\u3002"),(0,o.kt)("p",null,"The version released by Curve supports Debian 9 and above, and CentOs 8 and above. Other versions have not been tested."),(0,o.kt)("p",null,"8\u3001Curve\u662f\u5426\u53ef\u4ee5\u5728ARM64\u5e73\u53f0\u8fd0\u884c\uff1f\u76f8\u5173\u7248\u672c\u5982\u4f55\u83b7\u53d6\uff1f/ Can Curve run on ARM64 platform? How to get the relevant version?"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/arm64"},"https://github.com/opencurve/curve/tree/arm64")," \uff0c\u8fd9\u4e2a\u5206\u652f\u6709Curve\u7684\u5bf9ARM64\u5e73\u53f0\u7684\u652f\u6301\u3002"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/arm64"},"https://github.com/opencurve/curve/tree/arm64")," , this branch has Curve's support for the ARM64 platform."),(0,o.kt)("p",null,"doc to build curvebs v1.2.5 on arm64 platform: ",(0,o.kt)("a",{parentName:"p",href:"https://gist.github.com/h0hmj/f8764c082c9ecd03c074efe557cf3048"},"https://gist.github.com/h0hmj/f8764c082c9ecd03c074efe557cf3048")),(0,o.kt)("p",null,"9\u3001Curve\u9664\u4e86AMD64\u3001ARM64\u5e73\u53f0\u4e4b\u5916\uff0c\u8fd8\u652f\u6301\u54ea\u4e9bCPU\u67b6\u6784\u7684\u5e73\u53f0\uff1f/ In addition to AMD64 and ARM64 platforms, what CPU architecture platforms does Curve support?"),(0,o.kt)("p",null,"\u5176\u4ed6\u7684CPU\u67b6\u6784\u5e73\u53f0\u672a\u6d4b\u8bd5\u8fc7\uff08\u5df2\u6709\u7528\u6237\u6210\u529f\u79fb\u690d\u5230\u7533\u5a01\u5904\u7406\u5668\u5e73\u53f0\uff09\u3002\u5982\u679c\u60a8\u6709\u5174\u8da3\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u79fb\u690dCurve\u5230\u5176\u4ed6CPU\u67b6\u6784\u7684\u5e73\u53f0\u3002"),(0,o.kt)("p",null,"Other CPU architecture platforms have not been tested. If you are interested, you can help test other CPU architecture platforms."),(0,o.kt)("h2",{id:"\u67b6\u6784\u76f8\u5173"},"\u67b6\u6784\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u6211\u80fd\u628acurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f-what-is-the-deployment-architecture-of-curve-what-infrastructure-scenarios-can-i-use-curve-for"},"1. Curve\u7684\u90e8\u7f72\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1f\u6211\u80fd\u628aCurve\u7528\u5728\u54ea\u4e9b\u57fa\u7840\u8bbe\u65bd\u573a\u666f\uff1f/ What is the deployment architecture of Curve? What infrastructure scenarios can I use Curve for?"),(0,o.kt)("p",null,"\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"\u5173\u4e8eCurve"),"\u7684\u95ee\u98981\uff1a",(0,o.kt)("inlineCode",{parentName:"p"},"Curve\u662f\u4ec0\u4e48\uff1f")),(0,o.kt)("p",null,"Refer to Question 1 of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"About Curve"),": ",(0,o.kt)("inlineCode",{parentName:"p"},"What is Curve? ")),(0,o.kt)("h3",{id:"2-curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b-what-are-the-business-scenarios-supported-by-curve"},"2. Curve\u652f\u6301\u7684\u4e1a\u52a1\u573a\u666f\u6709\u54ea\u4e9b\uff1f/ What are the business scenarios supported by Curve"),(0,o.kt)("p",null,"\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"\u5173\u4e8eCurve"),"\u7684\u95ee\u98981\uff1a",(0,o.kt)("inlineCode",{parentName:"p"},"Curve\u662f\u4ec0\u4e48\uff1f")),(0,o.kt)("p",null,"Refer to Question 1 of ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve-FAQ#%E5%85%B3%E4%BA%8Ecurve"},"About Curve"),": ",(0,o.kt)("inlineCode",{parentName:"p"},"What is Curve? ")),(0,o.kt)("h3",{id:"3-curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684curve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b-what-is-the-technical-architecture-of-curve-what-is-the-difference-between-the-technical-architecture-of-curve-block-storage-and-file-storage"},"3. Curve\u7684\u6280\u672f\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff1fCurve\u5757\u5b58\u50a8\u548c\u6587\u4ef6\u5b58\u50a8\u7684\u6280\u672f\u67b6\u6784\u6709\u4f55\u533a\u522b\uff1f/ What is the technical architecture of Curve? What is the difference between the technical architecture of Curve block storage and file storage?"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-meetup-slides/blob/main/2020/1030-Curve%E8%AE%BE%E8%AE%A1%E8%A6%81%E7%82%B9-%E7%BD%91%E6%98%93%E6%95%B0%E5%B8%86-%E6%9D%8E%E5%B0%8F%E7%BF%A0.pdf"},"CurveBS\u67b6\u6784")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curvefs_architecture.md"},"CurveFS\u67b6\u6784")),(0,o.kt)("p",null,"CurveBS\u7684\u67b6\u6784\u548cCurveFS\u7684\u67b6\u6784\u662f\u7c7b\u4f3c\u7684\u3002CurveBS\u53ef\u4ee5\u4f5c\u4e3aCurveFS\u7684\u540e\u7aef\uff0c\u7528\u4e8e\u5b58\u50a8\u6587\u4ef6\u6570\u636e\u3002"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-meetup-slides/blob/main/2020/1030-Curve%E8%AE%BE%E8%AE%A1%E8%A6%81%E7%82%B9-%E7%BD%91%E6%98%93%E6%95%B0%E5%B8%86-%E6%9D%8E%E5%B0%8F%E7%BF%A0.pdf"},"CurveBS Architecture")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/curvefs_architecture.md"},"CurveFS Architecture")),(0,o.kt)("p",null,"The architecture of CurveBS is similar to that of CurveFS. CurveBS can be used as the backend of CurveFS \u200b\u200bto store file data."),(0,o.kt)("h3",{id:"4-curve\u548cceph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48-what-is-the-difference-between-the-technical-architecture-of-curve-and-ceph"},"4. Curve\u548cCeph\u7684\u6280\u672f\u67b6\u6784\u533a\u522b\u662f\u4ec0\u4e48\uff1f/ What is the difference between the technical architecture of Curve and Ceph"),(0,o.kt)("p",null,"\u67b6\u6784\u4e0a\u4e3b\u8981\u7684\u533a\u522b\u6709\u4e24\u4e2a\uff1a\u4e00\u4e2a\u662f\u6570\u636e\u653e\u7f6e\u65b9\u9762\uff0cCurve\u7531\u4e2d\u5fc3\u8282\u70b9\u9009\u62e9\uff0cCeph\u4f7f\u7528\u54c8\u5e0c\u7b97\u6cd5\u8ba1\u7b97\u5f97\u51fa\uff1b\u53e6\u4e00\u4e2a\u591a\u526f\u672c\u4e00\u81f4\u6027\u65b9\u9762\uff0cCurve\u4f7f\u7528Quorum\u673a\u5236\u534f\u8bae\uff0cCeph\u4f7f\u7528\u5f3a\u4e00\u81f4\u534f\u8bae.\u5176\u4ed6\u529f\u80fd\u548c\u5b9e\u73b0\u4e0a\uff08\u5ba2\u6237\u7aef\u652f\u6301\u70ed\u5347\u7ea7\u3001\u5feb\u7167\u3001\u6587\u4ef6\u5143\u6570\u636e\u3001\u6570\u636e\u8282\u70b9\u4f7f\u7528\u7684\u6587\u4ef6\u7cfb\u7edf\u7b49\u7b49\uff09\u7684\u533a\u522b\u8fd8\u6709\u5f88\u591a\uff0c\u5efa\u8bae\u9605\u8bfb\u5bf9\u6bd4",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#design-documentation"},"Curve"),"\u548cCeph\u7684\u8bbe\u8ba1\u6587\u6863\u3002"),(0,o.kt)("p",null,"There are two main differences in architecture: one is data placement, Curve is selected by the central node, and Ceph uses a hash algorithm to calculate; the other is multi-copy consistency, Curve uses the Quorum mechanism protocol, and Ceph uses a strong consensus protocol.There are many differences in other functions and implementations (Client supports hot upgrade\n, snapshots, file metadata, file systems used by data nodes, etc.), it is recommended to read the comparison ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#design-documentation"},"Curve")," and Ceph's design documentation."),(0,o.kt)("h3",{id:"5-curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc-where-is-the-advanced-nature-of-curves-technical-architecture-reflected"},"5. Curve\u6280\u672f\u67b6\u6784\u7684\u5148\u8fdb\u6027\u4f53\u73b0\u5728\u54ea\u91cc\uff1f/ Where is the advanced nature of Curve's technical architecture reflected?"),(0,o.kt)("p",null,"\u5757\u5b58\u50a8"),(0,o.kt)("p",null,"\u670d\u52a1\u7aef\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u4e2d\u6027\u5316\u8282\u70b9\u67b6\u6784\u3002\u5229\u7528\u4e2d\u5fc3\u8282\u70b9\u611f\u77e5\u96c6\u7fa4\u8282\u70b9\u548c\u8d1f\u8f7d\u3001\u5bb9\u91cf\u3001\u5f02\u5e38\uff0c\u8fdb\u884c\u8d44\u6e90\u7684\u5b9e\u65f6\u8c03\u5ea6\u4e0e\u6062\u590d"),(0,o.kt)("li",{parentName:"ul"},"Quorum\u673a\u5236\u7684\u4e00\u81f4\u6027\u534f\u8bae\u3002\u5f02\u5e38\u60c5\u51b5\u5bb9\u9519\u66f4\u4f18\u5f02\uff0c\u5728\u5f02\u5e38\u60c5\u51b5\u4e0b\u6062\u590d\u8f83\u5feb\uff0c\u4fdd\u8bc1\u53ef\u9760\u6027\u7684\u540c\u65f6\uff0c\u63d0\u9ad8\u670d\u52a1\u53ef\u7528\u6027"),(0,o.kt)("li",{parentName:"ul"},"\u6587\u4ef6\u6c60\u3002\u96c6\u7fa4\u521d\u59cb\u5316\u65f6\uff0c\u521b\u5efa\u6307\u5b9a\u5927\u5c0f\u7684\u6587\u4ef6\uff0c\u964d\u4f4eIO\u8fc7\u7a0b\u4e2d\u6587\u4ef6\u5143\u6570\u636e\u7684\u66f4\u65b0\u5f00\u9500\uff0c\u964d\u4f4eIO\u5ef6\u8fdf"),(0,o.kt)("li",{parentName:"ul"},"IO\u8def\u5f84\u4e00\u6b21\u6301\u4e45\u5316\u3002\u5bf9\u4e8e\u7528\u6237io, raft\u4e2d\u5927\u591a\u6570\u8282\u70b9\u5199\u5b8cwal, apply\u5199\u5165\u7f13\u5b58\u5373\u53ef\u8fd4\u56de"),(0,o.kt)("li",{parentName:"ul"},"raft\u8f7b\u91cf\u7ea7\u5feb\u7167\u3002\u8bfb\u5199\u64cd\u4f5c\u662f\u5e42\u7b49\u7684\uff0craft\u5feb\u7167\u53ea\u9700\u8981\u4fdd\u5b58\u6587\u4ef6\u540d\uff0c\u5bf9io\u65e0\u5f71\u54cd"),(0,o.kt)("li",{parentName:"ul"},"\u5feb\u7167\u4e0a\u4f20S3\u3002\u5feb\u7167\u5b58\u50a8\u5230\u652f\u6301S3\u63a5\u53e3\u7684\u5bf9\u8c61\u5b58\u50a8\uff0c\u4e0d\u9650\u5236\u6570\u91cf")),(0,o.kt)("p",null,"\u5ba2\u6237\u7aef\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u6761\u5e26\u5316\u8bbe\u8ba1\u3002\u5927io\u4f7f\u7528\u6761\u5e26\u5316\u6280\u672f\uff0c\u5728\u5ba2\u6237\u7aef\u8fdb\u884c\u5206\u7247\uff0c\u63d0\u9ad8IO\u7684\u5e76\u53d1\u5ea6\uff0c\u8ba9\u66f4\u591a\u7684\u8282\u70b9\u53c2\u4e0eIO\u5904\u7406"),(0,o.kt)("li",{parentName:"ul"},"ApplyIndex\u8bfb\u3002\u5ba2\u6237\u7aef\u5e26\u7740applyIndex\u8bfb\uff0c\u65e0\u9700\u8d70\u4e00\u81f4\u6027\u534f\u8bae\uff0c\u4f7f\u7684\u8bfb\u4e0d\u4f1a\u88ab\u5199\u963b\u585e\uff0c\u6781\u5927\u7684\u63d0\u9ad8\u4e86\u8bfb\u6027\u80fd"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u6302\u8f7d\u3002\u4e00\u4e2a\u6587\u4ef6\u53ef\u4ee5\u6302\u8f7d\u5230\u591a\u4e2a\u5ba2\u6237\u7aef\uff0c\u63d0\u4f9b\u5757\u7ea7\u522b\u7684\u4e00\u5199\u591a\u8bfb"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u70ed\u5347\u7ea7\u3002client\u7aef\u4f7f\u7528client-server\u67b6\u6784\uff0c\u7248\u672c\u5347\u7ea7\u53ea\u9700\u8981\u66f4\u65b0server\uff0c\u65e0\u9700\u4e1a\u52a1\u505c\u670d\uff0c\u5bf9io\u79d2\u7ea7\u5f71\u54cd")),(0,o.kt)("p",null,"\u6587\u4ef6\u5b58\u50a8"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u79cd\u5b58\u50a8\u540e\u7aef\uff0c\u652f\u6301\u516c\u6709\u4e91\u3001\u79c1\u6709\u4e91\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u7ea7\u7f13\u5b58"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u539f\u5b50\u6027rename"),(0,o.kt)("li",{parentName:"ul"},"\u652f\u6301\u591a\u6302\u8f7d"),(0,o.kt)("li",{parentName:"ul"},"\u5143\u6570\u636e\u548c\u6570\u636e\u8282\u70b9\u5f39\u6027\u53ef\u6269\u5c55")),(0,o.kt)("p",null,"Block Storage"),(0,o.kt)("p",null,"Server:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Neutral node architecture. Use the central node to sense cluster nodes, load, capacity, and anomalies, and perform real-time scheduling and recovery of resources"),(0,o.kt)("li",{parentName:"ul"},"Consistency protocol for Quorum mechanism. Better fault tolerance for abnormal conditions, faster recovery under abnormal conditions, and improved service availability while ensuring reliability"),(0,o.kt)("li",{parentName:"ul"},"File pool. When the cluster is initialized, a file of a specified size is created to reduce the update overhead of file metadata during the IO process and reduce the IO delay."),(0,o.kt)("li",{parentName:"ul"},"IO paths are persisted once. For user io, most nodes in raft finish writing wal, and apply write to the cache to return"),(0,o.kt)("li",{parentName:"ul"},"raft lightweight snapshot. Read and write operations are idempotent, and raft snapshots only need to save the file name, which has no effect on io"),(0,o.kt)("li",{parentName:"ul"},"Snapshot upload to S3. Snapshots are stored to object storage that supports the S3 interface, and the number is not limited")),(0,o.kt)("p",null,"Client:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Striped design. Big io uses striping technology to shard on the client side to improve IO concurrency and allow more nodes to participate in IO processing"),(0,o.kt)("li",{parentName:"ul"},"ApplyIndex read. The client reads with applyIndex, without the need to follow the consistency protocol, so that the read will not be blocked by the write, which greatly improves the read performance"),(0,o.kt)("li",{parentName:"ul"},"Support multiple mounts. A file can be mounted to multiple clients, providing block-level write-once read-many"),(0,o.kt)("li",{parentName:"ul"},"Support hot upgrade. The client side uses the client-server architecture, and the version upgrade only needs to update the server, without the need to stop the service, which has a second-level impact on io")),(0,o.kt)("p",null,"File Storage"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Support multiple storage backends, support public cloud, private cloud deployment"),(0,o.kt)("li",{parentName:"ul"},"Support multi-level cache"),(0,o.kt)("li",{parentName:"ul"},"Support atomic rename"),(0,o.kt)("li",{parentName:"ul"},"Support multiple mounts"),(0,o.kt)("li",{parentName:"ul"},"Metadata and data nodes are elastically scalable")),(0,o.kt)("h3",{id:"6-curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u53ef\u7528\u6027\u6027\u80fd\u7b49\u65b9\u9762-are-there-any-shortcomings-in-curves-technical-architecture-such-as-reliability-availability-performance-etc"},"6. Curve\u6280\u672f\u67b6\u6784\u662f\u5426\u5b58\u5728\u77ed\u677f\uff1f\u6bd4\u5982\u5728\u53ef\u9760\u6027\u3001\u53ef\u7528\u6027\u3001\u6027\u80fd\u7b49\u65b9\u9762\uff1f/ Are there any shortcomings in Curve's technical architecture? such as reliability, availability, performance, etc."),(0,o.kt)("p",null,"\u4ece\u67b6\u6784\u4e0a\u6765\u8bf4\u662f\u6ca1\u6709\u7684\uff0c\u4ece\u5de5\u7a0b\u5b9e\u8df5\u4e0a\u6765\u770b\u8fd8\u6709\u5f88\u591a\u53ef\u4ee5\u4f18\u5316\u7684\u5730\u65b9\u3002\u6bd4\u5982bypass-kernel(spdk, rdma), curvefs\u4e00\u81f4\u6027\u534f\u8bae\u7684\u5feb\u7167\u4f18\u5316\u7b49"),(0,o.kt)("p",null,"There is no such thing in terms of architecture, and there are still many places that can be optimized in terms of engineering practice. For example, bypass-kernel (spdk, rdma), snapshot optimization of curvefs consistency protocol, etc."),(0,o.kt)("h3",{id:"7-curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\u5bf9\u65b0\u786c\u4ef6\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212-what-is-the-evolution-direction-of-curves-technical-architecture-what-are-the-plans-for-support-for-new-hardware-and-new-platforms"},"7. Curve\u6280\u672f\u67b6\u6784\u7684\u6f14\u8fdb\u65b9\u5411\u662f\u4ec0\u4e48\uff1f\u5bf9\u65b0\u786c\u4ef6\u3001\u65b0\u5e73\u53f0\u7684\u652f\u6301\u6709\u4f55\u89c4\u5212\uff1f/ What is the evolution direction of Curve's technical architecture? What are the plans for support for new hardware and new platforms?"),(0,o.kt)("p",null,"\u53ef\u4ee5\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Roadmap_CN"},"roadmap")),(0,o.kt)("p",null,"You can refer to the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Roadmap"},"roadmap")),(0,o.kt)("h3",{id:"8-curvebs\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae--is-curvebs-compatible-with-librbd-protocol"},"8. CurveBS\u662f\u5426\u517c\u5bb9librbd\u534f\u8bae\uff1f / Is CurveBS compatible with librbd protocol?"),(0,o.kt)("p",null,"\u6211\u4eec\u505a\u4e86\u63a2\u7d22\uff0c\u76ee\u524d\u5df2\u6709demo\u65b9\u6848\uff0c\u53ef\u4ee5\u5728openstack+libirt+qemu\u7684\u7ec4\u5408\u573a\u666f\u4e0b\u4f7f\u7528\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u6d4b\u8bd5\u4f18\u5316\uff0c\u76f8\u5173\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\u5b98\u7f51\u6216\u8005\u516c\u4f17\u53f7\u6587\u7ae0\u3002"),(0,o.kt)("p",null,"We have done some research and now have a demo solution that can be used in the combination scenario of openstack+libirt+qemu. Those who are interested can test the optimization. For relevant details, please refer to the official website or official account article."),(0,o.kt)("h2",{id:"\u529f\u80fd\u76f8\u5173"},"\u529f\u80fd\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230--where-can-i-find-a-list-of-curves-features"},"1. Curve\u7684\u529f\u80fd\u6e05\u5355\u5728\u54ea\u91cc\u53ef\u4ee5\u770b\u5230\uff1f / Where can I find a list of Curve's features?"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/wiki/Feature-list"},"https://github.com/opencurve/curve/wiki/Feature-list"))),(0,o.kt)("h3",{id:"2-curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt--can-curve-be-used-by-kubevirt"},"2. Curve\u662f\u5426\u53ef\u4ee5\u5bf9\u63a5kubevirt\uff1f / Can Curve be used by kubevirt?"),(0,o.kt)("p",null,"\u53ef\u4ee5\u901a\u8fc7Curve-CSI\u8fdb\u884c\u5bf9\u63a5\uff08\u4f9d\u8d56nbd\u5185\u6838\u6a21\u5757\uff09\uff0cCurve-CSI\u4ed3\u5e93\u5730\u5740\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"https://github.com/opencurve/curve-csi")),(0,o.kt)("p",null,"Can be connected through Curve-CSI (depending on nbd kernel module), Curve-CSI repository: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-csi"},"https://github.com/opencurve/curve-csi")),(0,o.kt)("h3",{id:"3-curve\u5bf9\u63a5qemu\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1qemu\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01--do-i-need-to-compile-qemu-by-myself-when-connecting-to-qemu-where-can-i-find-relevant-patches"},"3. Curve\u5bf9\u63a5QEMU\u662f\u5426\u8981\u81ea\u884c\u7f16\u8bd1QEMU\uff1f\u4ece\u54ea\u91cc\u627e\u5230\u76f8\u5173\u8865\u4e01\uff1f / Do I need to compile QEMU by myself when connecting to QEMU? Where can I find relevant patches?"),(0,o.kt)("p",null,"\u662f\u7684\uff0c\u9700\u8981\u7f16\u8bd1QEMU\uff0c\u8865\u4e01\u4ed3\u5e93\u5730\u5740\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("p",null,"Yes, you need to compile QEMU, patches repository: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("h3",{id:"4-curve\u5bf9\u63a5libvirt\u662f\u5426\u8981\u7f16\u8bd1libvirt\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6--do-i-need-to-compile-libvirt-by-myself-when-connecting-to-libvirt-where-can-i-find-relevant-patches"},"4. Curve\u5bf9\u63a5Libvirt\u662f\u5426\u8981\u7f16\u8bd1Libvirt\uff1f\u76f8\u5173\u8865\u4e01\u5728\u90a3\u91cc\u83b7\u53d6\uff1f / Do I need to compile Libvirt by myself when connecting to Libvirt? Where can I find relevant patches?"),(0,o.kt)("p",null,"\u662f\u7684\uff0c\u9700\u8981\u7f16\u8bd1Libvirt\uff0c\u8865\u4e01\u4ed3\u5e93\u5730\u5740\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("p",null,"Yes, you need to compile Libvirt, patches repository: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve-qemu-block-driver"},"https://github.com/opencurve/curve-qemu-block-driver")),(0,o.kt)("h3",{id:"5-curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\u6587\u4ef6\u5b58\u50a8\u5bf9\u8c61\u5b58\u50a8--does-curve-support-block-storage-file-storage-object-storage"},"5. Curve\u662f\u5426\u652f\u6301\u5757\u5b58\u50a8\uff1f\u6587\u4ef6\u5b58\u50a8\uff1f\u5bf9\u8c61\u5b58\u50a8\uff1f / Does Curve support block storage? file storage? Object storage?"),(0,o.kt)("p",null,"Curve\u652f\u6301\u5757\u5b58\u50a8\u3001\u6587\u4ef6\u5b58\u50a8\uff0c\u4e0d\u652f\u6301\u5bf9\u8c61\u5b58\u50a8\uff08\u57fa\u4e8e\u6587\u4ef6\u5b58\u50a8\u6269\u5c55\u652f\u6301S3\u534f\u8bae\u53ef\u901a\u8fc7\u7b2c\u4e09\u65b9gateway\u5b9e\u73b0\uff0c\u53ef\u67e5\u8be2Curve\u5b98\u7f51\u6587\u6863\u6216\u516c\u4f17\u53f7\u6587\u7ae0\u4e86\u89e3\u8be6\u60c5\uff09\u3002"),(0,o.kt)("p",null,"Curve supports block storage and file storage, but does not support object storage (supporting the S3 protocol based on the file storage extension can be implemented through a third-party gateway. You can check the Curve official website documentation or public account articles for details)."),(0,o.kt)("h3",{id:"6-curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\u7f13\u5b58\u7684\u53ef\u9760\u6027\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1--does-curve-support-client-side-caching-how-to-ensure-cache-reliability-and-data-consistency"},"6. Curve\u662f\u5426\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff1f\u7f13\u5b58\u7684\u53ef\u9760\u6027\u3001\u6570\u636e\u4e00\u81f4\u6027\u5982\u4f55\u4fdd\u8bc1\uff1f / Does Curve support client-side caching? How to ensure cache reliability and data consistency?"),(0,o.kt)("p",null,"CurveBS\u5757\u5b58\u50a8\u4e0d\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff0c\u670d\u52a1\u7aef\u7f13\u5b58\u53ef\u4ee5\u7406\u89e3\u4e3a\u662f\u6587\u4ef6\u7cfb\u7edf\u7684pagecache\u3002"),(0,o.kt)("p",null,"CurveFS\u6587\u4ef6\u5b58\u50a8\u652f\u6301\u5ba2\u6237\u7aef\u7f13\u5b58\uff0c\u5305\u62ec\u5185\u5b58\u3001\u78c1\u76d8\u3001\u5206\u5e03\u5f0fkv \u4e09\u79cd\u5f62\u6001\uff1a\u5185\u5b58\u7f13\u5b58\u7684\u6570\u636e\u53ef\u9760\u6027\u65e0\u6cd5\u4fdd\u8bc1\uff08\u9075\u5faaPOSIX\u8bed\u4e49\uff0c\u672aflush\u6216\u8005close\u7684\u6570\u636e\u53ef\u80fd\u4e22\u5931\uff09\uff1b\u78c1\u76d8\u7f13\u5b58\u9700\u8981\u7531\u78c1\u76d8\u672c\u8eab\u53ef\u9760\u6027\u4fdd\u8bc1\uff08\u5efa\u8bae\u4f7f\u7528RAID1\u7b49\u5197\u4f59\u6a21\u5f0f\uff09\u3002\u591a\u5ba2\u6237\u7aef\u7684\u7f13\u5b58\u6570\u636e\u4e00\u81f4\u6027\u65e0\u6cd5\u4fdd\u8bc1\uff0c\u4f46\u4f1a\u5b9a\u671f\u66f4\u65b0\uff0c\u5982\u679c\u6709\u5f3a\u4e00\u81f4\u6027\u9700\u6c42\uff0c\u5efa\u8bae\u5173\u95ed\u78c1\u76d8\u7f13\u5b58\u3002"),(0,o.kt)("p",null,"\u6709\u5173\u7f13\u5b58\u7684\u5b9e\u73b0\u7ec6\u8282\u53ef\u4ee5\u53c2\u8003\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve%E6%BA%90%E7%A0%81%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BB#16-caches"},"Caches")),(0,o.kt)("p",null,"CurveBS block storage does not support client-side caching, and server-side caching can be understood as the pagecache of the file system."),(0,o.kt)("p",null,"CurveFS file storage supports client-side caching, including memory and disk: the data reliability of memory cache cannot be guaranteed (following POSIX semantics, data that is not flushed or closed may be lost); disk caching needs to be guaranteed by the reliability of the disk itself (recommended Use redundant modes such as RAID1). The cache data consistency of multiple clients cannot be guaranteed, but it will be updated regularly. If there is a strong consistency requirement, it is recommended to turn off the disk cache."),(0,o.kt)("p",null,"The implementation details of the cache can refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/wiki/Curve%E6%BA%90%E7%A0%81%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%B5%81%E7%A8%8B%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BB#16-caches"},"Caches"),"."),(0,o.kt)("h3",{id:"7-curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684waldb\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e--does-the-curve-server-support-disk-caching-or-how-to-configure-the-waldb-cache-disk-similar-to-ceph"},"7. Curve\u670d\u52a1\u7aef\u662f\u5426\u652f\u6301\u78c1\u76d8\u7f13\u5b58\uff1f\u6216\u8005\u8bf4\u7c7b\u4f3cceph\u7684wal/db\u7f13\u5b58\u76d8\u5982\u4f55\u914d\u7f6e\uff1f / Does the Curve server support disk caching? Or how to configure the wal/db cache disk similar to ceph?"),(0,o.kt)("p",null,"CurveBS 1.2.7\u7248\u672c\u5df2\u652f\u6301\u6df7\u5408\u5b58\u50a8\uff08\u6df7\u95ea\uff09\uff0c\u652f\u6301\u4f7f\u7528NVME\u505aHDD\u7684\u7f13\u5b58\u76d8\u8fdb\u884c\u52a0\u901f\uff0ccurveadm\u5de5\u5177\u5df2\u652f\u6301\u90e8\u7f72\uff0c\u5982\u6709\u95ee\u9898\u6b22\u8fce\u5fae\u4fe1\u7b49\u6e20\u9053\u8054\u7cfb\u6211\u4eec\u3002"),(0,o.kt)("p",null,"CurveBS version 1.2.7 already supports hybrid storage (mixed flash) and supports the use of NVME as HDD cache disk for acceleration. The curveadm tool has supported deployment. If you have any questions, please contact us through WeChat and other channels."),(0,o.kt)("h3",{id:"8-curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60--does-curve-support-different-disk-types-to-form-different-storage-pools"},"8. Curve\u662f\u5426\u652f\u6301\u4e0d\u540c\u78c1\u76d8\u7c7b\u578b\u7ec4\u6210\u4e0d\u540c\u7684\u5b58\u50a8\u6c60\uff1f / Does Curve support different disk types to form different storage pools?"),(0,o.kt)("p",null,"CurveBS 1.2.7\u7248\u672c\u5df2\u652f\u6301poolset\u529f\u80fd\uff0c\u6bcf\u4e2apoolset\u5bf9\u5e94\u4e00\u4e2a\u78c1\u76d8\u7c7b\u578b\uff0c\u53ef\u5305\u542b\u591a\u4e2apool\uff0c\u652f\u6301\u589e\u52a0pool\u7684\u65b9\u5f0f\u6765\u6269\u5bb9poolset\u3002"),(0,o.kt)("p",null,"CurveBS version 1.2.7 already supports the poolset function. Each poolset corresponds to a disk type and can contain multiple pools. It supports adding pools to expand the poolset."),(0,o.kt)("h3",{id:"9-curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\u662f\u5426\u652f\u6301\u7f29\u5bb9--does-curve-support-storage-pool-scale-out-does-it-support-scale-in"},"9. Curve\u662f\u5426\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\uff1f\u662f\u5426\u652f\u6301\u7f29\u5bb9\uff1f / Does Curve support storage pool scale-out? Does it support scale-in?"),(0,o.kt)("p",null,"\u652f\u6301\u5b58\u50a8\u6c60\u6269\u5bb9\uff0c\u6682\u4e0d\u652f\u6301\u7f29\u5bb9\u3002"),(0,o.kt)("p",null,"Storage pool scale-out is supported, but shrinking(or scale-in) is not currently supported."),(0,o.kt)("h3",{id:"10-curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de--does-curve-support-recyclebin-can-the-deleted-volume-or-directory-be-recovered"},"10. Curve\u662f\u5426\u652f\u6301\u56de\u6536\u7ad9\uff1f\u5220\u9664\u7684\u5377\u6216\u8005\u76ee\u5f55\u662f\u5426\u8fd8\u80fd\u627e\u56de\uff1f / Does Curve support RecycleBin? Can the deleted volume or directory be recovered?"),(0,o.kt)("p",null,"CurveBS\u5377\u652f\u6301\u56de\u6536\u7ad9\u529f\u80fd\uff0c\u5220\u9664\u7684\u5377\u5728\u56de\u6536\u7ad9\u6e05\u7406\u524d\u53ef\u4ee5\u627e\u56de\u3002CurveFS\u56de\u6536\u7ad9\u529f\u80fd\u4e5f\u5728\u5f00\u53d1\u4e2d\u3002"),(0,o.kt)("p",null,"CurveBS volumes support RecycleBin, and deleted volumes can be retrieved before the RecycleBin is cleaned. CurveFS RecycleBin feature is also under development."),(0,o.kt)("h3",{id:"11-curve\u662f\u5426\u652f\u6301xx\u786c\u4ef6\u5982optanenvmerdma\u7f51\u5361\u7b49--does-curve-support-xx-hardware-such-as-optane-nvme-rdma-network-cards-etc"},"11. Curve\u662f\u5426\u652f\u6301XX\u786c\u4ef6\uff08\u5982Optane\u3001NVMe\u3001RDMA\u7f51\u5361\u7b49\uff09\uff1f / Does Curve support XX hardware (such as Optane, NVMe, RDMA network cards, etc.)?"),(0,o.kt)("p",null,"Curve\u672c\u8eab\u5bf9\u786c\u4ef6\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u4f46\u8981\u5229\u7528\u597d\u8fd9\u4e9b\u65b0\u578b\u786c\u4ef6\uff0c\u8fd8\u9700\u8981\u8f6f\u4ef6\u7684\u4f18\u5316\u914d\u5408\uff0c\u8fd9\u4e9b\u90fd\u5728\u8ba1\u5212\u4e2d\uff0c\u6709\u4e9b\u5df2\u7ecf\u5728\u5f00\u53d1\u4e2d\uff0c\u5177\u4f53\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u8bba\u575b\u3001\u5fae\u4fe1\u7fa4\u7b49\u6e20\u9053\u8054\u7cfb\u6211\u4eec\u8fdb\u884c\u8be6\u7ec6\u4ea4\u6d41\u3002"),(0,o.kt)("p",null,"Curve itself has no special requirements for hardware, but to make good use of these new hardware, software optimization is also required. These are all planned, and some are already under development. For specific questions, please contact us through forums, WeChat groups and other channels for detailed communication."),(0,o.kt)("h3",{id:"12-curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f--how-much-storage-resources-does-curvefs-metadata-occupy"},"12. Curvefs\u7684\u5143\u6570\u636e\u5360\u7528\u8d44\u6e90\u5927\u5c0f\uff1f / How much storage resources does Curvefs metadata occupy?"),(0,o.kt)("p",null,"\u6211\u4eec\u4e4b\u524d\u6d4b\u8bd59\u4e2ametaserver\u7684\u96c6\u7fa4\uff0c\u901a\u8fc7mdtest\u6d4b\u8bd5\uff0c\u5927\u6982\u521b\u5efa2.2 Bil\u6587\u4ef6\u65f6\uff0c\u5355metaesrver\u5360\u7528\u5185\u5b5811GB\uff0c\u5360\u7528\u78c1\u76d8330GB\u3002"),(0,o.kt)("p",null,"We tested a cluster of 9 metaservers before. Through the mdtest test, when creating a 2.2 Bil file, a single metaesrver occupies 11GB of memory and 330GB of disk."),(0,o.kt)("h2",{id:"\u6027\u80fd\u76f8\u5173"},"\u6027\u80fd\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684-what-does-curves-performance-metrics-look-like"},"1. Curve\u7684\u6027\u80fd\u6307\u6807\u662f\u4ec0\u4e48\u6837\u7684\uff1f/ What does Curve's performance metrics look like?"),(0,o.kt)("p",null,"\u5757\u5b58\u50a8\uff1a",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md"},"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md")),(0,o.kt)("p",null,"\u6587\u4ef6\u5b58\u50a8\uff1arelease2.3\u6d4b\u8bd5\u4e4b\u540e\u66f4\u65b0\u6570\u636e"),(0,o.kt)("p",null,"Block Storage: ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md"},"https://github.com/opencurve/curve/blob/master/CHANGELOG-1.2.md")),(0,o.kt)("p",null,"File storage: update data after release2.3 test"),(0,o.kt)("h3",{id:"2-curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd-what-hardware-specifications-curve-has-tested-for-performance"},"2. Curve\u6d4b\u8bd5\u8fc7\u54ea\u4e9b\u786c\u4ef6\u89c4\u683c\u4e0b\u7684\u6027\u80fd\uff1f/ What hardware specifications Curve has tested for performance?"),(0,o.kt)("p",null,"\u5757\u5b58\u50a8\uff1aNVME+HDD\u3001Sata SSD\u3001NVME"),(0,o.kt)("p",null,"\u6587\u4ef6\u5b58\u50a8\uff1a\u5143\u6570\u636e Sata SSD; \u6570\u636e S3"),(0,o.kt)("p",null,"Block Storage: NVME+HDD, Sata SSD, NVME"),(0,o.kt)("p",null,"File Storage: Metadata Sata SSD; Data S3"),(0,o.kt)("h3",{id:"3-curve\u7684\u6027\u80fd\u76f8\u6bd4ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684-the-performance-of-curve-is-much-higher-than-that-of-ceph-how-is-it-done"},"3. Curve\u7684\u6027\u80fd\u76f8\u6bd4Ceph\u9ad8\u4e0d\u5c11\u662f\u600e\u4e48\u505a\u5230\u7684\uff1f/ The performance of Curve is much higher than that of Ceph. How is it done?"),(0,o.kt)("p",null,"\u4ece\u67b6\u6784\u4e0a\u6765\u8bf4\uff0cCurveBS\u4f7f\u7528Quorum\u673a\u5236\u7684\u4e00\u81f4\u6027\u534f\u8bae\uff0c\u5199\u5927\u591a\u6570\u8fd4\u56de\uff0c\u5ef6\u8fdf\u53d6\u51b3\u4e8e\u591a\u526f\u672c\u6700\u5feb\u7684\u5927\u591a\u6570; Ceph\u4f7f\u7528\u5f3a\u4e00\u81f4\u534f\u8bae\uff0c\u5199\u6240\u6709\u526f\u672c\u8fd4\u56de\uff0c\u5ef6\u8fdf\u53d6\u51b3\u4e8e\u6700\u6162\u7684\u90a3\u4e00\u4e2a\u3002\u5de5\u7a0b\u5b9e\u8df5\u7684\u7ec6\u8282\u4e0a\u5c31\u5f88\u96be\u4e00\u4e00\u505a\u5bf9\u6bd4\u4e86"),(0,o.kt)("p",null,"Architecturally, CurveBS uses the consensus protocol of the Quorum mechanism, writing the majority to return, and the delay depends on the fastest majority of multiple copies; Ceph uses a strong consensus protocol, writing all copies to return, and the delay depends on the slowest one. It is difficult to compare the details of engineering practice."),(0,o.kt)("p",null,"CurveFS \u5219\u4e3b\u8981\u901a\u8fc7\u8f7b\u91cf\u7ea7\u7684CTO\u4e00\u81f4\u6027\u4fdd\u8bc1\uff0c\u4ee5\u53ca\u5143\u6570\u636e\u548c\u6570\u636e\u591a\u7ea7\u7f13\u5b58\u6765\u5b9e\u73b0\u66f4\u4f18\u5f02\u7684\u6027\u80fd\u3002"),(0,o.kt)("p",null,"CurveFS mainly achieves better performance through lightweight CTO consistency guarantees and multi-level caching of metadata and data."),(0,o.kt)("h3",{id:"4-curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\u6f14\u8fdb\u65b9\u5411\u662f-what-are-curves-plans-for-performance-optimization-what-is-the-direction-of-evolution"},"4. Curve\u5728\u6027\u80fd\u4f18\u5316\u65b9\u9762\u7684\u89c4\u5212\u6709\u54ea\u4e9b\uff1f\u6f14\u8fdb\u65b9\u5411\u662f\uff1f/ What are Curve's plans for performance optimization? What is the direction of evolution"),(0,o.kt)("p",null,"\u91cd\u70b9\u8003\u8651\u70b9\u662f\u5de5\u7a0b\u5b9e\u8df5\u4e0a\u7684\uff1a\u78c1\u76d8io\u548c\u7f51\u7edcio\u53ef\u4ee5bypass kernel\uff0c\u652f\u6301\u66f4\u9ad8\u6027\u80fd\u7684\u78c1\u76d8"),(0,o.kt)("p",null,"\u66f4\u591a\u5730\u53ef\u4ee5\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://docs.opencurve.io/category/roadmap"},"roadmap")),(0,o.kt)("p",null,"The key consideration is engineering practice: disk io and network io can bypass the kernel and support higher-performance disks."),(0,o.kt)("p",null,"For more information, please refer to the ",(0,o.kt)("a",{parentName:"p",href:"https://docs.opencurve.io/category/roadmap"},"roadmap"),"."),(0,o.kt)("h3",{id:"5-curve-\u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd"},"5. Curve \u5f53\u524d\u7684\u6027\u80fd\u74f6\u9888\u70b9\u662f\u4ec0\u4e48\uff1f\u4f1a\u4e0d\u4f1a\u5bf9\u6211\u7684\u4e1a\u52a1\u4ea7\u751f\u5f71\u54cd\uff1f"),(0,o.kt)("p",null,"CurveBS\u7684\u6027\u80fd\u74f6\u9888\u9700\u8981\u9488\u5bf9\u5177\u4f53\u7684\u5b58\u50a8\u4ecb\u8d28\u6765\u8ba8\u8bba\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u4e8e\u56fa\u6001\u76d8\u6bd4\u5982NVMe\u76d8\uff0c\u74f6\u9888\u70b9\u4e00\u822c\u5728\u7f51\u7edc\u65f6\u5ef6\u548cIO\u534f\u8bae\u6808\u4ee5\u53caIO\u5904\u7406\u7684\u7ebf\u7a0b\u6a21\u578b\u7b49\u51e0\u4e2a\u65b9\u9762\uff0c\u6211\u4eec\u5728\u7f51\u7edc\u65b9\u9762\u652f\u6301\u4e86RDMA\uff0c\u5728IO\u534f\u8bae\u6808\u65b9\u9762\u652f\u6301\u4e86SPDK\uff0cIO\u5904\u7406\u7ebf\u7a0b\u6211\u4eec\u57fa\u4e8eBRPC\u548cSPDK\u6846\u67b6\u5b9e\u73b0\u4e86\u96f6\u62f7\u8d1d\uff0c\u5f53\u7136\u8fd8\u6709\u5f88\u591a\u9700\u8981\u4f18\u5316\u7684\u70b9\uff0c\u6b22\u8fce\u53c2\u4e0e\u8d21\u732e\u3002"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u4e8eHDD\uff0c\u6211\u4eec\u76ee\u524d\u8fd8\u6ca1\u6709\u5f88\u597d\u7684\u652f\u6301\uff0c\u56e0\u6b64\u4e0d\u63a8\u8350\u4f7f\u7528\uff0c\u5efa\u8bae\u914d\u5408NVMe\u7f13\u5b58\u76d8\u505a\u6df7\u95ea\uff08\u6df7\u5408\u5b58\u50a8\uff09\u90e8\u7f72"),(0,o.kt)("li",{parentName:"ul"},"\u53e6\u5916\u6211\u4eec\u5728\u987a\u5e8f\u5927IO\u7684\u5199\u5165\u65b9\u9762\u4e5f\u6709\u4e00\u5b9a\u7684\u6027\u80fd\u74f6\u9888\uff0c\u539f\u56e0\u5728\u7528raft\u7684wal\u548cdata\u53cc\u5199\u5bfc\u81f4\u7684\u5199\u653e\u5927\u95ee\u9898\uff0c\u6211\u4eec\u5df2\u7ecf\u5728\u8bbe\u8ba1\u65b9\u6848\u89e3\u51b3\u4e2d")),(0,o.kt)("p",null,"CurveFS\u7684\u6027\u80fd\u74f6\u9888\u4e3b\u8981\u5305\u62ec\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5143\u6570\u636e\u7684rename\u64cd\u4f5c\uff0c\u76ee\u524d\u5df2\u7ecf\u5728\u5f00\u53d1\u4f18\u5316\u4e2d"),(0,o.kt)("li",{parentName:"ul"},"\u5143\u6570\u636e\u7684\u7f51\u7edc\u8bbf\u95ee\u65f6\u5ef6\uff0c\u6211\u4eec\u8ba1\u5212\u652f\u6301\u5ba2\u6237\u7aef\u5230\u5143\u6570\u636e\u670d\u52a1\u7aef\u7684RDMA\u7f51\u7edc"),(0,o.kt)("li",{parentName:"ul"},"\u5bf9\u8c61\u5b58\u50a8\u6570\u636e\u540e\u7aef\u7684\u541e\u5410\u548cIOPS\u9650\u5236\uff0c\u76ee\u524d\u6211\u4eec\u662f\u901a\u8fc7\u591a\u7ea7\u7f13\u5b58\u6765\u52a0\u901f")),(0,o.kt)("p",null,"\u8fd9\u4e9b\u74f6\u9888\u70b9\u4e00\u822c\u4e0d\u5f71\u54cd\u666e\u901a\u4e1a\u52a1\u7684\u4f7f\u7528\uff0c\u5982\u679c\u6709\u6781\u7aef\u7684\u6027\u80fd\u9700\u6c42\uff0c\u6b22\u8fce\u4e0e\u6211\u4eec\u4ea4\u6d41\u63a2\u8ba8\u3002"),(0,o.kt)("p",null,"The performance bottleneck of CurveBS needs to be discussed based on specific storage media:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"For solid-state disks such as NVMe disks, bottlenecks generally lie in network latency, IO protocol stack, and IO processing thread model. We support RDMA in the network, SPDK in the IO protocol stack, and IO processing threads. We have implemented zero copy based on the BRPC and SPDK frameworks. Of course, there are still many points that need to be optimized. Welcome to contribute."),(0,o.kt)("li",{parentName:"ul"},"For HDD, we currently do not have good support, so it is not recommended to use it. It is recommended to use NVMe cache disk for hybrid flash (hybrid storage) deployment"),(0,o.kt)("li",{parentName:"ul"},"In addition, we also have certain performance bottlenecks in sequential large IO writing. The reason is the write amplification problem caused by double writing of wal and data in raft, which we are already solving in the design plan.")),(0,o.kt)("p",null,"The performance bottlenecks of CurveFS mainly include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The rename operation of metadata is currently under development and optimization."),(0,o.kt)("li",{parentName:"ul"},"Metadata network access delay, we plan to support RDMA network from client to metadata server"),(0,o.kt)("li",{parentName:"ul"},"The throughput and IOPS limitations of the object storage data backend are currently accelerated by multi-level caching.")),(0,o.kt)("p",null,"These bottlenecks generally do not affect the use of ordinary services. If you have extreme performance requirements, please feel free to discuss them with us."),(0,o.kt)("h2",{id:"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173"},"\u4e91\u539f\u751f\u6570\u636e\u5e93\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\u4ee5polardb-for-pg\u4e3a\u4f8b"},"1. Curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u662f\u4ec0\u4e48\u6837\u7684\uff08\u4ee5polardb for pg\u4e3a\u4f8b\uff09\uff1f"),(0,o.kt)("p",null,"Curve\u652f\u6301\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u67b6\u6784\u65b9\u5f0f\u662f\u91c7\u7528\u4e86curvebs + polarfs + pg\u7684\u67b6\u6784\uff0c\u5373\u4f7f\u7528curve\u5757\u5b58\u50a8\u4f5c\u4e3a\u5e95\u5c42\u5b58\u50a8\u5f15\u64ce\uff0c\u5728\u6b64\u4e4b\u4e0a\u901a\u8fc7\u9002\u914dpolarfs\u63d0\u4f9b\u9ad8\u6027\u80fd\u6587\u4ef6\u63a5\u53e3\uff08\u8fd9\u90e8\u5206\u5de5\u4f5c\u5f00\u6e90\u5728\u8fd9\u4e2a\u4ed3\u5e93 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio"},"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio")," \uff09\uff0c\u4ece\u800c\u652f\u6301\u8fd0\u884cpolardb for pg\u7b49\u57fa\u4e8e\u5171\u4eab\u5b58\u50a8\u7684\u4e91\u539f\u751f\u6570\u636e\u5e93\u3002"),(0,o.kt)("p",null,"What is the architecture of Curve supporting cloud native database (take polardb for pg as an example)?"),(0,o.kt)("p",null,"Curve supports cloud native database architecture by using curvebs + polarfs + pg architecture, that is, using curve block storage as the underlying storage engine, on top of which it provides a high-performance file interface by adapting polarfs (this part of the work is open source in this warehouse ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio"},"https://github.com/opencurve/PolarDB-FileSystem/tree/curvebs_sdk_devio")," ), which supports running cloud-native databases based on shared storage such as polardb for pg."),(0,o.kt)("h3",{id:"2-curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e"},"2. Curve\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\u7684\u6027\u80fd\u8868\u73b0\u5982\u4f55\uff1f\u6709\u65e0\u76f8\u5173\u6307\u6807\u6570\u636e\uff1f"),(0,o.kt)("p",null,"curvebs\u5728\u4e91\u539f\u751f\u6570\u636e\u5e93\u573a\u666f\u4e0b\uff0c\u4ece\u521d\u6b65\u6027\u80fd\u6d4b\u8bd5\u6765\u770b\uff08\u4e09\u8282\u70b9sata SSD\uff09\uff0c\u5199\u6027\u80fd\u8fbe\u5230800\u81f3900us\u7684\u65f6\u5ef6\uff0c\u8bfb\u6027\u80fd\u53ef\u4ee5\u8fbe\u5230200\u81f3300us\u7684\u65f6\u5ef6\u3002"),(0,o.kt)("p",null,"How does Curve perform in cloud native database scenarios? Is there any relevant indicator data?"),(0,o.kt)("p",null,"In the cloud native database scenario of curvebs, from the preliminary performance test, the write performance can reach a latency of 800 to 900us, and the read performance can reach a latency of 200 to 300us."),(0,o.kt)("h3",{id:"3-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7"},"3. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f"),(0,o.kt)("p",null,"curvebs + polarfs\u7684\u65b9\u6848\uff0c\u4f5c\u4e3a\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5c42\uff0c\u662f\u6bd4\u8f83\u901a\u7528\u7684\u65b9\u6848\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5176\u4ed6\u4e91\u539f\u751f\u6570\u636e\u5e93\u7684\u5b58\u50a8\u5e95\u5ea7\u7684\u3002"),(0,o.kt)("p",null,"Can Curve be used as a storage base for other cloud-native databases?"),(0,o.kt)("p",null,"The solution of curvebs + polarfs, as the storage bottom layer of cloud-native databases, is a relatively general solution and can be used as a storage base for other cloud-native databases."),(0,o.kt)("h3",{id:"4-curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafkarediselastic-search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7"},"4. Curve\u662f\u5426\u53ef\u4ee5\u4f5c\u4e3akafka\u3001redis\u3001Elastic Search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7\uff1f"),(0,o.kt)("p",null,"curvebs + polarfs\u4f5c\u4e3a\u5b58\u50a8\u5e95\u5c42\uff0c\u540c\u6837\u53ef\u4ee5\u63d0\u4f9b\u4f5c\u4e3akafka\u3001redis\u3001Elastic Search\u7b49\u4e2d\u95f4\u4ef6\u7684\u5b58\u50a8\u5e95\u5ea7\uff0c\u4f46\u662f\u76f8\u5e94\u7684\uff0c\u7c7b\u6bd4\u4e0e\u4e91\u539f\u751f\u6570\u636e\u5e93\u4e4b\u4e8emysql\u548cpgsql\uff0c\u9700\u8981\u5bf9\u8fd9\u4e9b\u7ec4\u4ef6\u7684\u5b58\u50a8\u5c42\u8fdb\u884c\u4e00\u5b9a\u7684\u9002\u914d\u6539\u9020\u3002"),(0,o.kt)("p",null,"Can Curve be used as a storage base for middleware such as kafka, redis, and Elastic Search?"),(0,o.kt)("p",null,"As the storage bottom layer, curvebs + polarfs can also provide a storage base for middleware such as kafka, redis, and Elastic Search, but correspondingly, analogy with cloud native databases for mysql and pgsql, the storage layer of these components needs to be retrofit."),(0,o.kt)("h2",{id:"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173"},"\u5f00\u53d1\u6d4b\u8bd5\u76f8\u5173"),(0,o.kt)("h3",{id:"1-curve-\u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa-how-to-build-the-curve-compilation-environment"},"1. Curve \u7f16\u8bd1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f/ How to build the Curve compilation environment?"),(0,o.kt)("p",null,"\u5173\u4e8e CurveBS \u7f16\u8bd1\u73af\u5883\u7684\u642d\u5efa\uff0c\u53ef\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/docs/cn/build_and_run.md"},"\u7f16\u8bd1\u73af\u5883\u642d\u5efa"),"\uff0c\u6587\u6863\u4e2d\u63d0\u4f9b\u4e86\u7269\u7406\u673a\u548c Docker \u4e24\u79cd\u7f16\u8bd1\u65b9\u5f0f\u3002"),(0,o.kt)("p",null,"\u800c CurveFS \u6211\u4eec\u6b63\u5728\u5feb\u901f\u8fed\u4ee3\u4e2d\uff0c\u76ee\u524d\u4e5f\u5df2\u63d0\u4f9b\u7269\u7406\u673a\u548c Docker \u4e24\u79cd\u7f16\u8bd1\u65b9\u5f0f\uff0c\u4f46\u76f8\u5e94\u6587\u6863\u4ecd\u5728\u5b8c\u5584\u4e2d\uff0c\u4e0d\u8fc7\u4f60\u53ef\u4ee5\u5728\u4ee5\u4e0b 2 \u4e2a\u76ee\u5f55\u4e2d\u627e\u5230\u4f60\u9700\u8981\u7684\u4fe1\u606f\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs"},"CurveFS \u4e3b\u76ee\u5f55")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/tree/master/curvefs/docker"},"CurveFS Docker \u76ee\u5f55"))),(0,o.kt)("p",null,"\u7279\u522b\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u4e3a\u7269\u7406\u673a\u7f16\u8bd1\u73af\u5883\uff0c\u63d0\u4f9b\u4e86 Makefile\uff0c\u4f60\u53ef\u4ee5\u5229\u7528\u6b64\u6765\u5feb\u901f\u7f16\u8bd1\u3001\u6253\u955c\u50cf\u7528\u6765\u6d4b\u8bd5\uff0c\u4f60\u53ef\u4ee5\u67e5\u770b\u76f8\u5e94\u7684 Makefile \u6765\u719f\u6089\u76f8\u5173\u7684\u4f7f\u7528\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/Makefile"},"Makefile for CurveBS")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/opencurve/curve/blob/master/curvefs/Makefile"},"Makefile for CurveFS"))),(0,o.kt)("p",null,"For the construction of the CurveBS compilation environment, please refer to Compilation Environment Construction. The documentation provides two compilation methods: physical machine and Docker."),(0,o.kt)("p",null,"As for CurveFS, we are iterating rapidly. Currently, we have provided two compilation methods: physical machine and Docker, but the corresponding documents are still being perfected, but you can find the information you need in the following two directories:"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/master/curvefs"},"CurveFS home directory"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/master/curvefs/docker"},"CurveFS Docker Directory")),(0,o.kt)("p",null,"It should be noted that we provide a Makefile for the physical machine compilation environment. You can use this to quickly compile and mirror images for testing. You can view the corresponding Makefile to familiarize yourself with related uses:"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/Makefile"},"Makefile for CurveBS"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/curvefs/Makefile"},"Makefile for CurveFS")),(0,o.kt)("h3",{id:"2-curve-\u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\u6211\u60f3\u8c03\u8bd5-curve-\u4ee3\u7801\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4-how-to-build-the-curve-development-environment-i-want-to-debug-curve-code-how-do-i-deploy-a-minimal-development-cluster"},"2. Curve \u5f00\u53d1\u73af\u5883\u600e\u4e48\u642d\u5efa\uff1f\u6211\u60f3\u8c03\u8bd5 Curve \u4ee3\u7801\uff0c\u600e\u4e48\u90e8\u7f72\u4e00\u5957\u6700\u5c0f\u89c4\u6a21\u7684\u5f00\u53d1\u96c6\u7fa4\uff1f/ How to build the Curve development environment? I want to debug Curve code, how do I deploy a minimal development cluster?"),(0,o.kt)("p",null,"\u4f60\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0a\u642d\u5efa\u4e00\u4e2a\u7f16\u8bd1\u73af\u5883\uff0c\u5e76\u4f7f\u7528 ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," \u90e8\u7f72\u4e00\u4e2a\u5355\u673a\u5668\u7684\u96c6\u7fa4\u3002"),(0,o.kt)("p",null,"You can refer to the above to build a compilation environment and use ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm"},"CurveAdm")," to deploy a single-machine cluster."),(0,o.kt)("h3",{id:"3-curve-\u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\u6211\u5982\u679c\u8981\u7ed9-curve-\u8d21\u732e\u4ee3\u7801\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801-what-are-the-types-of-curve-test-codes-if-i-want-to-contribute-code-to-curve-what-test-cases-or-test-code-do-i-need-to-add"},"3. Curve \u6d4b\u8bd5\u4ee3\u7801\u6709\u54ea\u4e9b\u7c7b\u578b\uff1f\u6211\u5982\u679c\u8981\u7ed9 Curve \u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u8865\u5145\u54ea\u4e9b\u6d4b\u8bd5\u7528\u4f8b\u6216\u6d4b\u8bd5\u4ee3\u7801\uff1f/ What are the types of Curve test codes? If I want to contribute code to Curve, what test cases or test code do I need to add?"),(0,o.kt)("p",null,"Curve \u7684\u6d4b\u8bd5\u4ee3\u7801\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u7c7b\uff1a"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"\u5355\u5143\u6d4b\u8bd5"),(0,o.kt)("li",{parentName:"ul"},"\u96c6\u6210\u6d4b\u8bd5"),(0,o.kt)("li",{parentName:"ul"},"\u5f02\u5e38\u6d4b\u8bd5")),(0,o.kt)("p",null,"\u6211\u4eec\u6b22\u8fce\u5927\u5bb6\u7ed9 Curve \u793e\u533a\u505a\u4efb\u4f55\u8d21\u732e\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4ee3\u7801\u3001\u6587\u6863\u3001issue\u3002\u5982\u679c\u4f60\u7684\u8d21\u732e\u6709\u6d89\u53ca\u4ee3\u7801\u7684\u4fee\u6539\uff0c\u6211\u4eec\u5e0c\u671b\u4f60\u80fd\u8865\u5145\u8fd9\u90e8\u5206\u4ee3\u7801\u6240\u6d89\u53ca\u7684\u5355\u5143\u6d4b\u8bd5\uff0c\u5e76\u5c3d\u53ef\u80fd\u5730\u63d0\u9ad8\u6d4b\u8bd5\u7684\u8986\u76d6\u7387\uff0c\u5c06\u5176\u4fdd\u6301\u5728 ",(0,o.kt)("inlineCode",{parentName:"p"},"85%")," \u4ee5\u4e0a\uff08\u5f53\u4f60\u63d0\u4ea4\u76f8\u5173 PR \u89e6\u53d1\u6211\u4eec\u7684 CI \u65f6\uff0c\u6211\u4eec\u4f1a\u81ea\u52a8\u7edf\u8ba1\u4ee3\u7801\u7684\u8986\u76d6\u7387\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u6b64\u6765\u6821\u6b63\u8986\u76d6\u7387\uff09\u3002"),(0,o.kt)("p",null,"Curve's test code mainly includes the following categories:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"unit test"),(0,o.kt)("li",{parentName:"ul"},"Integration Testing"),(0,o.kt)("li",{parentName:"ul"},"exception test")),(0,o.kt)("p",null,"We welcome everyone to make any contributions to the Curve community, including but not limited to code, documentation, and issues. If your contribution involves modification of code, we hope you can supplement the unit tests involved in this part of the code, and improve the test coverage as much as possible, keeping it above 85% (when you submit the relevant PR, we will trigger our During CI, we will automatically count the coverage of the code, you can use this to correct the coverage)."),(0,o.kt)("h2",{id:"\u5982\u4f55\u8d21\u732e\u4ee3\u7801"},"\u5982\u4f55\u8d21\u732e\u4ee3\u7801"),(0,o.kt)("h3",{id:"1-\u6211\u60f3\u7ed9curve\u8d21\u732e\u4ee3\u7801\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c-i-want-to-contribute-code-to-curve-what-preparations-need-to-be-done-in-advance"},"1. \u6211\u60f3\u7ed9Curve\u8d21\u732e\u4ee3\u7801\uff0c\u9700\u8981\u63d0\u524d\u5b8c\u6210\u54ea\u4e9b\u51c6\u5907\u5de5\u4f5c\uff1f/ I want to contribute code to Curve, what preparations need to be done in advance"),(0,o.kt)("p",null,"\u4ee3\u7801\u5f00\u53d1\u5b8c\u6210\u4e4b\u540e\uff0c\u63d0",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/compare"},"pr"),"\u5230curve\u7684master\u5206\u652f\u3002\u63d0\u4ea4pr\u65f6\uff0c\u8bf7\u586b\u5199pr\u6a21\u677f\u3002pr\u63d0\u4ea4\u4e4b\u540e\u4f1a\u81ea\u52a8\u89e6\u53d1CI\uff0cCI\u901a\u8fc7\u5e76\u4e14\u7ecf\u8fc7review\u4e4b\u540e\uff0c\u4ee3\u7801\u624d\u53ef\u5408\u5165\u3002CI\u7684Jenkins\u7528\u6237\u540d\u5bc6\u7801\u4e3anetease/netease\uff0c\u5982\u9047\u5230CI\u8fd0\u884c\u5931\u8d25\u53ef\u4ee5\u767b\u5f55Jenkins\u5e73\u53f0\u67e5\u770b\u5931\u8d25\u539f\u56e0\u3002 \u5177\u4f53\u89c4\u5219\u8bf7\u89c1",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CONTRIBUTING.md"},"CONTRIBUTING"),"."),(0,o.kt)("p",null,"After finishing the development of your code, you should submit a pull request to master branch of CURVE and fill out a pull request template. The pull request will trigger the CI automatically, and the code will only be merged after passing the CI and being reviewed. The Jenkins username and password of CI is netease/netease. If the CI fails to run, you can login to the Jenkins platform to view the reason for the failure."),(0,o.kt)("p",null,"For more detail, please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/CONTRIBUTING.md"},"CONTRIBUTING"),"."),(0,o.kt)("h3",{id:"2-\u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408curve\u9879\u76ee\u8981\u6c42-how-to-ensure-that-the-quality-of-the-code-i-contribute-meets-the-requirements-of-the-curve-project"},"2. \u5982\u4f55\u4fdd\u8bc1\u6211\u8d21\u732e\u7684\u4ee3\u7801\u8d28\u91cf\u7b26\u5408Curve\u9879\u76ee\u8981\u6c42\uff1f/ How to ensure that the quality of the code I contribute meets the requirements of the Curve project"),(0,o.kt)("p",null,"\u8bf7\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README_cn.md#%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83"},"\u7f16\u7801\u89c4\u8303")),(0,o.kt)("p",null,"\u8bf7\u53c2\u8003",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README_cn.md#%E6%B5%8B%E8%AF%95%E8%A6%86%E7%9B%96%E7%8E%87%E8%A6%81%E6%B1%82"},"\u8986\u76d6\u7387\u6d4b\u8bd5\u8981\u6c42")),(0,o.kt)("p",null,"please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#coding-style-guides"},"Coding style guides")),(0,o.kt)("p",null,"please refer to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/blob/master/README.md#code-coverage-requirement"},"Code coverage requirement")),(0,o.kt)("h3",{id:"3-\u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abcurve\u793e\u533amerge-how-can-my-contributed-code-be-merged-by-the-curve-community"},"3. \u6211\u8d21\u732e\u7684\u4ee3\u7801\u5982\u4f55\u624d\u80fd\u88abCurve\u793e\u533amerge\uff1f/ How can my contributed code be merged by the Curve community?"),(0,o.kt)("p",null,"Please refer to the above two questions."),(0,o.kt)("h3",{id:"4-\u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bcurve\u9879\u76ee\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48-how-should-novice-participants-get-started-with-the-curve-project-step-by-step-what-is-the-recommended-path"},"4. \u65b0\u624b\u53c2\u4e0e\u8005\u8be5\u600e\u4e48\u9010\u6b65\u4e0a\u624bCurve\u9879\u76ee\uff1f\u63a8\u8350\u8def\u5f84\u662f\u4ec0\u4e48\uff1f/ How should novice participants get started with the Curve project step by step? What is the recommended path?"),(0,o.kt)("p",null,"\u53ef\u4ee5\u5148\u4ece\u6807\u6709 ",(0,o.kt)("inlineCode",{parentName:"p"},"good first issue")," \u7684issue\u5165\u624b\uff0c\u8fd9\u4e9bissue\u6bd4\u8f83\u72ec\u7acb\uff0c\u5e76\u4e14\u9700\u6c42\u5f88\u660e\u786e\u3002"),(0,o.kt)("p",null,"You can start with the issues marked ",(0,o.kt)("inlineCode",{parentName:"p"},"good first issue"),", which are relatively independent and have clear requirements."),(0,o.kt)("h3",{id:"5-\u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9curve\u9879\u76ee\u5916\u6211\u8fd8\u80fd\u7ed9curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5-in-addition-to-submitting-code-to-the-curve-project-what-other-meaningful-things-can-i-do-for-the-curve-community"},"5. \u9664\u4e86\u63d0\u4ea4\u4ee3\u7801\u7ed9Curve\u9879\u76ee\u5916\uff0c\u6211\u8fd8\u80fd\u7ed9Curve\u793e\u533a\u505a\u54ea\u4e9b\u6709\u610f\u4e49\u7684\u4e8b\u60c5\uff1f/ In addition to submitting code to the Curve project, what other meaningful things can I do for the Curve community?"),(0,o.kt)("p",null,"\u5e2e\u52a9\u5b8c\u5584Curve\u6587\u6863\uff0c\u53c2\u4e0eCurve\u7684\u5404\u79cd\u7248\u672c\u6d4b\u8bd5\u5e76\u63d0\u4ea4\u53d1\u73b0\u7684\u95ee\u9898\u6216\u5efa\u8bae\uff0c\u7ed9Curve\u7684\u5fae\u4fe1\u516c\u4f17\u53f7(OpenCurve)\u6295\u7a3f\uff0c\u5728",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/"},"Curve\u8bba\u575b"),"\u4e2d\u63d0\u51fa\u95ee\u9898\u6216\u8005\u56de\u7b54\u7528\u6237\u95ee\u9898\uff0c\u53c2\u4e0eCurve\u793e\u533a\u7684\u7cfb\u5217\u76f4\u64ad\u6d3b\u52a8"),(0,o.kt)("p",null,"You can help to write documents for Curve, participate in various version tests of Curve and then post issues or advices, contribute articles to Curve's WeChat public account (OpenCurve), ask questions or answer user questions in the ",(0,o.kt)("a",{parentName:"p",href:"https://ask.opencurve.io/"},"Curve Forum"),", and participate in the Curve community Series of live events."))}h.isMDXComponent=!0},2207:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/curve-wechat-b4e692f587cfbd1bbc2e3e87a44b66dc.jpeg"}}]); \ No newline at end of file diff --git a/assets/js/8bae3c9c.903aac20.js b/assets/js/8bae3c9c.903aac20.js new file mode 100644 index 0000000..827fa87 --- /dev/null +++ b/assets/js/8bae3c9c.903aac20.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[490],{3905:(e,r,t)=>{t.d(r,{Zo:()=>i,kt:()=>m});var n=t(7294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function l(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),p=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},i=function(e){var r=p(e.components);return n.createElement(c.Provider,{value:r},e.children)},v="mdxType",s={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,i=u(e,["components","mdxType","originalType","parentName"]),v=p(t),d=a,m=v["".concat(c,".").concat(d)]||v[d]||s[d]||l;return t?n.createElement(m,o(o({ref:r},i),{},{components:t})):n.createElement(m,o({ref:r},i))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var l=t.length,o=new Array(l);o[0]=d;var u={};for(var c in r)hasOwnProperty.call(r,c)&&(u[c]=r[c]);u.originalType=e,u[v]="string"==typeof e?e:a,o[1]=u;for(var p=2;p{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=t(7462),a=(t(7294),t(3905));const l={},o="\u79bb\u7ebf\u90e8\u7f72\u6587\u6863",u={unversionedId:"CurveFS/deploy/offline-deploy",id:"CurveFS/deploy/offline-deploy",title:"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863",description:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907",source:"@site/docs/03-CurveFS/02-deploy/02-offline-deploy.md",sourceDirName:"03-CurveFS/02-deploy",slug:"/CurveFS/deploy/offline-deploy",permalink:"/CurveFS/deploy/offline-deploy",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CurveFS \u5feb\u901f\u4f53\u9a8c",permalink:"/CurveFS/deploy/quickstart"},next:{title:"\u9759\u6001PV\u914d\u7f6e",permalink:"/CurveFS/deploy/static-pv"}},c={},p=[{value:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907",id:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907",level:2},{value:"Curve\u955c\u50cf\u51c6\u5907",id:"curve\u955c\u50cf\u51c6\u5907",level:3},{value:"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa",id:"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa",level:3},{value:"\u4fee\u6539\u955c\u50cf\u5730\u5740",id:"\u4fee\u6539\u955c\u50cf\u5730\u5740",level:3},{value:"\u90e8\u7f72",id:"\u90e8\u7f72",level:2},{value:"\u5b89\u88c5CurveAdm",id:"\u5b89\u88c5curveadm",level:3},{value:"\u4e3b\u673a\u914d\u7f6e",id:"\u4e3b\u673a\u914d\u7f6e",level:3},{value:"Curve\u670d\u52a1\u7aef\u90e8\u7f72",id:"curve\u670d\u52a1\u7aef\u90e8\u7f72",level:3},{value:"client\u7aef\u90e8\u7f72",id:"client\u7aef\u90e8\u7f72",level:3}],i={toc:p},v="wrapper";function s(e){let{components:r,...t}=e;return(0,a.kt)(v,(0,n.Z)({},i,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863"},"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863"),(0,a.kt)("h2",{id:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907"},"\u79bb\u7ebf\u73af\u5883\u51c6\u5907"),(0,a.kt)("h3",{id:"curve\u955c\u50cf\u51c6\u5907"},"Curve\u955c\u50cf\u51c6\u5907"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\u62c9\u53d6\u955c\u50cf\nCurve\u5b98\u65b9\u955c\u50cf\uff08\u5982",(0,a.kt)("inlineCode",{parentName:"li"},"opencurve/curve/curvefs:v2.4"),"\uff09\u5230\u672c\u5730\u73af\u5883\uff08\u53ef\u8bbf\u95ee\u5916\u7f51\u7684\u673a\u5668\uff09")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ sudo docker pull opencurve/curve/curvefs:v2.4\n")),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},"\u5bfc\u51fa\u955c\u50cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"# \u67e5\u770b\u4e0b\u8f7d\u5230\u7684Curve\u955c\u50cf\n$ sudo docker image ls\nopencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB\n\n# \u5bfc\u51fa\u955c\u50cf\n$ sudo docker save -o curve_v2.4.tar 5717f16d4bec\n")),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"\u62f7\u8d1d\u955c\u50cf\u5230\u672c\u5730\u4ed3\u5e93\u8282\u70b9")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ scp curve_v2.4.tar ${desthost}:/path/to/save/image\n")),(0,a.kt)("ol",{start:4},(0,a.kt)("li",{parentName:"ol"},"\u5bfc\u5165\u955c\u50cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker load --input curve_v2.4.tar\n\n# \u67e5\u770b\u5bfc\u5165\u7684\u955c\u50cf\n$ sudo docker image ls \nopencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB\n")),(0,a.kt)("h3",{id:"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa"},"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa"),(0,a.kt)("p",null,"\u4f7f\u7528docker-registry\u6765\u8fdb\u884c\u672c\u5730\u4ed3\u5e93\u7684\u642d\u5efa\uff0c\u642d\u5efa\u5b8c\u672c\u5730\u4ed3\u5e93\u540e, \u628a\u524d\u9762\u6b65\u9aa4\u4e2d\u4e0b\u8f7d\u7684Curve\u955c\u50cf\u4e0a\u4f20\u5230\u672c\u5730\u4ed3\u5e93\u3002\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u6b65\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\u8fd0\u884c docker-registry")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker run -d -p 5000:5000 --restart=always --name registry registry\n")),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},"\u6807\u8bb0Curve\u955c\u50cf\n\u6807\u8bb0\u4e0b\u8f7d\u5230\u7684Curve\u955c\u50cf\uff0c\u6bd4\u5982\u628a\u4e0b\u8f7d\u6765\u7684\u955c\u50cf\uff08",(0,a.kt)("inlineCode",{parentName:"li"},"opencurve/curve/curvefs:v2.4"),"\uff09\u6807\u8bb0\u4e3a",(0,a.kt)("inlineCode",{parentName:"li"},"127.0.0.1:5000/curvefs:v2.4_local"),"\uff08\u5176\u4e2d",(0,a.kt)("inlineCode",{parentName:"li"},"127.0.0.1"),"\u4e3a\u672c\u5730\u4ed3\u5e93\u670d\u52a1IP\uff0c",(0,a.kt)("inlineCode",{parentName:"li"},"5000"),"\u4e3a\u672c\u5730\u4ed3\u5e93\u670d\u52a1\u7aef\u53e3\u53f7\uff0c\u8bf7\u6839\u636e\u5b9e\u9645\u73af\u5883\u4fee\u6539\uff09")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"# \u67e5\u770b\u4e0b\u8f7d\u5230\u7684Curve\u955c\u50cf\n$ sudo docker image ls \nopencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB\n\n# \u6807\u8bb0\u955c\u50cf\n$ sudo docker tag opencurve/curve/curvefs:v2.4 127.0.0.1:5000/curvefs:v2.4_local\n\n# \u67e5\u770b\u6807\u8bb0\u5b8c\u7684\u955c\u50cf\n$ sudo docker image ls\n 127.0.0.1:5000/curvefs v2.4_local 5717f16d4bec 13 months ago 1.84GB\n")),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"\u4e0a\u4f20\u955c\u50cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker push 127.0.0.1:5000/curvefs:v2.4_local\n")),(0,a.kt)("p",null,"\u66f4\u591a\u8be6\u60c5\u53ef\u53c2\u8003",(0,a.kt)("a",{parentName:"p",href:"https://yeasy.gitbook.io/docker_practice/repository/registry"},"\u79c1\u6709\u4ed3\u5e93\u642d\u5efa")),(0,a.kt)("h3",{id:"\u4fee\u6539\u955c\u50cf\u5730\u5740"},"\u4fee\u6539\u955c\u50cf\u5730\u5740"),(0,a.kt)("p",null,"\u4fee\u6539\u5ba2\u6237\u7aef\u90e8\u7f72\u914d\u7f6e\u6587\u4ef6",(0,a.kt)("inlineCode",{parentName:"p"},"client.yaml"),"\u4ee5\u53ca\u670d\u52a1\u7aef\u96c6\u7fa4\u90e8\u7f72\u914d\u7f6e\u6587\u4ef6",(0,a.kt)("inlineCode",{parentName:"p"},"topology.yaml"),"\u4e2d\u7684\u955c\u50cf\u5730\u5740\u914d\u7f6e\u9879\uff08",(0,a.kt)("inlineCode",{parentName:"p"},"container_image"),"\uff09\u4e3a\u672c\u5730\u4ed3\u5e93\u955c\u50cf\u5730\u5740\uff08\u5982\uff1a",(0,a.kt)("inlineCode",{parentName:"p"},"127.0.0.1:5000/curvefs:v2.4_local"),"\uff09"),(0,a.kt)("h2",{id:"\u90e8\u7f72"},"\u90e8\u7f72"),(0,a.kt)("h3",{id:"\u5b89\u88c5curveadm"},"\u5b89\u88c5CurveAdm"),(0,a.kt)("p",null,"CurveAdm\u662fCurve\u90e8\u7f72\u5de5\u5177\uff0c\u6709\u5916\u7f51\u7684\u673a\u5668\u53ef\u4ee5\u4e00\u952e\u5b89\u88c5\uff0c\u5177\u4f53\u5b89\u88c5\u53c2\u89c1",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/install-curveadm#%E5%AE%89%E8%A3%85-curveadm"},"CurveAdm\u5b89\u88c5")),(0,a.kt)("p",null,"\u4f46\u7531\u4e8e\u672c\u6587\u662f\u4ecb\u7ecd\u5185\u7f51\u73af\u5883\u7684\u90e8\u7f72\uff0c\u6240\u4ee5\u9700\u6309\u5982\u4e0b\u6b65\u9aa4\u64cd\u4f5c\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u4e0b\u8f7dCurveAdm\u5230\u672c\u5730\u53ef\u8bbf\u95ee\u5916\u7f51\u673a\u5668\uff0c\u4e0b\u8f7d\u5730\u5740\uff08\u6700\u65b0\u7248\u672c\u53ef\u54a8\u8be2Curve\u793e\u533a\u6210\u5458\uff09\uff1a ",(0,a.kt)("a",{parentName:"li",href:"https://curveadm.nos-eastchina1.126.net/release/curveadm-v0.2.0.tar.gz"},"CurveAdm")," "),(0,a.kt)("li",{parentName:"ul"},"\u628aCurveAdm\u62f7\u8d1d\u5230\u5185\u7f51\u5b89\u88c5\u9700\u90e8\u7f72Curve\u96c6\u7fa4\u7684\u4e3b\u63a7\u673a"),(0,a.kt)("li",{parentName:"ul"},"\u89e3\u538bCurveAdm"),(0,a.kt)("li",{parentName:"ul"},"\u62f7\u8d1d\u6267\u884c\u7a0b\u5e8f\u5e76\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ mv curveadm ~/.curveadm\n\n# \u53ef\u8003\u8651\u66f4\u65b0\u5230~/.bash_profile\u8fdb\u884c\u6301\u4e45\u5316\n$ export PATH=~/.curveadm/bin:$PATH\n")),(0,a.kt)("h3",{id:"\u4e3b\u673a\u914d\u7f6e"},"\u4e3b\u673a\u914d\u7f6e"),(0,a.kt)("p",null,"\u914d\u7f6eCurve\u96c6\u7fa4\u8981\u4f7f\u7528\u7684\u670d\u52a1\u5668\u5217\u8868\uff0c\u63d0\u4ea4\u5217\u8868\u7ed9CurveAdm\u7ba1\u7406\u3002\u4e3b\u673a\u914d\u7f6e\u8fc7\u7a0b\u6bd4\u8f83\u7b80\u5355\uff0c\u5728",(0,a.kt)("inlineCode",{parentName:"p"},"hosts.yaml"),"\u4e2d\u6dfb\u52a0\u5b9e\u9645\u4e3b\u673a\u540d\u548cip\uff0c\u7136\u540e\u63d0\u4ea4\u5c31\u53ef\u4ee5\u4e86\u3002"),(0,a.kt)("p",null,"\u5177\u4f53\u914d\u7f6e\u53c2\u8003\u6587\u6863\uff1a",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/hosts#%E4%B8%BB%E6%9C%BA%E9%85%8D%E7%BD%AE"},"\u4e3b\u673a\u7ba1\u7406")),(0,a.kt)("h3",{id:"curve\u670d\u52a1\u7aef\u90e8\u7f72"},"Curve\u670d\u52a1\u7aef\u90e8\u7f72"),(0,a.kt)("p",null,"\u9700\u4fee\u6539",(0,a.kt)("inlineCode",{parentName:"p"},"topology.yaml"),"\u4e2d\u7684\u955c\u50cf\u4e3a\u672c\u5730\u955c\u50cf\u5730\u5740\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: curvefs\nglobal:\n container_image: 127.0.0.1:5000/curvefs:v2.4_local ## \u4fee\u6539\u4e3a\u672c\u5730\u955c\u50cf\n")),(0,a.kt)("p",null,"\u5176\u4ed6\u7684\u914d\u7f6e\u9879\u8bf7\u53c2\u8003\u6587\u6863 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment"},"CurveFS\u96c6\u7fa4\u90e8\u7f72")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvebs-cluster-deployment"},"CurveBS\u96c6\u7fa4\u90e8\u7f72")),(0,a.kt)("h3",{id:"client\u7aef\u90e8\u7f72"},"client\u7aef\u90e8\u7f72"),(0,a.kt)("p",null,"\u9700\u4fee\u6539",(0,a.kt)("inlineCode",{parentName:"p"},"client.yaml"),"\u4e2d\u7684\u955c\u50cf\u4e3a\u672c\u5730\u955c\u50cf\u5730\u5740\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: curvefs\nglobal:\n container_image: 127.0.0.1:5000/curvefs:v2.4_local ## \u4fee\u6539\u4e3a\u672c\u5730\u955c\u50cf\n")),(0,a.kt)("p",null,"\u5176\u4ed6\u7684\u914d\u7f6e\u9879\u8bf7\u53c2\u8003\u6587\u6863 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvefs-client-deployment"},"\u90e8\u7f72CurveFS\u5ba2\u6237\u7aef")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvebs-client-deployment"},"\u90e8\u7f72CurveBS\u5ba2\u6237\u7aef")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8bae3c9c.cb92d561.js b/assets/js/8bae3c9c.cb92d561.js deleted file mode 100644 index d19c648..0000000 --- a/assets/js/8bae3c9c.cb92d561.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[490],{3905:(e,r,t)=>{t.d(r,{Zo:()=>i,kt:()=>m});var n=t(7294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function l(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var c=n.createContext({}),p=function(e){var r=n.useContext(c),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},i=function(e){var r=p(e.components);return n.createElement(c.Provider,{value:r},e.children)},v="mdxType",s={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},d=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,i=u(e,["components","mdxType","originalType","parentName"]),v=p(t),d=a,m=v["".concat(c,".").concat(d)]||v[d]||s[d]||l;return t?n.createElement(m,o(o({ref:r},i),{},{components:t})):n.createElement(m,o({ref:r},i))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var l=t.length,o=new Array(l);o[0]=d;var u={};for(var c in r)hasOwnProperty.call(r,c)&&(u[c]=r[c]);u.originalType=e,u[v]="string"==typeof e?e:a,o[1]=u;for(var p=2;p{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>s,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=t(7462),a=(t(7294),t(3905));const l={},o="\u79bb\u7ebf\u90e8\u7f72\u6587\u6863",u={unversionedId:"CurveFS/deploy/offline-deploy",id:"CurveFS/deploy/offline-deploy",title:"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863",description:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907",source:"@site/docs/03-CurveFS/02-deploy/02-offline-deploy.md",sourceDirName:"03-CurveFS/02-deploy",slug:"/CurveFS/deploy/offline-deploy",permalink:"/CurveFS/deploy/offline-deploy",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"CurveFS \u5feb\u901f\u4f53\u9a8c",permalink:"/CurveFS/deploy/quickstart"},next:{title:"\u6d4b\u8bd5",permalink:"/category/\u6d4b\u8bd5-1"}},c={},p=[{value:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907",id:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907",level:2},{value:"Curve\u955c\u50cf\u51c6\u5907",id:"curve\u955c\u50cf\u51c6\u5907",level:3},{value:"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa",id:"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa",level:3},{value:"\u4fee\u6539\u955c\u50cf\u5730\u5740",id:"\u4fee\u6539\u955c\u50cf\u5730\u5740",level:3},{value:"\u90e8\u7f72",id:"\u90e8\u7f72",level:2},{value:"\u5b89\u88c5CurveAdm",id:"\u5b89\u88c5curveadm",level:3},{value:"\u4e3b\u673a\u914d\u7f6e",id:"\u4e3b\u673a\u914d\u7f6e",level:3},{value:"Curve\u670d\u52a1\u7aef\u90e8\u7f72",id:"curve\u670d\u52a1\u7aef\u90e8\u7f72",level:3},{value:"client\u7aef\u90e8\u7f72",id:"client\u7aef\u90e8\u7f72",level:3}],i={toc:p},v="wrapper";function s(e){let{components:r,...t}=e;return(0,a.kt)(v,(0,n.Z)({},i,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863"},"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863"),(0,a.kt)("h2",{id:"\u79bb\u7ebf\u73af\u5883\u51c6\u5907"},"\u79bb\u7ebf\u73af\u5883\u51c6\u5907"),(0,a.kt)("h3",{id:"curve\u955c\u50cf\u51c6\u5907"},"Curve\u955c\u50cf\u51c6\u5907"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\u62c9\u53d6\u955c\u50cf\nCurve\u5b98\u65b9\u955c\u50cf\uff08\u5982",(0,a.kt)("inlineCode",{parentName:"li"},"opencurve/curve/curvefs:v2.4"),"\uff09\u5230\u672c\u5730\u73af\u5883\uff08\u53ef\u8bbf\u95ee\u5916\u7f51\u7684\u673a\u5668\uff09")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ sudo docker pull opencurve/curve/curvefs:v2.4\n")),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},"\u5bfc\u51fa\u955c\u50cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"# \u67e5\u770b\u4e0b\u8f7d\u5230\u7684Curve\u955c\u50cf\n$ sudo docker image ls\nopencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB\n\n# \u5bfc\u51fa\u955c\u50cf\n$ sudo docker save -o curve_v2.4.tar 5717f16d4bec\n")),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"\u62f7\u8d1d\u955c\u50cf\u5230\u672c\u5730\u4ed3\u5e93\u8282\u70b9")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ scp curve_v2.4.tar ${desthost}:/path/to/save/image\n")),(0,a.kt)("ol",{start:4},(0,a.kt)("li",{parentName:"ol"},"\u5bfc\u5165\u955c\u50cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker load --input curve_v2.4.tar\n\n# \u67e5\u770b\u5bfc\u5165\u7684\u955c\u50cf\n$ sudo docker image ls \nopencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB\n")),(0,a.kt)("h3",{id:"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa"},"\u672c\u5730\u955c\u50cf\u4ed3\u5e93\u642d\u5efa"),(0,a.kt)("p",null,"\u4f7f\u7528docker-registry\u6765\u8fdb\u884c\u672c\u5730\u4ed3\u5e93\u7684\u642d\u5efa\uff0c\u642d\u5efa\u5b8c\u672c\u5730\u4ed3\u5e93\u540e, \u628a\u524d\u9762\u6b65\u9aa4\u4e2d\u4e0b\u8f7d\u7684Curve\u955c\u50cf\u4e0a\u4f20\u5230\u672c\u5730\u4ed3\u5e93\u3002\u4e3b\u8981\u6709\u4ee5\u4e0b\u51e0\u6b65\uff1a"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"\u8fd0\u884c docker-registry")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker run -d -p 5000:5000 --restart=always --name registry registry\n")),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},"\u6807\u8bb0Curve\u955c\u50cf\n\u6807\u8bb0\u4e0b\u8f7d\u5230\u7684Curve\u955c\u50cf\uff0c\u6bd4\u5982\u628a\u4e0b\u8f7d\u6765\u7684\u955c\u50cf\uff08",(0,a.kt)("inlineCode",{parentName:"li"},"opencurve/curve/curvefs:v2.4"),"\uff09\u6807\u8bb0\u4e3a",(0,a.kt)("inlineCode",{parentName:"li"},"127.0.0.1:5000/curvefs:v2.4_local"),"\uff08\u5176\u4e2d",(0,a.kt)("inlineCode",{parentName:"li"},"127.0.0.1"),"\u4e3a\u672c\u5730\u4ed3\u5e93\u670d\u52a1IP\uff0c",(0,a.kt)("inlineCode",{parentName:"li"},"5000"),"\u4e3a\u672c\u5730\u4ed3\u5e93\u670d\u52a1\u7aef\u53e3\u53f7\uff0c\u8bf7\u6839\u636e\u5b9e\u9645\u73af\u5883\u4fee\u6539\uff09")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"# \u67e5\u770b\u4e0b\u8f7d\u5230\u7684Curve\u955c\u50cf\n$ sudo docker image ls \nopencurve/curve/curvefs v2.4 5717f16d4bec 1 months ago 1.84GB\n\n# \u6807\u8bb0\u955c\u50cf\n$ sudo docker tag opencurve/curve/curvefs:v2.4 127.0.0.1:5000/curvefs:v2.4_local\n\n# \u67e5\u770b\u6807\u8bb0\u5b8c\u7684\u955c\u50cf\n$ sudo docker image ls\n 127.0.0.1:5000/curvefs v2.4_local 5717f16d4bec 13 months ago 1.84GB\n")),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"\u4e0a\u4f20\u955c\u50cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ docker push 127.0.0.1:5000/curvefs:v2.4_local\n")),(0,a.kt)("p",null,"\u66f4\u591a\u8be6\u60c5\u53ef\u53c2\u8003",(0,a.kt)("a",{parentName:"p",href:"https://yeasy.gitbook.io/docker_practice/repository/registry"},"\u79c1\u6709\u4ed3\u5e93\u642d\u5efa")),(0,a.kt)("h3",{id:"\u4fee\u6539\u955c\u50cf\u5730\u5740"},"\u4fee\u6539\u955c\u50cf\u5730\u5740"),(0,a.kt)("p",null,"\u4fee\u6539\u5ba2\u6237\u7aef\u90e8\u7f72\u914d\u7f6e\u6587\u4ef6",(0,a.kt)("inlineCode",{parentName:"p"},"client.yaml"),"\u4ee5\u53ca\u670d\u52a1\u7aef\u96c6\u7fa4\u90e8\u7f72\u914d\u7f6e\u6587\u4ef6",(0,a.kt)("inlineCode",{parentName:"p"},"topology.yaml"),"\u4e2d\u7684\u955c\u50cf\u5730\u5740\u914d\u7f6e\u9879\uff08",(0,a.kt)("inlineCode",{parentName:"p"},"container_image"),"\uff09\u4e3a\u672c\u5730\u4ed3\u5e93\u955c\u50cf\u5730\u5740\uff08\u5982\uff1a",(0,a.kt)("inlineCode",{parentName:"p"},"127.0.0.1:5000/curvefs:v2.4_local"),"\uff09"),(0,a.kt)("h2",{id:"\u90e8\u7f72"},"\u90e8\u7f72"),(0,a.kt)("h3",{id:"\u5b89\u88c5curveadm"},"\u5b89\u88c5CurveAdm"),(0,a.kt)("p",null,"CurveAdm\u662fCurve\u90e8\u7f72\u5de5\u5177\uff0c\u6709\u5916\u7f51\u7684\u673a\u5668\u53ef\u4ee5\u4e00\u952e\u5b89\u88c5\uff0c\u5177\u4f53\u5b89\u88c5\u53c2\u89c1",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/install-curveadm#%E5%AE%89%E8%A3%85-curveadm"},"CurveAdm\u5b89\u88c5")),(0,a.kt)("p",null,"\u4f46\u7531\u4e8e\u672c\u6587\u662f\u4ecb\u7ecd\u5185\u7f51\u73af\u5883\u7684\u90e8\u7f72\uff0c\u6240\u4ee5\u9700\u6309\u5982\u4e0b\u6b65\u9aa4\u64cd\u4f5c\uff1a"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"\u4e0b\u8f7dCurveAdm\u5230\u672c\u5730\u53ef\u8bbf\u95ee\u5916\u7f51\u673a\u5668\uff0c\u4e0b\u8f7d\u5730\u5740\uff08\u6700\u65b0\u7248\u672c\u53ef\u54a8\u8be2Curve\u793e\u533a\u6210\u5458\uff09\uff1a ",(0,a.kt)("a",{parentName:"li",href:"https://curveadm.nos-eastchina1.126.net/release/curveadm-v0.2.0.tar.gz"},"CurveAdm")," "),(0,a.kt)("li",{parentName:"ul"},"\u628aCurveAdm\u62f7\u8d1d\u5230\u5185\u7f51\u5b89\u88c5\u9700\u90e8\u7f72Curve\u96c6\u7fa4\u7684\u4e3b\u63a7\u673a"),(0,a.kt)("li",{parentName:"ul"},"\u89e3\u538bCurveAdm"),(0,a.kt)("li",{parentName:"ul"},"\u62f7\u8d1d\u6267\u884c\u7a0b\u5e8f\u5e76\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"$ mv curveadm ~/.curveadm\n\n# \u53ef\u8003\u8651\u66f4\u65b0\u5230~/.bash_profile\u8fdb\u884c\u6301\u4e45\u5316\n$ export PATH=~/.curveadm/bin:$PATH\n")),(0,a.kt)("h3",{id:"\u4e3b\u673a\u914d\u7f6e"},"\u4e3b\u673a\u914d\u7f6e"),(0,a.kt)("p",null,"\u914d\u7f6eCurve\u96c6\u7fa4\u8981\u4f7f\u7528\u7684\u670d\u52a1\u5668\u5217\u8868\uff0c\u63d0\u4ea4\u5217\u8868\u7ed9CurveAdm\u7ba1\u7406\u3002\u4e3b\u673a\u914d\u7f6e\u8fc7\u7a0b\u6bd4\u8f83\u7b80\u5355\uff0c\u5728",(0,a.kt)("inlineCode",{parentName:"p"},"hosts.yaml"),"\u4e2d\u6dfb\u52a0\u5b9e\u9645\u4e3b\u673a\u540d\u548cip\uff0c\u7136\u540e\u63d0\u4ea4\u5c31\u53ef\u4ee5\u4e86\u3002"),(0,a.kt)("p",null,"\u5177\u4f53\u914d\u7f6e\u53c2\u8003\u6587\u6863\uff1a",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/hosts#%E4%B8%BB%E6%9C%BA%E9%85%8D%E7%BD%AE"},"\u4e3b\u673a\u7ba1\u7406")),(0,a.kt)("h3",{id:"curve\u670d\u52a1\u7aef\u90e8\u7f72"},"Curve\u670d\u52a1\u7aef\u90e8\u7f72"),(0,a.kt)("p",null,"\u9700\u4fee\u6539",(0,a.kt)("inlineCode",{parentName:"p"},"topology.yaml"),"\u4e2d\u7684\u955c\u50cf\u4e3a\u672c\u5730\u955c\u50cf\u5730\u5740\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: curvefs\nglobal:\n container_image: 127.0.0.1:5000/curvefs:v2.4_local ## \u4fee\u6539\u4e3a\u672c\u5730\u955c\u50cf\n")),(0,a.kt)("p",null,"\u5176\u4ed6\u7684\u914d\u7f6e\u9879\u8bf7\u53c2\u8003\u6587\u6863 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment"},"CurveFS\u96c6\u7fa4\u90e8\u7f72")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvebs-cluster-deployment"},"CurveBS\u96c6\u7fa4\u90e8\u7f72")),(0,a.kt)("h3",{id:"client\u7aef\u90e8\u7f72"},"client\u7aef\u90e8\u7f72"),(0,a.kt)("p",null,"\u9700\u4fee\u6539",(0,a.kt)("inlineCode",{parentName:"p"},"client.yaml"),"\u4e2d\u7684\u955c\u50cf\u4e3a\u672c\u5730\u955c\u50cf\u5730\u5740\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"kind: curvefs\nglobal:\n container_image: 127.0.0.1:5000/curvefs:v2.4_local ## \u4fee\u6539\u4e3a\u672c\u5730\u955c\u50cf\n")),(0,a.kt)("p",null,"\u5176\u4ed6\u7684\u914d\u7f6e\u9879\u8bf7\u53c2\u8003\u6587\u6863 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvefs-client-deployment"},"\u90e8\u7f72CurveFS\u5ba2\u6237\u7aef")," \u6216 ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curveadm/wiki/curvebs-client-deployment"},"\u90e8\u7f72CurveBS\u5ba2\u6237\u7aef")))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8dcab980.572fed0f.js b/assets/js/8dcab980.572fed0f.js deleted file mode 100644 index 403b9b4..0000000 --- a/assets/js/8dcab980.572fed0f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[3510],{31:e=>{e.exports=JSON.parse('{"title":"\u6d4b\u8bd5","slug":"/category/\u6d4b\u8bd5-1","permalink":"/category/\u6d4b\u8bd5-1","navigation":{"previous":{"title":"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863","permalink":"/CurveFS/deploy/offline-deploy"},"next":{"title":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","permalink":"/CurveFS/test/env-setup"}}}')}}]); \ No newline at end of file diff --git a/assets/js/8dcab980.fd4a78ee.js b/assets/js/8dcab980.fd4a78ee.js new file mode 100644 index 0000000..16ab690 --- /dev/null +++ b/assets/js/8dcab980.fd4a78ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[3510],{31:e=>{e.exports=JSON.parse('{"title":"\u6d4b\u8bd5","slug":"/category/\u6d4b\u8bd5-1","permalink":"/category/\u6d4b\u8bd5-1","navigation":{"previous":{"title":"\u9759\u6001PV\u914d\u7f6e","permalink":"/CurveFS/deploy/static-pv"},"next":{"title":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","permalink":"/CurveFS/test/env-setup"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.068fd7ec.js b/assets/js/935f2afb.068fd7ec.js new file mode 100644 index 0000000..72c7524 --- /dev/null +++ b/assets/js/935f2afb.068fd7ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u5173\u4e8e Curve","href":"/","docId":"Intro"},{"type":"category","label":"Curve\u5757\u5b58\u50a8","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5e94\u7528\u573a\u666f","href":"/CurveBS/usecase/scenario","docId":"CurveBS/usecase/scenario"},{"type":"link","label":"\u7528\u6237\u6848\u4f8b1","href":"/CurveBS/usecase/usecase1","docId":"CurveBS/usecase/usecase1"}],"href":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b"},{"type":"category","label":"\u90e8\u7f72","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveBS \u5feb\u901f\u4f53\u9a8c","href":"/CurveBS/deploy/quickstart","docId":"CurveBS/deploy/quickstart"}],"href":"/category/\u90e8\u7f72"},{"type":"category","label":"\u6d4b\u8bd5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","href":"/CurveBS/test/env-setup","docId":"CurveBS/test/env-setup"},{"type":"link","label":"curve\u8986\u76d6\u7387\u6536\u96c6\u4f18\u5316","href":"/CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","docId":"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6"},{"type":"link","label":"\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","href":"/CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","docId":"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5"},{"type":"link","label":"\u6027\u80fd\u6d4b\u8bd5","href":"/CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","docId":"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5"}],"href":"/category/\u6d4b\u8bd5"},{"type":"category","label":"\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveBS\u5bf9\u6bd4Ceph RBD","href":"/CurveBS/comparison/CurveBS-vs-Ceph-rbd","docId":"CurveBS/comparison/CurveBS-vs-Ceph-rbd"}],"href":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4"},{"type":"category","label":"\u67b6\u6784","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u67b6\u6784\u4ecb\u7ecd","href":"/CurveBS/architecture/architecture-intro","docId":"CurveBS/architecture/architecture-intro"}],"href":"/category/\u67b6\u6784"},{"type":"category","label":"\u6027\u80fd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"benchmark\u6307\u5357","href":"/CurveBS/performance/how-to-benchmark","docId":"CurveBS/performance/how-to-benchmark"}],"href":"/category/\u6027\u80fd"},{"type":"category","label":"\u8fd0\u7ef4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u8fd0\u7ef4\u5de5\u5177","href":"/CurveBS/maintenance/maintenance-tools","docId":"CurveBS/maintenance/maintenance-tools"}],"href":"/category/\u8fd0\u7ef4"}],"href":"/category/curve\u5757\u5b58\u50a8"},{"type":"category","label":"Curve\u6587\u4ef6\u5b58\u50a8","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5e94\u7528\u573a\u666f","href":"/CurveFS/usecase/scenario","docId":"CurveFS/usecase/scenario"},{"type":"link","label":"\u6c5f\u82cf\u519c\u4fe1\u9009\u62e9CurveFS\u5b9e\u73b0ES\u51b7\u6570\u636e\u957f\u671f\u5b58\u50a8","href":"/CurveFS/usecase/jiangsu-nongxin-es","docId":"CurveFS/usecase/jiangsu-nongxin-es"}],"href":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1"},{"type":"category","label":"\u90e8\u7f72","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveFS \u5feb\u901f\u4f53\u9a8c","href":"/CurveFS/deploy/quickstart","docId":"CurveFS/deploy/quickstart"},{"type":"link","label":"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863","href":"/CurveFS/deploy/offline-deploy","docId":"CurveFS/deploy/offline-deploy"},{"type":"link","label":"\u9759\u6001PV\u914d\u7f6e","href":"/CurveFS/deploy/static-pv","docId":"CurveFS/deploy/static-pv"}],"href":"/category/\u90e8\u7f72-1"},{"type":"category","label":"\u6d4b\u8bd5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","href":"/CurveFS/test/env-setup","docId":"CurveFS/test/env-setup"},{"type":"link","label":"\u6027\u80fd\u6d4b\u8bd5","href":"/CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","docId":"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5"}],"href":"/category/\u6d4b\u8bd5-1"},{"type":"category","label":"\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveFS \u5bf9\u6bd4 CephFS","href":"/CurveFS/comparison/CurveFS-vs-CephFS","docId":"CurveFS/comparison/CurveFS-vs-CephFS"}],"href":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1"},{"type":"category","label":"\u67b6\u6784","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u67b6\u6784\u4ecb\u7ecd","href":"/CurveFS/architecture/architecture-intro","docId":"CurveFS/architecture/architecture-intro"}],"href":"/category/\u67b6\u6784-1"},{"type":"category","label":"\u6027\u80fd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"benchmark\u6307\u5357","href":"/CurveFS/performance/how-to-benchmark","docId":"CurveFS/performance/how-to-benchmark"}],"href":"/category/\u6027\u80fd-1"},{"type":"category","label":"\u8fd0\u7ef4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u8fd0\u7ef4\u5de5\u5177","href":"/CurveFS/maintenance/maintenance-tools","docId":"CurveFS/maintenance/maintenance-tools"}],"href":"/category/\u8fd0\u7ef4-1"}],"href":"/category/curve\u6587\u4ef6\u5b58\u50a8"},{"type":"category","label":"\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684RDMA/SPDK\u652f\u6301","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7248\u672c\u4ecb\u7ecd","href":"/CurveBS-with-RDMA-SPDK/release-intro","docId":"CurveBS-with-RDMA-SPDK/release-intro"}],"href":"/category/\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301"},{"type":"category","label":"\u5f00\u53d1\u8005\u76f8\u5173","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u53c2\u4e0e\u8d21\u732e","href":"/Develop/how-to-contribute","docId":"Develop/how-to-contribute"},{"type":"link","label":"\u4ee3\u7801\u8d70\u8bfb - xxx","href":"/Develop/code-walkthrough-xxx","docId":"Develop/code-walkthrough-xxx"}],"href":"/category/\u5f00\u53d1\u8005\u76f8\u5173"},{"type":"category","label":"\u793e\u533a\u76f8\u5173","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u793e\u533a\u51c6\u5219","href":"/Community/community-guideline","docId":"Community/community-guideline"},{"type":"category","label":"\u53cc\u5468\u4f1a","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"2023","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"README","href":"/Community/Double-Week-Meetings/01-2023/README","docId":"Community/Double-Week-Meetings/01-2023/README"},{"type":"link","label":"2023-01-12","href":"/Community/Double-Week-Meetings/01-2023/2023-01-12","docId":"Community/Double-Week-Meetings/01-2023/2023-01-12"},{"type":"link","label":"2023-02-09","href":"/Community/Double-Week-Meetings/01-2023/2023-02-09","docId":"Community/Double-Week-Meetings/01-2023/2023-02-09"},{"type":"link","label":"2023-02-23","href":"/Community/Double-Week-Meetings/01-2023/2023-02-23","docId":"Community/Double-Week-Meetings/01-2023/2023-02-23"},{"type":"link","label":"2023-03-09","href":"/Community/Double-Week-Meetings/01-2023/2023-03-09","docId":"Community/Double-Week-Meetings/01-2023/2023-03-09"},{"type":"link","label":"2023-03-23","href":"/Community/Double-Week-Meetings/01-2023/2023-03-23","docId":"Community/Double-Week-Meetings/01-2023/2023-03-23"},{"type":"link","label":"2023-04-13","href":"/Community/Double-Week-Meetings/01-2023/2023-04-13","docId":"Community/Double-Week-Meetings/01-2023/2023-04-13"},{"type":"link","label":"2023-04-27","href":"/Community/Double-Week-Meetings/01-2023/2023-04-27","docId":"Community/Double-Week-Meetings/01-2023/2023-04-27"},{"type":"link","label":"2023-05-18","href":"/Community/Double-Week-Meetings/01-2023/2023-05-18","docId":"Community/Double-Week-Meetings/01-2023/2023-05-18"},{"type":"link","label":"2023-06-01","href":"/Community/Double-Week-Meetings/01-2023/2023-06-01","docId":"Community/Double-Week-Meetings/01-2023/2023-06-01"},{"type":"link","label":"2023-06-15","href":"/Community/Double-Week-Meetings/01-2023/2023-06-15","docId":"Community/Double-Week-Meetings/01-2023/2023-06-15"},{"type":"link","label":"2023-06-29","href":"/Community/Double-Week-Meetings/01-2023/2023-06-29","docId":"Community/Double-Week-Meetings/01-2023/2023-06-29"},{"type":"link","label":"2023-07-13","href":"/Community/Double-Week-Meetings/01-2023/2023-07-13","docId":"Community/Double-Week-Meetings/01-2023/2023-07-13"},{"type":"link","label":"2023-08-03","href":"/Community/Double-Week-Meetings/01-2023/2023-08-03","docId":"Community/Double-Week-Meetings/01-2023/2023-08-03"},{"type":"link","label":"2023-09-14","href":"/Community/Double-Week-Meetings/01-2023/2023-09-14","docId":"Community/Double-Week-Meetings/01-2023/2023-09-14"}],"href":"/category/2023"}],"href":"/category/\u53cc\u5468\u4f1a"}],"href":"/category/\u793e\u533a\u76f8\u5173"},{"type":"category","label":"\u7248\u672c\u76f8\u5173","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7248\u672c\u53d1\u5e03\u5468\u671f","href":"/Release/release-intro","docId":"Release/release-intro"},{"type":"link","label":"CHANGELOG of v2.6","href":"/Release/release-notes-v2.6","docId":"Release/release-notes-v2.6"}],"href":"/category/\u7248\u672c\u76f8\u5173"},{"type":"link","label":"\u5e38\u89c1FAQ","href":"/faq","docId":"FAQ"},{"type":"category","label":"Roadmap","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Curve Roadmap 2023","href":"/Roadmap/roadmap-2023","docId":"Roadmap/roadmap-2023"}],"href":"/category/roadmap"}]},"docs":{"Community/community-guideline":{"id":"Community/community-guideline","title":"\u793e\u533a\u51c6\u5219","description":"\u793e\u533a\u6cbb\u7406","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-01-12":{"id":"Community/Double-Week-Meetings/01-2023/2023-01-12","title":"2023-01-12","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-02-09":{"id":"Community/Double-Week-Meetings/01-2023/2023-02-09","title":"2023-02-09","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-02-23":{"id":"Community/Double-Week-Meetings/01-2023/2023-02-23","title":"2023-02-23","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-03-09":{"id":"Community/Double-Week-Meetings/01-2023/2023-03-09","title":"2023-03-09","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-03-23":{"id":"Community/Double-Week-Meetings/01-2023/2023-03-23","title":"2023-03-23","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-04-13":{"id":"Community/Double-Week-Meetings/01-2023/2023-04-13","title":"2023-04-13","description":"\x3c!--","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-04-27":{"id":"Community/Double-Week-Meetings/01-2023/2023-04-27","title":"2023-04-27","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-05-18":{"id":"Community/Double-Week-Meetings/01-2023/2023-05-18","title":"2023-05-18","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-06-01":{"id":"Community/Double-Week-Meetings/01-2023/2023-06-01","title":"2023-06-01","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-06-15":{"id":"Community/Double-Week-Meetings/01-2023/2023-06-15","title":"2023-06-15","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-06-29":{"id":"Community/Double-Week-Meetings/01-2023/2023-06-29","title":"2023-06-29","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-07-13":{"id":"Community/Double-Week-Meetings/01-2023/2023-07-13","title":"2023-07-13","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-08-03":{"id":"Community/Double-Week-Meetings/01-2023/2023-08-03","title":"2023-08-03","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-09-14":{"id":"Community/Double-Week-Meetings/01-2023/2023-09-14","title":"2023-09-14","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/README":{"id":"Community/Double-Week-Meetings/01-2023/README","title":"README","description":"Curve \u53cc\u5468\u4f1a","sidebar":"tutorialSidebar"},"CurveBS-with-RDMA-SPDK/release-intro":{"id":"CurveBS-with-RDMA-SPDK/release-intro","title":"\u7248\u672c\u4ecb\u7ecd","description":"\u6682\u672a\u5f00\u6e90\uff0c\u53ef\u63d0\u4f9b\u5b89\u88c5\u955c\u50cf\u3002","sidebar":"tutorialSidebar"},"CurveBS/architecture/architecture-intro":{"id":"CurveBS/architecture/architecture-intro","title":"\u67b6\u6784\u4ecb\u7ecd","description":"\u8bf7\u53c2\u8003Curve\u8bbe\u8ba1\u8981\u70b9","sidebar":"tutorialSidebar"},"CurveBS/comparison/CurveBS-vs-Ceph-rbd":{"id":"CurveBS/comparison/CurveBS-vs-Ceph-rbd","title":"CurveBS\u5bf9\u6bd4Ceph RBD","description":"\u9ad8\u6027\u80fd | \u66f4\u7a33\u5b9a | \u6613\u8fd0\u7ef4 | \u4e91\u539f\u751f","sidebar":"tutorialSidebar"},"CurveBS/deploy/quickstart":{"id":"CurveBS/deploy/quickstart","title":"CurveBS \u5feb\u901f\u4f53\u9a8c","description":"\u4e3a\u4e86\u63d0\u5347 Curve \u7684\u8fd0\u7ef4\u4fbf\u5229\u6027\uff0c\u6211\u4eec\u8bbe\u8ba1\u5f00\u53d1\u4e86 CurveAdm \u9879\u76ee\uff0c\u5176\u4e3b\u8981\u7528\u4e8e\u90e8\u7f72\u548c\u7ba1\u7406 Curve \u96c6\u7fa4\uff0c\u76ee\u524d\u5df2\u652f\u6301\u90e8\u7f72CurveBS & CurveFS\uff0c\u76f8\u5173\u4f7f\u7528\u6587\u6863\u8bf7\u53c2\u8003 CurveAdm\u7528\u6237\u624b\u518c\uff0c\u5e76\u6839\u636e\u624b\u518c\u9996\u5148\u5b89\u88c5CurveAdm\u5de5\u5177\u4e4b\u540e\u518d\u8fdb\u884cCurve\u96c6\u7fa4\u7684\u90e8\u7f72\u3002","sidebar":"tutorialSidebar"},"CurveBS/maintenance/maintenance-tools":{"id":"CurveBS/maintenance/maintenance-tools","title":"\u8fd0\u7ef4\u5de5\u5177","description":"TBD","sidebar":"tutorialSidebar"},"CurveBS/performance/how-to-benchmark":{"id":"CurveBS/performance/how-to-benchmark","title":"benchmark\u6307\u5357","description":"TBD","sidebar":"tutorialSidebar"},"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6":{"id":"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","title":"curve\u8986\u76d6\u7387\u6536\u96c6\u4f18\u5316","description":"curve\u4e3b\u8981\u4ece2\u4e2a\u7ef4\u5ea6\u8861\u91cf\u5355\u5143\u6d4b\u8bd5\u8986\u76d6\u7387\uff1a\u884c\u8986\u76d6\u7387\u548c\u5206\u652f\u8986\u76d6\u7387\u3002","sidebar":"tutorialSidebar"},"CurveBS/test/env-setup":{"id":"CurveBS/test/env-setup","title":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","description":"\u8bf7\u53c2\u8003 \u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","sidebar":"tutorialSidebar"},"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5":{"id":"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","title":"\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","description":"\u6d4b\u8bd5\u76ee\u7684","sidebar":"tutorialSidebar"},"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5":{"id":"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","title":"\u6027\u80fd\u6d4b\u8bd5","description":"\u80cc\u666f\u77e5\u8bc6","sidebar":"tutorialSidebar"},"CurveBS/usecase/scenario":{"id":"CurveBS/usecase/scenario","title":"\u5e94\u7528\u573a\u666f","description":"CurveBS\u7684\u6838\u5fc3\u5e94\u7528\u573a\u666f\u4e3b\u8981\u5305\u62ec\uff1a","sidebar":"tutorialSidebar"},"CurveBS/usecase/usecase1":{"id":"CurveBS/usecase/usecase1","title":"\u7528\u6237\u6848\u4f8b1","description":"TBD","sidebar":"tutorialSidebar"},"CurveFS/architecture/architecture-intro":{"id":"CurveFS/architecture/architecture-intro","title":"\u67b6\u6784\u4ecb\u7ecd","description":"\u8bf7\u53c2\u8003\u67b6\u6784\u8bbe\u8ba1","sidebar":"tutorialSidebar"},"CurveFS/comparison/CurveFS-vs-CephFS":{"id":"CurveFS/comparison/CurveFS-vs-CephFS","title":"CurveFS \u5bf9\u6bd4 CephFS","description":"","sidebar":"tutorialSidebar"},"CurveFS/deploy/offline-deploy":{"id":"CurveFS/deploy/offline-deploy","title":"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863","description":"\u79bb\u7ebf\u73af\u5883\u51c6\u5907","sidebar":"tutorialSidebar"},"CurveFS/deploy/quickstart":{"id":"CurveFS/deploy/quickstart","title":"CurveFS \u5feb\u901f\u4f53\u9a8c","description":"\u4e3a\u4e86\u63d0\u5347 Curve \u7684\u8fd0\u7ef4\u4fbf\u5229\u6027\uff0c\u6211\u4eec\u8bbe\u8ba1\u5f00\u53d1\u4e86 CurveAdm \u9879\u76ee\uff0c\u5176\u4e3b\u8981\u7528\u4e8e\u90e8\u7f72\u548c\u7ba1\u7406 Curve \u96c6\u7fa4\uff0c\u76ee\u524d\u5df2\u652f\u6301\u90e8\u7f72CurveBS & CurveFS\uff0c\u76f8\u5173\u4f7f\u7528\u6587\u6863\u8bf7\u53c2\u8003 CurveAdm\u7528\u6237\u624b\u518c\uff0c\u5e76\u6839\u636e\u624b\u518c\u9996\u5148\u5b89\u88c5CurveAdm\u5de5\u5177\u4e4b\u540e\u518d\u8fdb\u884cCurve\u96c6\u7fa4\u7684\u90e8\u7f72\u3002","sidebar":"tutorialSidebar"},"CurveFS/deploy/static-pv":{"id":"CurveFS/deploy/static-pv","title":"\u9759\u6001PV\u914d\u7f6e","description":"CurveFS CSI\u4f7f\u7528node\u8282\u70b9\u4e0a\u7684\u7f13\u5b58\u76d8","sidebar":"tutorialSidebar"},"CurveFS/maintenance/maintenance-tools":{"id":"CurveFS/maintenance/maintenance-tools","title":"\u8fd0\u7ef4\u5de5\u5177","description":"TBD","sidebar":"tutorialSidebar"},"CurveFS/performance/how-to-benchmark":{"id":"CurveFS/performance/how-to-benchmark","title":"benchmark\u6307\u5357","description":"TBD","sidebar":"tutorialSidebar"},"CurveFS/test/env-setup":{"id":"CurveFS/test/env-setup","title":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","description":"\u8bf7\u53c2\u8003 \u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","sidebar":"tutorialSidebar"},"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5":{"id":"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","title":"\u6027\u80fd\u6d4b\u8bd5","description":"\u6d4b\u8bd5\u5de5\u5177","sidebar":"tutorialSidebar"},"CurveFS/usecase/jiangsu-nongxin-es":{"id":"CurveFS/usecase/jiangsu-nongxin-es","title":"\u6c5f\u82cf\u519c\u4fe1\u9009\u62e9CurveFS\u5b9e\u73b0ES\u51b7\u6570\u636e\u957f\u671f\u5b58\u50a8","description":"\u4e00\u3001\u9700\u6c42\u80cc\u666f","sidebar":"tutorialSidebar"},"CurveFS/usecase/scenario":{"id":"CurveFS/usecase/scenario","title":"\u5e94\u7528\u573a\u666f","description":"CurveFS\u7684\u6838\u5fc3\u5e94\u7528\u573a\u666f\u4e3b\u8981\u5305\u62ec\uff1a","sidebar":"tutorialSidebar"},"Develop/code-walkthrough-xxx":{"id":"Develop/code-walkthrough-xxx","title":"\u4ee3\u7801\u8d70\u8bfb - xxx","description":"\u8bf7\u53c2\u8003 Curve\u6e90\u7801\u53ca\u6838\u5fc3\u6d41\u7a0b\u6df1\u5ea6\u89e3\u8bfb","sidebar":"tutorialSidebar"},"Develop/how-to-contribute":{"id":"Develop/how-to-contribute","title":"\u53c2\u4e0e\u8d21\u732e","description":"\u5982\u4f55\u53c2\u4e0e Curve \u9879\u76ee\u5f00\u53d1\u8be6\u89c1 Curve \u5f00\u53d1\u8005\u6307\u5357\uff0c\u5e76\u4e14\u8bf7\u9075\u5faa\u8d21\u732e\u8005\u51c6\u5219\uff0c\u6211\u4eec\u671f\u5f85\u60a8\u7684\u8d21\u732e\uff01","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"\u5e38\u89c1FAQ","description":"\u5173\u4e8eCurve","sidebar":"tutorialSidebar"},"Intro":{"id":"Intro","title":"\u5173\u4e8e Curve","description":"Curve \u662f\u7f51\u6613\u4e3b\u5bfc\u81ea\u7814\u7684\u73b0\u4ee3\u5316\u5b58\u50a8\u7cfb\u7edf, \u76ee\u524d\u652f\u6301\u6587\u4ef6\u5b58\u50a8(CurveFS)\u548c\u5757\u5b58\u50a8(CurveBS)\u3002\u73b0\u4f5c\u4e3a\u6c99\u7bb1\u9879\u76ee\u6258\u7ba1\u4e8eCNCF\u3002","sidebar":"tutorialSidebar"},"Release/release-intro":{"id":"Release/release-intro","title":"\u7248\u672c\u53d1\u5e03\u5468\u671f","description":"- CURVE\u7248\u672c\u53d1\u5e03\u5468\u671f\uff1a\u5927\u7248\u672c\u534a\u5e74\uff0c\u5c0f\u7248\u672c1~2\u4e2a\u6708","sidebar":"tutorialSidebar"},"Release/release-notes-v2.6":{"id":"Release/release-notes-v2.6","title":"CHANGELOG of v2.6","description":"Previous change logs can be found at CHANGELOG-2.5","sidebar":"tutorialSidebar"},"Roadmap/roadmap-2023":{"id":"Roadmap/roadmap-2023","title":"Curve Roadmap 2023","description":"\u8bf7\u53c2\u8003 Curve Roadmap 2023","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.50a9d8dd.js b/assets/js/935f2afb.50a9d8dd.js deleted file mode 100644 index d093576..0000000 --- a/assets/js/935f2afb.50a9d8dd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"\u5173\u4e8e Curve","href":"/","docId":"Intro"},{"type":"category","label":"Curve\u5757\u5b58\u50a8","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5e94\u7528\u573a\u666f","href":"/CurveBS/usecase/scenario","docId":"CurveBS/usecase/scenario"},{"type":"link","label":"\u7528\u6237\u6848\u4f8b1","href":"/CurveBS/usecase/usecase1","docId":"CurveBS/usecase/usecase1"}],"href":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b"},{"type":"category","label":"\u90e8\u7f72","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveBS \u5feb\u901f\u4f53\u9a8c","href":"/CurveBS/deploy/quickstart","docId":"CurveBS/deploy/quickstart"}],"href":"/category/\u90e8\u7f72"},{"type":"category","label":"\u6d4b\u8bd5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","href":"/CurveBS/test/env-setup","docId":"CurveBS/test/env-setup"},{"type":"link","label":"curve\u8986\u76d6\u7387\u6536\u96c6\u4f18\u5316","href":"/CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","docId":"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6"},{"type":"link","label":"\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","href":"/CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","docId":"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5"},{"type":"link","label":"\u6027\u80fd\u6d4b\u8bd5","href":"/CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","docId":"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5"}],"href":"/category/\u6d4b\u8bd5"},{"type":"category","label":"\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveBS\u5bf9\u6bd4Ceph RBD","href":"/CurveBS/comparison/CurveBS-vs-Ceph-rbd","docId":"CurveBS/comparison/CurveBS-vs-Ceph-rbd"}],"href":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4"},{"type":"category","label":"\u67b6\u6784","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u67b6\u6784\u4ecb\u7ecd","href":"/CurveBS/architecture/architecture-intro","docId":"CurveBS/architecture/architecture-intro"}],"href":"/category/\u67b6\u6784"},{"type":"category","label":"\u6027\u80fd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"benchmark\u6307\u5357","href":"/CurveBS/performance/how-to-benchmark","docId":"CurveBS/performance/how-to-benchmark"}],"href":"/category/\u6027\u80fd"},{"type":"category","label":"\u8fd0\u7ef4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u8fd0\u7ef4\u5de5\u5177","href":"/CurveBS/maintenance/maintenance-tools","docId":"CurveBS/maintenance/maintenance-tools"}],"href":"/category/\u8fd0\u7ef4"}],"href":"/category/curve\u5757\u5b58\u50a8"},{"type":"category","label":"Curve\u6587\u4ef6\u5b58\u50a8","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u5e94\u7528\u573a\u666f","href":"/CurveFS/usecase/scenario","docId":"CurveFS/usecase/scenario"},{"type":"link","label":"\u6c5f\u82cf\u519c\u4fe1\u9009\u62e9CurveFS\u5b9e\u73b0ES\u51b7\u6570\u636e\u957f\u671f\u5b58\u50a8","href":"/CurveFS/usecase/jiangsu-nongxin-es","docId":"CurveFS/usecase/jiangsu-nongxin-es"}],"href":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1"},{"type":"category","label":"\u90e8\u7f72","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveFS \u5feb\u901f\u4f53\u9a8c","href":"/CurveFS/deploy/quickstart","docId":"CurveFS/deploy/quickstart"},{"type":"link","label":"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863","href":"/CurveFS/deploy/offline-deploy","docId":"CurveFS/deploy/offline-deploy"}],"href":"/category/\u90e8\u7f72-1"},{"type":"category","label":"\u6d4b\u8bd5","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","href":"/CurveFS/test/env-setup","docId":"CurveFS/test/env-setup"},{"type":"link","label":"\u6027\u80fd\u6d4b\u8bd5","href":"/CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","docId":"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5"}],"href":"/category/\u6d4b\u8bd5-1"},{"type":"category","label":"\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CurveFS \u5bf9\u6bd4 CephFS","href":"/CurveFS/comparison/CurveFS-vs-CephFS","docId":"CurveFS/comparison/CurveFS-vs-CephFS"}],"href":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1"},{"type":"category","label":"\u67b6\u6784","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u67b6\u6784\u4ecb\u7ecd","href":"/CurveFS/architecture/architecture-intro","docId":"CurveFS/architecture/architecture-intro"}],"href":"/category/\u67b6\u6784-1"},{"type":"category","label":"\u6027\u80fd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"benchmark\u6307\u5357","href":"/CurveFS/performance/how-to-benchmark","docId":"CurveFS/performance/how-to-benchmark"}],"href":"/category/\u6027\u80fd-1"},{"type":"category","label":"\u8fd0\u7ef4","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u8fd0\u7ef4\u5de5\u5177","href":"/CurveFS/maintenance/maintenance-tools","docId":"CurveFS/maintenance/maintenance-tools"}],"href":"/category/\u8fd0\u7ef4-1"}],"href":"/category/curve\u6587\u4ef6\u5b58\u50a8"},{"type":"category","label":"\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684RDMA/SPDK\u652f\u6301","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7248\u672c\u4ecb\u7ecd","href":"/CurveBS-with-RDMA-SPDK/release-intro","docId":"CurveBS-with-RDMA-SPDK/release-intro"}],"href":"/category/\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301"},{"type":"category","label":"\u5f00\u53d1\u8005\u76f8\u5173","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u53c2\u4e0e\u8d21\u732e","href":"/Develop/how-to-contribute","docId":"Develop/how-to-contribute"},{"type":"link","label":"\u4ee3\u7801\u8d70\u8bfb - xxx","href":"/Develop/code-walkthrough-xxx","docId":"Develop/code-walkthrough-xxx"}],"href":"/category/\u5f00\u53d1\u8005\u76f8\u5173"},{"type":"category","label":"\u793e\u533a\u76f8\u5173","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u793e\u533a\u51c6\u5219","href":"/Community/community-guideline","docId":"Community/community-guideline"},{"type":"category","label":"\u53cc\u5468\u4f1a","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"2023","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"README","href":"/Community/Double-Week-Meetings/01-2023/README","docId":"Community/Double-Week-Meetings/01-2023/README"},{"type":"link","label":"2023-01-12","href":"/Community/Double-Week-Meetings/01-2023/2023-01-12","docId":"Community/Double-Week-Meetings/01-2023/2023-01-12"},{"type":"link","label":"2023-02-09","href":"/Community/Double-Week-Meetings/01-2023/2023-02-09","docId":"Community/Double-Week-Meetings/01-2023/2023-02-09"},{"type":"link","label":"2023-02-23","href":"/Community/Double-Week-Meetings/01-2023/2023-02-23","docId":"Community/Double-Week-Meetings/01-2023/2023-02-23"},{"type":"link","label":"2023-03-09","href":"/Community/Double-Week-Meetings/01-2023/2023-03-09","docId":"Community/Double-Week-Meetings/01-2023/2023-03-09"},{"type":"link","label":"2023-03-23","href":"/Community/Double-Week-Meetings/01-2023/2023-03-23","docId":"Community/Double-Week-Meetings/01-2023/2023-03-23"},{"type":"link","label":"2023-04-13","href":"/Community/Double-Week-Meetings/01-2023/2023-04-13","docId":"Community/Double-Week-Meetings/01-2023/2023-04-13"},{"type":"link","label":"2023-04-27","href":"/Community/Double-Week-Meetings/01-2023/2023-04-27","docId":"Community/Double-Week-Meetings/01-2023/2023-04-27"},{"type":"link","label":"2023-05-18","href":"/Community/Double-Week-Meetings/01-2023/2023-05-18","docId":"Community/Double-Week-Meetings/01-2023/2023-05-18"},{"type":"link","label":"2023-06-01","href":"/Community/Double-Week-Meetings/01-2023/2023-06-01","docId":"Community/Double-Week-Meetings/01-2023/2023-06-01"},{"type":"link","label":"2023-06-15","href":"/Community/Double-Week-Meetings/01-2023/2023-06-15","docId":"Community/Double-Week-Meetings/01-2023/2023-06-15"},{"type":"link","label":"2023-06-29","href":"/Community/Double-Week-Meetings/01-2023/2023-06-29","docId":"Community/Double-Week-Meetings/01-2023/2023-06-29"},{"type":"link","label":"2023-07-13","href":"/Community/Double-Week-Meetings/01-2023/2023-07-13","docId":"Community/Double-Week-Meetings/01-2023/2023-07-13"},{"type":"link","label":"2023-08-03","href":"/Community/Double-Week-Meetings/01-2023/2023-08-03","docId":"Community/Double-Week-Meetings/01-2023/2023-08-03"},{"type":"link","label":"2023-09-14","href":"/Community/Double-Week-Meetings/01-2023/2023-09-14","docId":"Community/Double-Week-Meetings/01-2023/2023-09-14"}],"href":"/category/2023"}],"href":"/category/\u53cc\u5468\u4f1a"}],"href":"/category/\u793e\u533a\u76f8\u5173"},{"type":"category","label":"\u7248\u672c\u76f8\u5173","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u7248\u672c\u53d1\u5e03\u5468\u671f","href":"/Release/release-intro","docId":"Release/release-intro"},{"type":"link","label":"CHANGELOG of v2.6","href":"/Release/release-notes-v2.6","docId":"Release/release-notes-v2.6"}],"href":"/category/\u7248\u672c\u76f8\u5173"},{"type":"link","label":"\u5e38\u89c1FAQ","href":"/faq","docId":"FAQ"},{"type":"category","label":"Roadmap","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Curve Roadmap 2023","href":"/Roadmap/roadmap-2023","docId":"Roadmap/roadmap-2023"}],"href":"/category/roadmap"}]},"docs":{"Community/community-guideline":{"id":"Community/community-guideline","title":"\u793e\u533a\u51c6\u5219","description":"\u793e\u533a\u6cbb\u7406","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-01-12":{"id":"Community/Double-Week-Meetings/01-2023/2023-01-12","title":"2023-01-12","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-02-09":{"id":"Community/Double-Week-Meetings/01-2023/2023-02-09","title":"2023-02-09","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-02-23":{"id":"Community/Double-Week-Meetings/01-2023/2023-02-23","title":"2023-02-23","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-03-09":{"id":"Community/Double-Week-Meetings/01-2023/2023-03-09","title":"2023-03-09","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-03-23":{"id":"Community/Double-Week-Meetings/01-2023/2023-03-23","title":"2023-03-23","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-04-13":{"id":"Community/Double-Week-Meetings/01-2023/2023-04-13","title":"2023-04-13","description":"\x3c!--","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-04-27":{"id":"Community/Double-Week-Meetings/01-2023/2023-04-27","title":"2023-04-27","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-05-18":{"id":"Community/Double-Week-Meetings/01-2023/2023-05-18","title":"2023-05-18","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-06-01":{"id":"Community/Double-Week-Meetings/01-2023/2023-06-01","title":"2023-06-01","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-06-15":{"id":"Community/Double-Week-Meetings/01-2023/2023-06-15","title":"2023-06-15","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-06-29":{"id":"Community/Double-Week-Meetings/01-2023/2023-06-29","title":"2023-06-29","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-07-13":{"id":"Community/Double-Week-Meetings/01-2023/2023-07-13","title":"2023-07-13","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-08-03":{"id":"Community/Double-Week-Meetings/01-2023/2023-08-03","title":"2023-08-03","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/2023-09-14":{"id":"Community/Double-Week-Meetings/01-2023/2023-09-14","title":"2023-09-14","description":"\u65f6\u95f4","sidebar":"tutorialSidebar"},"Community/Double-Week-Meetings/01-2023/README":{"id":"Community/Double-Week-Meetings/01-2023/README","title":"README","description":"Curve \u53cc\u5468\u4f1a","sidebar":"tutorialSidebar"},"CurveBS-with-RDMA-SPDK/release-intro":{"id":"CurveBS-with-RDMA-SPDK/release-intro","title":"\u7248\u672c\u4ecb\u7ecd","description":"\u6682\u672a\u5f00\u6e90\uff0c\u53ef\u63d0\u4f9b\u5b89\u88c5\u955c\u50cf\u3002","sidebar":"tutorialSidebar"},"CurveBS/architecture/architecture-intro":{"id":"CurveBS/architecture/architecture-intro","title":"\u67b6\u6784\u4ecb\u7ecd","description":"\u8bf7\u53c2\u8003Curve\u8bbe\u8ba1\u8981\u70b9","sidebar":"tutorialSidebar"},"CurveBS/comparison/CurveBS-vs-Ceph-rbd":{"id":"CurveBS/comparison/CurveBS-vs-Ceph-rbd","title":"CurveBS\u5bf9\u6bd4Ceph RBD","description":"\u9ad8\u6027\u80fd | \u66f4\u7a33\u5b9a | \u6613\u8fd0\u7ef4 | \u4e91\u539f\u751f","sidebar":"tutorialSidebar"},"CurveBS/deploy/quickstart":{"id":"CurveBS/deploy/quickstart","title":"CurveBS \u5feb\u901f\u4f53\u9a8c","description":"\u4e3a\u4e86\u63d0\u5347 Curve \u7684\u8fd0\u7ef4\u4fbf\u5229\u6027\uff0c\u6211\u4eec\u8bbe\u8ba1\u5f00\u53d1\u4e86 CurveAdm \u9879\u76ee\uff0c\u5176\u4e3b\u8981\u7528\u4e8e\u90e8\u7f72\u548c\u7ba1\u7406 Curve \u96c6\u7fa4\uff0c\u76ee\u524d\u5df2\u652f\u6301\u90e8\u7f72CurveBS & CurveFS\uff0c\u76f8\u5173\u4f7f\u7528\u6587\u6863\u8bf7\u53c2\u8003 CurveAdm\u7528\u6237\u624b\u518c\uff0c\u5e76\u6839\u636e\u624b\u518c\u9996\u5148\u5b89\u88c5CurveAdm\u5de5\u5177\u4e4b\u540e\u518d\u8fdb\u884cCurve\u96c6\u7fa4\u7684\u90e8\u7f72\u3002","sidebar":"tutorialSidebar"},"CurveBS/maintenance/maintenance-tools":{"id":"CurveBS/maintenance/maintenance-tools","title":"\u8fd0\u7ef4\u5de5\u5177","description":"TBD","sidebar":"tutorialSidebar"},"CurveBS/performance/how-to-benchmark":{"id":"CurveBS/performance/how-to-benchmark","title":"benchmark\u6307\u5357","description":"TBD","sidebar":"tutorialSidebar"},"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6":{"id":"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","title":"curve\u8986\u76d6\u7387\u6536\u96c6\u4f18\u5316","description":"curve\u4e3b\u8981\u4ece2\u4e2a\u7ef4\u5ea6\u8861\u91cf\u5355\u5143\u6d4b\u8bd5\u8986\u76d6\u7387\uff1a\u884c\u8986\u76d6\u7387\u548c\u5206\u652f\u8986\u76d6\u7387\u3002","sidebar":"tutorialSidebar"},"CurveBS/test/env-setup":{"id":"CurveBS/test/env-setup","title":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","description":"\u8bf7\u53c2\u8003 \u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","sidebar":"tutorialSidebar"},"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5":{"id":"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","title":"\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","description":"\u6d4b\u8bd5\u76ee\u7684","sidebar":"tutorialSidebar"},"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5":{"id":"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","title":"\u6027\u80fd\u6d4b\u8bd5","description":"\u80cc\u666f\u77e5\u8bc6","sidebar":"tutorialSidebar"},"CurveBS/usecase/scenario":{"id":"CurveBS/usecase/scenario","title":"\u5e94\u7528\u573a\u666f","description":"CurveBS\u7684\u6838\u5fc3\u5e94\u7528\u573a\u666f\u4e3b\u8981\u5305\u62ec\uff1a","sidebar":"tutorialSidebar"},"CurveBS/usecase/usecase1":{"id":"CurveBS/usecase/usecase1","title":"\u7528\u6237\u6848\u4f8b1","description":"TBD","sidebar":"tutorialSidebar"},"CurveFS/architecture/architecture-intro":{"id":"CurveFS/architecture/architecture-intro","title":"\u67b6\u6784\u4ecb\u7ecd","description":"\u8bf7\u53c2\u8003\u67b6\u6784\u8bbe\u8ba1","sidebar":"tutorialSidebar"},"CurveFS/comparison/CurveFS-vs-CephFS":{"id":"CurveFS/comparison/CurveFS-vs-CephFS","title":"CurveFS \u5bf9\u6bd4 CephFS","description":"","sidebar":"tutorialSidebar"},"CurveFS/deploy/offline-deploy":{"id":"CurveFS/deploy/offline-deploy","title":"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863","description":"\u79bb\u7ebf\u73af\u5883\u51c6\u5907","sidebar":"tutorialSidebar"},"CurveFS/deploy/quickstart":{"id":"CurveFS/deploy/quickstart","title":"CurveFS \u5feb\u901f\u4f53\u9a8c","description":"\u4e3a\u4e86\u63d0\u5347 Curve \u7684\u8fd0\u7ef4\u4fbf\u5229\u6027\uff0c\u6211\u4eec\u8bbe\u8ba1\u5f00\u53d1\u4e86 CurveAdm \u9879\u76ee\uff0c\u5176\u4e3b\u8981\u7528\u4e8e\u90e8\u7f72\u548c\u7ba1\u7406 Curve \u96c6\u7fa4\uff0c\u76ee\u524d\u5df2\u652f\u6301\u90e8\u7f72CurveBS & CurveFS\uff0c\u76f8\u5173\u4f7f\u7528\u6587\u6863\u8bf7\u53c2\u8003 CurveAdm\u7528\u6237\u624b\u518c\uff0c\u5e76\u6839\u636e\u624b\u518c\u9996\u5148\u5b89\u88c5CurveAdm\u5de5\u5177\u4e4b\u540e\u518d\u8fdb\u884cCurve\u96c6\u7fa4\u7684\u90e8\u7f72\u3002","sidebar":"tutorialSidebar"},"CurveFS/maintenance/maintenance-tools":{"id":"CurveFS/maintenance/maintenance-tools","title":"\u8fd0\u7ef4\u5de5\u5177","description":"TBD","sidebar":"tutorialSidebar"},"CurveFS/performance/how-to-benchmark":{"id":"CurveFS/performance/how-to-benchmark","title":"benchmark\u6307\u5357","description":"TBD","sidebar":"tutorialSidebar"},"CurveFS/test/env-setup":{"id":"CurveFS/test/env-setup","title":"\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","description":"\u8bf7\u53c2\u8003 \u6d4b\u8bd5\u73af\u5883\u914d\u7f6e","sidebar":"tutorialSidebar"},"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5":{"id":"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","title":"\u6027\u80fd\u6d4b\u8bd5","description":"\u6d4b\u8bd5\u5de5\u5177","sidebar":"tutorialSidebar"},"CurveFS/usecase/jiangsu-nongxin-es":{"id":"CurveFS/usecase/jiangsu-nongxin-es","title":"\u6c5f\u82cf\u519c\u4fe1\u9009\u62e9CurveFS\u5b9e\u73b0ES\u51b7\u6570\u636e\u957f\u671f\u5b58\u50a8","description":"\u4e00\u3001\u9700\u6c42\u80cc\u666f","sidebar":"tutorialSidebar"},"CurveFS/usecase/scenario":{"id":"CurveFS/usecase/scenario","title":"\u5e94\u7528\u573a\u666f","description":"CurveFS\u7684\u6838\u5fc3\u5e94\u7528\u573a\u666f\u4e3b\u8981\u5305\u62ec\uff1a","sidebar":"tutorialSidebar"},"Develop/code-walkthrough-xxx":{"id":"Develop/code-walkthrough-xxx","title":"\u4ee3\u7801\u8d70\u8bfb - xxx","description":"\u8bf7\u53c2\u8003 Curve\u6e90\u7801\u53ca\u6838\u5fc3\u6d41\u7a0b\u6df1\u5ea6\u89e3\u8bfb","sidebar":"tutorialSidebar"},"Develop/how-to-contribute":{"id":"Develop/how-to-contribute","title":"\u53c2\u4e0e\u8d21\u732e","description":"\u5982\u4f55\u53c2\u4e0e Curve \u9879\u76ee\u5f00\u53d1\u8be6\u89c1 Curve \u5f00\u53d1\u8005\u6307\u5357\uff0c\u5e76\u4e14\u8bf7\u9075\u5faa\u8d21\u732e\u8005\u51c6\u5219\uff0c\u6211\u4eec\u671f\u5f85\u60a8\u7684\u8d21\u732e\uff01","sidebar":"tutorialSidebar"},"FAQ":{"id":"FAQ","title":"\u5e38\u89c1FAQ","description":"\u5173\u4e8eCurve","sidebar":"tutorialSidebar"},"Intro":{"id":"Intro","title":"\u5173\u4e8e Curve","description":"Curve \u662f\u7f51\u6613\u4e3b\u5bfc\u81ea\u7814\u7684\u73b0\u4ee3\u5316\u5b58\u50a8\u7cfb\u7edf, \u76ee\u524d\u652f\u6301\u6587\u4ef6\u5b58\u50a8(CurveFS)\u548c\u5757\u5b58\u50a8(CurveBS)\u3002\u73b0\u4f5c\u4e3a\u6c99\u7bb1\u9879\u76ee\u6258\u7ba1\u4e8eCNCF\u3002","sidebar":"tutorialSidebar"},"Release/release-intro":{"id":"Release/release-intro","title":"\u7248\u672c\u53d1\u5e03\u5468\u671f","description":"- CURVE\u7248\u672c\u53d1\u5e03\u5468\u671f\uff1a\u5927\u7248\u672c\u534a\u5e74\uff0c\u5c0f\u7248\u672c1~2\u4e2a\u6708","sidebar":"tutorialSidebar"},"Release/release-notes-v2.6":{"id":"Release/release-notes-v2.6","title":"CHANGELOG of v2.6","description":"Previous change logs can be found at CHANGELOG-2.5","sidebar":"tutorialSidebar"},"Roadmap/roadmap-2023":{"id":"Roadmap/roadmap-2023","title":"Curve Roadmap 2023","description":"\u8bf7\u53c2\u8003 Curve Roadmap 2023","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/990437b7.467918b9.js b/assets/js/990437b7.467918b9.js new file mode 100644 index 0000000..87fd316 --- /dev/null +++ b/assets/js/990437b7.467918b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[4075],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>v});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),o=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=o(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,i=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=o(n),d=r,v=u["".concat(i,".").concat(d)]||u[d]||m[d]||s;return n?a.createElement(v,l(l({ref:t},p),{},{components:n})):a.createElement(v,l({ref:t},p))}));function v(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,l=new Array(s);l[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[u]="string"==typeof e?e:r,l[1]=c;for(var o=2;o{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>o});var a=n(7462),r=(n(7294),n(3905));const s={},l="\u9759\u6001PV\u914d\u7f6e",c={unversionedId:"CurveFS/deploy/static-pv",id:"CurveFS/deploy/static-pv",title:"\u9759\u6001PV\u914d\u7f6e",description:"CurveFS CSI\u4f7f\u7528node\u8282\u70b9\u4e0a\u7684\u7f13\u5b58\u76d8",source:"@site/docs/03-CurveFS/02-deploy/03-static-pv.md",sourceDirName:"03-CurveFS/02-deploy",slug:"/CurveFS/deploy/static-pv",permalink:"/CurveFS/deploy/static-pv",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"\u79bb\u7ebf\u90e8\u7f72\u6587\u6863",permalink:"/CurveFS/deploy/offline-deploy"},next:{title:"\u6d4b\u8bd5",permalink:"/category/\u6d4b\u8bd5-1"}},i={},o=[{value:"CurveFS CSI\u4f7f\u7528node\u8282\u70b9\u4e0a\u7684\u7f13\u5b58\u76d8",id:"curvefs-csi\u4f7f\u7528node\u8282\u70b9\u4e0a\u7684\u7f13\u5b58\u76d8",level:2},{value:"\u9759\u6001PV\u5b9e\u73b0\u8de8namespace\u5171\u4eab\u6587\u4ef6\u7cfb\u7edf",id:"\u9759\u6001pv\u5b9e\u73b0\u8de8namespace\u5171\u4eab\u6587\u4ef6\u7cfb\u7edf",level:2},{value:"\u9884\u5148\u521b\u5efa\u6587\u4ef6\u7cfb\u7edf",id:"\u9884\u5148\u521b\u5efa\u6587\u4ef6\u7cfb\u7edf",level:3},{value:"\u6309\u7167\u5982\u4e0b\u6a21\u677f\u58f0\u660ePV",id:"\u6309\u7167\u5982\u4e0b\u6a21\u677f\u58f0\u660epv",level:3},{value:"\u58f0\u660ePVC\u7ed1\u5b9a\u4e0a\u8ff0PV",id:"\u58f0\u660epvc\u7ed1\u5b9a\u4e0a\u8ff0pv",level:3},{value:"\u5bf9\u9700\u8981\u5171\u4eabpv\u7684namespace\u91cd\u590d\u4e0a\u8ff02-3\u6b65\u9aa4",id:"\u5bf9\u9700\u8981\u5171\u4eabpv\u7684namespace\u91cd\u590d\u4e0a\u8ff02-3\u6b65\u9aa4",level:3}],p={toc:o},u="wrapper";function m(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"\u9759\u6001pv\u914d\u7f6e"},"\u9759\u6001PV\u914d\u7f6e"),(0,r.kt)("h2",{id:"curvefs-csi\u4f7f\u7528node\u8282\u70b9\u4e0a\u7684\u7f13\u5b58\u76d8"},"CurveFS CSI\u4f7f\u7528node\u8282\u70b9\u4e0a\u7684\u7f13\u5b58\u76d8"),(0,r.kt)("p",null,"\u5982\u679cclient\u9700\u8981\u5f00\u542fdiskcache\u5e76\u4f7f\u7528\u5bbf\u4e3b\u673a\u989d\u5916\u7684\u786c\u76d8\u6216\u4e91\u76d8\uff0c\u9700\u8981\u5728csi driver\u90e8\u7f72\u4e4b\u524d\u5148\u628a\u4e91\u76d8\u6216\u8005\u672c\u5730\u76d8\u6302\u8f7d\u597d\u3002\u4e4b\u540e\u683c\u5f0f\u5316\u786c\u76d8\u6216\u4e91\u76d8\u7136\u540emount\u5230\u4e00\u4e2apath\uff08\u5982",(0,r.kt)("inlineCode",{parentName:"p"},"/data/curvefs-diskcache"),"\uff09\uff0c\u7136\u540e\u901a\u8fc7hostpath\u7684\u65b9\u5f0f\u6620\u5c04\u8fdbcsi\u7684daemonset pod\u91cc\u7684",(0,r.kt)("inlineCode",{parentName:"p"},"/curvefs/client/data/cache"),"\u8def\u5f84\uff0c\u914d\u7f6e\u53ef\u4ee5\u53c2\u8003\u4e0b\u9762\u8fd9\u4e2ayaml\uff1a"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curvefs-csi/blob/main/deploy/csi-node-daemonset-enable-cache.yaml"},"https://github.com/opencurve/curvefs-csi/blob/main/deploy/csi-node-daemonset-enable-cache.yaml")),(0,r.kt)("p",null,"\u4e0a\u8ff0\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684 ",(0,r.kt)("inlineCode",{parentName:"p"},"/data/curvefs-diskcache")," \u5bf9\u5e94\u7684\u5c31\u662f\u4e0a\u9762\u914d\u7f6e\u7684\u7f13\u5b58\u76d8\u76ee\u5f55\uff0c\u53ef\u4ee5\u4fee\u6539\u4e3a\u81ea\u5df1\u81ea\u5b9a\u4e49\u7684\u8def\u5f84\u540d\u79f0\u3002"),(0,r.kt)("p",null,"\u4e00\u4e2a\u5f00\u542fdiskcache\u7684\u9759\u6001pv\u6a21\u677f\u5982\u4e0b:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: PersistentVolume\nmetadata:\n name: static-pv-curvefs\nspec:\n accessModes:\n - ReadWriteMany\n capacity:\n storage: 1000Mi\n csi:\n driver: csi.curvefs.com\n volumeAttributes:\n fsType: s3\n mdsAddr: \n volumeHandle: \n mountOptions:\n - diskCache.diskCacheType=2 # \u5f00\u542fread\u548cwrite\u7f13\u5b58, 1\u4e3aread\u7f13\u5b58\uff0c\u9ed8\u8ba4\u4e3a0\u662f\u65e0\u7f13\u5b58\n - fuseClient.supportKVcache: true # \u4ee5\u4e0b\u914d\u7f6e\u53ef\u6309\u9700\u4fee\u6539\uff0c\u4e0b\u540c\n - diskCache.forceFlush: false\n - enableSumInDir: false\n - diskCache.fullRatio: 95\n - diskCache.safeRatio: 50\n persistentVolumeReclaimPolicy: Retain # \u4e0d\u8981\u4fee\u6539\u8be5\u7b56\u7565\n volumeMode: Filesystem\n")),(0,r.kt)("h2",{id:"\u9759\u6001pv\u5b9e\u73b0\u8de8namespace\u5171\u4eab\u6587\u4ef6\u7cfb\u7edf"},"\u9759\u6001PV\u5b9e\u73b0\u8de8namespace\u5171\u4eab\u6587\u4ef6\u7cfb\u7edf"),(0,r.kt)("p",null,"\u4e3a\u4e86\u5b9e\u73b0\u8de8namespace\u5171\u4eab\u6587\u4ef6\u7cfb\u7edf\uff0c\u9700\u8981\u6bcf\u4e00\u4e2anamespace\u521b\u5efa\u4e00\u7ec4PVC\u548cPV\uff0c\u5176\u4e2dPV\u6307\u5411\u7684\u662f\u540e\u7aef\u7684\u540c\u4e00\u4e2aFS\u3002"),(0,r.kt)("h3",{id:"\u9884\u5148\u521b\u5efa\u6587\u4ef6\u7cfb\u7edf"},"\u9884\u5148\u521b\u5efa\u6587\u4ef6\u7cfb\u7edf"),(0,r.kt)("p",null,"\u6bd4\u5982\u8fd9\u91cc\u7684\u6587\u4ef6\u7cfb\u7edf\u540d\u4e3a",(0,r.kt)("inlineCode",{parentName:"p"},"curvefs"),"\uff0c\u5b89\u88c5\u65b0\u5de5\u5177\u5e76\u4e14\u914d\u7f6e\u914d\u7f6e\u6587\u4ef6\uff0c\u5177\u4f53\u5b89\u88c5\u53c2\u8003\u5982\u4e0b\u6587\u6863\uff1a"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/opencurve/curve/tree/master/tools-v2#install"},"https://github.com/opencurve/curve/tree/master/tools-v2#install")),(0,r.kt)("p",null,"\u5b89\u88c5\u5b8c\u6210\u540e\u4f7f\u7528\u5982\u4e0b\u547d\u4ee4\u521b\u5efafs\uff1a"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"curve fs create fs --fsname curvefs --fstype s3 --s3.ak ${AK} --s3.sk ${SK} --s3.endpoint http://localhost:9000 --s3.bucketname curvefs --s3.blocksize 4MiB --s3.chunksize 4MiB")),(0,r.kt)("h3",{id:"\u6309\u7167\u5982\u4e0b\u6a21\u677f\u58f0\u660epv"},"\u6309\u7167\u5982\u4e0b\u6a21\u677f\u58f0\u660ePV"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: v1\nkind: PersistentVolume\nmetadata:\n name: static-pv-curvefs\nspec:\n accessModes:\n - ReadWriteMany\n capacity:\n storage: 1000Mi\n csi:\n driver: csi.curvefs.com\n volumeAttributes:\n fsType: s3\n mdsAddr: \n volumeHandle: \n mountOptions:\n - diskCache.diskCacheType=2 # \u5f00\u542fread\u548cwrite\u7f13\u5b58,1\u4e3aread\u7f13\u5b58\uff0c\u9ed8\u8ba4\u4e3a0\u662f\u65e0\u7f13\u5b58\n persistentVolumeReclaimPolicy: Retain # \u4e0d\u8981\u4fee\u6539\u8be5\u7b56\u7565\n volumeMode: Filesystem\n")),(0,r.kt)("p",null,"\u9700\u8981\u81ea\u5b9a\u4e49\u4fee\u6539\u7684\u5b57\u6bb5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"mdsaddr"),"\uff1a\u8fde\u63a5\u7684fs\u96c6\u7fa4\u7684mds\u5730\u5740"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"volumeHandle"),"\uff1a\u9884\u5148\u521b\u5efa\u7684fs\u7684\u540d\u5b57\uff0c\u6bd4\u5982curvefs")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"\u5176\u4ed6\u91cd\u70b9\u8bf4\u660e\uff1a")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"persistentVolumeReclaiPolicy: \u7b56\u7565\u4e3aRetain\uff0c\u4e0d\u8981\u8bd5\u56fe\u4fee\u6539")),(0,r.kt)("h3",{id:"\u58f0\u660epvc\u7ed1\u5b9a\u4e0a\u8ff0pv"},"\u58f0\u660ePVC\u7ed1\u5b9a\u4e0a\u8ff0PV"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: static-pvc-curvefs\n namespace: \nspec:\n accessModes:\n - ReadWriteMany\n resources:\n requests:\n storage: 100Mi\n storageClassName: ""\n volumeMode: Filesystem\n volumeName: static-pv-curvefs\n')),(0,r.kt)("p",null,"\u9700\u8981\u81ea\u5b9a\u4e49\u4fee\u6539\u7684\u5b57\u6bb5\uff1a"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"namespace\uff1a\u6307\u5b9apvc\u7684namespace\uff0c\u6bd4\u5982ns1\u3002")),(0,r.kt)("h3",{id:"\u5bf9\u9700\u8981\u5171\u4eabpv\u7684namespace\u91cd\u590d\u4e0a\u8ff02-3\u6b65\u9aa4"},"\u5bf9\u9700\u8981\u5171\u4eabpv\u7684namespace\u91cd\u590d\u4e0a\u8ff02-3\u6b65\u9aa4"),(0,r.kt)("p",null,"\u5bf9\u4e8e\u4e0d\u540c\u7684namespace\uff0c\u9700\u8981\u91cd\u590d\u4e0a\u8ff0\u76842\uff0c3\u6b65\u9aa4\uff0c\u65b0\u5efa\u7684PV\u6307\u5b9a\u540c\u4e00\u4e2aFS\uff0c\u65b0\u5efa\u7684PVC\u6307\u5b9a\u65b0\u7684namespace\u5373\u53ef\u3002"),(0,r.kt)("p",null,"\u8fd9\u6837\u4e0d\u540cnamespace\u7684pod\u6302\u8f7d\u5404\u81eanamespace\u4e0bPVC\u5373\u53ef\u3002"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.36d9cc01.js b/assets/js/main.36d9cc01.js deleted file mode 100644 index ddbdbd5..0000000 --- a/assets/js/main.36d9cc01.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.36d9cc01.js.LICENSE.txt */ -(self.webpackChunkcurve_book=self.webpackChunkcurve_book||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"06990c35":[()=>n.e(7519).then(n.bind(n,3798)),"@site/docs/02-CurveBS/03-test/01-env-setup.md",3798],"078d08d5":[()=>n.e(9993).then(n.t.bind(n,2692,19)),"~docs/default/category-tutorialsidebar-category-\u5f00\u53d1\u8005\u76f8\u5173-179.json",2692],"09ba7f07":[()=>n.e(2036).then(n.t.bind(n,9396,19)),"~docs/default/category-tutorialsidebar-category-\u8fd0\u7ef4-1-fed.json",9396],"0a4c09e6":[()=>n.e(8036).then(n.bind(n,7887)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-03-09.md",7887],"12eab49d":[()=>n.e(9680).then(n.t.bind(n,30,19)),"~docs/default/category-tutorialsidebar-category-\u6027\u80fd-1-748.json",30],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(1690),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,2027)),"@theme/SearchPage",2027],"1b4db4d5":[()=>n.e(4986).then(n.t.bind(n,7818,19)),"~docs/default/category-tutorialsidebar-category-\u90e8\u7f72-1-28a.json",7818],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1bff94c1":[()=>n.e(555).then(n.bind(n,6198)),"@site/docs/03-CurveFS/03-test/01-env-setup.md",6198],"1c0c81e0":[()=>n.e(4018).then(n.bind(n,4128)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-01-12.md",4128],"1e104361":[()=>n.e(3435).then(n.bind(n,5195)),"@site/docs/07-Release/02-release-notes-v2.6.md",5195],"1f391b9e":[()=>Promise.all([n.e(532),n.e(1690),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"22e90f3e":[()=>n.e(4350).then(n.bind(n,2576)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-04-27.md",2576],"23675ca2":[()=>n.e(6885).then(n.t.bind(n,6390,19)),"~docs/default/category-tutorialsidebar-category-\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-b52.json",6390],"28cfc256":[()=>n.e(604).then(n.bind(n,929)),"@site/docs/03-CurveFS/04-comparison/01-CurveFS-vs-CephFS.md",929],"2ef715f5":[()=>n.e(1844).then(n.bind(n,180)),"@site/docs/03-CurveFS/07-maintenance/01-maintenance-tools.md",180],"393be207":[()=>n.e(7414).then(n.bind(n,9286)),"@site/src/pages/markdown-page.md",9286],"3db84927":[()=>n.e(8521).then(n.bind(n,5846)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-03-23.md",5846],"42f8a9a4":[()=>n.e(6136).then(n.t.bind(n,4616,19)),"~docs/default/category-tutorialsidebar-category-\u6d4b\u8bd5-d30.json",4616],"46f8cdc4":[()=>n.e(8514).then(n.bind(n,2346)),"@site/docs/02-CurveBS/02-deploy/01-quickstart.md",2346],"493bc0dd":[()=>n.e(8099).then(n.t.bind(n,4485,19)),"~docs/default/category-tutorialsidebar-category-roadmap-866.json",4485],"4c342561":[()=>n.e(2896).then(n.bind(n,7185)),"@site/docs/06-Community/01-community-guideline.md",7185],"4de6d914":[()=>n.e(1099).then(n.bind(n,6369)),"@site/docs/02-CurveBS/06-performance/01-how-to-benchmark.md",6369],"4f6f0a70":[()=>n.e(2471).then(n.bind(n,1383)),"@site/docs/05-Develop/02-code-walkthrough-xxx.md",1383],"4f9e475d":[()=>n.e(8812).then(n.bind(n,2543)),"@site/docs/08-FAQ.md",2543],"50be4462":[()=>n.e(3487).then(n.t.bind(n,747,19)),"~docs/default/category-tutorialsidebar-category-\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301-012.json",747],"52985ac1":[()=>n.e(5908).then(n.t.bind(n,2776,19)),"/home/runner/work/curve-book/curve-book/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",2776],"55cb5ee0":[()=>n.e(8469).then(n.bind(n,4421)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-04-13.md",4421],"5835bfbc":[()=>n.e(2443).then(n.bind(n,5370)),"@site/docs/03-CurveFS/03-test/\u6027\u80fd\u6d4b\u8bd5.md",5370],"6095e94e":[()=>n.e(4845).then(n.t.bind(n,2316,19)),"~docs/default/category-tutorialsidebar-category-\u793e\u533a\u76f8\u5173-7bb.json",2316],"68a1d9a0":[()=>n.e(4734).then(n.bind(n,4173)),"@site/docs/02-CurveBS/07-maintenance/01-maintenance-tools.md",4173],"68fc0323":[()=>n.e(8325).then(n.t.bind(n,1919,19)),"~docs/default/category-tutorialsidebar-category-\u67b6\u6784-0c6.json",1919],"6acc8b0c":[()=>n.e(3315).then(n.bind(n,989)),"@site/docs/03-CurveFS/01-usecase/01-scenario.md",989],"6dc77e3b":[()=>n.e(8448).then(n.bind(n,2825)),"@site/docs/03-CurveFS/01-usecase/02-jiangsu-nongxin-es.md",2825],"6fddddc5":[()=>n.e(371).then(n.bind(n,5563)),"@site/docs/02-CurveBS/03-test/\u6027\u80fd\u6d4b\u8bd5.md",5563],"74a75e9e":[()=>n.e(396).then(n.t.bind(n,3517,19)),"~docs/default/category-tutorialsidebar-category-\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1-4c2.json",3517],"783daffc":[()=>n.e(4930).then(n.t.bind(n,871,19)),"~docs/default/category-tutorialsidebar-category-\u67b6\u6784-1-eec.json",871],"81490c9e":[()=>n.e(3483).then(n.bind(n,3110)),"@site/docs/04-CurveBS-with-RDMA-SPDK/01-release-intro.md",3110],"8bae3c9c":[()=>n.e(490).then(n.bind(n,7415)),"@site/docs/03-CurveFS/02-deploy/02-offline-deploy.md",7415],"8ccfadd4":[()=>n.e(7853).then(n.t.bind(n,922,19)),"~docs/default/category-tutorialsidebar-category-\u6027\u80fd-3a6.json",922],"8ce7ab14":[()=>n.e(3051).then(n.t.bind(n,2559,19)),"~docs/default/category-tutorialsidebar-category-\u90e8\u7f72-2f8.json",2559],"8d7a4e76":[()=>n.e(1122).then(n.t.bind(n,7782,19)),"~docs/default/category-tutorialsidebar-category-\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-98b.json",7782],"8dcab980":[()=>n.e(3510).then(n.t.bind(n,31,19)),"~docs/default/category-tutorialsidebar-category-\u6d4b\u8bd5-1-e5b.json",31],"8fa8ac7a":[()=>n.e(7154).then(n.t.bind(n,2982,19)),"~docs/default/category-tutorialsidebar-category-curve\u6587\u4ef6\u5b58\u50a8-b49.json",2982],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"94ed7e21":[()=>n.e(1563).then(n.bind(n,7471)),"@site/docs/02-CurveBS/04-comparison/01-CurveBS-vs-Ceph-rbd.md",7471],"9b5ada78":[()=>n.e(5650).then(n.bind(n,7745)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/01-README.md",7745],"9c7a26e0":[()=>n.e(446).then(n.bind(n,4801)),"@site/docs/03-CurveFS/06-performance/01-how-to-benchmark.md",4801],"9d2a34a4":[()=>n.e(2053).then(n.bind(n,8809)),"@site/docs/02-CurveBS/05-architecture/01-architecture-intro.md",8809],"9e0d2d20":[()=>n.e(6924).then(n.bind(n,967)),"@site/docs/09-Roadmap/01-roadmap-2023.md",967],a2f19940:[()=>n.e(7865).then(n.bind(n,2753)),"@site/docs/02-CurveBS/01-usecase/01-scenario.md",2753],a509eed6:[()=>n.e(7510).then(n.t.bind(n,9143,19)),"~docs/default/category-tutorialsidebar-category-2023-555.json",9143],a9fd269c:[()=>n.e(5123).then(n.bind(n,1301)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-02-23.md",1301],ae817aac:[()=>n.e(9795).then(n.t.bind(n,5745,19)),"/home/runner/work/curve-book/curve-book/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],b02e08b4:[()=>n.e(6758).then(n.t.bind(n,2972,19)),"~docs/default/category-tutorialsidebar-category-\u53cc\u5468\u4f1a-2c8.json",2972],b4529a7f:[()=>n.e(1128).then(n.bind(n,3944)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-06-01.md",3944],b6e1f4f1:[()=>n.e(3682).then(n.bind(n,2863)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-06-29.md",2863],bed49b90:[()=>n.e(3072).then(n.bind(n,3451)),"@site/docs/02-CurveBS/03-test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5.md",3451],c14a2e93:[()=>n.e(5937).then(n.bind(n,3642)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-02-09.md",3642],c1b372e7:[()=>n.e(638).then(n.t.bind(n,3197,19)),"~docs/default/category-tutorialsidebar-category-\u7248\u672c\u76f8\u5173-11f.json",3197],c353af6f:[()=>n.e(60).then(n.bind(n,3682)),"@site/docs/05-Develop/01-how-to-contribute.md",3682],c5f8d6f6:[()=>n.e(2564).then(n.bind(n,3975)),"@site/docs/02-CurveBS/01-usecase/02-usecase1.md",3975],cb08b7d8:[()=>n.e(2906).then(n.t.bind(n,4447,19)),"~docs/default/category-tutorialsidebar-category-\u8fd0\u7ef4-3e4.json",4447],d55ba36a:[()=>n.e(9729).then(n.bind(n,6345)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-09-14.md",6345],d9c8c52b:[()=>n.e(4224).then(n.bind(n,2419)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-07-13.md",2419],d9cf25ad:[()=>n.e(5999).then(n.bind(n,46)),"@site/docs/02-CurveBS/03-test/curve\u8986\u76d6\u7387\u6536\u96c6.md",46],dffd5b2b:[()=>n.e(9294).then(n.bind(n,2832)),"@site/docs/03-CurveFS/05-architecture/01-architecture-intro.md",2832],e095c50a:[()=>n.e(7770).then(n.bind(n,4521)),"@site/docs/03-CurveFS/02-deploy/01-quickstart.md",4521],e176d7a0:[()=>n.e(7400).then(n.bind(n,8036)),"@site/docs/01-Intro.md",8036],e4caf96c:[()=>n.e(3797).then(n.bind(n,8001)),"@site/docs/07-Release/01-release-intro.md",8001],e68ea24b:[()=>n.e(4617).then(n.t.bind(n,4436,19)),"~docs/default/category-tutorialsidebar-category-curve\u5757\u5b58\u50a8-206.json",4436],f1f85704:[()=>n.e(5799).then(n.bind(n,8185)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-08-03.md",8185],fad4f70b:[()=>n.e(4345).then(n.bind(n,5265)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-06-15.md",5265],fdcd7759:[()=>n.e(1118).then(n.t.bind(n,3769,19)),"/home/runner/work/curve-book/curve-book/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],fe1b9c8e:[()=>n.e(1147).then(n.t.bind(n,5981,19)),"~docs/default/category-tutorialsidebar-category-\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1-345.json",5981],ff35b17c:[()=>n.e(513).then(n.bind(n,8582)),"@site/docs/06-Community/02-Double-Week-Meetings/01-2023/2023-05-18.md",8582]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],h=(0,c.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/markdown-page",component:f("/markdown-page","d81"),exact:!0},{path:"/search",component:f("/search","59b"),exact:!0},{path:"/",component:f("/","f60"),routes:[{path:"/",component:f("/","ade"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/2023",component:f("/category/2023","1cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/curve\u5757\u5b58\u50a8",component:f("/category/curve\u5757\u5b58\u50a8","458"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/curve\u6587\u4ef6\u5b58\u50a8",component:f("/category/curve\u6587\u4ef6\u5b58\u50a8","9f2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/roadmap",component:f("/category/roadmap","232"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u53cc\u5468\u4f1a",component:f("/category/\u53cc\u5468\u4f1a","0a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4",component:f("/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","dae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1",component:f("/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1","261"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b",component:f("/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","c19"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1",component:f("/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1","1d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u5f00\u53d1\u8005\u76f8\u5173",component:f("/category/\u5f00\u53d1\u8005\u76f8\u5173","bb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u6027\u80fd",component:f("/category/\u6027\u80fd","ca5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u6027\u80fd-1",component:f("/category/\u6027\u80fd-1","252"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u67b6\u6784",component:f("/category/\u67b6\u6784","164"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u67b6\u6784-1",component:f("/category/\u67b6\u6784-1","7a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u6d4b\u8bd5",component:f("/category/\u6d4b\u8bd5","473"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u6d4b\u8bd5-1",component:f("/category/\u6d4b\u8bd5-1","12e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u7248\u672c\u76f8\u5173",component:f("/category/\u7248\u672c\u76f8\u5173","816"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u793e\u533a\u76f8\u5173",component:f("/category/\u793e\u533a\u76f8\u5173","5a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u8fd0\u7ef4",component:f("/category/\u8fd0\u7ef4","1e7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u8fd0\u7ef4-1",component:f("/category/\u8fd0\u7ef4-1","eb7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u90e8\u7f72",component:f("/category/\u90e8\u7f72","8b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u90e8\u7f72-1",component:f("/category/\u90e8\u7f72-1","3b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/category/\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301",component:f("/category/\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301","9d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/community-guideline",component:f("/Community/community-guideline","5de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-01-12",component:f("/Community/Double-Week-Meetings/01-2023/2023-01-12","6ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-02-09",component:f("/Community/Double-Week-Meetings/01-2023/2023-02-09","03d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-02-23",component:f("/Community/Double-Week-Meetings/01-2023/2023-02-23","400"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-03-09",component:f("/Community/Double-Week-Meetings/01-2023/2023-03-09","4ff"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-03-23",component:f("/Community/Double-Week-Meetings/01-2023/2023-03-23","27d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-04-13",component:f("/Community/Double-Week-Meetings/01-2023/2023-04-13","bbd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-04-27",component:f("/Community/Double-Week-Meetings/01-2023/2023-04-27","496"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-05-18",component:f("/Community/Double-Week-Meetings/01-2023/2023-05-18","3d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-06-01",component:f("/Community/Double-Week-Meetings/01-2023/2023-06-01","784"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-06-15",component:f("/Community/Double-Week-Meetings/01-2023/2023-06-15","f62"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-06-29",component:f("/Community/Double-Week-Meetings/01-2023/2023-06-29","95c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-07-13",component:f("/Community/Double-Week-Meetings/01-2023/2023-07-13","87f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-08-03",component:f("/Community/Double-Week-Meetings/01-2023/2023-08-03","297"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/2023-09-14",component:f("/Community/Double-Week-Meetings/01-2023/2023-09-14","b9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Community/Double-Week-Meetings/01-2023/README",component:f("/Community/Double-Week-Meetings/01-2023/README","9e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS-with-RDMA-SPDK/release-intro",component:f("/CurveBS-with-RDMA-SPDK/release-intro","db8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/architecture/architecture-intro",component:f("/CurveBS/architecture/architecture-intro","7b4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/comparison/CurveBS-vs-Ceph-rbd",component:f("/CurveBS/comparison/CurveBS-vs-Ceph-rbd","215"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/deploy/quickstart",component:f("/CurveBS/deploy/quickstart","209"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/maintenance/maintenance-tools",component:f("/CurveBS/maintenance/maintenance-tools","9fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/performance/how-to-benchmark",component:f("/CurveBS/performance/how-to-benchmark","5f3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6",component:f("/CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","d4c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/test/env-setup",component:f("/CurveBS/test/env-setup","ca5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5",component:f("/CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","96d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/test/\u6027\u80fd\u6d4b\u8bd5",component:f("/CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","05b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/usecase/scenario",component:f("/CurveBS/usecase/scenario","6c0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveBS/usecase/usecase1",component:f("/CurveBS/usecase/usecase1","466"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/architecture/architecture-intro",component:f("/CurveFS/architecture/architecture-intro","7ad"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/comparison/CurveFS-vs-CephFS",component:f("/CurveFS/comparison/CurveFS-vs-CephFS","06a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/deploy/offline-deploy",component:f("/CurveFS/deploy/offline-deploy","56d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/deploy/quickstart",component:f("/CurveFS/deploy/quickstart","99c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/maintenance/maintenance-tools",component:f("/CurveFS/maintenance/maintenance-tools","bd6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/performance/how-to-benchmark",component:f("/CurveFS/performance/how-to-benchmark","945"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/test/env-setup",component:f("/CurveFS/test/env-setup","04f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/test/\u6027\u80fd\u6d4b\u8bd5",component:f("/CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","f3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/usecase/jiangsu-nongxin-es",component:f("/CurveFS/usecase/jiangsu-nongxin-es","246"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CurveFS/usecase/scenario",component:f("/CurveFS/usecase/scenario","99d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Develop/code-walkthrough-xxx",component:f("/Develop/code-walkthrough-xxx","763"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Develop/how-to-contribute",component:f("/Develop/how-to-contribute","14d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/faq",component:f("/faq","802"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Release/release-intro",component:f("/Release/release-intro","17c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Release/release-notes-v2.6",component:f("/Release/release-notes-v2.6","6ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/Roadmap/roadmap-2023",component:f("/Roadmap/roadmap-2023","406"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),v=n(1944),y=n(4711),w=n(9727),k=n(3320),S=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(E,null),r.createElement(S.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const _=new Map;function T(e){if(_.has(e.pathname))return{...e,pathname:_.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return _.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return _.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),A=n(8940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const P=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function D(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),D(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(P,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const N=O,I="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function j(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${I}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
    \n

    Your Docusaurus site did not load properly.

    \n

    A very common reason is a wrong site baseUrl configuration.

    \n

    Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

    \n

    We suggest trying baseUrl =

    \n
    \n`}(e)).replace(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,j(e))),r.createElement("div",{id:I}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(z,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var q=n(4763);function W(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(q.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(C,null),r.createElement($,null),r.createElement(N,{location:T(t)},e)))))}var H=n(6887);const G=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const Z=new Set,V=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Y={prefetch(e){if(!(e=>!K()&&!V.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(H).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!V.has(e))(e)&&(V.add(e),D(e))},X=Object.freeze(Y);if(l.Z.canUseDOM){window.docusaurus=X;const e=a.hydrate;D(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(W,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"Intro","docs":[{"id":"Community/community-guideline","path":"/Community/community-guideline","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-01-12","path":"/Community/Double-Week-Meetings/01-2023/2023-01-12","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-02-09","path":"/Community/Double-Week-Meetings/01-2023/2023-02-09","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-02-23","path":"/Community/Double-Week-Meetings/01-2023/2023-02-23","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-03-09","path":"/Community/Double-Week-Meetings/01-2023/2023-03-09","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-03-23","path":"/Community/Double-Week-Meetings/01-2023/2023-03-23","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-04-13","path":"/Community/Double-Week-Meetings/01-2023/2023-04-13","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-04-27","path":"/Community/Double-Week-Meetings/01-2023/2023-04-27","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-05-18","path":"/Community/Double-Week-Meetings/01-2023/2023-05-18","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-06-01","path":"/Community/Double-Week-Meetings/01-2023/2023-06-01","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-06-15","path":"/Community/Double-Week-Meetings/01-2023/2023-06-15","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-06-29","path":"/Community/Double-Week-Meetings/01-2023/2023-06-29","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-07-13","path":"/Community/Double-Week-Meetings/01-2023/2023-07-13","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-08-03","path":"/Community/Double-Week-Meetings/01-2023/2023-08-03","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/2023-09-14","path":"/Community/Double-Week-Meetings/01-2023/2023-09-14","sidebar":"tutorialSidebar"},{"id":"Community/Double-Week-Meetings/01-2023/README","path":"/Community/Double-Week-Meetings/01-2023/README","sidebar":"tutorialSidebar"},{"id":"CurveBS-with-RDMA-SPDK/release-intro","path":"/CurveBS-with-RDMA-SPDK/release-intro","sidebar":"tutorialSidebar"},{"id":"CurveBS/architecture/architecture-intro","path":"/CurveBS/architecture/architecture-intro","sidebar":"tutorialSidebar"},{"id":"CurveBS/comparison/CurveBS-vs-Ceph-rbd","path":"/CurveBS/comparison/CurveBS-vs-Ceph-rbd","sidebar":"tutorialSidebar"},{"id":"CurveBS/deploy/quickstart","path":"/CurveBS/deploy/quickstart","sidebar":"tutorialSidebar"},{"id":"CurveBS/maintenance/maintenance-tools","path":"/CurveBS/maintenance/maintenance-tools","sidebar":"tutorialSidebar"},{"id":"CurveBS/performance/how-to-benchmark","path":"/CurveBS/performance/how-to-benchmark","sidebar":"tutorialSidebar"},{"id":"CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","path":"/CurveBS/test/curve\u8986\u76d6\u7387\u6536\u96c6","sidebar":"tutorialSidebar"},{"id":"CurveBS/test/env-setup","path":"/CurveBS/test/env-setup","sidebar":"tutorialSidebar"},{"id":"CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","path":"/CurveBS/test/\u5f02\u5e38\u81ea\u52a8\u5316\u65b9\u6cd5","sidebar":"tutorialSidebar"},{"id":"CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","path":"/CurveBS/test/\u6027\u80fd\u6d4b\u8bd5","sidebar":"tutorialSidebar"},{"id":"CurveBS/usecase/scenario","path":"/CurveBS/usecase/scenario","sidebar":"tutorialSidebar"},{"id":"CurveBS/usecase/usecase1","path":"/CurveBS/usecase/usecase1","sidebar":"tutorialSidebar"},{"id":"CurveFS/architecture/architecture-intro","path":"/CurveFS/architecture/architecture-intro","sidebar":"tutorialSidebar"},{"id":"CurveFS/comparison/CurveFS-vs-CephFS","path":"/CurveFS/comparison/CurveFS-vs-CephFS","sidebar":"tutorialSidebar"},{"id":"CurveFS/deploy/offline-deploy","path":"/CurveFS/deploy/offline-deploy","sidebar":"tutorialSidebar"},{"id":"CurveFS/deploy/quickstart","path":"/CurveFS/deploy/quickstart","sidebar":"tutorialSidebar"},{"id":"CurveFS/maintenance/maintenance-tools","path":"/CurveFS/maintenance/maintenance-tools","sidebar":"tutorialSidebar"},{"id":"CurveFS/performance/how-to-benchmark","path":"/CurveFS/performance/how-to-benchmark","sidebar":"tutorialSidebar"},{"id":"CurveFS/test/env-setup","path":"/CurveFS/test/env-setup","sidebar":"tutorialSidebar"},{"id":"CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","path":"/CurveFS/test/\u6027\u80fd\u6d4b\u8bd5","sidebar":"tutorialSidebar"},{"id":"CurveFS/usecase/jiangsu-nongxin-es","path":"/CurveFS/usecase/jiangsu-nongxin-es","sidebar":"tutorialSidebar"},{"id":"CurveFS/usecase/scenario","path":"/CurveFS/usecase/scenario","sidebar":"tutorialSidebar"},{"id":"Develop/code-walkthrough-xxx","path":"/Develop/code-walkthrough-xxx","sidebar":"tutorialSidebar"},{"id":"Develop/how-to-contribute","path":"/Develop/how-to-contribute","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/faq","sidebar":"tutorialSidebar"},{"id":"Intro","path":"/","sidebar":"tutorialSidebar"},{"id":"Release/release-intro","path":"/Release/release-intro","sidebar":"tutorialSidebar"},{"id":"Release/release-notes-v2.6","path":"/Release/release-notes-v2.6","sidebar":"tutorialSidebar"},{"id":"Roadmap/roadmap-2023","path":"/Roadmap/roadmap-2023","sidebar":"tutorialSidebar"},{"id":"/category/curve\u5757\u5b58\u50a8","path":"/category/curve\u5757\u5b58\u50a8","sidebar":"tutorialSidebar"},{"id":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","path":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b","sidebar":"tutorialSidebar"},{"id":"/category/\u90e8\u7f72","path":"/category/\u90e8\u7f72","sidebar":"tutorialSidebar"},{"id":"/category/\u6d4b\u8bd5","path":"/category/\u6d4b\u8bd5","sidebar":"tutorialSidebar"},{"id":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","path":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4","sidebar":"tutorialSidebar"},{"id":"/category/\u67b6\u6784","path":"/category/\u67b6\u6784","sidebar":"tutorialSidebar"},{"id":"/category/\u6027\u80fd","path":"/category/\u6027\u80fd","sidebar":"tutorialSidebar"},{"id":"/category/\u8fd0\u7ef4","path":"/category/\u8fd0\u7ef4","sidebar":"tutorialSidebar"},{"id":"/category/curve\u6587\u4ef6\u5b58\u50a8","path":"/category/curve\u6587\u4ef6\u5b58\u50a8","sidebar":"tutorialSidebar"},{"id":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1","path":"/category/\u5e94\u7528\u573a\u666f\u53ca\u6848\u4f8b-1","sidebar":"tutorialSidebar"},{"id":"/category/\u90e8\u7f72-1","path":"/category/\u90e8\u7f72-1","sidebar":"tutorialSidebar"},{"id":"/category/\u6d4b\u8bd5-1","path":"/category/\u6d4b\u8bd5-1","sidebar":"tutorialSidebar"},{"id":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1","path":"/category/\u540c\u7c7b\u8f6f\u4ef6\u5bf9\u6bd4-1","sidebar":"tutorialSidebar"},{"id":"/category/\u67b6\u6784-1","path":"/category/\u67b6\u6784-1","sidebar":"tutorialSidebar"},{"id":"/category/\u6027\u80fd-1","path":"/category/\u6027\u80fd-1","sidebar":"tutorialSidebar"},{"id":"/category/\u8fd0\u7ef4-1","path":"/category/\u8fd0\u7ef4-1","sidebar":"tutorialSidebar"},{"id":"/category/\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301","path":"/category/\u9ad8\u6027\u80fd\u5757\u5b58\u50a8\u7684rdmaspdk\u652f\u6301","sidebar":"tutorialSidebar"},{"id":"/category/\u5f00\u53d1\u8005\u76f8\u5173","path":"/category/\u5f00\u53d1\u8005\u76f8\u5173","sidebar":"tutorialSidebar"},{"id":"/category/\u793e\u533a\u76f8\u5173","path":"/category/\u793e\u533a\u76f8\u5173","sidebar":"tutorialSidebar"},{"id":"/category/\u53cc\u5468\u4f1a","path":"/category/\u53cc\u5468\u4f1a","sidebar":"tutorialSidebar"},{"id":"/category/2023","path":"/category/2023","sidebar":"tutorialSidebar"},{"id":"/category/\u7248\u672c\u76f8\u5173","path":"/category/\u7248\u672c\u76f8\u5173","sidebar":"tutorialSidebar"},{"id":"/category/roadmap","path":"/category/roadmap","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"Intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"zh","locales":["zh"],"path":"i18n","currentLocale":"zh","localeConfigs":{"zh":{"label":"\u4e2d\u6587","direction":"ltr","htmlLang":"zh","calendar":"gregory","path":"zh"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.1","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.35.0"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(179);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),S=(0,a.useContext)(c),E=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>E.current));const x=f||p;const C=(0,s.Z)(x),_=x?.replace("pathname://","");let T=void 0!==_?(L=_,b&&(e=>e.startsWith("/"))(L)?k(L):L):void 0;var L;T&&C&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),R=n?o.OL:o.rU,P=u.Z.canUseIntersectionObserver,D=(0,a.useRef)(),O=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,a.useEffect)((()=>(!P&&C&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&D.current&&D.current.disconnect()})),[D,T,P,C]);const N=T?.startsWith("#")??!1,I=!T||!C||N;return I||g||S.collectLink(T),I?a.createElement("a",(0,r.Z)({ref:E,href:T},x&&!C&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(R,(0,r.Z)({},v,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{E.current=e,P&&e&&C&&(D.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(D.current.unobserve(e),D.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),D.current.observe(e))},to:T},n&&{isActive:h,activeClassName:m}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>h,gA:()=>f,_r:()=>c,Jo:()=>g,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Dt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(7462),s=n(6550),u=n(5999),c=n(5936);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:v.skipToContent})}var w=n(6668),k=n(9689);function S(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const E={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",E.closeButton,e.className)}),r.createElement(S,{width:14,height:14,strokeWidth:3.1}))}const C={content:"content_knG7"};function _(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(_,{className:T.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:T.announcementBarClose}))}var A=n(2961),R=n(2466);var P=n(902),D=n(3102);const O=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,D.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,P.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function I(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,D.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(2949),j=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function $(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,j.Z)(),s=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(U.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!l&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),r.createElement($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})))}const W=r.memo(q),H={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(W,{className:t,buttonClassName:"dark"===n?H.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var Q=n(1327);function Z(){return r.createElement(Q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function V(){const e=(0,A.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(S,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(Z,null),r.createElement(G,{className:"margin-right--md"}),r.createElement(V,null))}var Y=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(Y.Z,(0,l.Z)({href:c?m:o},d,g)):r.createElement(Y.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(He,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(He,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const he="iconLanguage_nlXk";var ge=n(1029),be=n(412),ve=n(373),ye=n(143),we=n(22),ke=n(8202),Se=n(3926),Ee=n(1073),xe=n(2539),Ce=n(726);const _e='',Te='',Le='',Ae='',Re='',Pe='',De='',Oe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ne(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:l}=e;const s=0===n,u=1===n,c=[];i?c.push(Pe):l&&c.push(De);const d=c.map((e=>`${e}`)),f=`${s?_e:u?Te:Le}`,p=[`${(0,Ce.o)(t.t,(0,Ee.m)(a,"t"),o)}`];if(!i&&!l&&ge.H6){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;p.push(`${(0,Se.e)(e??[])}`)}else s||p.push(`${(0,xe.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const m=`${Ae}`;return[...d,f,``,...p,"",m].join("")}function Ie(){return`${Re}${(0,u.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Me=n(311);async function Fe(){const e=await Promise.all([n.e(8443),n.e(5525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Be="_highlight";const je=function(e){let{handleSearchBarToggle:t}=e;const{siteConfig:{baseUrl:n}}=(0,se.Z)(),o=(0,ye.gA)();let i=n;try{const{preferredVersion:e}=(0,ve.J)(o?.pluginId??ge.gQ);e&&!e.isLast&&(i=e.path+"/")}catch(I){if(ge.l9&&!(I instanceof P.i6))throw I}const l=(0,s.k6)(),c=(0,s.TH)(),d=(0,r.useRef)(null),f=(0,r.useRef)(new Map),p=(0,r.useRef)(!1),[m,h]=(0,r.useState)(!1),[g,b]=(0,r.useState)(!1),[v,y]=(0,r.useState)(""),w=(0,r.useRef)(null),k=(0,r.useRef)(""),[S,E]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(ge.Kc))return;let e="";if(c.pathname.startsWith(i)){const t=c.pathname.substring(i.length),n=ge.Kc.find((e=>t===e||t.startsWith(`${e}/`)));n&&(e=n)}k.current!==e&&(f.current.delete(e),k.current=e),E(e)}),[c.pathname,i]);const x=!!ge.hG&&Array.isArray(ge.Kc)&&""===S,C=(0,r.useCallback)((async()=>{if(x||f.current.get(S))return;f.current.set(S,"loading"),w.current?.autocomplete.destroy(),h(!0);const[{wrappedIndexes:e,zhDictionary:t},r]=await Promise.all([(0,we.w)(i,S),Fe()]);if(w.current=r(d.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,a.Z)(Oe.searchBar,{[Oe.searchBarLeft]:"left"===ge.pu}),noPrefix:!0,dropdownMenu:Oe.dropdownMenu,input:Oe.input,hint:Oe.hint,suggestions:Oe.suggestions,suggestion:Oe.suggestion,cursor:Oe.cursor,dataset:Oe.dataset,empty:Oe.empty}},[{source:(0,ke.v)(e,t,ge.qo),templates:{suggestion:Ne,empty:Ie,footer:e=>{let{query:t,isEmpty:r}=e;if(r&&!S)return;const a=(e=>{let{query:t,isEmpty:r}=e;const a=document.createElement("a"),o=new URLSearchParams,s=(0,u.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),c=(0,u.I)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:S}),d=(0,u.I)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:S});let f;if(o.set("q",t),f=S&&r?c:S?d:s,Array.isArray(ge.Kc)&&!r&&o.set("ctx",S),i!==n){if(!i.startsWith(n))throw new Error(`Version url '${i}' does not start with base url '${n}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",i.substring(n.length))}const p=`${n}search?${o.toString()}`;return a.href=p,a.textContent=f,a.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),w.current?.autocomplete.close(),l.push(p))})),a})({query:t,isEmpty:r}),o=document.createElement("div");return o.className=Oe.hitFooter,o.appendChild(a),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;d.current?.blur();let o=n;if(ge.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(Be,t);o+=`?${e.toString()}`}r&&(o+=r),l.push(o)})).on("autocomplete:closed",(()=>{d.current?.blur()})),f.current.set(S,"done"),h(!1),p.current){const e=d.current;e.value&&w.current?.autocomplete.open(),e.focus()}}),[x,S,i,n,l]);(0,r.useEffect)((()=>{if(!ge.vc)return;const e=be.Z.canUseDOM?new URLSearchParams(c.search).getAll(Be):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new ge.vc(t);n.unmark(),0!==e.length&&n.mark(e),y(e.join(" ")),w.current?.autocomplete.setVal(e.join(" "))}))}),[c.search,c.pathname]);const[_,T]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{p.current=!0,C(),T(!0),t?.(!0)}),[t,C]),A=(0,r.useCallback)((()=>{T(!1),t?.(!1)}),[t]),R=(0,r.useCallback)((()=>{C()}),[C]),D=(0,r.useCallback)((e=>{y(e.target.value),e.target.value&&b(!0)}),[]),O=!!be.Z.canUseDOM&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!ge.AY)return;const e=e=>{!(O?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),d.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[O,L]);const N=(0,r.useCallback)((()=>{const e=new URLSearchParams(c.search);e.delete(Be);const t=e.toString(),n=c.pathname+(""!=t?`?${t}`:"")+c.hash;n!=c.pathname+c.search+c.hash&&l.push(n),y(""),w.current?.autocomplete.setVal("")}),[c.pathname,c.search,c.hash,l]);return r.createElement("div",{className:(0,a.Z)("navbar__search",Oe.searchBarContainer,{[Oe.searchIndexLoading]:m&&g,[Oe.focused]:_}),hidden:x},r.createElement("input",{placeholder:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:L,onBlur:A,onChange:D,ref:d,value:v}),r.createElement(Me.Z,{className:Oe.searchBarLoadingRing}),ge.AY&&ge.t_&&(""!==v?r.createElement("button",{className:Oe.searchClearButton,onClick:N},"\u2715"):be.Z.canUseDOM&&r.createElement("div",{className:Oe.searchHintContainer},r.createElement("kbd",{className:Oe.searchHint},O?"\u2318":"ctrl"),r.createElement("kbd",{className:Oe.searchHint},"K"))))},ze={searchBox:"searchBox_ZlJk"};function $e(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,ze.searchBox)},t)}var Ue=n(2802);const qe=e=>e.docs.find((t=>t.id===e.mainDocId));const We={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement($e,{className:n},r.createElement(je,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,Ue.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,Ue.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Ue.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,ye.Iw)(n),m=(0,ye.gB)(n),{savePreferredVersionName:h}=(0,ve.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??qe(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,Ue.lO)(n)[0],v=t&&g.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&g.length>1?void 0:qe(b).path;return g.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},c,{mobile:t,label:v,to:y,items:g,isActive:a?()=>!1:void 0}))}};function He(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=We[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ge(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(He,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Qe(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ze(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Qe,{onClick:()=>t.hide()}),t.content)}function Ve(){const e=(0,A.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(K,null),primaryMenu:r.createElement(Ge,null),secondaryMenu:r.createElement(Ze,null)}):null}const Ke={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ke.navbarHideable,!s&&Ke.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ye,{onClick:i.toggle}),r.createElement(Ve,null))}var Je=n(8780);const et={errorBoundaryError:"errorBoundaryError_a6uf"};function tt(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function nt(e){let{error:t}=e;const n=(0,Je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:et.errorBoundaryError},n)}class rt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const at="right";function ot(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function it(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(ot,null))}const lt={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(rt,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(He,e)))))}function ut(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ct(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??at)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(ut,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(it,null),r.createElement(Z,null),r.createElement(st,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(st,{items:a}),r.createElement(G,{className:lt.colorModeToggle}),!o&&r.createElement($e,null,r.createElement(je,null)))})}function dt(){return r.createElement(Xe,null,r.createElement(ct,null))}function ft(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Y.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function pt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ft,{item:t}))}function mt(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(pt,{key:t,item:e})))))}function ht(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(mt,{key:t,column:e}))))}function gt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function bt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ft,{item:t})}function vt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(bt,{item:e}),t.length!==n+1&&r.createElement(gt,null))))))}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(ht,{columns:t}):r.createElement(vt,{links:t})}var wt=n(941);const kt={footerLogoLink:"footerLogoLink_BH7S"};function St(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(wt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function Et(e){let{logo:t}=e;return t.href?r.createElement(Y.Z,{href:t.href,className:kt.footerLogoLink,target:t.target},r.createElement(St,{logo:t})):r.createElement(St,{logo:t})}function xt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ct(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function _t(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Ct,{style:o,links:n&&n.length>0&&r.createElement(yt,{links:n}),logo:a&&r.createElement(Et,{logo:a}),copyright:t&&r.createElement(xt,{copyright:t})})}const Tt=r.memo(_t),Lt=(0,P.Qc)([B.S,k.pl,R.OC,ve.L5,i.VC,function(e){let{children:t}=e;return r.createElement(D.n2,null,r.createElement(A.M,null,r.createElement(N,null,t)))}]);function At(e){let{children:t}=e;return r.createElement(Lt,null,t)}function Rt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(tt,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(nt,{error:t})))))}const Pt={mainWrapper:"mainWrapper_z2l0"};function Dt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,b.t)(),r.createElement(At,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(L,null),r.createElement(dt,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Pt.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(Rt,e)},t)),!n&&r.createElement(Tt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),h=n?"":t,g=u?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>g});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),i?.(n))},className:l},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>g});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=(n(1688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{MN:()=>C,Wl:()=>m,_F:()=>v,cE:()=>f,jA:()=>h,xz:()=>p,hI:()=>x,lO:()=>k,vY:()=>E,oz:()=>S,s1:()=>w});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(4477),u=n(1116);function c(e){return Array.from(new Set(e))}var d=n(8596);const f=!!i._r;function p(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function m(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=m(t);if(e)return e}}}function h(){const{pathname:e}=(0,a.TH)(),t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||b(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,u.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}function C(e){return e.filter((e=>"category"!==e.type||!!m(e)))}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),a=n(6010);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};function i(e){let{className:t}=e;return r.createElement("div",{className:(0,a.Z)(o.loadingRing,t)},r.createElement("div",null),r.createElement("div",null),r.createElement("div",null),r.createElement("div",null))}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>l});var r=n(1336),a=n.n(r),o=n(1029);const i=new Map;function l(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),l=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(l)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>s});var r=n(1336),a=n.n(r);var o=n(1029);function i(e){return l(e).concat(l(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function l(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function s(e,t,n){return function(r,l){const s=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===s.length)return void l([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const l of t)if(r.substr(0,l.length)===l){const t={missed:a.missed,term:a.term.concat({value:l})};r.length>l.length?e(r.substr(l.length),t):n.push(t),i=!0}else for(let t=l.length-1;t>o;t-=1){const s=l.substr(0,t);if(r.substr(0,t)===s){o=t;const l={missed:a.missed,term:a.term.concat({value:s,trailing:!0})};r.length>t?e(r.substr(t),l):n.push(l),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let l;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);l=[];const t=[];for(const r of n){const n=e(r);l.push(n),n.length0&&t.push(n)}n.push(...t)}else l=n.slice();const s=[];for(const a of l)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)s.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(s))}(s,t),c=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(c.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(1690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const l=n+i.length;l${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>s});var r=n(1690),a=n(2539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var l=n(1029);function s(e,t,n,o){void 0===o&&(o=l.Hk);const{chunkIndex:s,chunks:u}=function(e,t,n){const o=[];let l=0,s=0,u=-1;for(;ls){const t=i(e.substring(s,c)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===u&&(u=o.length),s=c+d,o.push({html:(0,a.C)(e.substring(c,s),n,!0),textLength:d})}}if(s({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:u,chunks:o}}(e,t,n),c=u.slice(0,s),d=u[s],f=[d.html],p=u.slice(s+1);let m=d.textLength,h=0,g=0,b=!1,v=!1;for(;m0){const e=c.pop();m+e.textLength<=o?(f.unshift(e.html),h+=e.textLength,m+=e.textLength):(b=!0,c.length=0)}else{if(!(p.length>0))break;{const e=p.shift();m+e.textLength<=o?(f.push(e.html),g+=e.textLength,m+=e.textLength):(v=!0,p.length=0)}}return(b||c.length>0)&&f.unshift("\u2026"),(v||p.length>0)&&f.push("\u2026"),f.join("")}},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>l,gQ:()=>h,H6:()=>d,hG:()=>v,l9:()=>g,dK:()=>o,_k:()=>i,pu:()=>m,AY:()=>f,t_:()=>p,Kc:()=>b,J:()=>s,Hk:()=>c,qo:()=>u,pQ:()=>y});var r=n(1336),a=n.n(r);n(892)(a()),n(1728).w(a()),n(4182)(a());const o=["en","zh"],i=!1,l=null,s="search-index{dir}.json?_=af545112",u=8,c=50,d=!1,f=!0,p=!0,m="right",h=void 0,g=!0,b=null,v=!1,y=!1},1728:(e,t,n)=>{"use strict";function r(e){const t=new RegExp("^[^"+e+"]+","u"),n=new RegExp("[^"+e+"]+$","u");return function(e){return e.update((function(e){return e.replace(t,"").replace(n,"")}))}}function a(e,t){e.trimmerSupport.generateTrimmer=r,e.zh=function(){this.pipeline.reset(),this.pipeline.add(e.zh.trimmer,e.zh.stopWordFilter),t&&(this.tokenizer=t)},t&&(e.zh.tokenizer=t),e.zh.wordCharacters="\\u3400-\\u4DBF\\u4E00-\\u9FFC\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29\\u{20000}-\\u{2A6DD}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u{30000}-\\u{3134A}",e.zh.trimmer=e.trimmerSupport.generateTrimmer(e.zh.wordCharacters),e.Pipeline.registerFunction(e.zh.trimmer,"trimmer-zh"),e.zh.stopWordFilter=e.generateStopWordFilter("\u7684 \u4e00 \u4e0d \u5728 \u4eba \u6709 \u662f \u4e3a \u4ee5 \u4e8e \u4e0a \u4ed6 \u800c \u540e \u4e4b \u6765 \u53ca \u4e86 \u56e0 \u4e0b \u53ef \u5230 \u7531 \u8fd9 \u4e0e \u4e5f \u6b64 \u4f46 \u5e76 \u4e2a \u5176 \u5df2 \u65e0 \u5c0f \u6211 \u4eec \u8d77 \u6700 \u518d \u4eca \u53bb \u597d \u53ea \u53c8 \u6216 \u5f88 \u4ea6 \u67d0 \u628a \u90a3 \u4f60 \u4e43 \u5b83 \u5427 \u88ab \u6bd4 \u522b \u8d81 \u5f53 \u4ece \u5230 \u5f97 \u6253 \u51e1 \u513f \u5c14 \u8be5 \u5404 \u7ed9 \u8ddf \u548c \u4f55 \u8fd8 \u5373 \u51e0 \u65e2 \u770b \u636e \u8ddd \u9760 \u5566 \u4e86 \u53e6 \u4e48 \u6bcf \u4eec \u561b \u62ff \u54ea \u90a3 \u60a8 \u51ed \u4e14 \u5374 \u8ba9 \u4ecd \u5565 \u5982 \u82e5 \u4f7f \u8c01 \u867d \u968f \u540c \u6240 \u5979 \u54c7 \u55e1 \u5f80 \u54ea \u4e9b \u5411 \u6cbf \u54df \u7528 \u4e8e \u54b1 \u5219 \u600e \u66fe \u81f3 \u81f4 \u7740 \u8bf8 \u81ea".split(" ")),e.Pipeline.registerFunction(e.zh.stopWordFilter,"stopWordFilter-zh")}n.d(t,{w:()=>a})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>_,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},4182:function(e,t,n){var r,a;r=function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),n=t.join("-"),r="",a=[],o=[],i=0;i=n&&t[(a-=n)>>3]&1<<(7&a))return this.cursor++,!0}return!1},in_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var a=e.charCodeAt(this.cursor-1);if(a<=r&&a>=n&&t[(a-=n)>>3]&1<<(7&a))return this.cursor--,!0}return!1},out_grouping:function(t,n,r){if(this.cursorr||a>3]&1<<(7&a)))return this.cursor++,!0}return!1},out_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var a=e.charCodeAt(this.cursor-1);if(a>r||a>3]&1<<(7&a)))return this.cursor--,!0}return!1},eq_s:function(t,n){if(this.limit-this.cursor>1),d=0,f=l0||a==r||u)break;u=!0}}for(;;){if(l>=(p=t[r]).s_size){if(this.cursor=o+p.s_size,!p.method)return p.result;var h=p.method();if(this.cursor=o+p.s_size,h)return p.result}if((r=p.substring_i)<0)return 0}},find_among_b:function(t,n){for(var r=0,a=n,o=this.cursor,i=this.limit_backward,l=0,s=0,u=!1;;){for(var c=r+(a-r>>1),d=0,f=l=0;p--){if(o-f==i){d=-1;break}if(d=e.charCodeAt(o-1-f)-m.s[p])break;f++}if(d<0?(a=c,s=f):(r=c,l=f),a-r<=1){if(r>0||a==r||u)break;u=!0}}for(;;){var m;if(l>=(m=t[r]).s_size){if(this.cursor=o-m.s_size,!m.method)return m.result;var h=m.method();if(this.cursor=o-m.s_size,h)return m.result}if((r=m.substring_i)<0)return 0}},replace_s:function(t,n,r){var a=r.length-(n-t),o=e.substring(0,t),i=e.substring(n);return e=o+r+i,this.limit+=a,this.cursor>=n?this.cursor+=a:this.cursor>t&&(this.cursor=t),a},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>e.length)throw"faulty slice operation"},slice_from:function(e){this.slice_check(),this.replace_s(this.bra,this.ket,e)},slice_del:function(){this.slice_from("")},insert:function(e,t,n){var r=this.replace_s(e,t,n);e<=this.bra&&(this.bra+=r),e<=this.ket&&(this.ket+=r)},slice_to:function(){return this.slice_check(),e.substring(this.bra,this.ket)},eq_v_b:function(e){return this.eq_s_b(e.length,e)}}}},e.trimmerSupport={generateTrimmer:function(e){var t=new RegExp("^[^"+e+"]+"),n=new RegExp("[^"+e+"]+$");return function(e){return"function"==typeof e.update?e.update((function(e){return e.replace(t,"").replace(n,"")})):e.replace(t,"").replace(n,"")}}}}})?r.call(t,n,t,e):r)||(e.exports=a)},1336:(e,t,n)=>{var r,a;!function(){var o,i,l,s,u,c,d,f,p,m,h,g,b,v,y,w,k,S,E,x,C,_,T,L,A,R,P,D,O,N,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var s=I.utils.clone(t)||{};s.position=[i,l],s.index=a.length,a.push(new I.Token(n.slice(i,o),s))}i=o+1}}return a},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:ol?u+=2:i==l&&(t+=n[s+1]*r[u+1],s+=2,u+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new I.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new I.TokenSet;a.node.edges["*"]=l}if(0==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new I.TokenSet;a.node.edges["*"]=s}1==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new I.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),l=0;l1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(a.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=a)}()},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,S="+"===y||"*"===y,E="?"===y||"*"===y,x=n[2]||c,C=b||v;r.push({name:g||o++,prefix:h||"",delimiter:x,optional:E,repeat:S,partial:k,asterisk:!!w,pattern:C?u(C):w?".*":"[^"+s(x)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);E+=S.value.length,S=S.next){var x=S.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,_=1;if(v){if(!(C=o(k,E,e,b))||C.index>=e.length)break;var T=C.index,L=C.index+C[0].length,A=E;for(A+=S.value.length;T>=A;)A+=(S=S.next).value.length;if(E=A-=S.value.length,S.value instanceof a)continue;for(var R=S;R!==t.tail&&(Ad.reach&&(d.reach=N);var I=S.prev;if(D&&(I=s(t,I,D),E+=D.length),u(t,I,_),S=s(t,I,new a(f,g?r.tokenize(P,g):P,y,P)),O&&s(t,S,O),_>1){var M={cause:f+","+m,reach:N};i(e,t,n,S.prev,E,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;a(m);){for(var h in f={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in c))for(var v in p(b))if(v in c){f[b]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n