背景

本文档主要描述怎么运用 MinIO 搭建 OSS 方针存储服务

方针

  1. 搭建 OSS 服务,支撑 https 拜访
  2. 多站点布置副本集,完结高可用(容灾)

什么是 OSS

OSS 「Object Storage Service」,即方针存储服务。它是一种面向云计算的分布式存储服务,能够将海量的非结构化数据以方针的形式进行存储和办理。与传统的文件存储和块存储不同,方针存储将数据作为方针进行存储,每个方针都有唯一的标识符和元数据,能够经过 HTTP 或 HTTPS 等协议进行拜访。

什么是 MinIO

MinIO 是一个方针存储解决方案,一款开源云存储软件,供给高性能分布式方针存储,供给了与 Amazon Web Services S3 兼容的API,并支撑一切核心S3功用,专为大规模数据基础设施而设计。而且它在 GitHub 上拥有超越 26,000 颗星,有超越 680 名贡献者在为它工作。

MinIO 服务器存储一切类型的非结构化数据,例如照片、视频、日志文件等。它也可在开源 Apache V2 许可下运用,许多最强壮的大数据和机器学习应用程序都运用 MinIO S3 方针存储。能够在 MinIO 网站上检查许多其他功用。

官网: min.io/

gihub: github.com/minio/minio

✅ Docker 布置 MinIO

参阅文档:deploy-minio-single-node

装备文件

创立 /etc/default/minio 文件,并将以下内容保存到文件作为 MinIO 的环境变量

# /etc/default/minio,用于挂载到 MinIO 容器,设置 MinIO 的环境变量
# 设置 MinIO 服务的 root 帐号。
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=admin123
# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.
MINIO_VOLUMES="/mnt/data"
# MINIO_SERVER_URL sets the hostname of the local machine for use with the MinIO Server
# MinIO assumes your network control plane can correctly resolve this hostname to the local machine
# Uncomment the following line and replace the value with the correct hostname for the local machine.
# 设置 Minio 的 API 域名 & 文件同享的地址,注意是 https,由于运转容器时已装备证书敞开了 https 拜访
MINIO_SERVER_URL="https://xxx.domain.com:9000"

装备证书

将主机域名的 ssl 证书拷贝并重命名到独自的文件夹下 /minio/certs

如何搭建 OSS 对象存储服务? - MinIO

docker 运转 MinIO 容器

docker run -dt                 \
 -p 9000:9000 -p 9090:9090          \
 -v ~/minio/data:/mnt/data              \
 -v /etc/default/minio:/etc/config.env    \
 -v /minio/certs:/tmp/certs \
 -e "MINIO_CONFIG_ENV_FILE=/etc/config.env"  \
 -e "MINIO_PUBLIC_ADDRESS=gzoffice.mojidict.com:9090" \
 --name "minio_local"             \
 minio/minio server --console-address ":9090" --address ":9000" --certs-dir /tmp/certs
指令 解析
docker run -dt 创立一个后台运转的 Docker 容器
-p 9000:9000 -p 9090:9090 将容器内的端口 9000 和 9090 映射到主机的 9000 和 9090 端口
-v ~/minio/data:/mnt/data 将主机上 ~/minio/data 目录挂载到容器内的 /mnt/data 目录,用于耐久化存储数据
-v /etc/default/minio:/etc/config.env 将主机上 /etc/default/minio 文件挂载到容器内的 /etc/config.env 文件,用于设置 Minio 的装备环境变量
-v /minio/certs:/tmp/certs 将主机上 /minio/certs 目录挂载到容器内的 /tmp/certs 目录,用于存储 TLS 证书
-e "MINIO_CONFIG_ENV_FILE=/etc/config.env" 设置 Minio 的装备环境变量文件路径为 /etc/config.env
-e "MINIO_PUBLIC_ADDRESS=``gzoffice.mojidict.com:9090``" 设置 Minio 的公共拜访地址为 gzoffice.mojidict.com:9090,该地址用于生成拜访 Minio 方针存储的 URL
--name "minio_local" 指定容器称号为 minio_local
minio/minio 运用 Minio 的官方 Docker 镜像
server --console-address ":9090" --address ":9000" --certs-dir /tmp/certs 启动 Minio 服务器,并设置控制台地址为 :9090,服务地址为 :9000,TLS 证书存储路径为 /tmp/certs

Docker 启动成功,拜访 MinIO 办理后台:xxx.domain.com:9090

如何搭建 OSS 对象存储服务? - MinIO

✅ MinIO 站点仿制(Site Replication)

官方文档:Site Replication Overview

概述

Site Replication,即 站点仿制,将多个独立的 MinIO 布置装备为称为对等站点的副本集群,支撑将数据主动地从一个 MinIO 服务仿制到另一个 MinIO 服务,在多个地理方位创立冗余备份,从而提高可用性、灵活性、备份以及灾祸康复。

如何搭建 OSS 对象存储服务? - MinIO

站点仿制 特色

参阅文档:replicated-minio-deployments

  • MinIO 服务器端存储桶仿制是一种主动存储桶级装备
  • MinIO 副本集的每个实例都能够承担读取和写入数据的人物,
  • MinIO 仿制性能主要取决于每个对等站点之间的网络推迟。
  • MinIO 仿制能够主动修正由于时间短或持续停机而导致部分或全部数据丢掉的站点。
  • 仿制装备完全在服务器端处理,选用 设置即忘(set-it-and-forget-it)的方式,即不需要以任何方式修正运用MinIO 的应用程序,一切都在服务器端处理

站点仿制原理

参阅文档:replication-process、active-active-replication

  • 站点仿制建立在 双向主动-主动 结构的基础上,每个站点都能写入数据并触发数据仿制的行列使命;

  • 默许双向仿制规矩,不存在从节点的说法;(也可装备为 主动-被动 的单向仿制规矩,相当于主从)

  • 装备站点仿制规矩的 MinIO 实例充任 “源站点”,而装备的长途 MinIO 实例充任 “方针站点”;选用双向、增量仿制规矩,主动同步新方针和方针改变,例如方针写入操作( PUT)、新方针版别、更改方针元数据

  • MinIO 运用一个仿制行列系统,其中有多个并发仿制工作进程在该行列上操作。MinIO 不断地从行列中仿制和删除方针,同时扫描新的未仿制方针以添加到行列中。

  • MinIO 将失利的仿制操作从头排入行列,并重试这些操作,直到仿制成功,以确保数据的完整性和可用性,而无需依赖 MinIO 扫描程序来注意未仿制的方针版别。

  • 仿制进程通常具有以下流程之一:

    • PENDING -> COMPLETED
    • PENDING -> FAILED -> COMPLETED

同步仿制 & 异步仿制

参阅文档:synchronous-vs-asynchronous-replication

MinIO 支撑为给定的长途方针实例,选用异步(默许)或同步仿制。

  • 对于异步仿制,MinIO 会在将方针放入仿制行列之前完结原始的 PUT 操作。因此,在仿制方针之前,发起客户端能够看到成功的 PUT 操作。虽然这可能会导致长途设备上的方针过时或丢掉,但它减轻了由于仿制负载而导致写入操作缓慢的危险。
  • 运用同步仿制时,MinIO会在完结原始 PUT 操作之前测验仿制方针。无论仿制测验是否成功,MinIO都会回来成功的 PUT 操作。这降低了写操作缓慢的危险,但可能以长途方位上的方针陈腐或丢掉为价值。

MinIO 强烈建议运用默许的异步站点仿制

现在,MinIO 只建议跨两个数据中心进行仿制。跨多个数据中心进行仿制是可能的,但是,所涉及的复杂性和所需的性能权衡使得这完结起来相对困难(带宽、推迟)。详细参阅:Basic Architectural Considerations

副本集搭建

详细参阅官方布置文档:site-replication-tutorials

先决条件

  • 一切站点必须运用相同的 MinIO server 版别(布置方式参阅 #Docker 布置 MinIO)

  • 方针站点不能包含任何数据

    • 在设置时只要一个站点(源站点)能够有数据。其他站点不能存在任何 bucket、object;
    • 装备站点仿制后,源站点上的任何数据都会仿制到其他站点。
  • 站点已完全布置并可经过主机名或 IP 拜访

  • 与装备中的一切其他站点同享 IDP (identity provider) 装备

  • 运用与其他已装备站点相同的根用户凭据

源站点装备 Site Replication:

如何搭建 OSS 对象存储服务? - MinIO

如何搭建 OSS 对象存储服务? - MinIO

源站点数据:

如何搭建 OSS 对象存储服务? - MinIO

方针站点数据:

如何搭建 OSS 对象存储服务? - MinIO

经过指令行工具 MinIO Clinet 检查 Replication 状态、待仿制 Object 列表

MinIO Clinet API 文档:mc-replicate.html

如何搭建 OSS 对象存储服务? - MinIO

如何搭建 OSS 对象存储服务? - MinIO

如何搭建 OSS 对象存储服务? - MinIO

暂时关闭 minio2,在 minio1 上传文件,仿制失利,可经过 diff 检查未成功仿制的数据列表:(重启 minio2 即可主动从头仿制成功)

如何搭建 OSS 对象存储服务? - MinIO

✅ Node.js 连接 & 办理 Minio

SDK API Reference:min.io/docs/minio/…

const Minio = require('minio')
// 创立Minio客户端方针
const minioClient = new Minio.Client({
 endPoint: 'your-minio-endpoint',
 port: 9000,
 useSSL: false,
 accessKey: 'access-key',  // 办理员创立
 secretKey: 'secret-key'   // 办理员创立
})
const bucketName = 'moji-test'  // 存储空间 bucket 称号
const objectName = 'test.png'   // 保存到 bucket 的文件方针称号
const filePath = 'files/test.png'
// 上传文件到 Minio
minioClient.fPutObject(bucketName, objectName, filePath, function(err, etag) {
 if (err) {
  return console.log(err)
 }
 console.log('File uploaded successfully')

 // 获取文件的签名链接,默许 7 天有效期
 const url = minioClient.presignedGetObject(bucketName, objectName)
 console.log('Signed URL:', url)
})
>>>
Signed URL: Promise {
 '?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=sn92pbGHndL8T3YJ%2F20230417%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230417T062436Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=8865e435d049181ac0552fcf244df3f0c9dcff1b525b0ca0d67159a641b980b3'
}

参阅资料

  • minio installation
  • Automatic Site Replication
  • minio-replication-process
  • MinIO Replication Best Practices
  • site-active-active-replication
  • Enable Two-Way Server-Side Bucket Replication