Minio入门系列【1】Windows/Linux/K8S单机部署Minio

1 Minio简介

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。目前支持JavaScript 、Java、Python、Golang、.NET。

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

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

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

在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品

MinIO现在也是CNCF成员,在云原生存储部分和ceph等一起作为目前的解决方案之一。

2 Minio优点

2.1 Erasure Coding(消除编码)

MinIO 使用以汇编代码编写的每个对象内联擦除编码来保护数据,以提供尽可能高的性能。 MinIO 使用 Reed-Solomon 代码将对象条带化为具有用户可配置冗余级别的数据和奇偶校验块。 MinIO 的纠删码在对象级别执行修复,可以独立修复多个对象。

在最大奇偶校验为 N/2 的情况下,MinIO 的实现可以确保部署中只有 ((N/2)+1) 个可操作驱动器的不间断读写操作。 例如,在 12 驱动器设置中,MinIO 将对象分片到 6 个数据驱动器和 6 个奇偶校验驱动器,并且可以可靠地写入新对象或重建现有对象,部署中只剩下 7 个驱动器

在这里插入图片描述

2.2 Bitrot 保护

静默数据损坏或比特腐烂是磁盘驱动器面临的一个严重问题,会导致数据在用户不知情的情况下损坏。 原因多种多样(驱动器老化、电流峰值、磁盘固件错误、幻写、误读/写入、驱动程序错误、意外覆盖)但结果是相同的 - 数据受损。

MinIO 对 HighwayHash 算法的优化实现确保它永远不会读取损坏的数据 - 它会即时捕获并修复损坏的对象。 通过在读取时计算散列并在写入时从应用程序、网络和内存/驱动器验证它,从端到端确保完整性。 该实现专为速度而设计,可以在 Intel CPU 的单核上实现超过 10 GB/秒的散列速度。

在这里插入图片描述

2.3 加密

在飞行中加密数据是一回事; 保护静态数据是另一回事。 MinIO 支持多种复杂的服务器端加密方案来保护数据——无论数据位于何处。 MinIO 的方法以可忽略的性能开销确保机密性、完整性和真实性。 使用 AES-256-GCM、ChaCha20-Poly1305 和 AES-CBC 支持服务器端和客户端加密。

加密对象使用 AEAD 服务器端加密进行防篡改。 此外,MinIO 与所有常用的密钥管理解决方案(例如 HashiCorp Vault)兼容并经过测试。 MinIO 使用密钥管理系统 (KMS) 来支持 SSE-S3。

如果客户端请求 SSE-S3,或者启用了自动加密,MinIO 服务器使用唯一的对象密钥加密每个对象,该对象密钥由 KMS 管理的主密钥保护。 鉴于极低的开销,可以为每个应用程序和实例打开自动加密。
在这里插入图片描述

2.4 蠕虫病毒

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

2.5 身份管理

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

在这里插入图片描述

2.6 连续复制

传统复制方法的挑战在于它们无法有效地扩展到几百 TiB 以上。 话虽如此,每个人都需要一个复制策略来支持灾难恢复,并且该策略需要跨越地域、数据中心和云。

MinIO 的连续复制专为大规模、跨数据中心部署而设计。 通过利用 Lambda 计算通知和对象元数据,它可以高效快速地计算增量。 Lambda 通知确保立即传播更改,这与传统的批处理模式不同。

连续复制意味着如果发生故障,数据丢失将保持在最低限度 - 即使面对高度动态的数据集。 最后,与 MinIO 所做的一切一样,连续复制是多供应商的,这意味着您的备份位置可以是从 NAS 到公共云的任何地方。
在这里插入图片描述

2.7 全球联盟

现代企业的数据无处不在。 MinIO 允许将这些不同的实例组合起来形成一个统一的全局命名空间。 具体来说,可以将任意数量的 MinIO 服务器组合成一个 Distributed Mode set,多个 Distributed Mode set 可以组合成一个 MinIO Server Federation。 每个 MinIO Server Federation 都提供统一的管理和命名空间。

MinIO 联合服务器支持无限数量的分布式模式集。 这种方法的影响是,对象存储可以为大型、地理分布的企业大规模扩展,同时保留从单个控制台容纳各种应用程序(Splunk、Teradata、Spark、Hive、Presto、TensorFlow、H20)的能力。

2.8 多云网关

所有企业都在采用多云战略。 这也包括私有云。 因此,您的裸机虚拟化容器和公共云服务(包括非 S3 提供商,如谷歌、微软和阿里巴巴)必须看起来完全相同。 虽然现代应用程序具有高度可移植性,但为这些应用程序提供支持的数据却并非如此。

让数据可用,无论它位于何处,是 MinIO 解决的主要挑战。 MinIO 在裸机、网络附加存储和每个公共云上运行。 更重要的是,MinIO 通过 Amazon S3 API 确保您对该数据的看法从应用程序和管理的角度来看完全相同。

MinIO,可以走得更远,使您现有的存储基础设施与 Amazon S3 兼容。 其影响是深远的。 现在,组织可以真正统一他们的数据基础设施 - 从文件到块,所有这些都显示为可通过 Amazon S3 API 访问的对象,而无需迁移。

3 Minio架构

MinIO 被设计为云原生,可以作为由外部编排服务(如 Kubernetes)管理的轻量级容器运行。 整个服务器是一个大约 40MB 的静态二进制文件,并且在使用 CPU 和内存资源方面非常高效 - 即使在高负载下也是如此。 结果是您可以在共享硬件上共同托管大量租户。

在这里插入图片描述
MinIO 在带有本地连接驱动器 (JBOD/JBOF) 的商用服务器上运行。 集群中的所有服务器都具有相同的能力(完全对称架构)。 没有名称节点或元数据服务器。

MinIO 将数据和元数据作为对象一起写入,从而消除了对元数据数据库的需求。 此外,MinIO 执行所有功能(擦除代码、位腐烂检查、加密)作为内联、严格一致的操作。 结果是 MinIO 非常有弹性。

每个 MinIO 集群都是分布式 MinIO 服务器的集合,每个节点有一个进程。 MinIO作为单进程运行在用户空间,使用轻量级协程实现高并发。 驱动器被分组为擦除集(默认情况下每组 16 个驱动器),并且使用确定性哈希算法将对象放置在这些集中。

MinIO 专为大规模、多数据中心的云存储服务而设计。 每个租户运行他们自己的 MinIO 集群,与其他租户完全隔离,使他们能够保护他们免受升级、更新和安全事件的任何中断。 每个租户通过跨地域联合集群独立扩展。

4 Windows安装

4.1 下载

下载地址:http://dl.minio.org.cn/server/minio/release/
在这里插入图片描述
在这里插入图片描述

4.2 在minio.exe目录打开cmd

在这里插入图片描述

4.3 配置参数并启动

# 设置用户名
set MINIO_ACCESS_KEY=admin
# 设置密码(8位)
set MINIO_SECRET_KEY=admin123
# 指定启动端口(未指定默认9000)及存储位置
minio.exe  server  --address 0.0.0.0:9999 D:/data

在这里插入图片描述

4.4 登录地址IP+9999,输入用户名及密码,搭建完成

在这里插入图片描述

5 Linux安装

5.1 下载

在这里插入图片描述
在这里插入图片描述

5.2 创建相关目录

# 创建文件存储目录
mkdir -p /data/minio/data
# 创建程序存放目录,并上传minio至此目录
mkdir -p /data/minio
cd /data/minio
# 修改可读权限
chmod +x minio 
# 设置用户名
export  MINIO_ACCESS_KEY=admin
# 设置密码
export  MINIO_SECRET_KEY=admin123

5.3 启动并访问首页

 ./minio server /data/minio/data --console-address ":33639" --address ":9000"

在这里插入图片描述

5.4 Docker

docker run -p 9999:9000 -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123" -v /data/minio:/data -d minio/minio server /data

5.5 Docker compose

version: '3'
services:
   minio:
    container_name: minio
    hostname: minio
    image: "minio/minio:latest"
    volumes:
      - /data/minio:/data
    ports:
      - "9999:9000"
    environment:
      MINIO_ACCESS_KEY: admin
      MINIO_SECRET_KEY: admin123
      TZ: Asia/Shanghai
    command: server /data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

6 K8S

要点:使用yml文件配置资源,使用PVC存储minio文件

6.1 在节点 192.168.58.103创建NFS

# 安装nfs-utils rpcbind
yum install nfs-utils nfs-common rpcbind 
# 创建目录
mkdir -p /data/minio
chmod 666 /data/minio/
chown nfsnobaby /data/minio/
# 添加访问策略
vi /etc/exports
# 输入内容
/data/minio  *(rw,no_root_squash,no_all_squash,sync)
# 启动
systemctl start rpcbind
systemctl start nfs
# 查看
showmount -e

6.2 创建PV(master执行)

# vim minio-pv.yaml 
# 添加
apiVersion: v1
kind: PersistentVolume
metadata:
    name: pv-minio
spec:
    capacity:
      storage: 2Gi
    accessModes:
      - ReadWriteMany
    persistentVolumeReclaimPolicy: Recycle
    nfs:
      path: /data/minio
      server: 192.168.58.103
# 创建
kubectl create -f minio-pv.yaml 
# 查看
kubectl get pv -o wide

在这里插入图片描述

6.3 创建PVC(master执行)

# 
vim minio-pvc.yaml 
# 内容
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-minio
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
# 查看
kubectl get pvc -o wide 

6.4 创建pod及service(master执行)

# 
vim minio.yaml 
# 添加
apiVersion: v1
kind: Service
metadata:
  name: minio-svc
  labels:
    app: minio
spec:
  type: NodePort
  ports:
  - name: minio-port
    protocol: TCP
    port: 9000
    nodePort: 32600
    targetPort: 9000
  selector:
    app: minio
---
apiVersion: v1
kind: Pod
metadata:
  name: minio
  labels:
    app: minio
spec:
  containers:
  - name: minio
    env:
    - name: MINIO_ACCESS_KEY
      value: "admin"
    - name: MINIO_SECRET_KEY
      value: "admin123"
    image: minio/minio:latest
    args:
    - server
    - /data
    ports:
    - name: minio
      containerPort: 9000
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
     claimName: pvc-minio
# 创建
kubectl apply  -f minio.yaml 
# 查看pod 
kubectl get pods -o wide
# 查看service
kubectl get svc -o wide 

在这里插入图片描述

6.5 验证

因为service采用的是NodePort,所以需要输入minio所在node的IP+32600访问
在这里插入图片描述
文件存放:页面上传一个文件,进入nfs所在服务器,然后发现文件已被存放在PVC中
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37284798/article/details/132824064