前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Minio对象存储

Minio对象存储

作者头像
仙人技术
发布2020-04-29 13:26:06
8.2K0
发布2020-04-29 13:26:06
举报

1、概述

​ Minio是一个基于Apache License v2.0开源和谈的工具存储服务。它兼容亚马逊S3云存储服务接口,异常符合于存储大容量非构造化的数据,比如图片、视频、日记文献、备份数据和容器/杜撰机镜像等,而一个工具文献能够是任性巨细,从几kb到最大5T不等。且Minio十足笨重,可与使用顺序绳捆索绑在一齐,相似于NodeJS,Redis和MySQL。 ​ 官方文档地址:https://docs.min.io/cn ​ 对于有需求不能或不使用云厂商提供的存储服务,例如阿里云的oss、七牛云的对象存储等,可以通过自建minio对象存储集群的方式

2、功能特性

  • Amazon S3兼容 Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI访问Minio服务器。
  • 数据保护 Minio使用Minio Erasure Code来防止硬件故障。也许会损坏一半以上的driver,但是仍然可以从中恢复。
  • 高度可用 Minio服务器可以容忍分布式设置中高达(N / 2)-1节点故障。而且,您可以配置Minio服务器在Minio与任意Amazon S3兼容服务器之间存储数据。
  • Lambda计算 Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。
  • 加密和防篡改 Minio为加密数据提供了机密性,完整性和真实性保证,而且性能开销微乎其微。使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。加密的对象使用AEAD服务器端加密进行防篡改。
  • 可对接后端存储 除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。
  • sdk支持 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持

3、集群规划

3.1、单节点

  • 根据存储是否为远端,可直接使用FS或NFS直接操作存储中的Object
  • 调用S3接口,通过Minio使用FS或NFS来操作Object

3.2、多节点

多节点的Minio会根据不同的Access_key及Secret_Key来区分不同租户,每个租户可操作对应Server获取Object。Minio Server间可以通过不同的进程模型、容器或是虚拟机来互相隔离。

3.3、分布式

分布式Minio在无共享架构中根据需求扩展到尽可能多的服务器,所有节点需要使用相同的Access_key及Secret_key来登录。分布式Minio使用Web负载均衡器或DNS轮循(DNS round-robin),在各服务器之间实现负载均衡。

4、分布式minio集群搭建

minio存储的部署方案在官网有很多,例如在docker-compose,kubernetes,DC/OS等环境下,本文采用的是较稳定的二进制部署方式。

4.1、集群规划

minio二进制文件下载地址: https://dl.minio.io/server/minio/release/linux-amd64/minio 操作系统CentOS 7.6 服务器资源:

  • 172.16.1.101 /minio/data1 /minio/data2
  • 172.16.1.102 /minio/data1 /minio/data2

本集群由2台服务器构成(官方推荐集群最小4台服务器),每个服务器上挂载两个磁盘目录,最小数据挂载点为4个

4.2、创建用户

创建专用的用户

代码语言:javascript
复制
useradd -M -s /sbin/nologin -r minio-user

4.3、创建相关目录(所有节点)

  • 数据存储目录
代码语言:javascript
复制
[root@localhost ~]# mkdir -p /minio/data1
[root@localhost ~]# mkdir -p /minio/data2
  • 启动脚本目录
代码语言:javascript
复制
[root@localhost ~]# mkdir -p /opt/minio
  • 集群配置文件目录
代码语言:javascript
复制
[root@localhost ~]# mkdir -p /etc/minio

4.4、编写集群启动脚本(所有节点)

代码语言:javascript
复制
[root@localhost ~]# vim /opt/minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456
/opt/minio/minio server --config-dir /etc/minio \
http://172.16.1.101/minio/data1 http://172.16.1.101/minio/data2 \
http://172.16.1.102/minio/data1 http://172.16.1.102/minio/data2 \

其中,“MINIO_ACCESS_KEY”为用户名,“MINIO_SECRET_KEY”为密码,密码不能设置过于简单,不然minio会启动失败,“–config-dir”指定集群配置文件目录,生成复杂用户名和密码可通过类似Linux命令 tr -cd '[:alnum:]' </dev/urandom |fold -w64|head -n1的方式来生成

4.5、编写服务脚本(所有节点)

代码语言:javascript
复制
[root@localhost ~]# vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh

# Let systemd restart this service on-failure
Restart=on-failure
RestartSec=5

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
[root@localhost ~]# chmod +x /usr/lib/systemd/system/minio.service

其中,“WorkingDirectory”为启动脚本目录,“ExecStart”为指定集群启动脚本 参考官方地址: https://github.com/minio/minio-service/blob/master/linux-systemd/minio.service

4.6、服务启动

4.6.1、二进制文件

将minio二进制文件上传到/opt/minio目录下并赋予权限

代码语言:javascript
复制
chmod +x minio
4.6.2、赋予启动脚本权限
代码语言:javascript
复制
chmod +x /opt/minio/run.sh
4.6.3、修改目录所属

由于minio服务由minio-user这个用户启动和运行,所以需要修改相应目录的属主和属组

代码语言:javascript
复制
chown -R minio-user:minio-user /minio
chown -R minio-user:minio-user /etc/minio
chown -R minio-user:minio-user /opt/minio
4.6.4、启动服务
代码语言:javascript
复制
systemctl daemon-reload
systemctl start minio
systemctl enable minio
systemctl status minio

启动后可通过访问节点:9000,并使用设置的key登录到控制台,也可在启动脚本中加入参数--address "127.0.0.1:9000"修改端口,即:

代码语言:javascript
复制
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456

/opt/minio/minio server --config-dir /etc/minio \
--address "127.0.0.1:9000" \
http://172.16.1.101/minio/data1 http://172.16.1.101/minio/data2 \
http://172.16.1.102/minio/data1 http://172.16.1.102/minio/data2 \

5、配置域名及https

5.1、配置域名

使用nginx配置域名进行访问,在 Nginx 的配置文件中加入下面的内容:

代码语言:javascript
复制
location / {
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:9000;
}

5.2、配置https

使用nginx配置https安全访问,并根据301规则自动跳转到https,https证书可自签、也可申请一个浏览器可信的证书,下面的证书属于浏览器可信的,全局配置如下:

代码语言:javascript
复制
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;
    server_tokens  off;
    keepalive_timeout  65;
	client_max_body_size 50m;
    access_log   /var/log/nginx/nginx.access.log;
    error_log    /var/log/nginx/nginx.error.log;
    upstream minio_server {
        server 192.168.10.101:9000;
        server 192.168.10.102:9000;
        ip_hash;
    }
    server {
        listen       80;
        server_name  minio.test.com;
        return 301   https://$host$request_uri;
    }
    server {
        listen        443 ssl;
        server_name   minio.test.com;
        if ($host != 'minio.test.com') {
            return 403;
        }
        ssl_certificate      /usr/local/nginx/cert-ssl/minio.test.com.pem;
        ssl_certificate_key  /usr/local/nginx/cert-ssl/minio.test.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
            proxy_pass http://minio_server;
            proxy_redirect    off;
            proxy_set_header  Host             $http_host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
     }
}

5.3、访问认证

minio控制台界面是通过Accsss Key和Secret Key登录的,除了将这对Key用于客户端,作为管理员还可能有需要对控制台访问做保护,即在用Key登录的基础上再加一层。这就如同非X-pack版本的Kibana界面一样,没有访问控制。同样的,可以尝试使用nginx的basic_auth模块。一番折腾发现是不可行的,对于nginx基础认证,后端不支持非AWS4-HMAC-SHA256签名算法,可能出现如下图所示的返回结果:

因此这个想法不可行,具体如何实现也没有google到。。。

6、控制台界面操作及客户端sdk

6.1、控制台界面

通过上面配置的域名访问到minio界面

并通过指定的Access Key及Secret Key登录到控制台

6.2、控制台界面操作

控制台可以做的操作如下:

  • 创建一个存储空间(存储桶)bucket
  • 在存储桶内上传下载文件
  • 文件生成链接,设置链接过期时间

6.3、客户端sdk

更多内容可查看官网文档

7、多租户部署

多租户的实现可参考: https://blog.csdn.net/dingjs520/article/details/79118305

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述
  • 2、功能特性
  • 3、集群规划
    • 3.1、单节点
      • 3.2、多节点
        • 3.3、分布式
        • 4、分布式minio集群搭建
          • 4.1、集群规划
            • 4.2、创建用户
              • 4.3、创建相关目录(所有节点)
                • 4.4、编写集群启动脚本(所有节点)
                  • 4.5、编写服务脚本(所有节点)
                    • 4.6、服务启动
                      • 4.6.1、二进制文件
                      • 4.6.2、赋予启动脚本权限
                      • 4.6.3、修改目录所属
                      • 4.6.4、启动服务
                  • 5、配置域名及https
                    • 5.1、配置域名
                      • 5.2、配置https
                        • 5.3、访问认证
                        • 6、控制台界面操作及客户端sdk
                          • 6.1、控制台界面
                            • 6.2、控制台界面操作
                              • 6.3、客户端sdk
                              • 7、多租户部署
                              相关产品与服务
                              对象存储
                              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档