
文章目录
分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。

一、分布式存储可靠性常用方法
1. 概述
分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。
2. 冗余
冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本 备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如 Hadoop 的文件系统(3个副本),Redis 的集群,MySQL 的主备模式等。
3. 校验
校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如 TCP 协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的 RAID技术,纠删码(Erasure Code)技术等。MinIO 采用的就是纠删码技术。
二、分布式Minio优势
2.1. 数据保护
分布式Minio采用 纠删码来防范多个节点宕机和位衰减 bit rot 。
分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。
2.2. 高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。
2.3.一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型
三、运行分布式Minio
3.1. 启动方案简述
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。
为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境
变量。新版本使用MINIO_ROOT_USER&MINIO_ROOT_PASSWORD。 - 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
- 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
- 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
- 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
3.2. 案例说明
8个节点,每节点1块盘
启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令:
data MINIO_ROOT_USER=admin
data MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/root
${MINIO_HOME}/minio server --address ":9000" --console-address ":50000"
http://192.168.92.101:9000/mnt/data1 http://192.168.92.102:9000/mnt/data2
http://192.168.92.103:9000/mnt/data3 http://192.168.92.104:9000/mnt/data4
http://192.168.92.105:9000/mnt/data5 http://192.168.92.106:9000/mnt/data6

4节点,每节点4块盘
启动分布式Minio实例,4节点,每节点4块盘,需要在4个节点上都运行下面的命令
data MINIO_ROOT_USER=admin
data MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/root
${MINIO_HOME}/minio server --address ":9000" --console-address ":50000"
http://192.168.92.101:9000/mnt/data1 http://192.168.92.101:9000/mnt/data2
http://192.168.92.101:9000/mnt/data3 http://192.168.92.101:9000/mnt/data4
http://192.168.92.102:9000/mnt/data1 http://192.168.92.102:9000/mnt/data2
http://192.168.92.102:9000/mnt/data3 http://192.168.92.102:9000/mnt/data4
http://192.168.92.103:9000/mnt/data1 http://192.168.92.103:9000/mnt/data2
http://192.168.92.103:9000/mnt/data3 http://192.168.92.103:9000/mnt/data4
http://192.168.92.104:9000/mnt/data1 http://192.168.92.104:9000/mnt/data2

3.3. 制作分布式启动脚本
脚本演示:4个节点,每个节点挂载4块磁盘。在实际的服务器上依次执行以下命令即可
案例演示:伪分布式模式
data MINIO_ROOT_USER=admin
data MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/root
nohup ${MINIO_HOME}/minio server --address ":9000" --console-address ":50000"
http://192.168.92.101:9000/mnt/data1 http://192.168.92.101:9000/mnt/data2
http://192.168.92.101:9000/mnt/data3 http://192.168.92.101:9000/mnt/data4
http://192.168.92.102:9000/mnt/data1 http://192.168.92.102:9000/mnt/data2
http://192.168.92.102:9000/mnt/data3 http://192.168.92.102:9000/mnt/data4
http://192.168.92.103:9000/mnt/data1 http://192.168.92.103:9000/mnt/data2
http://192.168.92.103:9000/mnt/data3 http://192.168.92.103:9000/mnt/data4
http://192.168.92.104:9000/mnt/data1 http://192.168.92.104:9000/mnt/data2
http://192.168.92.104:9000/mnt/data3 http://192.168.92.104:9000/mnt/data4 > ${MINIO_HOME}/minio-9000.log 2>&1 &
3.4. 制作伪分布式启动脚本
案例演示:伪分布式模式案例
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/root
MINIO_HOST=192.168.92.104
for i in {01..04}; do
nohup ${MINIO_HOME}/minio server --address ":90${i}" --console-address ":500${i}" http://${MINIO_HOST}:9001/mnt/data01 http://${MINIO_HOST}:9002/mnt/data02 http://${MINIO_HOST}:9003/mnt/data03 http://${MINIO_HOST}:9004/mnt/data04 > ${MINIO_HOME}/minio-90${i}.log 2>&1 &
done

3.5. 登录minio




四、分布式Minio负载均衡
4.1. nginx安装
4.2. 配置nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream minio {
server 192.168.92.104:9001;
server 192.168.92.104:9002;
server 192.168.92.104:9003;
server 192.168.92.104:9004;
}
upstream console {
ip_hash;
server 192.168.92.104:50001;
server 192.168.92.104:50002;
server 192.168.92.104:50003;
server 192.168.92.104:50004;
}
server {
listen 9000;
server_name localhost;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio;
}
}
server {
listen 50000;
server_name localhost;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;`在这里插入代码片`
proxy_pass http://console;
}
}
}
4.3. 停止nginx服务
4.4. 重新启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
4.5. 登录monio
真实后端控制台端口:50001~5004,
现在访问50000自动负载到50001~5004的任意一个端口
http://192.168.92.104:50000/
账号密码:admin/12345678

