前一陣子負責公司分佈式文件技術選型、搭建集羣、數據遷移等相關雜七雜八的工做,技術選型上一篇已經講過了,這裏重點聊聊集羣和遷移。html
集羣是三臺套路雲機器,8C-16G-5M * 3前端
搭建 Minio
的負載均衡集羣,官方推薦無外乎兩種方式: Docker Swarm 與 Kubernetes (K8S「K-S共8個字母所以得名」) 兩種方式,K8S 不是我負責,因此我先使用 Swarm 來搭建集羣先保證測試經過便可。linux
集羣搭建方式也很簡單,直接看官網的例子: https://docs.min.io/docs/deploy-minio-on-docker-swarmnginx
稍微用過一點 docker 的人看一下就能夠,稍微注意一點:記住集羣的 Leader 的編號、後面遷移也會用到。git
初步打算負載四個不一樣的環境github
既然用了集羣,就須要考慮多租戶的問題了,Minio 的桶最初的設想我是想單租戶用來放 COMPANYID 的,這個思想有點相似 ElasticSearch 中的 _routing,這樣能夠海量數據均勻分佈,之後的橫向擴容、數據遷移都十分的方便。可是考慮到這樣一來就沒有機器給 「測試機器」「金絲雀機器」「研發本地開發」「備用機」搭建環境了,確實有點浪費,因此通過深思熟慮改變策略:web
以域名做爲桶區分租戶,之前硬盤的數據原路寫到 Minio,換句話說一個環境一個桶,這樣目前好處也很明顯:sql
恰好前幾天看了本書《分佈式服務架構 原理、設計與實戰》,原本挺好奇的,讀一讀發現挺水的,不如叫 《近兩年常見的分佈式架構介紹》,不過速度一番也能看到一些有用的東西。做者寫了這麼一句:docker
可是我我的感受,雙寫後較難立刻發現問題,立刻修復,因此雙寫並無大規模的實踐,由於我也不肯定,雙寫後本地 IO 關掉會發生多少問題。shell
遷移的工做是最複雜、最容易遺漏的、須要咱們留心觀察,儘可能一步到位,與測試人員溝通細心測試全部相關文件內容,避免之後的麻煩
系統資源所有改成文件系統集羣,說白了就是「上雲了」,全部服務器本地 IO 都絕對不能再有。不然負載均衡時會出現 A B C 三臺機器輪詢,66.6%的概率訪問不到資源的 BUG,爲之後研發人員的調試,和測試同事找麻煩。因此這裏要儘可能找到全部的:
好比 outputSream read write flush 等關鍵參數全局搜一搜,須要下一步改成以流的方式傳到分佈式文件系統中。
其中有些通用上傳的改下能解決 50% 的問題,剩餘的就五花八門了,有定時 Task 寫到 openResty 靜態資源目錄的,有寫到系統 /mnt/xxx 下的,恰好趁機與領導碰一下,制定一套規則,涉及到 N 個微服務 + 一些報表服務 + 一些中間件微服務『壓縮服務、文件預覽服務』 等,共同調整。
軟規則,口頭 + 文檔說明,並不是在代碼指定好 Utiil + Contacts 的硬性規則,由於微服務衆多,短時間內只能作點妥協。
上面的只是上傳的一些問題,下面說說讀取的問題
以前用的是 openResty 的靜態目錄,如今遷移到文件系統天然須要前端平滑的過濾到 Minio 上,前端不能有太大的改動,先後端一塊兒調整是災難性的,我很忌諱這樣的操做。
打個比方原來前端:
/checkJpg/routing/xxx/user/xxx/xx.jpg複製代碼
遷移到 Minio 後
/minio_host/checkJpg/routing/xxx/user/xxx/xx.jpg複製代碼
注意:minio 桶禁止大寫字母
咱們不可能讓前端加個 Base_Url 由於不少都是後端早早持久化到 Mysql 或者 ES 中了,前端對此確定無能爲力。因此使用 openResty rewrite 重寫了路由,固然安裝 lua 插件也能夠。
好比這樣:
location ~^/checkJpg {複製代碼 proxy_buffering off;複製代碼 rewrite ^//checkJpg/(.*)$ /minio_host/checkJpg/$1;複製代碼 proxy_set_header Host $http_host;複製代碼 # 而後代理 checkjpg 到 minio 集羣: 複製代碼 }複製代碼
複製代碼
其實開始我考慮到了 Minio 的令牌權限問題,代理時設爲公開來桶的安全問題,要不要寫個 lua 腳本作驗證,後來發現本身特傻想多了,可能想多了,參考 行業 BAT Github 等衆多服務,也沒見誰把 OSS 搞成驗證的,因此這樣應該能夠,若之後有需求涉及到用戶敏感信息預防萬一的話,分分鐘加個驗證不是問題。
還有本地一些 IO 讀取操做,與上文的上傳同理,循序漸進的修改就能夠了。
接下來 merge 代碼以後,扔到一個分支上,而後進行老數據的遷移工做。
遷移呢,我選擇的 Minio 官方的 mc 客戶端,操做簡單容易上手,我也本身簡單整理了一下:
因爲先臨時測試 我先臨時 docker 搭建了單臺 Minio 進行測試,待測試所有經過,發佈集羣。
yum install s3cmd # centos、具體看 https://s3tools.org/repositories複製代碼
複製代碼 # linux/macos 複製代碼 wget https://dl.min.io/server/minio/release/linux-amd64/minio複製代碼 chmod +x minio複製代碼 ./minio server /data複製代碼
先啓動一下看看 私鑰 而後 nohup
nohup ./minio server /data &
複製代碼
# linux/macos /home/minio/複製代碼 wget https://dl.minio.io/client/mc/release/linux-amd64/mc複製代碼 chmod +x mc複製代碼 ./mc --help複製代碼
mc 添加 minio 地址
# mc config host add <alias> <ip:port> <access key> <> <aws相關版本 s3v4便可>複製代碼 mc config host add qmenhu http://localhost:9000 4NMXJ94DEJHKTSI42B9D Kwbypq+4sySAqWl7AN0kSfZT5jLJfTq96B3CdMIO S3v4複製代碼
建立須要的桶
mc mb qmenhu/checkjpg 複製代碼 # 全部的大寫都是不容許的 具體:https://github.com/minio/minio/pull/5095#discussion_r147351020複製代碼 # 其實也能夠代理回來大寫的 :9000/minio/checkJpg複製代碼
設爲公開 (無祕鑰訪問) 公開的桶,無需祕鑰訪問、能夠硬盤寫入資源「硬盤寫入可否同步未測」
mc policy public qmenhu/checkjpg複製代碼
Access permission for qmenhu/checkjpg
is set to public
先配置下
複製代碼vim ~/.s3cfg複製代碼
複製代碼# 設置endpoint複製代碼host_base = 127.0.0.1:9000複製代碼host_bucket = 127.0.0.1:9000複製代碼bucket_location = us-east-1複製代碼use_https = False #若是升級了 https 就放開複製代碼 複製代碼# 設置access key和secret key,「啓動時的,通常不會變」複製代碼access_key = 4NMXJ94DEJHKTSI42B9D複製代碼secret_key = Kwbypq+4sySAqWl7AN0kSfZT5jLJfTq96B3CdMIO複製代碼 複製代碼# 啓用S3 v4版本簽名API複製代碼signature_v2 = False複製代碼
複製代碼
執行遷移命令
s3cmd sync /usr/local/nginx/html/checkJpg/ s3://checkjpg #從 本地 到 minio複製代碼 複製代碼 #s3cmd sync s3://checkjpg /usr/local/nginx/html/checkJpg/ 從 minio 到 本地複製代碼
主要取決於文件個數+磁盤速度「14888圖片| 1224Mb | 719s」
完成以後,刪掉 Linux 服務器本地原有的資源,gitLab-runner 部署剛纔 checkout 的你們調整的分支,交給測試的同事測試。
結果還能夠,測試的同窗們1個小時給咱們提了 20+ 個 BUG,不過都輕輕鬆的改完了,以後的陸陸續續的小問題也很快就迎刃而解了。那麼單臺測試效果很理想,只須要遷移到集羣就OK了
後面的重複工做我就不作了,交給運維來作,說明關鍵點,注意儘可能往 Swarm 指定的 Leader 機器來寫數據,方便「從」機器同步數據。
修改寫
修改讀
檢查各個須要調整的服務
單臺遷移數據測試「金絲雀」
測試集羣
發佈
不只是文件系統,經過此次的遷移冒險,之後遷移任何集羣均可以借鑑。此文非技術性文章,純屬分享經驗。
首發地址 :github.com/pkwenda/Blo…