PHP 依賴鏡像出問題後,阿里工程師的一頓“神操作“令人叫絕

PHP 依賴鏡像出問題後,阿里工程師的一頓“神操作“令人叫絕

阿里妹導讀:上個月,PHP開發者在網上紛紛反映出現 Composer 鏡像無法訪問的問題。阿里雲內部一位 90 後工程師顧詠連夜開工排查,快速解決問題後,他在問題群裡收到了一大波來自用戶的紅包。顧詠最後謝絕了紅包,接受了阿里技術的邀請,來聊一聊這次事件問題背後的技術。

一則消息

前段時間,因為國際網絡不穩定問題,國內各大Composer鏡像都出現了間歇性無法訪問情況,這對國內PHPer的生產工作造成了極大的影響。受此影響,國內各家Composer服務都出現了相同的問題,而阿里工程師的這個解決方案堪稱“簡單粗暴”,效率高到沒朋友!

阿里雲的 PHP Composer 最初研發靈感源自阿里內部一位 90 後工程師顧詠。作為負責開發阿里雲產品的 PHP SDK的工程師,他在工作中經常遇到同一個問題:儘管已經根據PHP 最新版本發佈了新的 SDK,但由於鏡像工具沒有實時同步版本,導致用戶安裝不成功。 此外,雲效平臺企業開發者對鏡像工具的使用體驗,同樣受到這個問題的困擾,為此,阿里技術團隊一起設計開發並開源了這套阿里雲版鏡像工具。

此次國際網絡不穩定導致的鏡像問題,阿里工程師顧詠第一時間響應了PHPer的訴求,連夜排查問題。 “我們程序員都離不開這個,越早解決越好”,最後終於成功定位問題、完成系統更新,解決了大家的燃眉之急。群裡的開發者主動發紅包向其致謝,顧詠十分感動,然後拒絕了他:“應該做的,紅包不能收。”

PHP 依賴鏡像出問題後,阿里工程師的一頓“神操作“令人叫絕

對於PHP 開發者來說,Composer 是必不可少的依賴包管理工具,作為存儲 Composer 依賴包的 Packagist,卻時常因為網絡問題讓國內開發者頭痛不已,國內開發者安裝依賴通常很慢,或者超時導致無法安裝,卻又沒有穩定的鏡像服務可以使用。Packagist 鼓勵開發者建立鏡像,但目前的鏡像也有諸多不穩定、不可靠的情況。

阿里雲Composer 鏡像的推出

今年七月,阿里雲提供了 Packagist/Composer 全量鏡像服務,其秒級同步的能力、快速穩定的下載服務、頁面上的動態數據展示得到了開發者的一致好評。

PHP 依賴鏡像出問題後,阿里工程師的一頓“神操作“令人叫絕

阿里雲Composer 鏡像的升級

11月16日開始,由於 Composer 鏡像出現了間歇性無法訪問情況,不少網友通過阿里雲釘釘服務群反應阿里雲鏡像出現不可用的情況,主要 zlib_decode 和 404 錯誤。在測試其他鏡像作對比時發現,其他鏡像也存在此類情況。接到反饋後,我們第一時間進行問題排查:

問題定位:阿里工程師立即查看系統狀態和日誌,未發現異常。初步懷疑是由於 CDN 接入層收國際網絡延遲導致不可用。

驗證:阿里工程師筆將相同的數據回傳至國內 Bucket ,在今經多次、多地域直接訪問測試,均成功。

決心升級:以往偶爾遇到這種問題,都被當做正常現象對待,而此次持續時間較長,影響面廣,為了徹底解決這類問題,阿里決定升級鏡像系統部署方案,直接將最新數據傳回國內。

已知現有 Packagist 鏡像的問題

1)同步的數據不是 Packagist 的根數據。事實上,官方的根數據不對外公開,開發者平時所訪問的數據是鏡像,甚至是鏡像的鏡像。當客戶端發起請求後,請求會被官方 DNS 指向其他的鏡像站,這些鏡像數據與根數據之間已經存在延遲。而由於國際網絡或系統設計原因,曾經出現初次官方鏡像站與根數據長達數小時不同步 的情況。

2)沒有處理代碼包 dist。大多數依賴包的源代碼存儲在在github、gitlab上,因為網絡問題,也會導致使用者下載速度慢,甚至下載失敗。這也是鏡像站需要關注處理的,一般鏡像只提供 meta 數據(包數據)。例如官方推薦的 Webysther's mirror code 鏡像同步系統就不處理dist。

3)本地文件存儲。目前已知的其他鏡像系統,是將文件存儲在本地,或至少先存儲在本地再上傳,這樣不僅會消耗大量本地磁盤空間,還存在系統最大子目錄限制,會使得系統存在致命瓶頸。優化版本使用的軟連接方案也會隨著包的無限增長需要重構。

4)單進程,性能表現不佳,消耗 CPU、內存資源大。

且處理數據耗時長,更新速度慢,系統的設計導致任務不能分發,且同步時間間隔越長,同步的時間越常。

5)沒有數據錯誤統計,官方源數據存在錯誤,也需要直觀的展示,讓開發者瞭解情況。

6)系統同步狀態、數據不可視化,鏡像是否已更新?什麼時候更新?今天更新了多少?下一次什麼時候更新?這些數據開發者都不知道。

阿里雲鏡像的優勢

阿里雲鏡像的架構核心目標是實時、快讀、穩定、可移植、可擴展,且具備對數據進行自我修復的能力。那麼阿里雲鏡像和其他鏡像有什麼區別?阿里雲鏡像又是如何做到秒級同步的呢?

官方合作

在數據上,阿里雲與 Packagist 官方合作,經過和 Packagist 溝通,阿里雲在距離官方根數據最近的城市節點部署了服務器,同時阿里雲的服務器 IP地址 被加入 Packagist 白名單,允許直接、頻繁地訪問其根數據(Meta)。獲取和解析 Meta 後,系統從代碼倉庫中下載源代碼壓縮包,再通過阿里雲洛神網絡不限帶寬的將數據傳回國內,這從最大程度上保證了國內用戶可以及時、快速地獲取最新數據。開發者使用 Composer 安裝依賴的數據,都是鏡像,甚至是鏡像的鏡像。例如官方在新加坡的鏡像,就數次出現長達數小時的不更新,以此為鏡像源的鏡像站就無法為開發者提供正常的服務。

實時

阿里雲實時同步源數據,對於以下場景的用戶具有十分重要的意義:

1. 迫切需要更新補丁依賴包的使用者。當一個依賴包被發現有bug,得到修復後使用者往往需要第一時間升級更新,鏡像同步的越及時、服務越穩定,使用者的補丁修復的也就越早,止損也就更及時。

2. 檢查依賴包發佈狀態的包開發者來說。對於包的開發者,在發佈包後,能儘快的檢查發佈狀態,通過安裝命令驗證其作品的可用性。

自主研發高性能系統

同步系統由阿里雲自主研發,採用 Golang 編寫,使用 Redis 做任務隊列,心跳協程將更新的數據文件分發到任務隊列,30個協程各自分工獲取數據傳回國內OSS。這意味著所要同步的數據不再是一個單進程按照順序一個一個傳輸,而是多個協程,甚至是多臺機上的多個協程一起分工,這又將同步時間大幅度縮短。

只分發有效任務

在任務分發的機制上,實現了任務不重複,由於內存會記錄已經成功處理過的任務和已分發的任務,所以不會分發舊文件,也不會發布相同的任務,這避免無效、重複工作,更是大幅度的減少了工作量,降低延遲。

重試機制

對於數據獲取錯誤的情況,系統具有重試機制,對於因為網絡問題暫時訪問錯誤的源數據、代碼包,系統會重試請求。

文件存儲

阿里雲 Composer 全量鏡像,依靠阿里雲強大的 OSS 存儲源數據和代碼壓縮包,不佔用本地磁盤,在避免最大子目錄的問題的同時,還能輕鬆移植、擴展系統。

錯誤記錄

記錄和統計官方錯誤,阿里雲將官方記錄當中的一些錯誤記錄下來,在方便內部隨時排查問題的同時,也能更準確的瞭解 Packagist 的情況。

自我修復

處理不成功的任務不會被記錄,在間隔時間極短的下一次同步中會得到修復。而執行錯誤的任務則會使用重試修復。

如果需要人工修復,只需刪除響應的 KEY,系統即可重新執行並更新狀態。

CDN 支撐

鏡像數據對外,接入了阿里雲全國 CDN 節點,阿里雲強大的網絡基礎設施保證了開發者如絲般順滑的使用體驗。

狀態數據可視化

鏡像系統數據狀態可視,在阿里雲 Composer 全量鏡像的官方頁面上,動態顯示 Packagist 最後更新時間,阿里雲同步耗時、下一次刷新 CDN 的時間,系統同步的狀態和數據讓開發者“心中有數”。

PHP 依賴鏡像出問題後,阿里工程師的一頓“神操作“令人叫絕

免費全量鏡像站,開發者的福音

阿里做鏡像站的歷史最早可追溯至2011年,從最開始阿里內部的需求,擴展到為更廣大的開發者免費投入資源,提供更快、更穩定的鏡像資源。從最初的幾臺設備,成長為現在覆蓋主流語言和主流操作系統的全量鏡像站。並且,在這個過程中,一直堅持免費為開發者提供鏡像資源,不斷追求更快、更穩定的服務。

目前阿里雲鏡像站不僅提供Centos、Ubuntu、 Fedora、Arch Linux、 Deepin 等10多個發行版的軟件安裝源和ISO下載服務, 還提供Python, Php 等多款開發語言的包管理鏡像服務以及nvidia-cuda, homebrew, kubernetes等 10 多款垂直倉庫的鏡像服務。每月下載包文件數量已經超過 7 億次。

國內鏡像所做的是緩存所有安裝包和元數據到自己的服務器,並通過國內 CDN 進行加速,實現 Composer require/install/update 的操作,並達到最快速度。阿里雲的 PHP Composer 全量鏡像能夠實現與 PHP Packagist 官方實時同步,通過自研的鏡像同步系統,實現多協程分工同步、數據自我修復的能力,在保證快速同步的同時,也能快速修復因網絡不穩定造成的數據錯誤。

最後,歡迎在留言區說出你的使用體驗。


分享到:


相關文章: