什么是对象存储?
An object 是二进制数据,有时也称为 Binary 大对象 (BLOB)。 Blob 可以是图像、音频文件、电子表格,甚至 二进制可执行代码。 像 MinIO 这样的对象存储平台提供了专用的 用于存储、检索和搜索 blob 的工具和功能。
MinIO 对象存储使用 buckets 来组织对象。 存储桶类似于文件系统中的文件夹或目录,其中每个 桶可以容纳任意数量的对象。 MinIO 存储桶提供 与 AWS S3 存储桶相同的功能。
例如,考虑一个托管网络博客的应用程序。 应用程序 需要存储各种 blob,包括丰富的多媒体,如视频和 图片。 MinIO 服务器上的对象结构可能类似于 下列的:
MinIO 是在AGPL3.0 下发布的高性能对象存储。 它是与 Amazon S3 云存储服务兼容的 API。 使用 MinIO 构建用于机器学习、分析和应用的高性能基础设施数据工作负载。
应用集群部署
为CentOS7开通服务器的ip_forward功能
cat >> /etc/sysctl.conf <<-'EOF'
net.ipv4.ip_forward=1
vm.max_map_count=655360
EOF
sysctl -p
创建Macvlan31网络,让每个容器都拥有独立IP
docker network create -d macvlan \
--subnet=192.168.31.0/24 \
--ip-range=192.168.31.0/24 \
--gateway=192.168.31.1 \
-o parent=ens33 \
macvlan31
创建三个Macvlan容器192.168.31.240-242,构建Macvlan应用集群
docker rm -f minio-240
docker rm -f minio-241
docker rm -f minio-242
rm -rf /data
docker run -d --name minio-240 \
--restart=always \
--network macvlan31 --ip=192.168.31.240 \
-v /data/n240/export1:/export1 \
-v /data/n240/export2:/export2 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=a1b2c3d4" \
minio/minio server http://192.168.31.24{0...2}/export{1...2}
docker run -d --name minio-241 \
--restart=always \
--network macvlan31 --ip=192.168.31.241 \
-v /data/n241/export1:/export1 \
-v /data/n241/export2:/export2 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=a1b2c3d4" \
minio/minio server http://192.168.31.24{0...2}/export{1...2}
docker run -d --name minio-242 \
--restart=always \
--network macvlan31 --ip=192.168.31.242 \
-v /data/n242/export1:/export1 \
-v /data/n242/export2:/export2 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=a1b2c3d4" \
minio/minio server http://192.168.31.24{0...2}/export{1...2}
minio高可用原理
MinIO 将对象分成块,并在每个块之间均匀分布驱动器在擦除集。 MinIO 可以继续无缝地服务于读取和尽管丢失了任何单个驱动器,但仍会发出写入请求。 在最高 冗余级别,MinIO 可以以最低的性能处理读取请求 尽管损失了多达一半 (N/2) 的总驱动器部署。
Dashboard
http://192.168.31.240:9000
接入代码
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>minio-sdk</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
接入代码
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.xmlpull.v1.XmlPullParserException;
import io.minio.MinioClient;
import io.minio.errors.MinioException;
public class FileUploader {
public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
try {
// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient("http://192.168.31.240:9000", "1234567890", "1234567890");
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists("test");
if(isExist) {
System.out.println("Bucket already exists.");
} else {
// 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
minioClient.makeBucket("test");
}
// 使用putObject上传一个文件到存储桶中。
minioClient.putObject("test","/诗歌/再别康桥.txt", "d:/再别康桥.txt",null);
System.out.println("文件上传成功");
InputStream is = minioClient.getObject("test", "/诗歌/再别康桥.txt");
List<String> strings = IOUtils.readLines(is, "UTF-8");
strings.stream().forEach(s -> System.out.println(s));
} catch(MinioException e) {
System.out.println("Error occurred: " + e);
}
}
}