
minIO集群etcd部署和联邦扩容+nginx负载均衡实践
minIO集群etcd部署和联邦扩容+nginx负载均衡实践
minIO集群etcd部署和联邦扩容+nginx负载均衡实践
1 任务背景
公司有一个OA系统,其中有一个文件子系统模块,用于处理用户办公文件,主要是各种office word、excel、ppt、wps等日常办公文件,这个子系统还承载了在线编辑文档的存取,由于在线编辑需要保存大量历史版本的过程文件,这使得文件系统需要保存的文件大小快速增长,年预估达100T级别,如果系统升级为面向企业的平台,那么存储需求就更大了,PB级别的存储量是很正常的事情。
在面对如此庞大的存储需求,我们通常有两种方案可以选择,一是使用阿里云、腾讯云、华为云等对象存储服务,二是自建存储服务器。第一种方案是最省事也是最容易实现的方案,但数据托管在别人的服务器上,始终觉得心里不踏实,而且费用也是非常可观的。第二种方案虽然要求技术支持高,部署过程复杂,但数据始终是存储在自己的机房里,所谓“我命由我不由天”,命运掌握在自己手里。
2 技术选型
经过一番调研,我决定选用minIO作为文件存储系统。MinIO 是一个高性能的分布式对象存储系统,旨在提供与 Amazon S3 API 兼容的存储服务。它被设计为简单、可扩展且高度可靠,适用于大规模的数据存储和处理需求。而管理minIO分布式系统的工具,etcd是不二之选,天生与minIO无缝结合,打造高可用大规模分布式文件系统的最佳组合。Etcd 是一个分布式键值存储系统,专门用于分布式系统中存储配置信息、元数据和其他关键数据,其起到了minIO服务的管理作用,有点类似于微服务框架中的服务管理中心Nacos,提供了minIO服务的注册与发现、配置管理、服务选举等功能。
关键词:etcdminio联邦扩容分布式文件系统
3 拓扑规划
这次实践是作为生产环境的一次单元测试,我不可能使用那么多真机来试验,所以使用虚拟机进行模拟,本次实验使用vmware station安装的ubuntu,总共7个服务器。
ip地址 | 角色 | 磁盘挂载 |
---|---|---|
192.168.0.102 | etcd服务 | (无需挂载额外磁盘) |
192.168.0.103 | etcd服务 | (无需挂载额外磁盘) |
192.168.0.104 | etcd服务 | (无需挂载额外磁盘) |
192.168.0.106 | minIO服务 | /home/user/minio/data1, /home/user/minio/data2 |
192.168.0.107 | minIO服务 | /home/user/minio/data1, /home/user/minio/data2 |
192.168.0.109 | minIO服务 | /home/user/minio/data1, /home/user/minio/data2 |
192.168.0.110 | minIO服务 | /home/user/minio/data1, /home/user/minio/data2 |
其中
- 192.168.0.102,192.168.0.103,192.168.0.104作为etcd服务集群。
- 192.168.0.106,192.168.0.107作为第一个minIO服务集群,分别挂载两个额外的独立磁盘,为了验证分布式和扩展特性,每个磁盘大小只安排了1G,特意很容易就让磁盘写满。
- 192.168.0.109,192.168.0.110作为第二个minIO服务集群。
具于如何为虚拟机划拨和挂载磁盘,后续文章将给出详细的操作步骤。
4 实施步骤
4.1 部署etcd服务集群
在每台etcd服务器上,进行如下相同的操作:
- 创建etcd工作目录
mkdir -p /home/user/etcd/data
mkdir -p /home/user/etcd/bin
mkdir -p /home/user/etcd/conf
- 下载etcd程序
cd /home/user/etcd
wget https://github.com/etcd-io/etcd/releases/download/v3.5.14/etcd-v3.5.14-linux-amd64.tar.gz
tar -xvf etcd-v3.5.14-linux-amd64.tar.gz
mv etcd-v3.5.14-linux-amd64/etcd bin/
mv etcd-v3.5.14-linux-amd64/etcdctl bin/
mv etcd-v3.5.14-linux-amd64/etcdutl bin/
rm -rf etcd-v3.5.14-linux-amd64
rm -rf etcd-v3.5.14-linux-amd64.tar.gz
chmod +x bin/etcd
chmod +x bin/etcdctl
chmod +x bin/etcdutl
- 配置
vim conf/etcd.conf
192.168.0.102的etcd配置:
name: etcd1
data-dir: /home/user/etcd/data
initial-advertise-peer-urls: http://192.168.0.102:2380
listen-peer-urls: http://0.0.0.0:2380
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://192.168.0.102:2379
initial-cluster-token: etcd-cluster-token-for-minio-zxht
initial-cluster: etcd1=http://192.168.0.102:2380,etcd2=http://192.168.0.103:2380,etcd3=http://192.168.0.105:2380
initial-cluster-state: new
192.168.0.103的etcd配置:
name: etcd2
data-dir: /home/user/etcd/data
initial-advertise-peer-urls: http://192.168.0.103:2380
listen-peer-urls: http://0.0.0.0:2380
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://192.168.0.103:2379
initial-cluster-token: etcd-cluster-token-for-minio-zxht
initial-cluster: etcd1=http://192.168.0.102:2380,etcd2=http://192.168.0.103:2380,etcd3=http://192.168.0.105:2380
initial-cluster-state: new
192.168.0.105的etcd配置:
name: etcd2
data-dir: /home/user/etcd/data
initial-advertise-peer-urls: http://192.168.0.105:2380
listen-peer-urls: http://0.0.0.0:2380
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://192.168.0.105:2379
initial-cluster-token: etcd-cluster-token-for-minio-zxht
initial-cluster: etcd1=http://192.168.0.102:2380,etcd2=http://192.168.0.103:2380,etcd3=http://192.168.0.105:2380
initial-cluster-state: new
- 启动etcd集群
在每台etcd服务器上启动服务:
cd /home/user/etcd
bin/etcd --config-file /home/user/etcd/conf/etcd.conf
注意,在启动etcd集群之前,确保每个etcd服务器的防火墙已经放行了2379和2380端口。
etcd日志打印
- 查看etcd集群工作状态
bin/etcdctl member list
若输出如下信息,则说明etcd集群启动成功:
4.2 部署minIO集群
根据规划,我先部署第一个minIO集群,在服务器192.168.0.106,192.168.0.107上分别进行如下的操作:
- 下载minio程序
因为在挂载磁盘时,我们已经创建了minio工作目录,所以在此无需创建,直接进入这个目录即可
cd /home/user/minio
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
chmod +x minio
- 设置启动脚本
作为可开机自启动的服务,我应该把minio放入linux的systemd的service里面,但这里作为实验,方便查看log等原因,只需要简单配置启动脚本就可以了。
vim start.sh
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123
export MINIO_ETCD_ENDPOINTS="http://192.168.0.102:2379,http://192.168.0.103:2379,http://192.168.0.105:2379"
export MINIO_PUBLIC_IPS=192.168.0.106,192.168.0.107
export MINIO_DOMAIN=domain.com
./minio server --address ":9000" --console-address ":9999" http://192.168.0.{106...107}/home/user/minio/data{1...2}
注意,两个服务的启动脚本是一模一样的。
- 启动minio集群
chmod +x start.sh
./start.sh
注意,在启动minio集群之前,确保每个minio服务器的防火墙都已经放行了9000和9999端口。
启动成功后控制台打印的日志应该如下:
5 检验效果
登录minio后台管理系统,首先登录http://192.168.0.106:9999,输入账号和密码(这个账号和密码我们已经配置在启动脚本start.sh里了)
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123
然后创建一个名为bucket106的存储桶,上传些文件。
然后,登录http://192.168.0.107:9999, 我们将会看到存储桶名bucket106出现在了存储桶列表里,并且可以读写bucket106的文件。
6 集群扩容
我们继续上传文件到bucket106,当上传的最后一个文件的大小超过1G磁盘所剩的空间时,系统就不允许我们上传文件了。
这时,我们需要对系统进行集群扩容。由于我们已经使用了etcd作为minio服务的管理中心,我们只需要重复第一个集群的操作,将192.168.0.109和192.168.0.110作为第二个集群,添加到系统里面就可以了,在这里不再赘述。
7 负载均衡
我们可以使用nginx代理的方式,对minio各个节点进行负载均衡架构。我们可以选择任何一台服务器作为nginx服务器,不一定要新开一个服务器,这里就使用192.168.0.102作为nginx负载均衡服务器。
7.1 安装nginx
vim /etc/nginx/nginx.conf
7.2 配置nginx
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
#Minio 服务负载均衡
upstream minio-server {
server 192.168.0.106:9000 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.0.107:9000 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.0.109:9000 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.0.110:9000 weight=25 max_fails=2 fail_timeout=30s;
}
#控制台负载均衡
upstream minio-console {
server 192.168.0.106:9999 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.0.107:9999 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.0.109:9999 weight=25 max_fails=2 fail_timeout=30s;
server 192.168.0.110:9999 weight=25 max_fails=2 fail_timeout=30s;
}
#Minio服务
server {
listen 9030;
server_name minio-server;
# 允许在标头中使用特殊字符
ignore_invalid_headers off;
# 允许任何大小的文件上传。
# 设置为1000m等值;将文件大小限制为特定值
client_max_body_size 1000m;
# 禁用缓冲
proxy_buffering off;
location / {
root html;
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 Host $http_host;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio-server;
}
}
#Minio控制台
server {
listen 9040;
server_name minio-console;
# 允许在标头中使用特殊字符
ignore_invalid_headers off;
# 允许任何大小的文件上传。
# 设置为1000m等值;将文件大小限制为特定值
client_max_body_size 1000m;
# 禁用缓冲
proxy_buffering off;
location / {
root html;
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 Host $http_host;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio-console;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
主要关注以下这几个节点的配置内容
特别注意要添加以下的配置项,不然在负载均衡9040端口访问minio服务时,会报跨域错误。
7.3 重启nginx
service nginx restart
7.4 访问nginx代理的服务器
访问http://192.168.0.102:9040, 进入minio控制台,就可以体验文件上传过程中文件的存储位置了,读者可自行体验,这里不再赘述。
更多推荐
所有评论(0)