
阿裡妹導讀:上個月,PHP開發者在網上紛紛反映出現 Composer 鏡像無法通路的問題。阿裡雲内部一位 90 後工程師顧詠連夜開工排查,快速解決問題後,他在問題群裡收到了一大波來自使用者的紅包。顧詠最後謝絕了紅包,接受了阿裡技術的邀請,來聊一聊這次事件問題背後的技術。
一則消息
前段時間,因為國際網絡不穩定問題,國内各大Composer鏡像都出現了間歇性無法通路情況,這對國内PHPer的生産工作造成了極大的影響。受此影響,國内各家Composer服務都出現了相同的問題,而阿裡工程師的這個解決方案堪稱“簡單粗暴”,效率高到沒朋友!
阿裡雲的 PHP Composer 最初研發靈感源自阿裡内部一位 90 後工程師顧詠。作為負責開發阿裡雲産品的 PHP SDK的工程師,他在工作中經常遇到同一個問題:盡管已經根據PHP 最新版本釋出了新的 SDK,但由于鏡像工具沒有實時同步版本,導緻使用者安裝不成功。 此外,雲效平台企業開發者對鏡像工具的使用體驗,同樣受到這個問題的困擾,為此,阿裡技術團隊一起設計開發并開源了這套阿裡雲版鏡像工具。
此次國際網絡不穩定導緻的鏡像問題,阿裡工程師顧詠第一時間響應了PHPer的訴求,連夜排查問題。 “我們程式員都離不開這個,越早解決越好”,最後終于成功定位問題、完成系統更新,解決了大家的燃眉之急。群裡的開發者主動發紅包向其緻謝,顧詠十分感動,然後拒絕了他:“應該做的,紅包不能收。”
對于PHP 開發者來說,Composer 是必不可少的依賴包管理工具,作為存儲 Composer 依賴包的 Packagist,卻時常因為網絡問題讓國内開發者頭痛不已,國内開發者安裝依賴通常很慢,或者逾時導緻無法安裝,卻又沒有穩定的鏡像服務可以使用。Packagist 鼓勵開發者建立鏡像,但目前的鏡像也有諸多不穩定、不可靠的情況。
阿裡雲Composer 鏡像的推出
今年七月,阿裡雲提供了 Packagist/Composer 全量鏡像服務,其秒級同步的能力、快速穩定的下載下傳服務、頁面上的動态資料展示得到了開發者的一緻好評。
阿裡雲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 的時間,系統同步的狀态和資料讓開發者“心中有數”。
免費全量鏡像站,開發者的福音
阿裡做鏡像站的曆史最早可追溯至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 官方實時同步,通過自研的鏡像同步系統,實作多協程分工同步、資料自我修複的能力,在保證快速同步的同時,也能快速修複因網絡不穩定造成的資料錯誤。
最後,歡迎在留言區說出你的使用體驗。
原文釋出時間:2019-12-24
作者:顧詠
本文來自阿裡雲合作夥伴“
阿裡技術”,了解相關資訊可以關注“
”。