Minio简介

MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。

MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。

MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。

特点

擦除码

MinIO使用按对象的嵌入式擦除编码保护数据,该编码以汇编代码编写,可提供最高的性能。 MinIO使用Reed-Solomon代码将对象划分为n / 2个数据和n / 2个奇偶校验块-尽管可以将它们配置为任何所需的冗余级别。 这意味着在12个驱动器设置中,将一个对象分片为6个数据和6个奇偶校验块。即使丢失了多达5个((n / 2)–1)个驱动器(无论是奇偶校验还是数据),仍然可以从其余驱动器可靠地重建数据。MinIO的实现可确保即使丢失或无法使用多个设备,也可以读取对象或写入新对象。最后,MinIO的擦除代码位于对象级别,并且可以一次修复一个对象。
image-1661150138005

Bitrot保护

无声的数据损坏或Bitrot是磁盘驱动器面临的严重问题,导致数据在用户不知情的情况下损坏。原因多种多样(驱动器老化,电流尖峰,磁盘固件错误,虚假写入,读/写方向错误,驱动程序错误,意外覆盖),但结果是一样的——数据泄漏。
MinIO对高速哈希算法的优化实现可确保它永远不会读取损坏的数据-它可以实时捕获和修复损坏的对象。 通过在READ上计算哈希值,并在WRITE上从应用程序,整个网络以及到内存/驱动器的哈希值,来确保端到端的完整性。 该实现旨在提高速度,并且可以在Intel CPU的单个内核上实现超过10 GB /秒的哈希速度。
image-1661150301394

加密

加密飞行中的数据是一回事,保护静态数据是另一回事。 MinIO支持多种复杂的服务器端加密方案,以保护数据-无论其位于何处。 MinIO的方法可确保机密性,完整性和真实性,而性能开销却可以忽略不计。 使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。加密的对象使用AEAD服务器端加密进行了防篡改。此外,MinIO与所有常用的密钥管理解决方案(例如HashiCorp Vault)兼容并经过测试
MinIO使用密钥管理系统(KMS)支持SSE-S3。如果客户端请求SSE-S3,或启用了自动加密,则MinIO服务器会使用唯一的对象密钥对每个对象进行加密,该对象密钥受KMS管理的主密钥保护。由于开销极低,因此可以为每个应用程序和实例打开自动加密。
image-1661150357191

WORM

启用WORM后,MinIO会禁用所有可能会使对象数据和元数据发生变异的API。这意味着一旦写入数据就可以防止篡改。这对于许多不同的法规要求具有实际应用。

身份认证和管理

MinIO支持身份管理中最先进的标准,并与OpenID connect兼容提供商以及主要的外部IDP供应商集成。这意味着访问是集中的,密码是临时的和轮换的,而不是存储在配置文件和数据库中。此外,访问策略是细粒度的且高度可配置的,这意味着支持多租户和多实例部署变得简单。
image-1661150432506

连续复制

传统复制方法的挑战在于它们无法有效扩展到几百TB。话虽如此,每个人都需要一种复制策略来支持灾难恢复,并且该策略需要跨越地域,数据中心和云。 MinIO的连续复制旨在用于大规模的跨数据中心部署。通过利用Lambda计算通知和对象元数据,它可以高效,快速地计算增量。
Lambda通知确保与传统的批处理模式相反,更改可以立即传播。连续复制意味着即使发生高动态数据集,如果发生故障,数据丢失也将保持在最低水平。最后,就像MinIO所做的一样,连续复制是多厂商的,这意味着您的备份位置可以是从NAS到公共云的任何位置。
image-1661150465256

全局一致性

现代企业到处都有数据。 MinIO允许将这些各种实例组合在一起以形成统一的全局名称空间。具体来说,最多可以将32个MinIO服务器组合成一个分布式模式集,并且可以将多个分布式模式集组合成一个MinIO服务器联合。每个MinIO Server Federation都提供统一的管理员和名称空间。
MinIO Federation Server支持无限数量的分布式模式集。
这种方法的影响在于,对象存储可以为大型的,地理上分散的企业进行大规模扩展,同时保留从以下位置容纳各种应用程序(S3 Select,MinSQL,Spark,Hive,Presto,TensorFlow,H20)的能力。单一控制台。
image-1661150497236

多云网关

所有企业都在采用多云策略。这也包括私有云。因此,您的裸机虚拟化容器和公共云服务(包括Google,Microsoft和阿里巴巴等非S3提供商)必须看起来完全相同。尽管现代应用程序具有高度的可移植性,但为这些应用程序提供支持的数据却并非如此。
MinIO应对的主要挑战是,无论数据位于何处,都使数据可用。 MinIO在裸机,网络连接存储和每个公共云上运行。更重要的是,MinIO通过Amazon S3 API从应用程序和管理角度确保您对数据的看法完全相同。
MinIO可以走得更远,使您现有的存储基础架构与Amazon S3兼容。其影响是深远的。现在,组织可以真正统一其数据基础架构-从文件到块,所有这些都显示为可通过Amazon S3 API访问的对象,而无需迁移。
image-1661150521248

架构设计

MinIO设计为云原生,可以作为轻量级容器运行,由外部编排服务(如Kubernetes)管理。整个服务器约为40MB静态二进制文件,即使在高负载下也可以高效利用CPU和内存资源。结果是您可以在共享硬件上共同托管大量租户。
architecture_diagram
MinIO在带有本地驱动器(JBOD / JBOF)的商品服务器上运行。集群中的所有服务器的功能均相同(完全对称的体系结构)。没有名称节点或元数据服务器。
MinIO将数据和元数据作为对象一起写入,从而无需使用元数据数据库。此外,MinIO以内联,严格一致的操作执行所有功能(擦除代码,位rotrot检查,加密)。结果是MinIO异常灵活。
每个MinIO群集都是分布式MinIO服务器的集合,每个节点一个进程。 MinIO作为单个进程在用户空间中运行,并使用轻量级的协同例程来实现高并发性。将驱动器分组到擦除集(默认情况下,每组16个驱动器),然后使用确定性哈希算法将对象放置在这些擦除集上。
MinIO专为大规模,多数据中心云存储服务而设计。每个租户都运行自己的MinIO群集,该群集与其他租户完全隔离,从而使他们能够保护他们免受升级,更新和安全事件的任何干扰。每个租户通过联合跨地理区域的集群来独立扩展。

部署

环境说明

ip主机名数据路径操作系统版本Minio版本
10.2.3.23vm19-node23/data/miniocentos7.5RELEASE.2022-08-13T21-54-44Z
10.2.3.24vm19-node24/data/miniocentos7.5RELEASE.2022-08-13T21-54-44Z
10.2.3.25vm19-node25/data/miniocentos7.5RELEASE.2022-08-13T21-54-44Z
10.2.3.26vm19-node26/data/miniocentos7.5RELEASE.2022-08-13T21-54-44Z
  • 分布式Minio至少需要4个节点
  • 如果资源不够,可以采用两个节点每个节点启动两个实例的方式来实现四节点的集群,仅用于测试环境
  • 生产环境建议最少4节点

环境准备

#所有节点执行下列操作
# 配置时间同步,配置时间同步的方式不做讲述
# 创建数据目录
mkdir -p /data/minio
# 创建程序存放路径
mkdir -p /usr/local/minio
# 下载minio程序包
wget -P /usr/local/minio https://dl.min.io/server/minio/release/linux-amd64/minio
# 修改系统最大文件数
echo "*   soft    nofile  65535" >> /etc/security/limits.conf
echo "*   hard    nofile  65535" >> /etc/security/limits.conf

配置启动Minio启动脚本

vim /usr/local/minio/minio_run.sh

  • MINIO_ACCESS_KEY:用户名,长度最小是5个字符
  • MINIO_SECRET_KEY:密码,密码不能设置过于简单,不然minio会启动失败,长度最小是8个字符
  • --config-dir:指定集群配置文件目录
  • 所有节点均需配置
#!/bin/bash
#export MINIO_ACCESS_KEY=Admin
#export MINIO_SECRET_KEY=Admin1234!
# 新版本使用MINIO_ROOT_USER和MINIO_ROOT_PASSWORD来配置账号密码

export MINIO_ROOT_USER=Admin
export MINIO_ROOT_PASSWORD=Admin1234!

/usr/local/minio/minio server --config-dir /usr/local/minio \
http://10.2.3.23/data/minio \
http://10.2.3.24/data/minio \
http://10.2.3.25/data/minio \
http://10.2.3.26/data/minio \

配置minio.service

cat > /usr/lib/systemd/system/minio.service <<EOF
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/usr/local/minio
ExecStart=/usr/local/minio/minio_run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

授权

chmod u+x /usr/local/minio/minio
chmod u+x /usr/local/minio/minio_run.sh
chmod u+x /usr/lib/systemd/system/minio.service

启动服务

systemctl daemon-reload
systemctl enable --now minio
systemctl status minio -l

测试服务是否正常

分别访问四个节点(http://10.2.3.23-26:9000),账号密码为minio_run.sh脚本中指定的账号密码。

Nginx代理

在生产环境中,一般需要使用Nginx或者Haproxy进行反代+负载均衡来使用Minio,本文采用Nginx方式。
在10.2.3.23上面安装nginx并进行配置:
安装nginx

wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar xzvf nginx-1.22.0.tar.gz
cd nginx-1.22.0
yum install -y wget gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
./configure --prefix=/usr/local/nginx
make && make install
echo 'export PATH=$PATH:/usr/local/nginx/sbin/' >> /etc/profile
source /etc/profile
nginx -t
# 配置nginx.service
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
[Install]
WantedBy=multi-user.target
EOF
# 启动nginx
systemctl daemon-reload && systemctl enable --now nginx && systemctl status nginx

配置nginx
修改nginx配置文件/usr/local/nginx/conf/nginx.conf
关键配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream minio{
        server 10.2.3.23:9000;
        server 10.2.3.24:9000;
        server 10.2.3.25:9000;
        server 10.2.3.26:9000;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
                proxy_pass http://minio;
                proxy_set_header Host $http_host;
                client_max_body_size 1000m;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

测试Nginx

访问 http://10.2.3.23查看是否正常

星霜荏苒 居诸不息