前言
- 官网地址:安装和部署 MinIO — 适用于 Linux 的 MinIO 对象存储
- MinIO是一种软件定义的高性能分布式对象存储服务器。 您可以在消费级或企业级硬件上运行 MinIO 以及各种 操作系统和体系结构。
- 所有 MinIO 部署都实现纠删码后端。 您可以使用以下拓扑之一部署 MinIO:
- 单节点单驱动器(SNSD 或“独立”)
本地开发和评估,可靠性无/有限
从 github.com/minio/minio… 开始,MinIO 为单节点单驱动器部署实现了零奇偶校验纠删码后端。 此功能允许访问与纠删码相关的功能,而无需多个驱动器。
集群部署
部署前的准备工作
- 准备服务器环境
- 采用两台服务器,分别挂载两块硬盘
| 机器资源 | 挂载路径1 | 挂载路径2 |
|---|---|---|
| 192.168.1.100 | /data/data1 | /data/data2 |
| 192.168.1.101 | /data/data1 | /data/data2 |
- 创建minio运行时配置数据存储文件夹
mkdir -p /etc/minio
- 创建minio软件安装路径
mkdir -p /opt/minio
- 在 /opt/minio 目录下载minio软件
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
- 下载成功后给minio增加执行权限
chmod +x minio
- 创建minio启动脚本
vim /opt/minio/run.sh
- 写入的脚本内容
#!/bin/bash
# 原始脚本
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minio123456
/opt/minio/minio server --config-dir /etc/minio \
--address ":9000" --console-address ":9001" \
http://192.168.1.100:9000/data/data{1...2} \
http://192.168.1.101:9000/data/data{1...2} > minio_server.log
- 给运行脚本增加可执行权限
chmod +x /opt/minio/run.sh
- 编写服务脚本
vim /usr/lib/systemd/system/minio.service
- 编写服务脚本内容
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
- 增加service的可执行权限
chmod +x /usr/lib/systemd/system/minio.service
-
如图
-
启动minio
# 重新加载
systemctl daemon-reload
# 启动minio
systemctl start minio.service
# 设置开机启动
systemctl enable minio.service
# 查看运行状态
systemctl status minio.service
- 启动成功后,如图:
扩容
准备两台同样配置的服务器,并且每台挂载两块同样大小的硬盘
| 机器资源 | 挂载路径1 | 挂载路径2 | 类型 |
|---|---|---|---|
| 192.168.1.100 | /data/data1 | /data/data2 | 原始集群 |
| 192.168.1.101 | /data/data1 | /data/data2 | 原始集群 |
| 192.168.1.102 | /data/data1 | /data/data2 | 扩容集群 |
| 192.168.1.103 | /data/data1 | /data/data2 | 扩容集群 |
操作
- 修改run.sh 脚本,配置在原来的两台服务器和增加的服务器
- MinIO支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:
#!/bin/bash
# 扩容脚本
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minio123456
/opt/minio/minio server --config-dir /etc/minio \
--address ":9000" --console-address ":9001" \
http://192.168.1.100:9000/data/data{1...2} \
http://192.168.1.101:9000/data/data{1...2} \
http://192.168.1.102:9000/data/data{1...2} \
http://192.168.1.103:9000/data/data{1...2} > minio_server.log
注意:
- MinIO 支持通过添加新的服务器池来扩展现有的分布式部署。 每个池扩展群集的总可用存储容量。
- 官网链接:扩展分布式 MinIO 部署 — 适用于 Linux 的 MinIO 对象存储
- 注意:原始集群2个节点2块磁盘,则在扩容时必须增加2个节点2块磁盘或整倍数,以致于系统维持相同的数据冗余SLA来降低扩容的复杂性
- 当MinIO集群扩容后,并不会对全部的4个节点进行完全的数据均衡,而是将原本的2个节点视作一个区域,新加入的2节点视作另一区域
- 当有新对象上传时,集群将依据各区域的可用空间比例确定存放区域,在各区域内仍旧通过哈希算法确定对应的纠删组进行最终的存放
- 此外,集群进行一次对等扩容后,还可依据扩容规则继续进行对等扩容,但出于安全性考虑,集群的最大节点数一般不得超过32个,超过了反而会增加集权维护强一致性的负担
负载均衡
安装nginx
- nginx 安装在另一台服务器 192.168.1.105
安装前的准备工作
- 安装 编译工具和库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- 安装PCRE让Nginx支持Rewrite功能
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
- 解压安装包
tar -zxvf pcre-8.35.tar.gz
- 进入安装包目录
cd pcre-8.35
- 编译安装
./configure
make && make install
此问题,开启firewall 9000 端口即可
安装 Nginx
- 下载ngnix安装包
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.20.2.tar.gz
- 解压安装包
tar -zxvf nginx-1.20.2.tar.gz
- 进入安装包目录
cd nginx-1.20.2
- 编译安装
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make && make install
修改nginx配置文件 [/usr/local/nginx/conf/nginx.conf]
worker_processes auto;
events {
worker_connections 1024;
}
error_log logs/error.log;
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 10M;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"'
'$request_time $upstream_response_time';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
upstream minio-server {
server 192.168.1.100:9000 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.1.101:9000 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.1.102:9000 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.1.103:9000 weight=25 max_fails=2 fail_timeout=30s;
}
upstream minio-console {
ip_hash;
server 192.168.1.100:9001 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.1.101:9001 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.1.102:9001 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.1.103:9001 weight=25 max_fails=2 fail_timeout=30s;
}
server {
listen 9000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# 配置成上传文件不限制大小
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_pass http://minio-server;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
expires 0;
# 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
# 是否开启proxy忽略客户端中断
proxy_ignore_client_abort on;
}
}
server {
listen 9001;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# 配置成上传文件不限制大小
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_pass http://minio-console;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
expires 0;
# 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
# 是否开启proxy忽略客户端中断
proxy_ignore_client_abort on;
}
}
}
-
nginx配置没有支持webscoket,使用控制台时无法访问桶
- 需要添加以下配置
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; -
使用API上传文件时,response响应nginx403
- 需要将proxy_set_header Host $host修改为以下配置
proxy_set_header Host $http_host
启动nginx
cd /usr/local/nginx
- 指定配置文件,启动方式
./sbin/nginx -c ./conf/nginx.conf
- 修改配置文件,重新加载
./sbin/nginx -c ./conf/nginx.conf -s reload
演示环境:http:192.68.1.105:9001
验证数据损坏恢复
验证方案
数据块,指文件分割成N块后分别存储在不同硬盘的数据,在硬盘内的文件名为part.1,part.2…
- 4台服务8(N)个数据块,根据纠删码的原理,只要保证至少4(N/2)个硬盘的数据完整,文件就可以正常访问,且可以对损坏数据块进行恢复。
- 分别上传2个文件,一个文件用于验证损坏超过4个硬盘数据时文件能否正常访问,另一个文件用于验证坏不超过4个硬盘时,是否可以进行文件恢复。
- 验证损坏超过N/2个数据块
- 上传文件test.jpg。
- 进入docker容器中,删除5个( 5 > N/2 )数据块
- 此处删除容器2两个数据块,容器4两个数据块,容器3一个数据块
此处删除容器2两个数据块,容器4两个数据块,容器3一个数据块