cloud-can 是一个分布式对象存储系统(object storage system)。
对象存储是一种用于存储和检索大量非结构化数据的数据存储模式。与传统的文件系统存储不同,对象存储不以文件层次结构进行组织,而是将数据存储为对象,每个对象都包含数据、元数据和一个唯一的标识符。对象存储通常用于存储大型文件和多媒体内容,例如图片、音频、视频、备份和归档数据。
相对于传统的文件系统和块存储,Cloud Can的优点:
安全性高:上层为用户提供了丰富的权限设置,底层提供了加密存储。
可靠性高:提供冗余功能,保证数据的可靠性和安全性。
扩展性好:可以无缝扩展存储容量,满足海量数据存储需求。
高性能:允许高并发访问和快速读写操作,适用于高并发场景。
存储效率高:采用分布式存储技术和先进的共识算法,维护数据和元数据的效率和一致性高。
存储桶(Bucket): 存储桶是对象存储系统中用于组织和管理对象的容器。存储桶可以看作是文件系统中的文件夹,用于对对象进行逻辑分组和管理。存储桶具有唯一的名称,每个用户可以创建至多1000个存储桶,一个或多个对象可以存储在同一个存储桶中。
对象(Object): 对象是存储在对象存储系统中的基本单位。每个对象都由数据本身和与之关联的元数据组成。
架构图如下:
- 多用户访问(用户与子用户)
- 对象访问控制列表(Object Access Control List)
- 对象桶访问控制列表(Bucket Access Control List)
- 对象桶访问策略(Bucket Access Policy)
- 对象秘钥访问(Access Key)
- 支持小文件加速上传、对象秒传、分片上传、大文件上传
- 支持对象元数据访问,对象二进制数据下载
- Bucket内支持文件夹逻辑(文件夹可以理解为一个只有元数据的空对象)
- 支持对象标签
- 支持用户收藏Bucket功能
- 提供SDK进行客户端访问,可与SpringBoot应用结合使用
- SDK支持跨语言(Java、Python)
- SDK支持更多协议(S3、FTP)
- 提供NodeClient对所有存储节点进行管理
- 支持RS模式,并且提供文件分片存储
- 支持一致性hash(hash环)和crush算法(权重算法)对数据进行定位和负载均衡
- Node层支持强一致性读和弱一致性读
- 可进行存储容量水平扩容
- 利用反射机制解耦合状态机和处理实现
- Node索引支持本地的KV数据库(leveldb)
- 支持高并发访问
- 支持多种对象的Unique Key计算(MD5、CRC32)
- 采用Lease Read提供强一致性读,减少RPC和落盘开销
- 存储层减少对于中间件的依赖,元数据采用去中心化的方式存储
- 优化状态机apply方法从串行到并行,减少IO等待
- 支持buffer+顺序IO进行落盘
- Node支持snapshot
- 利用Nacos配置中心进行Node配置
- 支持一键部署
中间件: Mysql 8+ 、Redis 3+ and Ncos 2.0.4 .
编译: JDK 1.8 and Maven 3.2.5+ .
nacos安装
wget https://github.com/alibaba/nacos/releases/download/2.0.4/nacos-server-2.0.4.tar.gz
tar -zxvf nacos-server-2.0.3.tar.gz
mv nacos /usr/local
cd /usr/local/nacos/bin
sh startup.sh -m standalone
- mysql 和 Redis 安装
sh startup.sh -m standalone
chmod 755 redis-install.sh && sh redis-install.sh 4.0.10
chmod 755 mysql-install.sh && sh mysql-install.sh
- 项目启动
git clone git@github.com:llzcx/cloud-can.git
cd cloud-can-mater
mvn clean install
mvn package
java -cp -jar target/oss-node-0.0.1-SNAPSHOT.jar ccw.serviceinnovation.OssNodeApplication {node运行参数}
java -cp -jar target/oss-service-0.0.1-SNAPSHOT.jar ccw.serviceinnovation.OssApplication {service运行参数}
group_name为Group的唯一ID
group_cluster指定了当前Group所有的节点
election_timeout为超时选举时间(ms)
data_shards和parity_shards为RS分片配置
encrypt为加密方式,NULL为不加密,目前支持SM4加密
wight与Group配置成正比。
注:启动项目前需要启动Nacos、Redis和Mysql服务。Group内节点配置数目建议为1、3、5个。配置为单个节点时自动识别为单机部署。
- 多机多磁盘
--host=127.0.0.1
--port=8021
--group_name=cxoss
--group_cluster=127.0.0.1:8021,127.0.0.1:8022,127.0.0.1:8023
--election_timeout=1000
--log_disk=./log
--partition_disk=./1,./2,./3,./4,./5,./6
--data_shards=4
--parity_shards=2
--nacos_host=127.0.0.1
--nacos_port=8848
--encrypt=NULL
--wight=1
--host=127.0.0.1
--port=8022
--group_name=cxoss
--group_cluster=127.0.0.1:8021,127.0.0.1:8022,127.0.0.1:8023
--election_timeout=1000
--log_disk=D:\\oss\\n2\\log
--partition_disk=D:\\oss\\n2\\1,D:\\oss\\n2\\2,D:\\oss\\n2\\3,D:\\oss\\n2\\4,D:\\oss\\n2\\5,D:\\oss\\n2\\6
--data_shards=4
--parity_shards=2
--nacos_host=127.0.0.1
--nacos_port=8848
--encrypt=NULL
--wight=1
--host=127.0.0.1
--port=8023
--group_name=cxoss
--group_cluster=127.0.0.1:8021,127.0.0.1:8022,127.0.0.1:8023
--election_timeout=1000
--log_disk=D:\\oss\\n3\\log
--partition_disk=D:\\oss\\n3\\1,D:\\oss\\n3\\2,D:\\oss\\n3\\3,D:\\oss\\n3\\4,D:\\oss\\n3\\5,D:\\oss\\n3\\6
--data_shards=4
--parity_shards=2
--nacos_host=127.0.0.1
--nacos_port=8848
--encrypt=NULL
--wight=1
- 单机多磁盘
--host=127.0.0.1
--port=8024
--group_name=single
--group_cluster=127.0.0.1:8024
--election_timeout=1000
--log_disk=D:\\oss\\n1\log
--partition_disk=D:\\oss\\n1\\1,D:\\oss\\n1\\2,D:\\oss\\n1\\3,D:\\oss\\n1\\4,D:\\oss\\n1\\5,D:\\oss\\n1\\6
--data_shards=4
--parity_shards=2
--nacos_host=127.0.0.1
--nacos_port=8848
--encrypt=NULL
--wight=1
service负责上层业务
--server.address=0.0.0.0
--server.port=8080
--nacos.addr=127.0.0.1:8848
--naocs.username=nacos
--nacos.password=nacos
--redis.ip=127.0.0.1
--redis.port=6379
--mysql.addr=127.0.0.1:3306
--mysql.username=root
--mysql.password=123456
mvn install到本地仓库以后即可使用
<dependency>
<groupId>ccw.serviceinnovation</groupId>
<artifactId>oss-sdk</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
CloudCan cloudCan = new CloudCanClientBuilder()
.build("localhost:8080","root","123456");
String bucketName = "test";
String objectName = "2.jpg";
cloudCan.createBucket(bucketName);
cloudCan.putObject(bucketName,objectName,new File("D:\\test\\对象存储测试数据\\2.jpg"));
cloudCan.getObject(bucketName,objectName, "D:\\oss\\test\\");
@Configuration
public class CloudCanConfig {
@Value("${cloud-can.endpoint}")
private String endpoint;
@Value("${cloud-can.username}")
private String username;
@Value("${cloud-can.password}")
private String password;
@Bean
public CloudCan cloudCan() {
return new CloudCanClientBuilder()
.build(endpoint, username, password);
}
}