minio存储
单机测试
minio对象存储:
编译安装:
minio 服务器安装:
git clone https://gitee.com/mirrors/minio.git
cd minio
go build
cp minio /usr/local/bin/
minio客户端安装:
git clone git clone https://github.com/minio/mc.git
cd mc
go build
cp mc /usr/local/bin/
单机性能测试:
启动minio服务器:
root@ubuntu:/home/work/minio# minio server data
Endpoint: http://10.1.30.31:9000 http://172.17.0.1:9000 http://172.30.0.1:9000 http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin
Browser Access:
http://10.1.30.31:9000 http://172.17.0.1:9000 http://172.30.0.1:9000 http://127.0.0.1:9000
Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
$ mc alias set myminio http://10.1.30.31:9000 minioadmin minioadmin
Object API (Amazon S3 compatible):
Go: https://docs.min.io/docs/golang-client-quickstart-guide
Java: https://docs.min.io/docs/java-client-quickstart-guide
Python: https://docs.min.io/docs/python-client-quickstart-guide
JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
.NET: https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
mc客户端写入数据:
root@ubuntu:/home/work/minio# dd if=/dev/zero of=random bs=10M count=1024
1024+0 records in
1024+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 56.3821 s, 190 MB/s
root@ubuntu:/home/work/minio#
root@ubuntu:/home/work/minio# ll random
-rw-r--r-- 1 root root 10737418240 Oct 27 16:58 random
root@ubuntu:/home/work/minio# mc cp ./random data/
./random: 10.00 GiB / 10.00 GiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 1.09 GiB/s 9s
root@ubuntu:/home/work/minio# ll /home/work/minio/data/
total 10485772
drwxr-xr-x 3 root root 4096 Oct 27 17:00 ./
drwxr-xr-x 6 root root 4096 Oct 27 16:57 ../
drwxr-xr-x 6 root root 4096 Oct 27 16:47 .minio.sys/
-rw-r--r-- 1 root root 10737418240 Oct 27 17:00 random
root@ubuntu:/home/work/minio# ll /home/work/minio/data/ -h
total 11G
drwxr-xr-x 3 root root 4.0K Oct 27 17:00 ./
drwxr-xr-x 6 root root 4.0K Oct 27 16:57 ../
drwxr-xr-x 6 root root 4.0K Oct 27 16:47 .minio.sys/
-rw-r--r-- 1 root root 10G Oct 27 17:00 random
root@ubuntu:/home/work/minio#
linux文件系统拷贝性能测试:
root@ubuntu:/home/work/minio# rm random
root@ubuntu:/home/work/minio# ll
total 28
drwxr-xr-x 7 root root 4096 Oct 27 17:18 ./
drwxr-xr-x 5 root root 4096 Oct 27 16:26 ../
drwxr-xr-x 3 root root 4096 Oct 27 17:00 data/
drwxr-xr-x 3 root root 4096 Oct 27 16:55 dir1/
drwxr-xr-x 2 root root 4096 Oct 27 16:58 dir2/
drwxr-xr-x 8 root root 4096 Oct 27 17:13 mc/
drwxr-xr-x 12 root root 4096 Oct 27 16:33 minio/
root@ubuntu:/home/work/minio# time cp data/random .
real 0m8.067s
user 0m0.064s
sys 0m8.002s
root@ubuntu:/home/work/minio#
挂载
准备密码文件:
echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
chmod 600 ${HOME}/.passwd-s3fs
挂载:
root@ubuntu:/home/work/minio# ls /mnt/
root@ubuntu:/home/work/minio# s3fs data/
.minio.sys/ random
root@ubuntu:/home/work/minio# s3fs data /mnt/
s3fs: credentials file /root/.passwd-s3fs should not have others permissions.
root@ubuntu:/home/work/minio# chmod 600 /root/.passwd-s3fs
root@ubuntu:/home/work/minio# s3fs data /mnt/
root@ubuntu:/home/work/minio#
写入测试:
root@ubuntu:/home/work/minio# cd /mnt/
root@ubuntu:/mnt# time dd if=/dev/zero of=file1 bs=2M count=1024
1024+0 records in
1024+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 1.43733 s, 1.5 GB/s
real 0m1.440s
user 0m0.000s
sys 0m1.440s
root@ubuntu:/mnt#
集群性能测试:
docker 容器形成集群
集群测试
测试硬件环境:
用docker 创建4节点的集群,每个节点两个挂载点。共8个挂载点。
1 准备yaml文件:
Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
$ cat docker-compose.yaml
version: '3.7'
# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
minio1:
image: minio/minio:RELEASE.2020-10-27T04-03-55Z
volumes:
- data1-1:/data1
- data1-2:/data2
ports:
- "9001:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio2:
image: minio/minio:RELEASE.2020-10-27T04-03-55Z
volumes:
- data2-1:/data1
- data2-2:/data2
ports:
- "9002:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio3:
image: minio/minio:RELEASE.2020-10-27T04-03-55Z
volumes:
- data3-1:/data1
- data3-2:/data2
ports:
- "9003:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio4:
image: minio/minio:RELEASE.2020-10-27T04-03-55Z
volumes:
- data4-1:/data1
- data4-2:/data2
ports:
- "9004:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
data1-1:
data1-2:
data2-1:
data2-2:
data3-1:
data3-2:
data4-1:
data4-2:
Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
2 启动minio容器
Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
$ docker-compose up -d
Found orphan containers (minio_nginx_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing minio_minio1_1
Recreating f417a19c3491_minio_minio1_1 ... done
Recreating minio_minio3_1 ... done
Recreating minio_minio2_1 ... done
Recreating minio_minio4_1 ... done
Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
3 查看容器状态
Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24d62d1addba minio/minio:RELEASE.2020-10-27T04-03-55Z "/usr/bin/docker-ent鈥? 9 seconds ago Up 7 seconds (health: starting) 0.0.0.0:9004->9000/tcp minio_minio4_1
8a47cc4ce634 minio/minio:RELEASE.2020-10-27T04-03-55Z "/usr/bin/docker-ent鈥? 9 seconds ago Up 7 seconds (health: starting) 0.0.0.0:9002->9000/tcp minio_minio2_1
631afe2b9c3d minio/minio:RELEASE.2020-10-27T04-03-55Z "/usr/bin/docker-ent鈥? 9 seconds ago Up 7 seconds (health: starting) 0.0.0.0:9003->9000/tcp minio_minio3_1
a32e5216c29b minio/minio:RELEASE.2020-10-27T04-03-55Z "/usr/bin/docker-ent鈥? 9 seconds ago Up 7 seconds (health: starting) 0.0.0.0:9001->9000/tcp minio_minio1_1
Administrator@DESKTOP-CU3KA28 MINGW64 ~/Desktop/minio
在浏览器输入登录地址:http://127.0.0.1:9000/minio/login
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
创建桶,桶名为group1,在桶下面创建文件夹20200807,上传文件到该文件夹。
上传一张图片到桶:
4.验证数据损坏恢复
4.1验证方案
数据块,指文件分割成N块后分别存储在不同硬盘的数据,在硬盘内的文件名为part.1,part.2…
- 4台服务8(N)个数据块,根据纠删码的原理,只要保证至少4(N/2)个硬盘的数据完整,文件就可以正常访问,且可以对损坏数据块进行恢复。
- 分别上传2个文件,一个文件用于验证损坏超过4个硬盘数据时文件能否正常访问,另一个文件用于验证坏不超过4个硬盘时,是否可以进行文件恢复。
4.2 验证损坏超过N/2个数据块
-
上传文件test.jpg。
-
进入docker容器中,删除5个( 5 > N/2 )数据块
此处删除容器2两个数据块,容器4两个数据块,容器3一个数据块
-
先删除容器2上面的data1、data2数据块
# 进入容器2
C:\Users\Administrator>docker exec -it minio_minio2_1 /bin/sh
/ # ls
CREDITS data data2 etc lib mnt proc run srv tmp var
bin data1 dev home media opt root sbin sys usr
/ #
# 进入data1/group1/20200807/目录,删除数据块1上面的图片
/ # cd data1/group1/20200807/
/data1/group1/20200807 # ls
Sketchpad.png cfg.json test.jpg
/data1/group1/20200807 #
/data1/group1/20200807 # ls test.jpg/
d83cf1b6-be3a-4f7c-8533-1a31ff1e80d8 xl.meta
/data1/group1/20200807 # ls test.jpg/d83cf1b6-be3a-4f7c-8533-1a31ff1e80d8/
part.1
/data1/group1/20200807 #
/data1/group1/20200807 # rm -rf test.jpg/
/data1/group1/20200807 # ls
Sketchpad.png cfg.json
/data1/group1/20200807 #
# 进入data2/group1/20200807/目录,删除数据块2上面的图片
/ # cd data2/group1/20200807/
/data2/group1/20200807 # ls
Sketchpad.png cfg.json test.jpg
/data2/group1/20200807 # rm -rf test.jpg/
/data2/group1/20200807 #
此时正常数据块6块,损坏数据块2块(上面删除的两块数据块),此时在web客户端查看刚才上传的test.jpg文件,是可以正常显示的。
- 依此类推,删除容器4所有的数据块,此时正常数据块4块,损坏数据块4块,再次访问test.jpg文件,仍然可以正常显示。
C:\Users\Administrator>docker exec -it minio_minio4_1 /bin/sh
/ # ls
CREDITS data data2 etc lib mnt proc run srv tmp var
bin data1 dev home media opt root sbin sys usr
/ # rm -rf data1/
.minio.sys/ group1/
/ # rm -rf data1/group1/20200807/
Sketchpad.png/ cfg.json/ test.jpg/
/ # rm -rf data1/group1/20200807/test.jpg/
/ # rm -rf data2/group1/20200807/test.jpg/
/ # exit
C:\Users\Administrator>
- 再次删除9003节点的data1后,此时正常数据块3块,损坏数据块5块,再次访问test.jpg,发现文件已经不见了,说明当损坏超过N/2个数据块时,文件就无法访问。
C:\Users\Administrator>docker exec -it minio_minio3_1 /bin/sh
/ # ls
CREDITS data data2 etc lib mnt proc run srv tmp var
bin data1 dev home media opt root sbin sys usr
/ # rm -rf data1/group1/20200807/test.jpg/
/ # rm -rf data1/group2/20200807/test.jpg/
/ # exit
C:\Users\Administrator>
验证损坏不超过N/2个数据块,数据恢复
- 上传Sketchpad.png文件
- 按照上面的的步骤,删除4个数据块(容器3和容器4上面的数据块)
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio3_1 /bin/sh
/ # rm /data1/group1/20200807/
cfg.json/ test.jpg/
/ # rm /data1/group1/20200807/cfg.json/
rm: '/data1/group1/20200807/cfg.json' is a directory
/ # rm -rf /data1/group1/20200807/cfg.json/
/ # rm -rf /data2/group1/20200807/cfg.json/
/ # exit
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio4_1 /bin/sh
/ # rm -rf /data1/group1/20200807/cfg.json/
/ # rm -rf /data2/group1/20200807/cfg.json/
/ #
- 此时正常的数据块4块,损坏的数据块4块。
- 通过minio的heal命令,对损坏的文件进行恢复,同样基于容器进行操作,此处需要运行新的容器minio/mc,以下方案为恢复整个服务器的数据,也可以按bucket或者object进行恢复,此处不作演示,可自行查询官方文档
# 拉取mc的镜像
PS C:\Users\Administrator\Desktop\minio> docker pull minio/mc
# 运行mc容器
docker run -it --entrypoint=/bin/sh minio/mc
PS C:\Users\Administrator\Desktop\minio> docker run -it --entrypoint=/bin/sh minio/mc
# 设置mc客户端参数,使其可以连接到minio集群(其中:172.16.200.23是docker宿主机的ip地址)
/ # mc config host add minio2 http://172.16.200.23:9000 minio minio123 --api s3v4
Added `minio2` successfully.
/ # mc policy set public minio2/group1
Access permission for `minio2/group1` is set to `public`
/ # mc admin heal -r minio2
◓ group1/20200807/cfg.json
1/1 objects; 653 B in 1s
┌────────┬───┬─────────────────────┐
│ Green │ 3 │ 100.0% ████████████ │
│ Yellow │ 0 │ 0.0% │
│ Red │ 0 │ 0.0% │
│ Grey │ 0 │ 0.0% │
└────────┴───┴─────────────────────┘
/ #
# 重新进入9001容器的data1/group1文件夹中,发现test2.jpg文件夹重新出现了,说明数据恢复成功。在最新版本的minio中,数据恢复是自动发现和触发修复的。
进度条显示,本次成功恢复了一个group1桶下面的20200807/cfg.json对象,恢复进度为100%。恢复后的对象大小为653 Byte。
查看集群信息
查看桶和桶下面的目录
/ # mc ls minio2
[2020-10-28 03:58:55 UTC] 0B group1/
/ #
/ # mc tree minio2
minio2
└─ group1
└─ 20200807
/ #
/ # mc admin info minio2
● minio2:9000
Uptime: 1 hour
Version: 2020-10-27T04:03:55Z
Network: 4/4 OK
Drives: 2/2 OK
● minio3:9000
Uptime: 1 hour
Version: 2020-10-27T04:03:55Z
Network: 4/4 OK
Drives: 2/2 OK
● minio4:9000
Uptime: 1 hour
Version: 2020-10-27T04:03:55Z
Network: 4/4 OK
Drives: 2/2 OK
● minio1:9000
Uptime: 1 hour
Version: 2020-10-27T04:03:55Z
Network: 4/4 OK
Drives: 2/2 OK
27 KiB Used, 1 Bucket, 2 Objects
8 drives online, 0 drives offline
/ #
大文件测试
生成大文件
/ # time dd if=/dev/zero of=/tmp/file bs=32M count=1024
1024+0 records in
1024+0 records out
real 0m 23.23s
user 0m 0.01s
sys 0m 23.14s
/ #
32GB数据上传测试
/bin/sh: ll: not found
/ # ls /tmp/file -lh
-rw-r--r-- 1 root root 32.0G Oct 28 09:40 /tmp/file
/ #
/ # time mc cp -r /tmp/file minio2/group1/
删除大文件:
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio3_1 /bin/sh
/ # rm -rf data1/group1/file
/ # rm -rf data2/group1/file/
/ # exit
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio4_1 /bin/sh
/ #
/ # ls data1/group1/
20200807 file
/ # ls data1/group1/file/
1003d24c-fcbe-4829-8804-2e52b7efe14d xl.meta
/ # rm -rf data1/group1/
20200807/ file/
/ # rm -rf data1/group1/file
/ # rm -rf data2/group1/file
/ #
恢复大文件:
/ # mc admin heal -r minio2
进入容器查看大文件恢复情况:
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio3_1 /bin/sh
/ # ls /data1/group1/ -lh
total 8K
drwxr-xr-x 4 root root 4.0K Oct 28 09:28 20200807
drwxr-xr-x 3 root root 4.0K Oct 28 11:11 file
/ #
/ # ls /data2/group1/ -lh
total 8K
drwxr-xr-x 4 root root 4.0K Oct 28 09:28 20200807
drwxr-xr-x 3 root root 4.0K Oct 28 11:11 file
/ #
/ # exit
C:\Users\Administrator\Desktop\minio>docker exec -it minio_minio4_1 /bin/sh
/ # ls /data1/group1/ -lh
total 8K
drwxr-xr-x 4 root root 4.0K Oct 28 09:28 20200807
drwxr-xr-x 3 root root 4.0K Oct 28 11:11 file
/ # ls /data2/group1/ -lh
total 8K
drwxr-xr-x 4 root root 4.0K Oct 28 09:28 20200807
drwxr-xr-x 3 root root 4.0K Oct 28 11:11 file
/ #
对比可见minio的数据恢复速度比较快:
32GB数据恢复时间是8min。32GB数据写入时间是32min。
minio是gluster团队把glusterfs卖给红帽后,新创建的项目。全部用golang实现,由gluster创始人主导minio的开发工作。
优点:
- 读写速度极快。MinIO号称是世界上速度最快的对象存储服务器。在标准硬件上,minio对象存储的读/写速度最高可以达到183 GB/s和171 GB/s。
minio有以下特点:
-
运维简单
-
简洁易用,部署方便
-
原生支持k8s docker
-
支持纠删码,支持
bit rot
位保护(磁盘比特位衰减) -
支持scal out
-
故障可以精确到对象,单个对象的恢复不影响其他对象
局限性:
-
minio设计目标是amazon s3兼容的对象存储,目前版本不支持fuse mount,需要借助s3-fuse第三方工具挂载到系统目录。
-
文档相对于ceph较少
-
搭建集群后,不允许扩容。MinIO一旦集群搭建成功后,就不可以更改集群节点数。因为存在在MinIO的对象到底存储在哪个Set,是通过名字做Hash去找的,一旦节点数变了落点就错乱了。
-
大集群最大节点数为32。MinIO实现了一个峰值锁叫DSync。它在节点数量少时,性能非常高;但节点数量过多时,性能就下降了。功能实现的最大节点就是32,所以导致MinIO单个集群的最大节点数也是32。官方回复是,他们十年做GlusterFS的经验看,一个超大的集群是难以维护的,尤其是宕机之后的恢复时间也特别长,所以他们在做MinIO的时候一个核心设计理念就是存储组件要变得简单可控,易于维护。进群容量问题,可以通过应用层来解决。
扩容方案:
1、可同时向多个集群写入
2、当集群容量达到阈值,从写集群中剔除,变成只读
3、读取的时候,根据编码到文件名上的集群信息,从而路由到正确的集群。
MinIO本身提供一个叫联合模式的方式来组建集群,但是要额外引入其他依赖。可以考虑在LB层根据其请求里面的一些header信息做流量转发。
当配置多个集群的时候,可以先从配置中获取可用的集群,再从LB上根据请求的header信息,可控制向哪个集群写。当某个集群的容量达到阈值时,可以从配置中剔除该集群,把他变成只读集群。读取的时候把集群ID或信息码编码到文件名上去,这样可以通过解析文件名就能获取到对应的集群。
压测工具:
采用 cosBench 工具做压测,cosBench是专门对对象存储做压测的工具。
参考文献:
minio集群搭建:
https://blog.csdn.net/kea_iv/article/details/108061337
minio中文文档:
http://docs.minio.org.cn/docs/master/minio-erasure-code-quickstart-guide
minio英文文档:
https://docs.minio.io/docs/minio-admin-complete-guide.html