20张图手把手教你搭建并优化后浪云模式下的多节点Minio分布式文件系统

大家好,我是冰河~~

Minio是一个开源的高性能对象存储服务器,适用于构建分布式存储系统。它具有高可用性、可扩展性和数据保护机制,兼容Amazon S3  API,在大数据、云计算和容器化环境中广泛应用,为应用程序提供了可靠、高效的对象存储服务。

一、前言

分布式IM即时通讯系统提供了单聊和群聊的功能,在消息的发送和接收上需要支持文本、表情、图片、文件、语音和视频等等。那在消息的发送过程中,如何存储图片、文件、语音等资源呢?一种非常有效的存储方式,就是将其存储到一款高性能的分布式文件系统中。

对比其他的分布式文件系统后,我们最终选择了Minio来存储消息的图片、文件和语音等资源。主要是考虑到Minio文件系统具备高性能、高可扩展性、安装和操作简单、具备纠删码等特性。具体的特性大家可自行上网了解,这里不再赘述。

二、环境说明

  • 服务器版本:CentOS7
  • 主机名:binghe102
  • IP地址:192.168.106.102
  • docker-compose:v2.17.3
  • Minio镜像:minio/minio
  • Nginx镜像:nginx:1.19.2-alpine

三、安装docker-compose

安装docker-compose环境相对就比较简单,在命令行执行如下命令下载并安装docker-compose。

curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

下载并安装成功后,使用如下命令创建docker-compose软链接。

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

随后查看docker-compose版本,如下所示。

[root@binghe102]# docker-compose version
Docker Compose version v2.17.3

可以看到,安装的docker-compose版本为2.17.3,说明docker-compose安装成功。

四、编写配置文件

这里,安装并启动四个Minio容器,由Nginx统一对外提供访问图片或者文件等资源的地址。所以,除了要编写基于docker-compose安装Minio容器的配置,还需要编写基于docker-compose安装Nginx的配置,另外,也需要对nginx.conf文件进行配置。

1、编写容器配置

无论是Minio文件系统,还是Nginx,都是基于docker-compose安装的。所以,在编写容器配置时,我们将Minio容器和Nginx容器的安装写到同一个配置文件中,并将其命名为:docker-compose-minio.yml。

源码详见:environment/docker-compose-minio.yml。

version: '3.2'

# 所有容器通用的设置和配置
x-minio-common: &minio-common
  image: minio/minio
  command: server --console-address ":9001" http://minio{1...4}/data
  expose:
    - "9000"
  environment:
    MINIO_ROOT_USER: binghe
    MINIO_ROOT_PASSWORD: binghe123
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3

# 启动4个docker容器运行minio服务器实例
# 使用nginx反向代理9000端口,负载均衡
# 可以通过9001、9002、9003、9004端口访问它们的web console
services:
  minio1:
    <<: *minio-common
    hostname: minio1
    ports:
      - "9001:9001"
    volumes:
      - ./data/data1:/data

  minio2:
    <<: *minio-common
    hostname: minio2
    ports:
      - "9002:9001"
    volumes:
      - ./data/data2:/data

  minio3:
    <<: *minio-common
    hostname: minio3
    ports:
      - "9003:9001"
    volumes:
      - ./data/data3:/data

  minio4:
    <<: *minio-common
    hostname: minio4
    ports:
      - "9004:9001"
    volumes:
      - ./data/data4:/data

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

在上述配置中,会安装并启动四个Minio服务容器,并且Minio容器映射到宿主机的端口分别为:9001~9004。并且,需要注意的是,在上述配置中,将Minio后台管理端的账号配置成了binghe,密码配置成了binghe123。

2、编写nginx.conf配置

启动四个Minio容器后,对外统一由Nginx进行负载均衡访问,并且在编写容器配置文件时,也指定了容器中的nginx.conf文件与宿主机中nginx.conf文件的对应关系,所以,我们也需要在宿主机上配置nginx.conf文件。

源码详见:environment/nginx.conf。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  4096;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;

    # include /etc/nginx/conf.d/*.conf;

    upstream minio {
        server minio1:9000;
        server minio2:9000;
        server minio3:9000;
        server minio4:9000;
    }

    server {
        listen       9000;
        listen  [::]:9000;
        server_name  localhost;

        # To allow special characters in headers
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;
        # To disable buffering
        proxy_buffering off;

        location / {
            proxy_set_header Host $http_host;
            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_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;
        }
    }
}

五、启动容器

1、创建并启动容器

将environment目录上传到服务器,并将服务器命令行切换到environment目录下,并输入如下命令来创建并启动Minio容器和Nginx容器。

docker-compose -f docker-compose-minio.yml up -d

创建并启动容器的过程如下所示。

[root@binghe102 environment]# docker-compose -f docker-compose-minio.yml up -d
[+] Running 17/17
  minio2 Pulled                                                         219.5s 
  minio3 Pulled                                                         219.5s 
  minio1 7 layers [⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                      219.5s 
    d46336f50433 Pull complete                                           45.3s 
    be961ec68663 Pull complete                                           45.7s 
    44173c602141 Pull complete                                           46.1s 
    a9809a6a679b Pull complete                                           46.2s 
    df29d4a76971 Pull complete                                           46.3s 
    2b5a8853d302 Pull complete                                           46.3s 
    84f01ee8dfc1 Pull complete                                          210.3s 
  minio4 Pulled                                                         219.5s 
  nginx 5 layers [⣿⣿⣿⣿⣿]      0B/0B      Pulled                          54.9s 
    df20fa9351a1 Pull complete                                            5.3s 
    3db268b1fe8f Pull complete                                           31.6s 
    f682f0660e7a Pull complete                                           31.7s 
    7eb0e8838bc0 Pull complete                                           31.7s 
    e8bf1226cc17 Pull complete                                           32.1s 
[+] Running 6/6
  Network environment_default     Created                                14.3s 
  Container environment-minio1-1  Started                               140.1s 
  Container environment-minio3-1  Started                               140.2s 
  Container environment-minio2-1  Started                               140.1s 
  Container environment-minio4-1  Started                               140.0s 
  Container environment-nginx-1   Started

2、查看启动状态

启动完成后,在服务器命令行输入 docker ps 命令来查看启动的容器,如图4-1所示。

当看到minio容器STATUS列中标有healthy状态时,说明Minio容器创建并启动成功。

六、配置Minio

1、Minio

打开浏览器,在地址栏中输入http://192.168.106.102:9001,如图4-2所示。

输入账号binghe,密码binghe123登录Minio,如图4-3所示。

登录后的页面如图4-4所示。

可以看到,总共有4个Minio服务实例。

滑动页面右侧的滚动条,在SERVERS选项下,我们可以看到四个具体的服务实例信息,如图4-5所示。

切换到DRIVES选项下,可以看到四个服务实例的DRIVE信息,如图4-6所示。

2、创建分桶

在Minio文件系统中创建一个名称为bh-im的分桶,用来存储分布式IM即时通讯系统消息发送过程中的图片、文件和语音等资源,如图4-7所示。

接下来,在Bucket Name一栏中填写bh-im,如图4-8所示。

点击Create Bucket按钮即可创建分桶。随后,点击Buckets菜单来查看分桶信息,如图4-9所示。

可以看到,名称为bh-im的分桶已经创建成功,点击Manage后,如图4-10所示。

将bh-im分桶中Summary的Access Policy,也就是访问策略,由Private修改成Public,如图4-11所示。

修改完成后,如图4-12所示。

3、优化性能

创建完分桶后,我们来优化下Minio文件系统多节点之间的同步性能,选择Settings菜单-Scanner子菜单,配置Delay multiplier、Max Wait和Cycle的值,如图4-13所示。

可以看到,这里我们将Delay multiplier配置成10,Max Wait和Cycle都配置成了1s,以此来加快Minio多个节点之间的同步效率。

七、测试Minio

选择Buckets-Browse,如图4-14所示。

进入Browse页面后如图4-15所示。

这里,我们点击向上的箭头按钮来上传一张图片,上传完成后如图4-16所示。

接下来,点击图片进入详情,如图4-17所示。

进入图片详情页面后,点击分享按钮,如图4-18所示。

点击分享按钮后,如图4-19所示。

可以看到,在分享页面中,给出了图片的访问链接,这里,我们点击Copy按钮复制图片链接,复制出的图片链接如下所示。

http://172.18.0.4:9000/bh-im/2.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=9X4104YB84KCT5XGQKSW%2F20231224%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231224T073947Z&X-Amz-Expires=604800&X-Amz-Security-Token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NLZXkiOiI5WDQxMDRZQjg0S0NUNVhHUUtTVyIsImV4cCI6MTcwMzQwNDY3MCwicGFyZW50IjoiYmluZ2hlIn0.h611ez9SqsGcw-pEeXLp59_IpotFGmx1LeNzgGQdjJdAiYXm4f0EQ-ADgkxlr3UPIbR6-hQxYR__As_oo02BHg&X-Amz-SignedHeaders=host&versinotallow=null&X-Amz-Signature=4d2128b0da332fbbba8dfedea4ede07051c9376365e76bf12e4e658b8020747f

由于我们已经配置了可以基于Nginx统一访问Minio分布式文件系统中的资源,所以,这里,我们将IP地址172.18.0.4修改成192.168.106.102,在浏览器地址栏中打开如下链接。

http://192.168.106.102:9000/bh-im/2.jpg

在浏览器地址栏打开修改IP地址后的链接地址,如图4-20所示。

可以看到,浏览器中正常展示了我们上传的图片。

至此,云原生模式下的多节点Minio分布式文件系统环境搭建完毕。

八、写在最后

这些真实场景的项目设计与落地实现,在冰河的知识星球除了分布式IM即时通讯系统外,还有其他5个项目,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/288614.html<

(0)
管理的头像管理
上一篇2025-05-16 10:04
下一篇 2025-05-16 10:06

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注