对象存储MinIO从入门到入坑

MinIO 介绍

MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。

MinIO 英文官网 MinIO 中文官网 注意:中文官方更新不及时,会有很多坑,请以英文官网为准。

基础概念

1、Object:存储到minio的基本对象,如文件,字节流,Anything。。。。

2、Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是互相隔离的。对于客户端而言,就相当于存放文件的顶层文件夹。

3、Drlve:存储数据的磁盘,在MinIO启动时,以参数的方式传入。MinIO中所有的对象数据都会存在Drive里。

4、Set:即一组 Drive的集合,分布式部署根据集群规模自动划分一个或者多个Set,每个Set中的Drive 分布在不同位置。一个对象存储在一个Set上。

4.1、一个对象存储在一个Set上。

4.2、一个集群划分为多个Set。

4.3、一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出。

4.4、一个Set中的drive 尽可能分布在不同的节点上。

5、纠删码:Minio 使用纠删码机制来保证高可靠性。

5.1、使用highwayhash来处理数据损坏(Bit Rot Protectio)。关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原。

5.2、纠删码是恢复丢失和算怀数据的数学算法,minio采用reed-solomincode将对象拆分成N/2数据和N/2奇偶校验块。这就意味着如果是12块盘,一个对象会被分成6个数据快、6个奇偶校验块,你可以丢失任意6块盘(不管其存放的是数据块还是奇偶校验块),你任可以从剩下的盘中的数据进行恢复。

5.2、纠删码模式,把数据分成 DATA BLOCk:数据块、 PARITY BLOCK:校验块。一个BLOCK 10M左右,如果一个文件小于10M,就以文件大小进行分块。如果一个文件大于10m,就以10M为一个文件单位进行分块。

应用场景

1、互联网非结构化数据的存储需求

1.1 、电商网站:海量商品图片

2.1、视频网站:海量视频文件

3.1、网盘:海量文件

MinIO优势

1、数据保护

1.1、分布式MInio采用纠删码来放反多个节点待机和位衰减 bit rot

1.2、分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

2、高可用

2.1、单机Minio服务存在单点故障,相反,如果是有一个N快硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。

2.2、例如,一个16节点的Minio集群,每个节点16块块硬盘,计算8台服务器宕机,这个集群仍然是可读的,不过你需要9台服务器才能写入数据。

3、一致性

3.1、Minio在分布式和单机模式下,所有读写炒作都严格遵守read-after-write 一致性模型

MinIO 使用

【服务端】单机模式

下载

# 二进制文件下载赋权
# 官方镜像站点
wget https://dl.min.io/server/minio/release/linux-amd64/minio

# 国内镜像站点 -P 参数指定保存路径
wget -P /usr/local/bin/ http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x /usr/local/bin/minio


# MinIO中国站点:http://www.minio.org.cn
# MinIO中国镜像站:http://dl.minio.org.cn

linux部署

# 修改用户名密码:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=minio123456

# 启动:
minio server --console-address ":9090" ./miniodata/data

# 后台启动,指定日志路径:
nohup minio server --console-address :"9090" ./miniodata/data >./miniodata/minio.log 2>&1 &

# minio停止
ps -ef |grep minio|grep -v grep|awk '{print $2}'|xargs kill -9

# ps:接口默认地址:9000
# 指定console端口:9090

docker部署

# docker run
docker run \
  -p 9000:9000 \
  -p 9001:9001 \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=minio123456" \
  quay.io/minio/minio server /data --console-address ":9001"
  
  
# docker 后端运行
docker run -it -d \
  -p 9000:9000 \
  -p 9001:9001 \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=minio123456" \
  -v /app/miniodata/docker/data:/data \
  quay.io/minio/minio server /data --console-address ":9001"

# ps:接口默认地址:9000
# 指定console端口:9001

docker-compose部署

# minio/docker-compose.yml
version: '3'
services:
  minio-server:
    container_name: minio-server
    image: quay.io/minio/minio:latest
    restart: always
    build:
      context: ./
    ports:
      - '9000:9000'
      - '9001:9001'
    expose:
      - "8000"
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=minio123456
    volumes:
      - /app/miniodata/docker/data:/data
    command: server /data --console-address ":9001"

Kubernetes部署

下载 yaml文件

curl https://raw.githubusercontent.com/minio/docs/master/source/extra/examples/minio-dev.yaml -O

文件内容

# Deploys a new Namespace for the MinIO Pod
apiVersion: v1
kind: Namespace
metadata:
  name: minio-dev # Change this value if you want a different namespace name
  labels:
    name: minio-dev # Change this value to match metadata.name
---
# Deploys a new MinIO Pod into the metadata.namespace Kubernetes namespace
#
# The `spec.containers[0].args` contains the command run on the pod
# The `/data` directory corresponds to the `spec.containers[0].volumeMounts[0].mountPath`
# That mount path corresponds to a Kubernetes HostPath which binds `/data` to a local drive or volume on the worker node where the pod runs
# 
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: minio
  name: minio
  namespace: minio-dev # Change this value to match the namespace metadata.name
spec:
  containers:
  - name: minio
    image: quay.io/minio/minio:latest
    command:
    - /bin/bash
    - -c
    args: 
    - minio server /data --console-address :9090
    volumeMounts:
    # 修改数据挂载路径
    - mountPath: /data
      name: localvolume # Corresponds to the `spec.volumes` Persistent Volume
  nodeSelector:
    kubernetes.io/hostname: kubealpha.local # Specify a node label associated to the Worker Node on which you want to deploy the pod.
  volumes:
  - name: localvolume
    hostPath: # MinIO generally recommends using locally-attached volumes
    # 主机数据文件目录
      path: /app/miniodata/docker/data # Specify a path to a local drive or volume on the Kubernetes worker node
      type: DirectoryOrCreate # The path to the last directory must exist

多节点部署(集群部署:服务化部署 + nginx)

环境

ip数据盘 挂载目录内核版本(minio内部版本要求4.x.x)minio版本
192.168.192.40/dev/sdb /data1

/dev/sdc /data2
4.19.90minio version RELEASE.2023-05-18T00-05-36Z (commit-id=9d96b18df03f5978873705ac55959161f018fb48)
192.168.192.50/dev/sdb /data1

/dev/sdc /data2
4.19.90minio version RELEASE.2023-05-18T00-05-36Z (commit-id=9d96b18df03f5978873705ac55959161f018fb48)

目录准备(两节点都执行)

# 数据目录
mkdir /data1
mkdir /data2

mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc

mount /dev/sdb /data1
mount /dev/sdc /data2

# 二进制及配置目录
mkdir -p /app/minio/{run,etc} && mkdir -p /app/etc/minio

下载二进制文件(两节点都执行)

# 国内镜像下载 -P 指定下载保存目录
wget -P /app/minio/run/minio http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x /app/minio/run/minio

创建启动脚本文件(两节点都执行)

vi /app/minio/run/run.sh


#Minio默认9000端口,在配置文件中加入–address “127.0.0.1:9029” 可更改端口
#注意 :
#MINIO_ROOT_USER:用户名,长度最小是5个字符
#MINIO_ROOT_PASSWORD:密码,密码不能设置过于简单,不然minio会启动失败,长度最小是8个字符
#–config-dir:指定集群配置文件目录

# !/bin/bash
# 配置内容如下
# 修改用户名密码:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=minio123456

# 启动服务
/app/minio/run/minio server --config-dir /etc/minio --address ":9000" --console-address ":9001" http://192.168.192.40/data1 \
http://192.168.192.40/data2 \
http://192.168.192.50/data1 \
http://192.168.192.50/data2 >>/app/minio/minio_server.log

创建停止脚本文件(两节点都执行)

cat <<EOF > /app/minio/run/stop.sh
#!/bin/bash
#MinIO停止脚本
ps -ef | grep  minio | grep -v 'grep' | awk '{print $2}'| xargs kill -9
 
if $? != 0;then
          echo "minio service stop failed."
            exit 1
fi
EOF

创建Minio.server(两节点都执行)

cat <<EOF > /etc/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
 
[Service]
WorkingDirectory=/app/minio/run/
ExecStart=/app/minio/run/run.sh
ExecStop=/app/minio/run/stop.sh
 
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=multi-user.target
EOF

权限修改(两节点都执行)

chmod +x /etc/systemd/system/minio.service && chmod +x /app/minio/run/minio && chmod +x /app/minio/run/run.sh && chmod +x /app/minio/run/stop.sh

启动集群(两节点都执行)

systemctl daemon-reload
systemctl start minio
systemctl enable minio
systemctl status minio.service
systemctl status minio

● minio.service - Minio service
   Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-05-26 13:54:11 CST; 9min ago
     Docs: https://docs.minio.io/
 Main PID: 778169 (run.sh)
    Tasks: 12
   Memory: 118.1M
   CGroup: /system.slice/minio.service
           ├─778169 /bin/bash /app/minio/run/run.sh
           └─778174 /app/minio/run/minio server --config-dir /etc/minio --address :9000 --console-address :9001 http://192.168.192.40/data1 http://192.168.192.40/data2 http://192.168.192.50/data1 http://192.168.>

May 26 13:54:11 ctyunos-master systemd[1]: minio.service: Failed with result 'signal'.
May 26 13:54:11 ctyunos-master systemd[1]: Stopped Minio service.
May 26 13:54:11 ctyunos-master systemd[1]: Started Minio service.

使用 nginx 负载均衡(选择节点都执行)

可以在其中一台部署好nginx,也可以单独一台做nginx。

我这里选择在192.168.192.40配置nginx。

主要是 upstream 及 proxy_pass 的配置。

# nginx安装
yum install nginx 

# /etc/nginx/nginx.conf

http{
   ......

    upstream minio_console {
        server 192.168.192.40:9001 max_fails=3 fail_timeout=5s;
        server 192.168.192.50:9001 max_fails=3 fail_timeout=5s;
    
    }
    upstream minio_api {
        server 192.168.192.40:9000 max_fails=3 fail_timeout=5s;
        server 192.168.192.50:9000 max_fails=3 fail_timeout=5s;
    
    }
    
    server {
        listen          8080;
    #    listen         443 ssl; 			# 没有ssl证书,不做配置
    #    server_name     cons.minio.com;		# 不需要域名时
        
    #    ssl_certificate keys/cons/server.crt;	# 没有ssl证书,不做配置
    #    ssl_certificate_key keys/cons/server.key;	# 没有ssl证书,不做配置
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        client_max_body_size     1G;   #如果上传文件大于1G,就需要更改这个参数
        client_header_timeout    1m;
        client_body_timeout      1m;
        proxy_connect_timeout    60s;
        proxy_read_timeout       1m;
        proxy_send_timeout       1m;
        
        location / {
            proxy_next_upstream     http_500 http_502 http_503 http_504 error timeout invalid_header;
            proxy_set_header        Host  $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass              http://minio_console;
            expires                 0;
        }
    }
    
    server {
        listen          80;
    #    listen         443 ssl;			# 没有ssl证书,不做配置
    #    server_name     api.minio.com;		# 不需要域名时
    
    #    ssl_certificate keys/cons/server.crt;	# 没有ssl证书,不做配置
    #    ssl_certificate_key keys/cons/server.key;	# 没有ssl证书,不做配置
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        client_max_body_size     1G;
        client_header_timeout    1m;
        client_body_timeout      1m;
        proxy_connect_timeout    60s;
        proxy_read_timeout       1m;
        proxy_send_timeout       1m;
    
        location / {
            proxy_next_upstream     http_500 http_502 http_503 http_504 error timeout invalid_header;
            proxy_set_header        Host  $host;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass              http://minio_api;
            expires                 0;
        }
    }
   ......
 }
 
 # 重启nginx
 systemctl restart nginx

# /etc/nginx/nginx.conf
http{
   ......
    upstream minio{
            server 192.168.192.40:9001;
            server 192.168.192.50:9001;
    }
    server {
            listen 80;
            server_name localhost;
            location / {
                    proxy_pass http://minio;
                    proxy_set_header Host $http_host;
                   #client_max_body_size 1000m;
            }
    }
    ......
}

验证

访问

http://192.168.192.40:8080/login

http://192.168.192.40

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MinIO是一个开源的分布式对象存储服务,它可以在私有云环境中提供高性能和高可用性的存储解决方案。下面是关于MinIO的一些基本概念和使用方法: 1. 分布式存储MinIO使用分布式架构,可以将数据存储在多个节点上,实现数据的冗余和高可用性。每个节点都可以独立地提供存储服务,并且可以通过添加更多的节点来扩展存储容量和吞吐量。 2. 对象存储MinIO对象的形式存储数据,每个对象都有一个唯一的键(Key)和对应的值(Value)。对象可以是任意类型的文件,例如图片、视频、文档等。通过使用对象存储MinIO可以提供高效的数据访问和管理。 3. 数据分片:MinIO将每个对象分成多个数据片段(Data Shard),并将它们分布在不同的节点上。这种数据分片的方式可以提高数据的可靠性和可用性,同时也可以提高数据的读写性能。 4. 冗余备份:MinIO使用纠删码(Erasure Code)技术来实现数据的冗余备份。纠删码可以将数据分成多个片段,并将这些片段分布在不同的节点上。即使某个节点发生故障,系统仍然可以通过其他节点上的数据片段进行数据恢复。 5. 客户端接口:MinIO提供了丰富的客户端接口,可以方便地与MinIO进行交互。你可以使用MinIO的命令行工具、API接口或者各种编程语言的SDK来管理和操作MinIO存储。 下面是一个使用MinIO Python SDK上传文件的例子: ```python from minio import Minio # 创建MinIO客户端 client = Minio('play.min.io', access_key='YOUR_ACCESS_KEY', secret_key='YOUR_SECRET_KEY', secure=True) # 上传文件 client.fput_object('mybucket', 'myobject', 'path/to/local/file.jpg') # 关闭客户端连接 client.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值