首頁 > 軟體

Minio基本介紹及如何搭建Minio叢集

2022-06-14 14:02:44

一、Minio介紹

1.1 Minio簡介

MinIO 是高效能的物件儲存,是為海量資料儲存、人工智慧、巨量資料分析而設計的,它完全相容Amazon S3介面,單個物件最大可達5TB,適合儲存海量圖片、視訊、紀錄檔檔案、備份資料和容器/虛擬機器器映象等。MinIO主要採用Golang語言實現,,使用者端與儲存伺服器之間採用http/https通訊協定。

1.2 部署方式:

  • 單機部署
  • 分散式部署

1.3 Minio官網

1、首頁

https://min.io/

2、下載

https://min.io/download

3、中文檔案

http://docs.minio.org.cn/docs/

二、Minio叢集

2.1 Minio叢集原理

MinIO分散式叢集是指在多個伺服器節點均部署MinIO服務,並將其組建為分散式儲存叢集,對外提供標準S3介面以進行統一存取。

MinIO叢集採用去中心化無共用架構,各節點間為對等關係,連線至任一節點均可實現對叢集的存取。在我們的方案中還選擇了Nginx的輪詢實現各個節點的負載均衡。

資料物件在MinIO叢集中進行儲存時,先進行糾刪分片,後打散儲存在各硬碟上。具體為:

  • MinIO自動在叢集內生成若干糾刪組,每個糾刪組包含一組硬碟,其數量通常為4至16塊;
  • 對資料物件進行分片,預設策略是得到相同數量的資料分片和校驗分片;
  • 而後通過雜湊演演算法計算出該資料物件對應的糾刪組,並將資料和校驗分片儲存至糾刪組內的硬碟上。

假設某MinIO叢集內糾刪組包含4塊硬碟,某資料物件名為MyObject,其隸屬儲存桶名為MyBucket,雜湊計算得到對應的糾刪組為Disk 14。那麼在Disk 14的資料路徑下,都會生成MyBucket/MyObject子路徑,子路徑中包含2個檔案,分別為儲存後設資料資訊的xl.meta和MyObject物件在該盤上的第一個分片part.1。其中,xl表示MinIO中資料物件的預設儲存格式。

2.2 術語解釋

1、S3

Simple Storage Service,簡單儲存服務,這個概念是Amazon在2006年推出的,物件儲存就是從那個時候誕生的。S3提供了一個簡單Web服務介面,可用於隨時在Web上的任何位置儲存和檢索任何數量的資料。

2、Object

儲存到 Minio 的基本物件,如檔案、位元組流,Anything...

3、Bucket

用來儲存 Object 的邏輯空間。每個 Bucket 之間的資料是相互隔離的。

4、Drive

部署 Minio 時設定的磁碟,Minio 中所有的物件資料都會儲存在 Drive 裡。

5、Set

一組 Drive 的集合,分散式部署根據叢集規模自動劃分一個或多個 Set ,每個 Set 中的 Drive 分佈在不同位置。一個物件儲存在一個 Set 上。

2.3 糾刪碼

糾刪碼是一種恢復丟失和損壞資料的數學演演算法,目前,糾刪碼技術在分散式儲存系統中的應用主要有三類,陣列糾刪碼(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)裡德-所羅門類糾刪碼和LDPC(LowDensity Parity Check Code)低密度奇偶校驗糾刪碼。Erasure Code是一種編碼技術,它可以將n份原始資料,增加m份校驗資料,並能通過n+m份中的任意n份原始資料,還原為原始資料。即如果有任意小於等於m份的校驗資料失效,仍然能通過剩下的資料還原出來。

Minio採用Reed-Solomon code將物件拆分成N/2資料和N/2 奇偶校驗塊。

在同一叢集內,MinIO 自己會自動生成若干糾刪組(Set),用於分佈存放桶資料。一個糾刪組中的一定數量的磁碟發生的故障(故障磁碟的數量小於等於校驗盤的數量),通過糾刪碼校驗演演算法可以恢復出正確的資料。

2.4 Minio叢集搭建

有兩臺伺服器:

  • 192.168.3.17
  • 192.168.3.18

1、在每臺伺服器上建立minio目錄

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

2、下載或者上傳下載好的minio二進位制檔案

官網下載地址:

https://dl.min.io/server/minio/release/linux-amd64/minio

3、叢集啟動檔案設定

Minio預設9000埠,在組態檔中加入–address “127.0.0.1:9029” 可更改埠

注意 :

  • MINIO_ACCESS_KEY:使用者名稱,長度最小是5個字元
  • MINIO_SECRET_KEY:密碼,密碼不能設定過於簡單,不然minio會啟動失敗,長度最小是8個字元
  • –config-dir:指定叢集組態檔目錄
vim /home/minio/run/minio-run.sh

叢集節點192.168.3.17內容為

#!/bin/bash
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=admin123
/home/minio/run/minio server --config-dir /etc/minio 
--address "192.168.3.17:9000" 
http://192.168.3.17/home/minio/data1 http://192.168.3.17/home/minio/data2 
http://192.168.3.18/home/minio/data1 http://192.168.3.18/home/minio/data2 

叢集節點192.168.3.18內容為

#!/bin/bash
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=admin123
/home/minio/run/minio server --config-dir /etc/minio 
--address "192.168.3.18:9000" 
http://192.168.3.17/home/minio/data1 http://192.168.3.17/home/minio/data2 
http://192.168.3.18/home/minio/data1 http://192.168.3.18/home/minio/data2 

4、建立Minio.server,將minio加入系統服務

vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/home/minio/run/
ExecStart=/home/minio/run/minio-run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

修改組態檔後需要過載入設定

systemctl daemon-reload

5、許可權修改

chmod +x /usr/lib/systemd/system/minio.service && chmod +x /home/minio/run/minio && chmod +x /home/minio/run/minio-run.sh

6、啟動叢集

systemctl start minio
systemctl enable minio

檢視叢集狀態

systemctl status minio.service -l

三、Nginx反向代理與負載均衡

3.1 安裝nginx

apt-get install nginx

nginx檔案安裝完成之後的檔案位置:

  • /usr/sbin/nginx:主程式
  • /etc/nginx:存放組態檔
  • /usr/share/nginx:存放靜態檔案
  • /var/log/nginx:存放紀錄檔

為了保證安全性,將採用https形式存取minio,下面展示再伺服器本地生成ssl證書,並且整合到nginx中。

3.2 建立SSL證書

1、建立證書目錄

[root@localhost ~]# cd /etc/nginx/
[root@localhost nginx]# mkdir ssl
[root@localhost nginx]# cd ssl/

2、生成一個RSA金鑰

[root@localhost ssl]#  openssl genrsa -des3 -out nginx.key 1024  #實際使用中看伺服器效能,如果足夠好也可以使用4096位祕鑰
Generating RSA private key, 1024 bit long modulus
.......++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for nginx.key: 123456                #輸入密碼,自定義
Verifying - Enter pass phrase for nginx.key: 123456    #確認密碼

3、生成一個證書請求

[root@localhost ssl]# openssl req -new -key nginx.key -out nginx.csr
Enter pass phrase for nginx.key:                             #輸入剛剛建立的祕密碼
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN                      #國家名稱
State or Province Name (full name) []:JiangSu            #省
Locality Name (eg, city) [Default City]:NanJing          #市
Organization Name (eg, company) [Default Company Ltd]:Dwing     #公司
Organizational Unit Name (eg, section) []:Tech     #部門
Common Name (eg, your name or your server's hostname) []:*.generalstorage.com       #注意,此處應當填寫你要部署的域名,如果是單個則直接新增即可,如果不確定,使用*,表示可以對所有generalstorage.com的子域名做認證
Email Address []:admin@generalstorage.com    #以域名結尾即可

Please enter the following 'extra' attributes
to be sent with your certificate request 
A challenge password []:        #是否設定密碼,可以不寫直接回車  
An optional company name []:    #其他公司名稱 可不寫

4、建立不需要輸入密碼的RSA證書,否則每次reload、restart都需要輸入密碼

[root@localhost ssl]# openssl rsa -in nginx.key -out nginx_nopass.key
Enter pass phrase for nginx.key:        #之前RSA祕鑰建立時的密碼
writing RSA key

5、簽發證書(由於是測試自己簽發,實際應該將自己生成的csr檔案提交給SSL認證機構認證)

[root@localhost ssl]# openssl x509 -req -days 3650 -in nginx.csr  -signkey nginx.key -out nginx.crt    
Signature ok
subject=/C=CN/ST=JiangSu/L=NanJing/O=Dwing/OU=Tech/CN=*.generalstorage.com/emailAddress=admin@generalstorage.com
Getting Private key
Enter pass phrase for nginx.key:          #RSA建立時的密碼

3.3 設定Nginx

server {
	listen      80 default_server;
	listen      [::]:80 default_server;
	server_name test.generalstorage.com;
	include 	/etc/nginx/default.d/*.conf;
	return      301 https://$server_name$request_uri;    #在80監聽埠 設定跳轉
}
server {
	listen       443 ssl http2 default_server;
	listen       [::]:443 ssl http2 default_server;
	server_name test.generalstorage.com;
	client_max_body_size 20M;
	charset utf-8;
	ssl_certificate "/etc/nginx/ssl/nginx.crt";   #
    ssl_certificate_key "/etc/nginx/ssl/nginx_nopass.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers on;
	location /{
		proxy_set_header  Host       $host;
        proxy_set_header  X-Real-IP    $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://minio_server;
	}
}
  • ssl_certificate證書其實是個公鑰,它會被傳送到連線伺服器的每個使用者端,ssl_certificate_key私鑰是用來解密的,所以它的許可權要得到保護但nginx的主程序能夠讀取。當然私鑰和證書可以放在一個證書檔案中,這種方式也只有公鑰證書才傳送到client。
  • ssl_session_timeout 使用者端可以重用對談快取中ssl引數的過期時間,內網系統預設5分鐘太短了,可以設成30m即30分鐘甚至4h。
  • ssl_protocols指令用於啟動特定的加密協定,nginx在1.1.13和1.0.12版本後預設是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。
  • ssl_ciphers選擇加密套件,不同的瀏覽器所支援的套件(和順序)可能會不同。這裡指定的是OpenSSL庫能夠識別的寫法,你可以通過 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(後面是你所指定的套件加密演演算法) 來看所支援演演算法。
  • ssl_prefer_server_ciphers on設定協商加密演演算法時,優先使用我們伺服器端的加密套件,而不是使用者端瀏覽器的加密套件。

啟動服務

[root@localhost nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost nginx]# systemctl restart nginx

本地hosts繫結域名

192.168.3.17 test.generalstorage.com

四、minio頁面展示

瀏覽器中輸入:https://test.generalstorage.com/

輸入賬號/密碼:admin/admin123

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com