极光高级工程师胡冠军分享了搭建UMS私有云文件服务器的过程,针对UMS5.1版本中对短信签名、邮件支持上传本地图片/附件及大量文件存储的需求,决定构建私有云文件服务器,并确保兼容客户文件服务器(通常支持S3协议)。经过调研和讨论,最终选择了minIO作为解决方案。 minIO是一款基于Apache License v2.0协议、使用Go语言开发的对象存储服务,兼容Amazon S3云存储服务接口,适合存储大量非结构化数据,如图片、视频、日志文件、备份数据及容器/虚拟机镜像等。minIO具有轻量级特性,易于与其他应用集成,支持NodeJS、Redis、MySQL等。 minIO具有以下优势:兼容Amazon S3 API、数据保护(使用Erasure Code)、高度可用性(容忍分布式系统中高达(N/2)-1节点故障)、Lambda计算(通过事件通知服务触发Lambda功能)、加密和防篡改(提供机密性、完整性和真实性保证)、可对接后端存储、提供SDK支持、一致性(遵守read-after-write模型)。minIO采用去中心化的无共享架构,数据被打散存储在不同节点的多块硬盘上,并通过Web负载均衡器或DNS轮询实现负载均衡。 为了兼容客户文件服务器,minIO提供了纠删码(Erasure Code)机制,即使丢失一半硬盘数据,仍然可以恢复数据。纠删码通过将对象拆分成数据块和奇偶校验块,实现数据冗余。minIO在分布式和单机模式下,所有读写操作严格遵守read-after-write一致性模型,确保数据一致性。 在UMS系统中,文件管理服务器提供了对外操作minIO服务器的接口,包括获取上传文件的presignedURL、设置过期时间、设置访问策略、创建存储桶、生成下载文件URL等功能。presignedURL允许其他用户在有限时间内上传或下载对象。文件管理服务器通过minIO官方API实现这些功能,同时提供了生成下载链接的方法,过期时间可自定义,需设置存储桶对外访问策略为public。 在minIO的实际应用中,客户端通过Web/API服务器获取上传文件的凭证(presignedURL),上传文件至minIO服务器,并通过下载链接直接下载文件。客户端使用上传URL上传文件,下载URL作为请求文件的参数,如发送邮件时支持上传本地图片。 minIO集群采用去中心化无共享架构,所有节点集元数据存储、数据存储、应用访问等功能于一体。minIO的分布式部署使用命令行工具,集群扩容需增加对等数量的节点,以维持相同的数据冗余SLA。minIO支持通过命令行指定新集群扩展现有集群。部署过程可以通过Ansible脚本自动化,使用Nginx作为反向代理,验证集群部署成功。 总结而言,minIO为UMS私有云文件服务器提供了稳定、高效且兼容S3协议的存储解决方案。通过精心规划和实施,可以满足不同业务场景的需求,实现文件的可靠存储和高效访问。