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

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

大家好,我是冰河~~

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

责任编辑:姜华 来源: 冰河技术
相关推荐

2010-07-06 09:43:57

搭建私有云

2018-05-09 09:44:51

Java分布式系统

2018-05-22 15:30:30

Python网络爬虫分布式爬虫

2010-07-06 09:38:51

搭建私有云

2021-06-23 07:16:06

buildroot Linux内核根文件系统

2022-09-15 21:04:20

JuiceFS云原生

2022-03-14 14:47:21

HarmonyOS操作系统鸿蒙

2021-03-05 08:52:00

Celery在Windows分布式

2011-03-25 12:45:49

Oracle SOA

2022-01-04 08:52:14

博客网站Linux 系统开源

2010-11-01 05:50:46

分布式文件系统

2021-12-28 08:38:26

Linux 中断唤醒系统Linux 系统

2020-08-12 07:41:39

SQL 优化语句

2022-01-17 07:50:37

Linux Patch项目

2009-06-15 16:58:57

Java安装Linux

2022-01-08 20:04:20

拦截系统调用

2009-11-09 14:57:37

WCF上传文件

2020-07-27 10:15:51

LinuxJenkins命令

2022-07-08 09:00:00

混合云数据存储IT

2021-02-04 09:00:57

SQLDjango原生
点赞
收藏

51CTO技术栈公众号