在生產(chǎn)環(huán)境中使用時(shí),務(wù)必先經(jīng)過(guò)測(cè)試環(huán)境測(cè)試,測(cè)試通過(guò)后再上生產(chǎn)環(huán)境避免造成生產(chǎn)事故,若配置不當(dāng),可能引發(fā)性能、安全或邏輯等問(wèn)題甚至造成生產(chǎn)事故?? 背景:存儲(chǔ)告急由于每個(gè)文件都提供了url地址鏈接,將文件遷移走肯定是不行的,如何擴(kuò)容且不中斷服務(wù)?
隨著業(yè)務(wù)快速增長(zhǎng),我們的文件存儲(chǔ)服務(wù)器 /home/data/files2
磁盤使用率已飆升至 95%,觸發(fā)了嚴(yán)重預(yù)警,準(zhǔn)備擴(kuò)容
核心需求:
- ? 新增一塊4TB硬盤掛載至
/data2/app/files2
- ? 文件無(wú)論放在哪里原有訪問(wèn)URL不能變(如
http://a.域名.com/files2/a.txt
) - ? 支持未來(lái)持續(xù)橫向擴(kuò)展
- ? 不重啟服務(wù)、不改代碼、不停機(jī)遷移
?? 方案:Nginx智能路由實(shí)現(xiàn)無(wú)縫擴(kuò)容
我們采用 主備式多路徑存儲(chǔ)架構(gòu),利用Nginx的 try_files
和命名location功能,實(shí)現(xiàn):“先查舊盤,找不到自動(dòng)查新盤,用戶端完全無(wú)感”
使用技術(shù) nginx命名location
示例
location @name { ... }
官方文檔原文是這樣解釋的:The “@” prefix defines a named
location. Such a location is not used for a regular
request processing, but instead used for request redirection.
They cannot be nested, and cannot contain nested locations.
大概意思:“@”前綴定義了一個(gè)命名位置。這樣的位置不用于常規(guī)請(qǐng)求處理,而是用于請(qǐng)求重定向。它們不能嵌套,也不能包含嵌套位置。
? 實(shí)現(xiàn)目標(biāo)架構(gòu)流程圖
??? 實(shí)戰(zhàn)配置:
新增一塊盤的情況
nginx
server { listen 80;
server_name a.域名.com;
location ~* ^/files2/ {alias /home/data/files2/;
try_files $uri @newfile_storage;
}
location @newfile_storage {
alias /data2/app/files2/;
try_files $uri =404;
}
}
新增多塊盤的情況
nginx
location ~*^/files2/ {
root /home/data;
try_files $uri $uri/@filestorage1;
}
location @filestorage1 {
alias /data2/app/files2/1/;
try_files $uri $uri/@filestorage2;
}
location @filestorage2 {
alias /data2/app/files2/2/;
try_files $uri $uri/@filestorage3;
}
location @filestorage3 {
alias /data3/app/files3/;
try_files $uri $uri /=404;
}
?? 配置解析:
1. 主入口location
nginx
location ~* ^/files2/ {
alias /home/data/files2/;
try_files $uri @newfile_storage;
}
~* ^/files2/:不區(qū)分大小寫(xiě)匹配/files2/路徑
alias:映射到物理路徑
try_files:優(yōu)先查找主存儲(chǔ),找不到則跳轉(zhuǎn)命名位置徑@
newfile_storage
2. 命名location(新存儲(chǔ))
ngin
location @newfile_storage {
alias /data2/app/files2/;
try_files $uri =404;
}
@newfile_storage:內(nèi)部標(biāo)記,外部無(wú)法直接訪問(wèn)
=404:最終未找到返回404
# 重新加載配置
# 遷移后驗(yàn)證
mv 2023-01-video.png /data2/app/files2/
curl -I http://a.domain.com/files2/2023-01-video.png
方案優(yōu)勢(shì)總結(jié)
| |
---|
零代碼改動(dòng) | |
URL永久有效 | |
客戶端無(wú)感知 | |
易擴(kuò)展 | 可擴(kuò)展數(shù)多存儲(chǔ)節(jié)點(diǎn) |
安全可控 | |
結(jié)語(yǔ)
存儲(chǔ)擴(kuò)容不應(yīng)成為業(yè)務(wù)瓶頸。通過(guò)Nginx的 try_files
+ named location
機(jī)制,實(shí)現(xiàn)了:“程序不改、URL不變、遷移無(wú)感、擴(kuò)展靈活”
適合系統(tǒng)做低成本、高可用的存儲(chǔ)橫向擴(kuò)容。
閱讀原文:原文鏈接
該文章在 2025/8/11 10:31:36 編輯過(guò)