| @@ -2,11 +2,10 @@ | |||
| # JCS-pub(云际存储公共基础设施+开箱即用云际存储客户端) | |||
| ## 简介 | |||
| JCS-pub(云际存储公共基础设施+开箱即用云际存储客户端)是一款基于云际存储的开放式存储服务,提供跨云迁移数据、跨云存储数据、本地+多云混合存储数据、开箱即用、云际存储公共基础设施等功能。云际存储的发展路径如下图所示。 | |||
| ## 项目演化路径 | |||
| <center> | |||
| <img src="docs/figs/roadmap.jpg" width=100% /></center> | |||
| <img src="docs/figs/roadmap.jpg" width=80% /></center> | |||
| ## 特性 | |||
| @@ -56,9 +55,9 @@ JCS-pub(云际存储公共基础设施+开箱即用云际存储客户端)是 | |||
| - **统一混合存储视图**:支持数据分散于**本地文件系统**和**多个远端云平台**,并为用户提供统一数据视图,屏蔽底层多云复杂性 | |||
| - **双模运行架构**: | |||
| - **独立运行模式**:客户端可完全离线操作,不依赖其他服务 | |||
| - **基础设施连接模式**:接入公共基础设施后运行(能提高数据传输效率,降低用户流量费用) | |||
| - **基础设施连接模式**:接入公共基础设施后运行(**可提高数据传输效率,降低用户流量费用**) | |||
| - **开源公共基础设施**: | |||
| - 任何用户可自主部署公共基础设施(项目地址:xx),或接入现有公共基础设施 | |||
| - 任何用户可自主部署公共基础设施,或接入现有公共基础设施 | |||
| - 免费公共基础设施示例: | |||
| - xxx | |||
| @@ -66,13 +65,15 @@ JCS-pub(云际存储公共基础设施+开箱即用云际存储客户端)是 | |||
| ## 架构图 | |||
| <center> | |||
| <img src="docs/figs/architecture.png" width=100% /></center> | |||
| <img src="docs/figs/architecture.png" width=70% /></center> | |||
| ### 1、云存储空间 | |||
| - 使用云际存储客户端前,用户需自行准备云存储空间。云存储空间主要指对象存储服务的桶和文件存储服务的目录。可使用用户在公有云开通的云存储服务,也可以使用用户私有的云存储服务。 | |||
| - 主流的公有云存储服务注册教程见链接:xx | |||
| ### 2、云际存储公共基础设施 | |||
| - 公共基础设施包含若干代理节点,它们可以根据客户端的请求,与客户端协同完成跨云数据迁移、数据上传、数据下载等访问操作,并可通过数据传输路径优化、数据并发访问等技术提高数据访问效率,同时降低客户端的流量开销并避免客户端成为数据传输瓶颈。 | |||
| ### 3、云际存储客户端 | |||
| - 云际存储客户端部署在用户的服务器上,充当数据服务网关和元数据管理节点的角色。 | |||
| - 用户通过客户端提供的各类方式管理用户自由的云存储空间中的数据。 | |||
| @@ -84,7 +85,7 @@ JCS-pub(云际存储公共基础设施+开箱即用云际存储客户端)是 | |||
| ### 1、第三方组件准备 | |||
| 以下组件需要自行安装: | |||
| - MySQL:8.0版本以上,创建好JCS客户端使用的账户和数据库 | |||
| - `MySQL`:8.0版本以上,创建好JCS客户端使用的账户和数据库 | |||
| ### 2、Docker安装(推荐) | |||
| @@ -94,9 +95,9 @@ JCS-pub(云际存储公共基础设施+开箱即用云际存储客户端)是 | |||
| ```bash | |||
| docker pull jcs:latest | |||
| ``` | |||
| 如果你已经准备好了JCS客户端的配置文件和证书文件,那么在运行容器前只需要将包含这些文件的目录通过-v参数挂载到容器里即可,并在运行容器时使用-c来指定配置文件的位置(容器中的位置)。 | |||
| 如果你已经准备好了JCS客户端的配置文件和证书文件,那么在运行容器前只需要将包含这些文件的目录通过`-v`参数挂载到容器里即可,并在运行容器时使用`-c`来指定配置文件的位置(容器中的位置)。 | |||
| 如果你没有提前准备好配置文件,想要通过JCS客户端的init命令来生成,那么也需要使用-v参数将宿主机 的一个目录挂载到容器内,并在之后的生成配置的过程中将配置文件和证书文件保存到这个目录。 | |||
| 如果你没有提前准备好配置文件,想要通过JCS客户端的init命令来生成,那么也需要使用`-v`参数将宿主机 的一个目录挂载到容器内,并在之后的生成配置的过程中将配置文件和证书文件保存到这个目录。 | |||
| 完整的执行命令大概如下格式: | |||
| ```bash | |||
| @@ -107,19 +108,19 @@ jcs serve -c /opt/confs/config.json # 注意配置文件路径是容器内的路 | |||
| ### 3、源码编译安装 | |||
| 云际存储客户端的源码位于仓库的`cmd/jcs`目录下,编译前你需要准备好: | |||
| - Go:1.23及以上的版本 | |||
| - mage:一个类似于makefile的工具,用于运行编译命令,官方仓库:仓库地址 | |||
| 编译前你需要准备好: | |||
| - `Go`:1.23及以上的版本 | |||
| - `mage`:一个类似于makefile的工具,用于运行编译命令,官方仓库:[仓库地址](https://github.com/magefile/mage) | |||
| 安装好上述依赖后,将本项目的仓库克隆到本地,然后在仓库目录中打开终端,输入以下命令进行编译: | |||
| ```powershell | |||
| mage bin | |||
| ``` | |||
| 命令执行结束后会在仓库目录内生成一个build文件夹,里面包含编译产生的所有的可执行文件,文件包括: | |||
| - jcs:JCS客户端程序 | |||
| - jcsctl:客户端的命令行工具,可以将其加入到PATH环境变量中,方便使用 | |||
| - coordinator:JCS系统的协调节点程序,如果只是使用公共的JCS系统则可以忽略这个文件 | |||
| - hub:JCS系统的枢纽节点程序,作用同上 | |||
| - `jcs`:JCS客户端程序 | |||
| - `jcsctl`:客户端的命令行工具,可以将其加入到PATH环境变量中,方便使用 | |||
| - `coordinator`:JCS系统的协调节点程序,如果只是使用公共的JCS系统则可以忽略这个文件 | |||
| - `hub`:JCS系统的枢纽节点程序,作用同上 | |||
| ### 4、可执行文件安装 | |||
| @@ -133,13 +134,13 @@ mage bin | |||
| 使用JCS客户端的init命令进入配置流程,按照命令提示填写相关内容。注意:如果将要使用Docker镜像来运行JCS客户端,配置里的路径都要是容器里的路径。 | |||
| 命令执行结束后,一共将生成以下几个文件: | |||
| - config.json:客户端程序的完整配置文件 | |||
| - ca_cert.pem:HTTP服务使用的根证书 | |||
| - ca_key.pem:HTTP服务的根秘钥,需要自己额外保管 | |||
| - server_cert.pem、server_key.pem:使用根秘钥签发的服务端证书 | |||
| - client_cert.pem、client_key.pem:使用根秘钥签发的客户端证书,jcsctl工具或第三方程序使用 | |||
| - `config.json`:客户端程序的完整配置文件 | |||
| - `ca_cert.pem`:HTTP服务使用的根证书 | |||
| - `ca_key.pem`:HTTP服务的根秘钥,**需要自己额外保管** | |||
| - `server_cert.pem`、`server_key.pem`:使用根秘钥签发的服务端证书 | |||
| - `client_cert.pem`、`client_key.pem`:使用根秘钥签发的客户端证书,jcsctl工具或第三方程序使用 | |||
| 除了ca_key.pem文件外,其他文件在客户端运行时都会使用到。 | |||
| 除了`ca_key.pem`文件外,其他文件在客户端运行时都会使用到。 | |||
| 配置文件的字段介绍如下: | |||
| @@ -217,7 +218,7 @@ jcsctl与JCS客户端通信时需要使用证书进行鉴权,这些证书在JC | |||
| - 通过命令行参数--ca、--cert、--key指定 | |||
| - jcsctl自身所在目录 | |||
| jcsctl默认使用https://127.0.0.1:7890地址去尝试连接客户端,如果客户端地址不同,则可以使用--endpoint设置地址。 | |||
| jcsctl默认使用`https://127.0.0.1:7890`地址去尝试连接客户端,如果客户端地址不同,则可以使用`--endpoint`设置地址。 | |||
| ### 3、API | |||
| @@ -240,24 +241,24 @@ jcsctl默认使用https://127.0.0.1:7890地址去尝试连接客户端,如果 | |||
| - 选择冗余策略:根据一定规则选择对象的冗余策略,比如对象大小等。并不是只有没有冗余的对象才能变化,有需要的话你可以让对象在不同的冗余方式之间改变。 | |||
| - 执行变化:根据事先选择的策略和当前对象的策略生成执行计划并执行。如果需要定制计划指令,请查看后续的定制指令的说明。 | |||
| 具体可参考gitlink.org.cn/cloudream/jcs-pub/client/internal/ticktock包中change_redundancy.go和redundancy_recover.go部分的代码。 | |||
| 具体可参考`gitlink.org.cn/cloudream/jcs-pub/client/internal/ticktock`包中change_redundancy.go和redundancy_recover.go部分的代码。 | |||
| ### 2、冗余收缩 | |||
| 冗余收缩采用模拟退火算法从容灾度、冗余度、访问效率三个方面来调整对象的冗余文件的数量、分布,目前仅支持多副本和纠删码的收缩。 | |||
| 这部分的功能不是必须实现的,有需要可以参考gitlink.org.cn/cloudream/jcs-pub/client/internal/ticktock包中redundancy_shrink.go部分的代码。 | |||
| 这部分的功能不是必须实现的,有需要可以参考`gitlink.org.cn/cloudream/jcs-pub/client/internal/ticktock`包中redundancy_shrink.go部分的代码。 | |||
| ### 3、对象下载 | |||
| 涉及到需要下载对象的功能(不仅仅是HTTP的下载对象功能),都需要调整代码以支持新的冗余策略。下载过程分为选择下载策略和执行策略两部分。 | |||
| 选择策略的代码相对集中,在gitlink.org.cn/cloudream/jcs-pub/client/internal/downloader/strategy包中,而执行策略的代码则除了gitlink.org.cn/cloudream/jcs-pub/client/internal/downloader包以外,还在项目中有所分布,建议善用搜索功能避免遗漏。 | |||
| 选择策略的代码相对集中,在`gitlink.org.cn/cloudream/jcs-pub/client/internal/downloader/strategy`包中,而执行策略的代码则除了`gitlink.org.cn/cloudream/jcs-pub/client/internal/downloader`包以外,还在项目中有所分布,建议善用搜索功能避免遗漏。 | |||
| ## 定制指令 | |||
| 当前项目中大部分已实现指令可在项目的gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2包中找到,可以作为开发过程中的参考。 | |||
| 当前项目中大部分已实现指令可在项目的`gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2`包中找到,可以作为开发过程中的参考。 | |||
| ### 1、编写指令逻辑 | |||
| @@ -269,10 +270,10 @@ type Op interface { | |||
| } | |||
| ``` | |||
| - **String()**:用于调试时打印指令的内容。 | |||
| - **Execute(ctx *ExecContext, e *Executor)error**:指令的执行逻辑,该函数包含两个参数: | |||
| - **ctx**:执行指令的上下文,其中的Context字段用于支持中断指令操作,Values则包含执行计划时提供的额外参数,可以通过gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec包中的GetValueByType、SetValueByType等函数修改。 | |||
| - **e**:执行器,可以通过BindVar和PutVar函数来访问内部的变量表,实现数据在不同指令之间的传递。也可以使用gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec中提供的泛型版本的BindVar、BindArray等函数。 | |||
| - `String()`:用于调试时打印指令的内容。 | |||
| - `Execute(ctx *ExecContext, e *Executor)error`:指令的执行逻辑,该函数包含两个参数: | |||
| - `ctx`:执行指令的上下文,其中的Context字段用于支持中断指令操作,Values则包含执行计划时提供的额外参数,可以通过`gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec`包中的GetValueByType、SetValueByType等函数修改。 | |||
| - `e`:执行器,可以通过BindVar和PutVar函数来访问内部的变量表,实现数据在不同指令之间的传递。也可以使用`gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec`中提供的泛型版本的BindVar、BindArray等函数。 | |||
| 当Execute返回的error不为nil时,整个计划会被视为执行失败,所有正在执行的指令都会被中断。 | |||
| @@ -296,7 +297,7 @@ type VarValue interface { | |||
| 当指令的Execute函数返回了nil后,这个指令就执行结束了,而当某个节点上的指令都执行结束,则这个节点上的计划也会结束,因此如果你的指令会产生流,那么建议使用WaitGroup等方式,在产生的流被读取结束后再结束Execute函数。 | |||
| 最后,当你定义好了指令和数据后,记得使用gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec中的UseOp和UseVarValue函数来将它们注册到模块内。 | |||
| 最后,当你定义好了指令和数据后,记得使用`gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec`中的UseOp和UseVarValue函数来将它们注册到模块内。 | |||
| ### 2、编写指令对应DAG节点 | |||
| @@ -321,7 +322,7 @@ type Node interface { | |||
| - Env代表这个指令将在哪个环境里执行,比如在Driver(发起计划的服务,即JCS客户端)、Hub(代理节点)、Any。大多数指令的Env设置成Any即可,除非你确定这个指令必须在哪个环境执行。 | |||
| - 最后的GenerateOp函数是计划DAG优化结束后生成指令时被调用的。 | |||
| 推荐嵌入gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag包中的NodeBase结构体,它实现了除GenerateOp以外的其他函数。 | |||
| 推荐嵌入`gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag`包中的NodeBase结构体,它实现了除GenerateOp以外的其他函数。 | |||
| ### 3、使用指令 | |||
| @@ -342,7 +343,7 @@ type To interface { | |||
| } | |||
| ``` | |||
| 然后在gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/gen的合适位置编写从FromTo到DAG的算法即可。 | |||
| 然后在`gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/gen`的合适位置编写从FromTo到DAG的算法即可。 | |||
| **注意**:你根据FromTo生成的DAG的节点应该实现要实现以下接口 | |||
| ```go | |||
| @@ -363,7 +364,7 @@ type ToNode interface { | |||
| 在DAG优化阶段你也可以增加你自己的优化步骤来用到你的指令,一般是通过遍历DAG来找到符合某种模式的一系列指令,然后对这些指令进行变换或者替换,达到减少指令数量或者采用更高效实现的目的。 | |||
| 当你实现好自己的优化步骤后,需要在gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser中的Parse函数的合适位置插入调用你的函数的代码,你需要仔细考虑你的步骤与其他步骤之间相互影响。 | |||
| 当你实现好自己的优化步骤后,需要在`gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser`中的Parse函数的合适位置插入调用你的函数的代码,你需要仔细考虑你的步骤与其他步骤之间相互影响。 | |||
| ## 许可证 | |||