天天看點

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

作者:章為忠學架構

随着檔案資料的越來越多,傳統的檔案存儲方式通過tomcat或nginx虛拟化的靜态資源檔案在單一的伺服器節點内已經無法滿足系統需求,也不利于檔案的管理和維護,這就需要一個系統來管理多台計算機節點上的檔案資料,這就是分布式檔案系統。

一、什麼是分布式檔案系統?

1.1 什麼是分布式檔案系統

分布式檔案系統(Distributed File System,DFS)是指檔案系統管理的實體存儲資源不一定直接連接配接在本地節點上,而是通過計算機網絡與節點(可簡單的了解為一台計算機)相連;或是若幹不同的邏輯磁盤分區或卷标組合在一起而形成的完整的有層次的檔案系統。DFS為分布在網絡上任意位置的資源提供一個邏輯上的樹形檔案系統結構,進而使使用者通路分布在網絡上的共享檔案更加簡便。

1.3 分布式檔案系統的優勢

可擴充:分布式存儲系統可以擴充到數百甚至數千個這樣的叢集大小,并且系統的整體性能可以線性增長。

高可用性:在分布式檔案系統中,高可用性包含兩層,一是整個檔案系統的可用性,二是資料的完整和一緻性

低成本:分布式存儲系統的自動容錯和自動負載平衡允許在成本較低伺服器上建構分布式存儲系統。此外,線性可擴充性還能夠增加和降低伺服器的成本。

彈性存儲: 可以根據業務需要靈活地增加或縮減資料存儲以及增删存儲池中的資源,而不需要中斷系統運作

1.4 分布式檔案系統的應用場景

分布式檔案系統廣發适用于網際網路、金融等海量非結構化資料的存儲需求:

  • 電商網站:海量商品圖檔
  • 視訊平台:視訊、圖檔檔案存儲
  • 網盤應用:檔案存儲
  • 社交網站:海量視訊、圖檔

二、分布式檔案系統與傳統檔案系統對比

傳統的網絡存儲系統采用集中的伺服器存放所有資料,到一定程度伺服器會成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

分布式檔案系統是将檔案分散的存儲在多台伺服器上,采用可擴充的系統結構,利用多台伺服器分擔負荷,利用位置伺服器定位存儲資訊。這不但提高了系統的可靠性、可用性和存取效率,還易于擴充,避免單點故障。

分布式檔案系統 一般檔案系統
存儲方式 資料分散的存儲在多台伺服器上 集中存放所有資料,在一台伺服器上器上
特點 分布式網絡存儲系統采用可擴充的系統結構,利用多台存儲伺服器分擔存儲負荷,利用位置伺服器定位存儲資訊,它不但提高了系統的可靠性、可用性和存取效率,還易于擴充。 傳統的網絡存儲系統采用集中的存儲伺服器存放所有資料,存儲伺服器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。

使用分布式檔案系統可以解決如下幾點問題:

  • 海量檔案資料存儲
  • 檔案資料高可用(備援備份)
  • 讀寫性能和負載均衡

以上三點都是傳統檔案系統無法達到的,這也是我們為什麼要使用分布式檔案系統的原因。

目前,可用于檔案存儲的網絡服務選擇有很多,其中最常用的分布式檔案系統有:DFS、FastDfs、MinIO、Ceph等。接下來我們就來詳細介紹MinIO并通過MinIO搭建分布式存儲系統。

三、MinIO簡介

3.1 什麼是MinIO?

MinIO 是在 GNU Affero 通用公共許可證 v3.0 下釋出的高性能對象存儲。它與 Amazon S3 雲存儲服務 API 相容。使用 MinIO 為機器學習、分析和應用程式資料工作負載建構高性能基礎架構。

官方文檔:https//docs.min.io/

中文文檔:http://docs.minio.org.cn/docs/

GitHub 位址:https://github.com/minio/minio

3.2 MinIO的特點

  • 資料保護——分布式 MinIO采用 糾删碼來防範多個節點當機和位衰減 bit rot。分布式 MinIO至少需要 4 個硬碟,使用分布式 MinIO自動引入了糾删碼功能。
  • 高可用——單機MinIO服務存在單點故障風險,相反,如果是一個有 N 塊硬碟的分布式 MinIO,隻要有 N/2 硬碟線上,你的資料就是安全的。不過你需要至少有 N/2+1 個硬碟來建立新的對象。
  • 一緻性——MinIO在分布式和單機模式下,所有讀寫操作都嚴格遵守 read-after-write 一緻性模型。

3.3 MinIO的優點

  • 部署簡單,一個二進制檔案(minio)即是一切,還可以支援各種平台;
  • 支援海量存儲,可以按 zone 擴充,支援單個對象最大 5TB;
  • 低備援且磁盤損壞高容忍,标準且最高的資料備援系數為 2(即存儲一個 1M 的資料對象,實際占用磁盤空間為 2M)。但在任意 n/2 塊 disk 損壞的情況下依然可以讀出資料(n 為一個糾删碼集合中的 disk 數量)。并且這種損壞恢複是基于單個對象的,而不是基于整個存儲卷的;
  • 讀寫性能優異,MinIO号稱是目前速度最快的對象存儲伺服器。在标準硬體上,對象存儲的讀/寫速度最高可以高達183 GB/s和171 GB/s。

3.4 MinIO 基礎概念

  • S3——Simple Storage Service,簡單存儲服務,這個概念是 Amazon 在 2006 年推出的,對象存儲就是從那個時候誕生的。S3 提供了一個簡單 Web 服務接口,可用于随時在 Web 上的任何位置存儲和檢索任何數量的資料;
  • Object——存儲到 MinIO 的基本對象,如檔案、位元組流等各種類型的資料;Bucket——用來存儲 Object 的邏輯空間。每個 Bucket 之間的資料是互相隔離的;
  • Drive——部署 MinIO時設定的磁盤,MinIO 中所有的對象資料都會存儲在 Drive 裡;
  • Set——一組 Drive 的集合,分布式部署根據叢集規模自動劃分一個或多個 Set ,每個 Set 中的 Drive 分布在不同位置。
    • 一個對象存儲在一個 Set 上
    • 一個叢集劃分為多個 Set
    • 一個 Set 包含的 Drive 數量是固定的,預設由系統根據叢集規模自動計算得出
    • 一個 SET 中的 Drive 盡可能分布在不同的節點上

Set /Drive 的關系

  • Set /Drive 這兩個概念是 MinIO 裡面最重要的兩個概念,一個對象最終是存儲在 Set 上面的。
  • Set 是另外一個概念,Set 是一組 Drive 的集合,圖中,所有藍色、橙色背景的 Drive(硬碟)的就組成了一個 Set。

3.5 什麼是糾删碼(Erasure Code)?

前面我們介紹MinIO的時候提到過:Minio 采用糾删碼來防範多個節點當機或是故障,保證資料安全。那究竟什麼是糾删碼呢?

糾删碼(Erasure Code)簡稱 EC,它是一種恢複丢失和損壞資料的算法,也是一種編碼技術。通過将資料分割成片段,把備援資料塊擴充、編碼,并将其存儲在不同的位置,比如磁盤、存儲節點或者其它地理位置,實作資料的備份與安全。

其實,簡單來說就是:糾删碼可通過将 n 份原始資料,增加 m 份校驗資料,并能通過 n+m 份中的任意 n 份原始資料,還原為原始資料。即如果有任意小于等于 m 份的校驗資料失效,仍然能通過剩下的資料還原出來。

目前,糾删碼技術在分布式存儲系統中的應用主要有三類:陣列糾删碼(Array Code: RAID5、RAID6 等)、RS(Reed-Solomon)裡德-所羅門類糾删碼和LDPC(LowDensity Parity Check Code)低密度奇偶校驗糾删碼。

Minio 采用 Reed-Solomon code 将對象拆分成 N/2 資料和 N/2 奇偶校驗塊。在同一叢集内,MinIO 自己會自動生成若幹糾删組(Set),用于分布存放桶資料。一個糾删組中的一定數量的磁盤發生的故障(故障磁盤的數量小于等于校驗盤的數量),通過糾删碼校驗算法可以恢複出正确的資料。

四、MinIO安裝部署

4.1MinIO部署方式

MinIO支援多種部署方式:單主機單硬碟模式、單主機多硬碟模式、多主機多硬碟模式(也就是分布式)。下面介紹下這三種方式。

4.1.1 單主機,單硬碟模式

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

如上圖所示,此模式下MinIO 隻在一台伺服器上搭建服務,且資料都存在單塊磁盤上,該模式存在單點風險,主要用作開發、測試等使用

4.1.2 單主機,多硬碟模式

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

如上圖所示,該模式下MinIO 在一台伺服器上搭建服務,但資料分散在多塊(大于 4 塊)磁盤上,提供了資料上的安全保障。

4.1.3 多主機、多硬碟模式(分布式)

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

如上圖所示,此模式是 MinIO 服務最常用的架構,通過共享一個 access_key 和 secret_key,在多台伺服器上搭建服務,且資料分散在多塊(大于 4 塊,無上限)磁盤上,提供了較為強大的資料備援機制(Reed-Solomon 糾删碼)。

4.2MinIO分布式部署

4.2.1 環境準備

由于是MinIO分布式部署,準備了2台Linux虛拟機,Centos 7.5的作業系統。同時每台伺服器額外增加了2個磁盤。Nginx則是用于叢集的負載均衡,也可以使用etcd。

節點 IP 磁盤
minio node1 192.168.78.101 /mnt/disk1,/mnt/disk2
minio node2 192.168.78.102 /mnt/disk1,/mnt/disk2
nginx 192.168.78.101 /home/nginx

【溫馨提示】磁盤大小必須>1G,這裡我添加的是 4*1G 的盤。

MinIO官網下載下傳位址:https://min.io/download#/linux

4.2.2 搭建MinIO叢集

1)建立安裝目錄

首先,在每台伺服器上建立minio的目錄。

mkdir -p /home/minio/{run,conf} && mkdir -p /etc/minio           

2)下載下傳MinIO

接下來進入到我們剛剛建立的minio目錄,下載下傳MinIO程式,具體指令如下所示:

cd /home/minio/run
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio           

minio的程式很簡單,下載下傳後就一個可執行檔案。兩台伺服器都要執行如下操作,當然也可以一台伺服器上面執行,然後拷貝到另一台伺服器。

3)配置服務啟動腳本

Minio 預設9000端口,在配置檔案中加入–address “127.0.0.1:9029” 可更改端口。同時還有一些啟動參數如下所示:

  • MINIO_ACCESS_KEY:使用者名,長度最小是 5 個字元;
  • MINIO_SECRET_KEY:密碼,密碼不能設定過于簡單,不然 minio 會啟動失敗,長度最小是 8 個字元;
  • –config-dir:指定叢集配置檔案目錄;
  • –address:api 的端口,預設是9000
  • --console-address :web 背景端口,預設随機;

編寫啟動腳本(/home/minio/run/minio-run.sh)

#!/bin/bash
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=12345678
/home/minio/run/minio server --config-dir /home/minio/conf \
--address "192.168.78.102:9000" --console-address ":50000" \
http://192.168.78.102/mnt/disk1 http://192.168.78.102/mnt/disk2 \
http://192.168.78.101/mnt/disk1 http://192.168.78.101/mnt/disk2 \
           

如上示例代碼所示,我們的minio服務綁定主機192.168.1.102和端口9000,背景端口50000,配置MinIO服務的登入賬号密碼為:admin\12345678。此啟動腳本同樣需要複制到另外一台伺服器。

【溫馨提示】腳本複制時 \ 後不要有空格,還有就是上面的目錄是對應的一塊磁盤,而非簡單的在/mnt 目錄下建立四個目錄,要不然會報如下錯誤,看提示以為是 root 權限問題。part of root disk, will not be used (*errors.errorString)

4)啟動Minio叢集

MinIO配置完成後,在兩台測試伺服器上都執行該腳本,即以分布式的方式啟動MINIO服務。sh /home/minio/run/minio-run.sh

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

叢集啟動成功後,接下來分别通路節點上的MinIO背景管理頁面,兩個節點都可以通路http://192.168.78.101:50000/,http://192.168.78.102:50000/ 。賬号密碼:admin/12345678

以上,說明MinIO叢集啟動成功。

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

4.2.3 使用 nginx 負載均衡

上面我們部署好了MinIO叢集,我們知道每個叢集上的節點都可以單獨通路,雖然每個節點的資料都是一緻的,但這樣顯然不合理。接下來我們通過使用 nginx 進行負載均衡。具體的的配置如下:

upstream minio_server {
    server 192.168.78.101:9000;
    server 192.168.78.102:9000;
}
upstream minio_console {
    server 192.168.78.101:50000;
    server 192.168.78.102:50000;
}
server{
    listen       9001;
    server_name  192.168.78.101;
    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    location / {
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_ignore_client_abort on;
        proxy_pass http://minio_server;
    }
}
server{
    listen       50001;
    server_name  192.168.78.101;
    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    location / {
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_ignore_client_abort on;
        proxy_pass http://minio_console;
    }
}           

這裡就不介紹如何安裝Nginx了。不了解的同學可以檢視我之前關于Nginx的系列文章。

接下來,儲存配置并重新開機Nginx服務,然後在浏覽器中通路:http://192.168.78.101:50001/ 驗證MinIO叢集是否可以通路。

分布式檔案系統實戰,使用MinIO建構分布式檔案系統

最後

以上,我們就把分布式存儲系統介紹完了,并且介紹了目前最流行的分布式對象存儲MinIO。接下來還會介紹如何在項目中整合MinIO服務。