一、 简介
MinIO
是一个基于Apache License v2.0
开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。官方文档MinIO
是一个非常轻量的服务,可以很简单的和其他应用的结合,类似NodeJS
,Redis
或者MySQL
。
1. 存储机制
MinIO
将对象拆分成N/2数据和N/2奇偶校验盘,(N为盘总数)(推荐默认), 可通过存储类型自定义配置。
MinIO
使用纠删码erasure code
和checksum
来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。
2. 优缺点
- 安装部署(运维)简单,普通的技术人员就能够参与后期运维
- AWS S3标准兼容,可以把对象存储放到云上,只要云厂商支持S3标准,你的应用程序是不需要重新开发的
- MinIO目前是由2014年在硅谷创立的公司MinIO.Inc运营的开源项目,社区论坛的活跃度不错
- 完善的文档
- UI界面
- 高性能:作为高性能对象存储,在标准硬件条件下它能达到
55GB/s
的读、35GG/s
的写速率 - 容器化支持,提供了与
k8s
、etcd
、docker
等容器化技术深度集成方案 - 丰富的SDK支持,目前提供了
C
和Java SDK
,以及PHP
扩展SDK - 数据保护, 采用纠删码方式保护数据
- 高可用,采用纠删码方式实现
- 一致性,在分布式和单机模式下,所有读写操作都严格遵守
read-after-write
和list-after-write
一致性模型。 - 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心
- 云原生:容器化、基于K8S的编排、多租户支持
1. 不支持动态增加节点,minio创始人的设计理念就是动态增加节点太复杂,后续会采用其它方案来支持扩容。
3. 注意事项
1. MinIO 可创建每组4到16个磁盘组成的纠删码集合。所以你提供的磁盘总数必须是其中一个数字的倍数。
2. MinIO根据给定的磁盘总数或者节点总数选择最大的纠删码集合大小,确保统一分布,即每个节点参与每个集合的磁盘数量相等。
3. 每个对象被写入一个EC集合中,因此该对象分布在不超过16个磁盘上。
4. 建议运行分布式MinIO设置的所有节点都是同构的,即相同的操作系统,相同数量的磁盘和相同的网络互连。
5. 分布式Minio里的节点系统时间差不能超过15分钟,你可以使用`NTP`来保证时间一致
6. JDK最低需求Java 1.8或更高版本
7. 读,节点
二、 MinIO集群搭建
节点 | IP | 数据目录 |
---|---|---|
minio1 | 10.168.12.123 | /usr/local/nlp/minio/server/datastore/ |
minio2 | 10.168.12.124 | /usr/local/nlp/minio/server/datastore/ |
minio3 | 10.168.12.91 | /usr/local/nlp/minio/server/datastore/ |
minio4 | 10.168.12.98 | /usr/local/nlp/minio/server/datastore/ |
minio4 | 10.168.12.47 | /usr/local/nlp/minio/server/datastore/ |
minio4 | 10.168.12.48 | /usr/local/nlp/minio/server/datastore/ |
1. 下载
# 1. 创建文件下载目录
mkdir -p /usr/local/nlp/minio/server/
# 2. 进入目录
cd /usr/local/nlp/minio/server/
# 3. wget下载 (官网与可能变更地址)
wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
2. 安装服务端
chmod 744 /usr/local/nlp/minio/server/minio
mkdir -p /usr/local/nlp/minio/server/datastore/
#!/bin/bash
# chkconfig: 2345 85 15
# description: minio server
# 账号
export MINIO_ACCESS_KEY=admin
# 密码
export MINIO_SECRET_KEY=adminsecret
# 浏览器, off on
export MINIO_BROWSER=on
IP=`hostname -i`
# 服务端口
PORT=8800
MINIO_BASE=/usr/local/nlp/minio/server
MINIO_DATA=$MINIO_BASE/datastore
MINIO_RUN_LOG=$MINIO_BASE/logs
MINIO_CONFIG=$MINIO_BASE/config
PID=minio.pid
case "$1" in
start)
nohup $MINIO_BASE/minio server \
--config-dir $MINIO_CONFIG \
--address $IP:$PORT \
http://10.168.12.123$MINIO_DATA \
http://10.168.12.91$MINIO_DATA \
http://10.168.12.47$MINIO_DATA \
http://10.168.12.48$MINIO_DATA \
http://10.168.12.124$MINIO_DATA \
http://10.168.12.98$MINIO_DATA > $MINIO_RUN_LOG/running.log 2>&1 &
echo $! > $MINIO_BASE/$PID
echo "=== 启动 MinIO 成功"
;;
stop)
kill `cat $MINIO_BASE/$PID`
rm -rf $MINIO_BASE/$PID
sleep 2
P_ID=`ps -ef | grep -w "$MINIO_BASE/minio server" | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "=== $MINIO_BASE/minio process not exists or stop success"
else
echo "=== $MINIO_BASE/minio process pid is:$P_ID"
echo "=== begin kill $MINIO_BASE/minio server process, pid is:$P_ID"
kill -9 $P_ID
fi
echo "=== 停止 MinIO 成功"
;;
status)
echo "=== 查看 MinIO 状态"
echo `ps -ef | grep -w "$MINIO_BASE/minio server"`
;;
logs)
tail -200f $MINIO_RUN_LOG/running.log
;;
restart)
$0 stop
sleep 3
$0 start
echo "=== 重启 MinIO 成功"
;;
esac
exit 0
chmod 744 /usr/local/nlp/minio/server/minioServer.sh
mkdir -p /usr/local/nlp/minio/server/logs/
# 创建软连接
sudo ln -s /usr/local/nlp/minio/server/minioServer.sh /etc/init.d/minioServer
# 用户和组
sudo chown -R uaren:uaren /etc/init.d/minioServer
# 添加服务
sudo chkconfig --add minioServer
# 开机启动
sudo chkconfig minioServer on
# 1. 启动
service minioServer start
# 2. 停止
service minioServer stop
# 3. 状态
service minioServer status
# 4. 重启
service minioServer restart
# 5. 日志
service minioServer logs
3. Nginx负载
# 1. location部分
# MinIO集群-浏览器
location /minio {
proxy_pass http://minio;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
# MinIO集群-API
# 注意minio-,这表示API能访问的桶只能这个开头,root用户为其他用户创建桶时需要注意
location ^~ /minio- {
proxy_pass http://minio;
proxy_redirect off;
proxy_set_header Host $host; # 必须
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
expires -1;
}
# 2. upstream部分
upstream minio {
#weigth参数表示权值,权值越高被分配到的几率越大
server 10.168.12.123:8800 weight=1;
server 10.168.12.124:8800 weight=1;
server 10.168.12.91:8800 weight=1;
server 10.168.12.98:8800 weight=1;
}
三、 MinIO客户端
1. 安装配置
# 1. 创建文件下载目录
mkdir -p /usr/local/nlp/minio/client/
# 2. 进入目录
cd /usr/local/nlp/minio/client/
# 3. wget下载
wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc
# 4. 配置环境
# 修改/etc/profile文件,新增:
export MINIO_CLIENT=/usr/local/nlp/minio/client
export PATH=$MINIO_CLIENT:$PATH
2. 安装配置
1. 添加MinIO存储服务
# 格式
mc config host add 别名 <YOUR-MINIO-ENDPOINT> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
# 示例
mc config host add minio http://10.168.12.123:8800 admin adminsecret
2. 查看节点
mc admin info minio
3. 查看账户列表
# 格式
mc admin user list --json 别名
# 示例
mc admin user list --json minio
4. 创建账户
# 格式
mc admin user add 别名 用户名 用户密码
# 示例
mc admin user add minio natsu natsu123456
5. 配置权限规则
以下操作是创建用户,并为其分配特定桶的部分权限,本身不具备创建桶的权限,需要root用户创建,避免用户随意创建桶
Action-name | 描述 |
---|---|
s3:ListAllMyBuckets | 查看所有的桶权限 |
s3:ListBucket | 查看桶内对象权限 |
s3:GetBucketLocation | 定位bucket权限 |
s3:GetObject | 下载权限 |
s3:PutObject | 上传权限 |
s3:DeleteObject | 删除权限 |
s3:ListAllMyBuckets | 查看所有的桶权限 |
s3:ListBucket | 查看桶内对象权限 |
Resource-name | 描述 |
---|---|
arn:aws:s3:::minio-test/* | arn:aws:s3:::不动,minio-test表示桶名,*表示全部 |
# 创建minio-test.json文件,内容:
{
"Version": "2021-01-05",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::minio-test/*"
];
}
]
}
# 1. 添加策略
# 格式
mc admin policy add 别名 策略名(建议policy文件名) policy文件路径
# 示例
mc admin policy add minio minio-test /usr/local/nlp/minio/client/policy/minio-test.json
# 2. 删除策略
# 格式
mc admin policy remove 别名 策略名
# 示例
mc admin policy remove minio minio-test
# 3. 用户分配策略
# 格式
mc admin policy set 别名 策略名 user=用户名
# 示例
mc admin policy set minio minio-test user=natsu