前置條件
官網:https://www.minio.org.cn/download.shtml#/kubernetes
命令
# 查看系統上的網絡連接和監聽端口信息
netstat -tpnl
# 檢查系統的指定端口占用情況
sudo netstat -tuln | grep 9000systemctl status firewalld
# 臨時關閉
systemctl stop firewalld
# 永久關閉
systemctl disable firewalld
安裝
官網有不同系統的下載安裝方式
Linux
注意:./是當前目錄
# 下載
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 修改權限
chmod +x minio
# 啟動
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
#也可以下面這樣,他會默認用戶名和密碼
./minio server /mnt/data --console-address ":9001"
- MINIO_ROOT_USER 指定 MinIO 的用戶名;
- MINIO_ROOT_PASSWORD 指定 MinIO 的密碼;
- /mnt/data 指定 MinIO 服務器用于存儲數據的目錄;
- console-address “:9001” 指定 MinIO 控制臺的監聽地址和端口
后臺啟動(&結束):./minio server /mnt/data --console-address “:9001” &
docker
# 安裝前查看系統是否已經安裝了Docker
yum list installed | grep docker
# 卸載Docker 把查出來的都卸載就行了
yum remove docker.x86_64 -y
# 安裝 這種方式安裝的Docker版本比較舊;(查看版本:docker -v)
yum install docker -y
# 安裝最新版的Docker
yum install yum-utils -y
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
安裝啟動
# 搜索MinIO鏡像
docker search minio
# 拉取MinIO鏡像
docker pull minio/minio
# 啟動MinIO容器 不指定的話默認最新 這個啟動命令官網是 podman 改成docker
docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address :9001
沒有指定用戶名和密碼,默認是 minioadmin
- p (映射端口) 虛擬機 : 容器
- minio/minio 鏡像名
- server 啟動參數
- /data 數據文件存放的路徑
- console-address :9001 web 訪問地址和端口
windows
下載 minio:https://dl.min.io/server/minio/release/windows-amd64/minio.exe
進入到 minio.exe 所在的目錄
執行 minio.exe server D:\minio\data 啟動 minio 服務,其中 D:\minio\data 是 MinIO 存儲數據的目錄路徑
在瀏覽器輸入:http://localhost:9000/ ,登錄 MinIO 服務器 web 管理后臺,默認用戶名密碼都是 minioadmin
springboot 集成
Bucket 是存儲 Object 的邏輯空間,每個 Bucket 之間的數據是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾;
Object 是存儲到 MinIO 的基本對象,對用戶而言,相當于文件;
添加依賴
https://min.io/docs/minio/linux/developers/minio-drivers.html#java
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.10</version>
</dependency>
配置類 MinioClientConfig
@Configuration
public class MinioClientConfig {@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint("http://192.168.64.100:9000").credentials("minioadmin", "minioadmin").build();}
}
測試連接
@SpringBootTest
public class TestMain {@Autowiredprivate MinioClient minioClient;@Testpublic void test() {System.out.println(minioClient);}
}
MinioClient 的常用 API:
-
bucketExists():用于檢查指定的存儲桶是否存在,返回布爾值,表示存儲桶是否存在;
-
makeBucket():用于創建一個新的存儲桶(bucket),需要指定存儲桶的名稱;
-
listBuckets():用于列出用戶有權訪問的所有存儲桶,返回存儲桶的列表;
-
removeBucket():用于刪除一個已存在的存儲桶(bucket),刪除失敗會拋出異常;
-
putObject():用于上傳文件到指定的存儲桶;
-
statObject():用于檢查指定的對象(文件)的狀態;
-
getPresignedObjectUrl():用于生成一個對象(文件)的簽名 URL,以便可以通過 HTTP 訪問;
-
getObject():用于從指定的存儲桶中下載文件;
-
listObjects():用于列出指定存儲桶中的所有對象(文件);
-
removeObject():用于刪除指定存儲桶中的對象,需要指定存儲桶名稱和對象鍵;
Buckets 代碼實現
@SpringBootTest
public class TestBucket {@Autowiredprivate MinioClient minioClient;@Testpublic void removeBucket() throws Exception {// 刪除bucketminioClient.removeBucket(RemoveBucketArgs.builder().bucket("test").build());}@Testpublic void listBuckets() throws Exception {// 列出所有有權訪問的 bucketminioClient.listBuckets().forEach(bucket -> {System.out.println(bucket.name()+bucket.creationDate());});}@Testpublic void createBucket() throws Exception {// 創建bucketminioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());}@Testpublic void bucketExists() throws Exception {boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());System.out.println("test目錄是否存在:"+bucketExists);}@Testpublic void test() {System.out.println(minioClient);}
}
Object 代碼實現
@SpringBootTest
public class TestObject {@Autowiredprivate MinioClient minioClient;@Testpublic void removeObject() throws Exception {//用于刪除指定存儲桶中的指定對象(文件)minioClient.removeObject(RemoveObjectArgs.builder().bucket("test").object("1.jpg").build());}@Testpublic void listObjects() {//用于列出指定存儲桶中的所有對象(文件)Iterable<Result<Item>> test = minioClient.listObjects(ListObjectsArgs.builder().bucket("test").build());test.forEach(result -> {try {Item item = result.get();System.out.println(item.objectName());} catch (Exception e) {throw new RuntimeException(e);}});}@Testpublic void getObject() throws Exception {//用于從指定的存儲桶中下載文件GetObjectResponse response = minioClient.getObject(GetObjectArgs.builder().bucket("test").object("1.jpg").build());//io.minio.GetObjectResponse@6a5dd083System.out.println(response);System.out.println(response.transferTo(new FileOutputStream("D:\\Desktop\\projects\\springoot3-vues\\minio\\day01\\src\\main\\resources\\static\\1.jpg")));}@Testpublic void getPresignedObjectUrl() throws Exception {//用于生成一個對象(文件)的簽名URL,以便可以通過HTTP訪問String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket("test").expiry(3, TimeUnit.MINUTES)//設置過期時間.object("1.jpg").method(Method.GET).build());System.out.println("url = " + url);}@Testpublic void statObject() throws Exception {StatObjectResponse test = minioClient.statObject(StatObjectArgs.builder().bucket("test").object("1.jpg").build());//用于檢查指定的對象(文件)的狀態;//ObjectStat{bucket=test, object=1.jpg, last-modified=2024-05-10T08:30:35Z, size=1145359}System.out.println(test);}@Testpublic void putObject() throws Exception {File file = new File("D:\\Pictures\\0.jpg");ObjectWriteResponse test = minioClient.putObject(PutObjectArgs.builder().bucket("test").object("1.jpg")//上傳到minio后的文件名.stream(new FileInputStream(file), file.length(), -1).build());//test = io.minio.ObjectWriteResponse@1815577bSystem.out.println("test = " + test);ObjectWriteResponse test1 = minioClient.uploadObject(UploadObjectArgs.builder().bucket("test").object("1.jpg").filename("D:\\Pictures\\0.jpg").build());}
}
集群
糾刪碼模式部署
糾刪碼(Erasure Code)簡稱 EC,是一種數據保護方法,也是一種算法;
MinIO 對糾刪碼模式的算法進行了實現,采用 Reed-Solomon code(簡稱 RScode)糾錯碼將對象拆分成 N/2 數據和 N/2 奇偶校驗塊,Reed Solomon 利用范德蒙矩陣(Vandermonde matrix)、柯西矩陣(Cauchy matrix)的特性來實現;
即將數據拆分為多個數據塊和多個校驗塊,分散存儲在不同的磁盤上,即使在部分磁盤損壞或丟失的情況下,也可以通過剩余的數據塊和校驗塊恢復出原始數據;
舉個例子,現在有 12 塊磁盤,一個對象數據會被分成 6 個數據塊、6 個奇偶校驗塊,你可以損壞或丟失任意 6 塊磁盤(不管其是存放的數據塊還是奇偶校驗塊),你仍可以從剩下的磁盤中恢復數據
linux 啟動糾刪碼模式
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 修改權限
chmod +x minio
# 單機多磁盤的部署 記得執行上行命令 在/usr/local/minio下 /opt/minio/data 數據卷目錄
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12}
單機多磁盤的部署,會報錯
執行命令:lsblk
lsblk 是 Linux 中的一個命令,用于列出所有可用的塊設備(數據存儲設備,如硬盤、閃存驅動器)的信息,如設備名稱、大小、掛載點等;
執行命令:lsblk
lsblk 是 Linux 中的一個命令,用于列出所有可用的塊設備(數據存儲設備,如硬盤、閃存驅動器)的信息,如設備名稱、大小、掛載點等;
添加一塊磁盤,上圖是沒加磁盤
# 不重啟,直接刷新磁盤數據總線,獲取新加的磁盤
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done
再次執行 lsblk
啟動糾刪碼
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12}
登錄 minio 查看
上傳一個文件查看數據目錄發現每個目錄都存了文件
linux 啟動糾刪碼模式-后臺啟動
# 這樣就不能設置用戶名和密碼了,咱也不知道為啥一會必須設置一會不能設置,默認用戶名密碼 minioadmin 不知道是不是版本原因
nohup /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12} > /opt/minio/data/minio.log 2>&1 &
- nohup: 這是一個 Unix 命令,用于運行另一個命令在后臺,并且忽略掛起(HUP)信號,也就是即使你退出了終端或關閉了會話,該命令也會繼續運行;
- > /opt/minio/data/minio.log: 這部分是將標準輸出(stdout)重定向到 /opt/minio/data/minio.log 文件,這意味著 MinIO 服務器的所有正常輸出(如啟動信息、狀態更新等)都會被寫入到這個日志文件中;
- 2>&1: 這部分是將標準錯誤輸出(stderr)重定向到標準輸出(stdout),即輸出到 /opt/minio/data/minio.log 文件,這樣,無論是標準輸出還是錯誤輸出,都會被寫入到同一個日志文件中;
- &: 這個符號是在命令的末尾,用于將命令放到后臺執行,也就是即使你啟動了 MinIO 服務器,你的終端或 shell 會話也不會被阻塞,你可以繼續執行其他命令;
docker 啟動糾刪碼模式
docker logs minio
# 這里的密碼也不能少于八位 不然容器就會一直處于重啟狀態(查看日志就會說密碼少于八位了)
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name=minio \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=password" \
-v /home/minio/data1:/data1 \
-v /home/minio/data2:/data2 \
-v /home/minio/data3:/data3 \
-v /home/minio/data4:/data4 \
-v /home/minio/data5:/data5 \
-v /home/minio/data6:/data6 \
-v /home/minio/data7:/data7 \
-v /home/minio/data8:/data8 \
--privileged=true \
minio/minio server /data{1...8} \
--console-address ":9000" \
--address ":9001"
上傳個文件并使用 tree 命令查看目錄 /home/minio
安裝 tree:yum install tree
集群部署-Linux
糾刪碼模式是單機多磁盤方式,如果這臺機器宕機了,那么 minio 就不能對外提供服務了
準備 4 臺機器;(根據 MinIO 的架構設計,至少需要 4 個節點來構建集群,這是因為在一個 N 節點的分布式 MinIO 集群中,只要有 N/2 節點在線,數據就是安全的,同時,為了確保能夠創建新的對象,需要至少有 N/2+1 個節點,因此,對于一個 4 節點的集群,即使有兩個節點宕機,集群仍然是可讀的,但需要有 3 個節點才能寫數據;)
準備四臺虛擬機—下面的操作四臺都需要執行
192.168.64.100
192.168.64.102
192.168.64.103
192.168.64.104
minio 集群需要獨占磁盤塊,不能使用 Linux 的 root 磁盤塊
都添加一塊硬盤去目錄看–> linux 啟動糾刪碼模式
# 不重啟,直接刷新磁盤數據總線,獲取新加的磁盤
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done
將添加的磁盤格式化為 xfs 格式:
mkfs.xfs /dev/sdb
將磁盤掛載到 minio 的存儲目錄:
# 遞歸創建文件夾 若文件夾不存在
mkdir -p /opt/minio/data
mount /dev/sdb /opt/minio/data
開機自動掛載-Linux
開機自動掛載,不配置自動掛載的話,重啟之后需要手動進行掛載
一、修改 /etc 下的 fstab 文件
vim /etc/fstab
source /etc/fstab
在最后一行加入以下內容
/dev/sdb /opt/minio/data xfs defaults 0 0
- /dev/sdb 是設備的路徑。
- /opt/minio/data 是掛載點。
- xfs 是文件系統類型。
- defaults 是一組默認選項。
- 0 0 是用于文件系統檢查的選項。
注意:不要寫錯和少寫,我沒有寫文件系統類型和默認選項,重啟后進入了緊急模式
二、修改 /etc 下的 rc.local 文件或者 /etc/rc.d 下的 rc.local 文件
這個配置文件會在用戶登陸之前讀取,這個文件中寫入了什么命令,在每次系統啟動時都會執行一次。
vim /etc/rc.local
# 加入 mount /dev/sdb /opt/minio/data
# 重新加載 rc.local 文件
source /etc/rc.local
每臺機器上安裝好 minio;(安裝在 /usr/local/minio 目錄下,版本統一)
# 下載
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 修改權限
chmod +x minio
在四臺虛擬機的 /usr/local/minio 下編寫 minio.sh 啟動腳本
#!/bin/bash
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=password
/usr/local/minio/minio server --config-dir /etc/minio --address :9000 --console-address :9001 \
http://192.168.64.100/opt/minio/data/data1 http://192.168.64.100/opt/minio/data/data2 \
http://192.168.64.100/opt/minio/data/data3 http://192.168.64.100/opt/minio/data/data4 \
http://192.168.64.102/opt/minio/data/data1 http://192.168.64.102/opt/minio/data/data2 \
http://192.168.64.102/opt/minio/data/data3 http://192.168.64.102/opt/minio/data/data4 \
http://192.168.64.103/opt/minio/data/data1 http://192.168.64.103/opt/minio/data/data2 \
http://192.168.64.103/opt/minio/data/data3 http://192.168.64.103/opt/minio/data/data4 \
http://192.168.64.104/opt/minio/data/data1 http://192.168.64.104/opt/minio/data/data2 \
http://192.168.64.104/opt/minio/data/data3 http://192.168.64.104/opt/minio/data/data4 &
給腳本修改權限
chmod 744 minio.sh
啟動腳本
# 如果在 minio 的安裝目錄下 /usr/local/minio
./minio.sh
# 若不在安裝目錄下,則寫全路徑
/usr/local/minio/minio.sh
啟動可能會報錯
查看防火墻的狀態關閉防火墻
systemctl status firewalld
# 臨時關閉
systemctl stop firewalld
# 永久關閉
systemctl disable firewalld
腳本加入開機啟動-Linux
在 /usr/lib/systemd/system 下編寫服務
vim /usr/lib/systemd/system/minio.service
加入以下內容
#固定寫法,換一下路徑即可
#!/bin/sh
[Unit]
Description=xxx-service
Documentation=https://docs.minio.io/
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
# 腳本的位置
ExecStart=/usr/local/minio/minio.sh
WorkingDirectory=/opt/minio
PrivateTmp=true
[Install]
WantedBy=multi-user.target
添加權限
chmod +x /usr/lib/systemd/system/minio.service
可以一臺一臺的新建腳本,也可以用下列命令把建好的腳本拷貝給其他機器
# 先ssh連一下目標服務器
ssh 192.168.64.102
# 退出 192.168.64.102
exit
scp -r /usr/lib/systemd/system/minio.service 192.168.64.102:/usr/lib/systemd/system/minio.service
如果 ssh 由于秘鑰問題連不上可用下面命令
ssh -o StrictHostKeyChecking=no 192.168.64.100
# 重新連接
啟動
#將服務添加到開機自啟服務中
systemctl enable minio.service
#系統服務刷新
systemctl daemon-reload
#啟動服務
systemctl start minio.service
#查看服務狀態
systemctl status minio
#停止服務
systemctl stop minio
#取消開機自啟
systemctl disable minio
集群部署-Docker
看了好多人寫的,都沒成功,放著吧
Nginx 負載均衡
官網:https://nginx.org/en/download.html
Nginx 下載安裝
# 下載 下載到當前目錄
wget https://nginx.org/download/nginx-1.26.0.tar.gz
# 安裝相關庫
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
# 解壓
tar -zxvf nginx-1.26.0.tar.gz
# 切換至解壓后的nginx主目錄
cd nginx-1.26.0/
# 在nginx主目錄nginx-1.26.0下執行命令 --prefix是指定nginx安裝路徑
./configure --prefix=/usr/local/nginx
# 執行命令進行編譯
make
# 執行命令進行安裝
make install
# 安裝完成建議刪除 nginx-1.26.0 nginx 安裝在了/usr/local
# 這個刪除的是下載解壓的文件
rm -rf nginx-1.26.0
Nginx 啟動
# -c是指定配置文件
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 重啟
/usr/local/nginx/sbin/nginx -s reload
Nginx 關閉
# 會將已經進來的請求處理完后再關閉
# 找出nginx的進程號
ps -ef | grep nginx
# QUIT 必須是大寫
kill -QUIT 主pid
# 快速關閉會直接關閉,已經進來的請求也不會處理
ps -ef | grep nginx
# TERM 必須是大寫
kill -TERM 主pid
Nginx配置檢查
# 當修改Nginx配置文件后,可以使用Nginx命令進行配置文件語法檢查,用于檢查Nginx配置文件是否正確
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
Nginx 修改配置文件
1、在http模塊配置upstream
upstream api {server 192.168.64.100:9000;server 192.168.64.102:9000;server 192.168.64.103:9000;server 192.168.64.104:9000;
}
upstream webui {server 192.168.64.100:9001;server 192.168.64.102:9001;server 192.168.64.103:9001;server 192.168.64.104:9001;
}
2、在server模塊里配置
location / {#root html;#index index.html index.htm;proxy_pass http://api;proxy_set_header Host $http_host;proxy_set_header Server MinIO;proxy_set_header Accept-Ranges bytes;}
再寫個server 指定 webui
server {listen 50000;server_name localhost;location / {proxy_pass http://webui;}
}
測試訪問
在地址欄輸入:http://192.168.64.100:50000/ 可以正常訪問 minio 后臺
常見問題
服務器時間不同步
The difference between the request time and the server’s time is too large.
解決:
yum install ntpdate -y
ntpdate pool.ntp.org
上傳的文件默認是不能訪問的
http://ip:9000/存儲桶/文件名
一、后臺修改 bucke t 的訪問策略
二、代碼實現
@Testpublic void createBucket() throws Exception {String bucketName = "test1";boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!bucketExists) {// 創建bucketminioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}//創建的時候設置訪問策略 2012-10-17 不能改String policyJsonString = "{\n" +" \"Version\": \"2012-10-17\",\n" +" \"Statement\": [\n" +" {\n" +" \"Effect\": \"Allow\",\n" +" \"Principal\": {\"AWS\": [\"*\"]},\n" +" \"Action\": [\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\n" +" \"Resource\": [\"arn:aws:s3:::"+bucketName+"\"]\n" +" },\n" +" {\n" +" \"Effect\": \"Allow\",\n" +" \"Principal\": {\"AWS\": [ \"*\"]},\n" +" \"Action\": [\"s3:DeleteObject\",\"s3:GetObject\", \"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\n" +" \"Resource\": [\"arn:aws:s3:::"+bucketName+"/*\"]\n" +" }\n" +" ]\n" +"}";minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(policyJsonString).build());}