赞
踩
三台服务器,每台服务器挂一块磁盘,每台挂一块500g的磁盘,分成五个区,没个区100G,挂到同的数据目录
minio的数据和元数据都直接写在linux文件系统上,不关注是linux文件系统类型,只需配置好minio数据目录即可
172.16.11.250 test001
172.16.11.21 test002
172.16.11.206 test003
组件 | 版本 | 备注 |
---|---|---|
操作系统 | CentOS Linux release 7.9.2009 (Core) | |
minio | RELEASE.2022-02-18T01-50-10Z | |
Prometheus | prom/prometheus:v2.7.2 | 容器镜像版本 |
每个区一个分区,挂载到一个目录,每个目录是一个minio的存储单元
DEVICE=/dev/vdc
parted -s $DEVICE mklabel gpt
parted -s $DEVICE mkpart primary 1 100G
parted -s $DEVICE mkpart primary 100G 200G
parted -s $DEVICE mkpart primary 200G 300G
parted -s $DEVICE mkpart primary 300G 400G
parted -s $DEVICE mkpart primary 400G 500G
for i in {1..5};do mkfs.ext4 $DEVICE$i;done
for i in {1..5};do mkdir -p /data/minio/data$i;done
for i in {1..5};do mount $DEVICE$i /data/minio/data$i;done
mkdir -p /data/minio/{bin,scripts,etc}
wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /data/minio/bin/minio
chmod +x /data/minio/bin/minio
ln -s /data/minio/bin/minio /usr/local/bin/minio
cat > /data/minio/scripts/run.sh << EOF #!/bin/env bash export MINIO_ROOT_USER=Minio export MINIO_ROOT_PASSWORD=Minio123456 minio server --config-dir /data/minio/etc \ --console-address ":9001" \ http://test00{1...3}/data/minio/data{1...5} EOF chmod +x /data/minio/scripts/run.sh cat > /usr/lib/systemd/system/minio.service << EOF [Unit] Description=Minio service Documentation=https://docs.minio.io/ [Service] WorkingDirectory=/data/minio/ ExecStart=/data/minio/scripts/run.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF
systemctl daemon-reload
systemctl start minio
systemctl enable minio
systemctl status minio.service
此时可以通过三台服务器中的任意一台访问console http://ceph01:9001, 密码为上面启动脚本中设置的密码
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /data/minio/bin/mc
chmod +x /data/minio/bin/mc
ln -s /data/minio/bin/mc /usr/local/bin/mc
mc alias set myminio http://172.16.11.250:9000 Minio Minio123456
mc admin prometheus generate myminio
scrape_configs:
- job_name: minio-job
bearer_token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ3OTkxOTgzMjMsImlzcyI6InByb21ldGhldXMiLCJzdWIiOiJNaW5pbyJ9.sFSa4d9O7xFVBzQSkAjMHv2Q0WGBxXdm7vtZ-D6ay1c7BZjS_mp3XwgJrJHtpwkDdvcza2lhmachV9iBRUVb5g
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: ['172.16.11.250:9000']
cat /data/minio/scripts/run.sh
#!/bin/env bash
# 新增这行
export MINIO_PROMETHEUS_URL=http://172.16.10.10:9092
export MINIO_ROOT_USER=Minio
export MINIO_ROOT_PASSWORD=Minio123456
minio server --config-dir /data/minio/etc \
--console-address ":9001" \
http://test00{1...3}/data/minio/data{1...5}
所有节点都需修改,修改完重启
systemctl restart minio
使用mc重启
mc admin service restart myminio
重启完之后即可看到dashboard http://172.16.11.250:9001/tools/dashboard
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyM7L0ex-1646114726977)(/img/posts/Minio集群部署/mino_dashboard.png)]
元数据组织形式如下下图 2
上传一个txt文件
echo "helloworld" > test.txt
上传上去之后看下本地目录文件结构如图, 15个data目录下各有一份数据
-- data5
`-- test002
`-- test.txt
`-- xl.meta
解析每台的元数据看看,从上面的元数据组织形式,我们能得知数据是存在最后面,所以我们看最后几行就好,通过下面最后几行我们能粗略的组合出我们写入的 helloworld
test001
[root@test001 minio]# for i in {1..5};do hexdump -Cv /data/minio/data$i/test002/test.txt/xl.meta|tail -n 2;done
00000520 3a 18 1c 65 95 4a 65 |:..e.Je|
00000527
00000520 2c 18 cc 94 98 cf 6f |,.....o|
00000527
00000520 c6 c5 7a de bc 54 72 |..z..Tr|
00000527
00000520 92 92 aa 9d 12 dc 0a |.......|
00000527
00000520 a9 6c 34 dc 03 65 13 |.l4..e.|
00000527
00000378
test002
[root@test002 minio]# for i in {1..5};do hexdump -Cv /data/minio/data$i/test002/test.txt/xl.meta|tail -n 2;done
00000520 66 a7 75 97 da d3 6c |f.u...l| -- 数据 l
00000527
00000520 2e 3e f8 23 24 88 77 |.>.#$.w| -- 数据 w
00000527
00000520 66 a7 75 97 da d3 6c |f.u...l| -- 数据 l
00000527
00000520 15 d3 29 3c d2 cc bf |..)<...| -- 校验
00000527
00000520 0b ae 7e 37 7e 6a 7f |..~7~j.| -- 校验
00000527
test003
[root@test003 minio]# for i in {1..5};do hexdump -Cv /data/minio/data$i/test002/test.txt/xl.meta|tail -n 2;done
00000520 66 a7 75 97 da d3 6c |f.u...l| -- 数据 l
00000527
00000520 2c 18 cc 94 98 cf 6f |,.....o| -- 数据 o
00000527
00000520 05 fe f5 e8 9c fc 64 |......d| -- 数据 d
00000527
00000520 64 c6 a6 e7 d0 0c 69 |d.....i| -- 校验 -- 因为helloworld中没有i
00000527
00000520 64 69 e4 50 ee e4 68 |di.P..h| -- 数据
00000527
单词太少分布不均,解析的参考意义不大,单词多的话不好解析,这里得不出比较有效的结论
通过元数据结构,再看下
00000070 63 b2 53 05 9c a6 45 63 41 6c 67 6f 01 a3 45 63 |c.S...EcAlgo..Ec|
00000080 4d 0b a3 45 63 4e 04 a7 45 63 42 53 69 7a 65 d2 |M..EcN..EcBSize.|
ErasureM int `json:"EcM" msg:"EcM"` // Erasure data blocks
ErasureN int `json:"EcN" msg:"EcN"` // Erasure parity blocks
EcM EcN 为数据块和校验块数量,通过ascii表可知 EcM EcN后面0b 04转化成10进制正好为 11 4
我们还可以解析出块的序号
for i in {1..5};do hexdump -Cv /data/minio/data$i/test002/test/xl.meta|grep EcIndex;done
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 05 a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 08 a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 0b a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 0e a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 02 a6 45 63 |.....EcIndex..Ec|
for i in {1..5};do hexdump -Cv /data/minio/data$i/test002/test/xl.meta|grep EcIndex;done
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 06 a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 09 a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 0c a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 0f a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 03 a6 45 63 |.....EcIndex..Ec|
for i in {1..5};do hexdump -Cv /data/minio/data$i/test002/test/xl.meta|grep EcIndex;done
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 07 a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 0a a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 0d a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 01 a6 45 63 |.....EcIndex..Ec|
00000090 00 10 00 00 a7 45 63 49 6e 64 65 78 04 a6 45 63 |.....EcIndex..Ec|
倒数第四列 05 08 0b 0e 02 06 09 0c 0f 03 07 0a 0d 01 04 从01-0f就可以把纠删码块的序列排出来,启用版本管理的话元数据是多条在同一个文件的,会有多个EcIndex
尝试从上面数据解析道数据块和校验块,由于单词太少分布不均,解析的参考意义不大,单词多的话不好解析,先不走这条路
小文件元数据和数据存储在一起,通过纠删码算法打散,每个数据目录都存一份
dd一个大文件
dd if=/dev/zero of=testbigfile bs=4m count=250
上传到minio之后查看磁盘数据
|-- data5
| `-- test002
| |-- testbigfile
| | |-- 713daa2d-4466-44bc-bb94-b55f30f361f2
| | | `-- part.1
# 15个块都是91M
du -sh data5/test002/testbigfile/713daa2d-4466-44bc-bb94-b55f30f361f2/
91M data5/test002/testbigfile/713daa2d-4466-44bc-bb94-b55f30f361f2/
15 * 91 / 1000 = 0.73
这里的纠删码算法空间利用率为0.73左右,应该是4/15 4个校验块,11个数据块,符合默认的EC4
3
大文件元数据与数据分开存储,数据分布通过纠删码块数量分配到各个数据盘,每块盘一份
新加server pool需要修改所有minio服务器的配置,并重启服务,只有当所有服务重启完成时minio开始提供服务
Recover after Hardware Failure
服务无需停机
推荐配置还蛮高的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6xGRmK1-1646114726978)(https://blog.min.io/content/images/2021/09/serverpools.gif)]
一个server pool就是一个纠删码集合,一个对象只会被分布到一个server pool, 多个server pool的情况下对象会分布到使用最少的一个
落盘分为两步 4:
https://blog.min.io/server-pools-streamline-storage-operations/ ↩︎ ↩︎
https://blog.min.io/minio-versioning-metadata-deep-dive/ ↩︎
https://docs.min.io/minio/baremetal/concepts/erasure-coding.html#erasure-sets ↩︎
https://github.com/minio/minio/blob/master/docs/distributed/DESIGN.md ↩︎
https://github.com/minio/minio/blob/890e526bdee894e303c0a4252d8625ef75715547/cmd/erasure-sets.go#L804 ↩︎
https://github.com/minio/minio/blob/890e526bdee894e303c0a4252d8625ef75715547/cmd/erasure-sets.go#L793 ↩︎
https://github.com/minio/minio/blob/890e526bdee894e303c0a4252d8625ef75715547/cmd/erasure-object.go#L730 ↩︎
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。