单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如:resources\static\file、resources\static\image等。 优点:这样做比较便利,项目直接引用就行,实现起来也简单,无需任何复杂技术,保存数据库记录和访问起来也很方便。 缺点:如果只是后台系统的使用一般也不会有什么问题,但是作为一个前端网站使用的话就会存在弊端。一方面,文件和代码耦合在一起,文件越多存放越混乱;另一方面,如果流量比较大,静态文件访问会占据一定的资源,影响正常业务进行,不利于网站快速发展。 1.1.2 独立文件服务器 随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器,工作流程如下:项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过ngnix或者apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。 优点:图片访问是很消耗服务器资源的(因为会涉及到操作系统的上下文切换和磁盘I/O操作),分离出来后,Web/App服务器可以更专注发挥动态处理的能力;独立存储,更方便做扩容、容灾和数据迁移;方便做图片访问请求的负载均衡,方便应用各种缓存策略(HTTP Header、Proxy Cache等),也更加方便迁移到CDN。 缺点:单机存在性能瓶颈,容灾、垂直扩展性稍差 分布式文件系统 通过独立文件服务器可以解决一些问题,如果某天存储文件的那台服务突然down了怎么办?可能你会说,定时将文件系统备份,这台down机的时候,迅速切换到另一台就OK了,但是这样处理需要人工来干预。另外,当存储的文件超过100T的时候怎么办?单台服务器的性能问题?这个时候我们就应该考虑分布式文件系统了。 业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。分布式文件系统,一般分为三块内容来配合,服务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,仲裁系统相当于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责保存文件,容灾系统负责文件系统和自己的相互备份。 优点:扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行 缺点:系统复杂度稍高,需要更多服务器
常见的分布式文件系统有GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自适用于不同的领域。它们都不是系统级的分布式文件系统,而是应用级的分布式文件存 储服务
Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。 Minio的特性: Amazon S3兼容 Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI访问Minio服务器。 数据保护 Minio使用Minio Erasure Code来防止硬件故障。也许会损坏一半以上的driver,但是仍然可以从中恢复。 高度可用 Minio服务器可以容忍分布式设置中高达(N / 2)-1节点故障。而且,您可以配置Minio服务器在Minio与任意Amazon S3兼容服务器之间存储数据。 Lambda计算 Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。 加密和防篡改 Minio为加密数据提供了机密性,完整性和真实性保证,而且性能开销微乎其微。使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。加密的对象使用AEAD服务器端加密进行防篡改。 可对接后端存储 除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。 sdk支持 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持
进入服务器然后直接执行以下命令 mkdir /minio/{data,logs} -p #创建文件夹 cd /minio ##进入文件夹 wget https://dl.minio.io/server/minio/release/linux-amd64/minio ##下载minio ./minio server --address ":9009" --console-address 0.0.0.0:9001 /root/minio/data/ > /minio/data/minio.log 2>&1 & ##启动 --address 指定api端口 --console-address 指定web控制台端口 启动后 记得防火墙开启 9001 和9009端口 firewall-cmd --zone=public --add-port=9009/tcp --permanent firewall-cmd --zone=public --add-port=9001/tcp --permanent firewall-cmd --reload
然后通过浏览器访问 http://ip:9001 默认账号密码 : minioadmin minioadmin ,登陆后如下图
集群版至少需要4个硬盘分区,不然会报磁盘数量不足错误,最好是找4台服务器,或者添加多个硬盘做到至少4个磁盘可用 比如目前我得集群构成如下(举例)
ip | 描述 | 页面控制台端口 | 后台通讯端口 |
192.168.1.1 | mino slave | 9001 | 9009 |
192.168.1.2 | mino slave | 9001 | 9009 |
192.168.1.3 | mino slave | 9001 | 9009 |
192.168.1.4 | mino slave | 9001 | 9009 |
192.168.1.5 | nginx 负载(主要用来对后台请求负载均衡的) | 9090 |
分别进入前四台机器执行如下命令: mkdir /minio/{app,config,data,logs} -p #创建文件夹 然后将下载好的 minio文件手动活scp放到 /minio目录
vi run.sh #编写启动脚本#!/bin/bash export MINIO_ROOT_USER=admin export MINIO_ROOT_PASSWORD=admin@minio export MINIO_ACCESS_KEY=admin export MINIO_SECRET_KEY=admin@minio /minio/minio server --config-dir /minio/config --address ":9009" --console-address ":9001" \ http://192.168.1.182:9009/minio/data \ http://192.168.1.106:9009/minio/data \ http://192.168.1.82:9009/minio/data \ http://192.168.1.97:9009/minio/data >/minio/logs/start.txt 2>&1 &
四台机器分别执行sh run.sh ,启动完毕 启动后进入单个独立的控制台和单机版一样,不同的是,四台机器所有数据都是一样的,某个控制台上传的文件都会同步到其他机器
nginx 搭建 详细搭建不过多说,之说明一下nginx.conf的配置
upstream minio-server { server 192.168.1.1:9009 weight=25 max_fails=2 fail_timeout=30s; server 192.168.1.2:9009 weight=25 max_fails=2 fail_timeout=30s; server 192.168.1.3:9009 weight=25 max_fails=2 fail_timeout=30s; server 192.168.1.4:9009 weight=25 max_fails=2 fail_timeout=30s; } server { listen 9090; listen 443; server_name minio-aaa.com ; ssl on; ssl_certificate /usr/local/nginx/conf/cert/k8s/3877901__aaa.com.pem; ssl_certificate_key /usr/local/nginx/conf/cert/k8s/3877901__aaa.com.key; charset utf-8; default_type text/html; location /{ proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 10M; client_max_body_size 10G; proxy_buffers 1024 4k; proxy_read_timeout 300; proxy_next_upstream error timeout http_404; proxy_pass http://minio-server; } error_log /data1/logs/minio/error.log; access_log /data1/logs/minio/access.log access; }
启动完毕后,后台java程序只需要连接nginx所在服务器ip端口9090 即可