20張圖手把手教你搭建并優(yōu)化云原生模式下的多節(jié)點Minio分布式文件系統(tǒng)
大家好,我是冰河~~
Minio是一個開源的高性能對象存儲服務(wù)器,適用于構(gòu)建分布式存儲系統(tǒng)。它具有高可用性、可擴展性和數(shù)據(jù)保護機制,兼容Amazon S3 API,在大數(shù)據(jù)、云計算和容器化環(huán)境中廣泛應(yīng)用,為應(yīng)用程序提供了可靠、高效的對象存儲服務(wù)。
一、前言
分布式IM即時通訊系統(tǒng)提供了單聊和群聊的功能,在消息的發(fā)送和接收上需要支持文本、表情、圖片、文件、語音和視頻等等。那在消息的發(fā)送過程中,如何存儲圖片、文件、語音等資源呢?一種非常有效的存儲方式,就是將其存儲到一款高性能的分布式文件系統(tǒng)中。
對比其他的分布式文件系統(tǒng)后,我們最終選擇了Minio來存儲消息的圖片、文件和語音等資源。主要是考慮到Minio文件系統(tǒng)具備高性能、高可擴展性、安裝和操作簡單、具備糾刪碼等特性。具體的特性大家可自行上網(wǎng)了解,這里不再贅述。
二、環(huán)境說明
- 服務(wù)器版本: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環(huán)境相對就比較簡單,在命令行執(zhí)行如下命令下載并安裝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
下載并安裝成功后,使用如下命令創(chuàng)建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統(tǒng)一對外提供訪問圖片或者文件等資源的地址。所以,除了要編寫基于docker-compose安裝Minio容器的配置,還需要編寫基于docker-compose安裝Nginx的配置,另外,也需要對nginx.conf文件進行配置。
1、編寫容器配置
無論是Minio文件系統(tǒng),還是Nginx,都是基于docker-compose安裝的。所以,在編寫容器配置時,我們將Minio容器和Nginx容器的安裝寫到同一個配置文件中,并將其命名為:docker-compose-minio.yml。
源碼詳見:environment/docker-compose-minio.yml。
version: '3.2'
# 所有容器通用的設(shè)置和配置
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服務(wù)器實例
# 使用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服務(wù)容器,并且Minio容器映射到宿主機的端口分別為:9001~9004。并且,需要注意的是,在上述配置中,將Minio后臺管理端的賬號配置成了binghe,密碼配置成了binghe123。
2、編寫nginx.conf配置
啟動四個Minio容器后,對外統(tǒng)一由Nginx進行負載均衡訪問,并且在編寫容器配置文件時,也指定了容器中的nginx.conf文件與宿主機中nginx.conf文件的對應(yīng)關(guān)系,所以,我們也需要在宿主機上配置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、創(chuàng)建并啟動容器
將environment目錄上傳到服務(wù)器,并將服務(wù)器命令行切換到environment目錄下,并輸入如下命令來創(chuàng)建并啟動Minio容器和Nginx容器。
docker-compose -f docker-compose-minio.yml up -d
創(chuàng)建并啟動容器的過程如下所示。
[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、查看啟動狀態(tài)
啟動完成后,在服務(wù)器命令行輸入 docker ps
命令來查看啟動的容器,如圖4-1所示。
當看到minio容器STATUS列中標有healthy狀態(tài)時,說明Minio容器創(chuàng)建并啟動成功。
六、配置Minio
1、Minio
打開瀏覽器,在地址欄中輸入http://192.168.106.102:9001,如圖4-2所示。
輸入賬號binghe,密碼binghe123登錄Minio,如圖4-3所示。
登錄后的頁面如圖4-4所示。
可以看到,總共有4個Minio服務(wù)實例。
滑動頁面右側(cè)的滾動條,在SERVERS選項下,我們可以看到四個具體的服務(wù)實例信息,如圖4-5所示。
切換到DRIVES選項下,可以看到四個服務(wù)實例的DRIVE信息,如圖4-6所示。
2、創(chuàng)建分桶
在Minio文件系統(tǒng)中創(chuàng)建一個名稱為bh-im的分桶,用來存儲分布式IM即時通訊系統(tǒng)消息發(fā)送過程中的圖片、文件和語音等資源,如圖4-7所示。
接下來,在Bucket Name一欄中填寫bh-im,如圖4-8所示。
點擊Create Bucket按鈕即可創(chuàng)建分桶。隨后,點擊Buckets菜單來查看分桶信息,如圖4-9所示。
可以看到,名稱為bh-im的分桶已經(jīng)創(chuàng)建成功,點擊Manage后,如圖4-10所示。
將bh-im分桶中Summary的Access Policy,也就是訪問策略,由Private修改成Public,如圖4-11所示。
修改完成后,如圖4-12所示。
3、優(yōu)化性能
創(chuàng)建完分桶后,我們來優(yōu)化下Minio文件系統(tǒng)多節(jié)點之間的同步性能,選擇Settings菜單-Scanner子菜單,配置Delay multiplier、Max Wait和Cycle的值,如圖4-13所示。
可以看到,這里我們將Delay multiplier配置成10,Max Wait和Cycle都配置成了1s,以此來加快Minio多個節(jié)點之間的同步效率。
七、測試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
由于我們已經(jīng)配置了可以基于Nginx統(tǒng)一訪問Minio分布式文件系統(tǒng)中的資源,所以,這里,我們將IP地址172.18.0.4
修改成192.168.106.102
,在瀏覽器地址欄中打開如下鏈接。
http://192.168.106.102:9000/bh-im/2.jpg
在瀏覽器地址欄打開修改IP地址后的鏈接地址,如圖4-20所示。
可以看到,瀏覽器中正常展示了我們上傳的圖片。
至此,云原生模式下的多節(jié)點Minio分布式文件系統(tǒng)環(huán)境搭建完畢。
八、寫在最后
這些真實場景的項目設(shè)計與落地實現(xiàn),在冰河的知識星球除了分布式IM即時通訊系統(tǒng)外,還有其他5個項目,這些項目的需求、方案、架構(gòu)、落地等均來自互聯(lián)網(wǎng)真實業(yè)務(wù)場景,讓你真正學到互聯(lián)網(wǎng)大廠的業(yè)務(wù)與技術(shù)落地方案,并將其有效轉(zhuǎn)化為自己的知識儲備。