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个项目,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。

THE END