使用Fly.io部署MinIO对象存储服务

前面的文章讲了Fly.io 的入门使用和如何使用 Fly.io 部署 go 开发的应用程序。今天我们来继续讲解使用 Fly.io 部署 对象存储服务 MinIO. MinIO 是什么我就不过多介绍了, 接下来我们就进入正题,进行 MinIO 服务的部署。 准备 Dockerfile 文件 我们先准备 MinIO docker 部署相关的文件, 我们使用官方的镜像进行部署, Dockerfile 文件内容如下: FROM minio/minio CMD [ "server", "/data", "--console-address", ":9001"] MinIO 的数据文件将存储在 data 目录下,指定 9001 为 web 控制台的端口,如果不指定将会使用随机端口。 初始化 Fly.io 应用 接下来像以前一样使用 flyctl launch 命令进行应用的初始化。 我们照常不使用数据库,不立即部署,生成的配置如下: # fly.toml file generated for twilight-lake-5450 on 2022-11-19T22:34:39+08:00 app = "twilight-lake-5450" kill_signal = "SIGINT" kill_timeout = 5 processes = [] [env] [experimental] allowed_public_ports = [] auto_rollback = true [[services]] http_checks = [] internal_port = 8080 processes = ["app"] protocol = "tcp" script_checks = [] [services.concurrency] hard_limit = 25 soft_limit = 20 type = "connections" [[services.ports]] force_https = true handlers = ["http"] port = 80 [[services.ports]] handlers = ["tls", "http"] port = 443 [[services.tcp_checks]] grace_period = "1s" interval = "15s" restart_limit = 0 timeout = "2s" 如果我们要限制从公网连接 MinIO ,只允许和 MinIO 使用相同网络的应用访问,只要删除 [[services]] 下的内容即可。 ...

十一月 19, 2022 · overstarry

记一次阿里云OSS报错的解决

最近在使用 MinIO go-sdk 操作阿里云OSS 时遇到了一个问题,特此记录下。 问题 在使用 sdk 调用 PutObject 方法时,发生了报错,具体报错如下: The request signature we calculated does not match the signature you provided. Check your key and signing method. 解决 可以看出报错的意思是签名不一致问题,我们首先检查 AccessKey ID 和 AccessKey Secret 是否正确,我发现同样创建的 client 在其它地方调用 方法时,没有报错,成功上传了文件对象。 后来查了多个相关的问题,发现可能是我填写的 objectName 的问题,我的 objectName 前带了 / 符号,导致在计算签名时变成 // ,使签名不一致。 我去掉前面的 ‘/’ 符号后,果然成功上传了。 总结 在编写相关操作 OSS 代码时,要注意 objectName 的格式,不要加上多余的符号。但奇怪的是原来上传至 MinIO 时没有报错,正常上传,可能是不同的存储有不同的签名规则吧。 参考 https://help.aliyun.com/document_detail/31951.htm?spm=a2c4g.11186623.0.0.3057jkGJjkGJjL https://blog.csdn.net/DCTANT/article/details/107917268 https://error-center.aliyun.com/status/search?Keyword=SignatureDoesNotMatch&source=PopGw";

八月 2, 2022 · overstarry

应用内存升高原因排查

起因 最近一个部署了 go 应用的服务器出现了 OOM 的现象,内存占用过高。 原因 通过 Pyroscope 分析得出是因为 Minio 的 go sdk 中的 PutObject 函数占用了大量的内存。 Pyroscope 是什么,前面的文章已经介绍过了,这里就不过多介绍了。 接下来我们通过查看相关的源码来查看是什么原因。 // PutObject creates an object in a bucket. // // You must have WRITE permissions on a bucket to create an object. // // - For size smaller than 16MiB PutObject automatically does a // single atomic PUT operation. // // - For size larger than 16MiB PutObject automatically does a // multipart upload operation. // // - For size input as -1 PutObject does a multipart Put operation // until input stream reaches EOF. Maximum object size that can // be uploaded through this operation will be 5TiB. // // WARNING: Passing down '-1' will use memory and these cannot // be reused for best outcomes for PutObject(), pass the size always. // // NOTE: Upon errors during upload multipart operation is entirely aborted. func (c *Client) PutObject(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64, opts PutObjectOptions, ) (info UploadInfo, err error) { if objectSize < 0 && opts.DisableMultipart { return UploadInfo{}, errors.New("object size must be provided with disable multipart upload") } err = opts.validate() if err != nil { return UploadInfo{}, err } return c.putObjectCommon(ctx, bucketName, objectName, reader, objectSize, opts) } 从方法的注释可以看出,当传递的大小为 -1 时,会进行多次 put 操作,直到输入流结束。 多次 put 操作的最大大小为 5TiB, 并且不能重用内存,导致占用大量内存。 ...

五月 14, 2022 · overstarry

使用Prometheus收集MinIO指标

今天我来讲一讲如何使用 Prometheus 获取 MinIO 指标。 前提 需要部署好 Prometheus 、Minio 服务和配置好 Minio Client , MinIO 和 Prometheus 的网络需要可互相访问。 步骤 1. 生成 JWT 令牌 使用以下命令生成 JWT bearer token mc admin Prometheus generate ALIAS 请将 ALIAS 替换成你的 MinIO 主机服务名。 该命令会产生如下的信息输出: scrape_configs: - job_name: minio-job bearer_token: token metrics_path: /minio/v2/metrics/cluster scheme: http static_configs: - targets: [minIOip] 配置 Prometheus Targets 将上一个步骤输出的信息添加至 Targets 配置文件(Prometheus.yml) 中, 重新启动 Prometheus 服务。 查询 Prometheus 指标 添加重启完 Prometheus 服务后, 我们就可以在 Prometheus 界面查询 Minio 相关的指标。 例如: 我们可以通过 minio_bucket_usage_object_total 指标查询 bucket 的对象总数。 ...

九月 28, 2021 · overstarry