PHP 依赖镜像出问题后,阿里工程师的一顿“神操作“令人叫绝!
簡介: 上個月,PHP開發(fā)者在網(wǎng)上紛紛反映出現(xiàn) Composer 鏡像無法訪問的問題。阿里云內(nèi)部一位 90 后工程師顧詠連夜開工排查,快速解決問題后,他在問題群里收到了一大波來自用戶的紅包。顧詠最后謝絕了紅包,接受了阿里技術(shù)的邀請,來聊一聊這次事件問題背后的技術(shù)。
作者 | 顧詠
?
一則消息
前段時間,因為國際網(wǎng)絡(luò)不穩(wěn)定問題,國內(nèi)各大Composer鏡像都出現(xiàn)了間歇性無法訪問情況,這對國內(nèi)PHPer的生產(chǎn)工作造成了極大的影響。受此影響,國內(nèi)各家Composer服務(wù)都出現(xiàn)了相同的問題,而阿里工程師的這個解決方案堪稱“簡單粗暴”,效率高到?jīng)]朋友!
阿里云的 PHP Composer 最初研發(fā)靈感源自阿里內(nèi)部一位 90 后工程師顧詠。作為負責(zé)開發(fā)阿里云產(chǎn)品的 PHP SDK的工程師,他在工作中經(jīng)常遇到同一個問題:盡管已經(jīng)根據(jù)PHP 最新版本發(fā)布了新的 SDK,但由于鏡像工具沒有實時同步版本,導(dǎo)致用戶安裝不成功。 此外,云效平臺企業(yè)開發(fā)者對鏡像工具的使用體驗,同樣受到這個問題的困擾,為此,阿里技術(shù)團隊一起設(shè)計開發(fā)并開源了這套阿里云版鏡像工具。
此次國際網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致的鏡像問題,阿里工程師顧詠第一時間響應(yīng)了PHPer的訴求,連夜排查問題。 “我們程序員都離不開這個,越早解決越好”,最后終于成功定位問題、完成系統(tǒng)更新,解決了大家的燃眉之急。群里的開發(fā)者主動發(fā)紅包向其致謝,顧詠十分感動,然后拒絕了他:“應(yīng)該做的,紅包不能收。”
?
對于PHP 開發(fā)者來說,Composer 是必不可少的依賴包管理工具,作為存儲 Composer 依賴包的 Packagist,卻時常因為網(wǎng)絡(luò)問題讓國內(nèi)開發(fā)者頭痛不已,國內(nèi)開發(fā)者安裝依賴通常很慢,或者超時導(dǎo)致無法安裝,卻又沒有穩(wěn)定的鏡像服務(wù)可以使用。Packagist 鼓勵開發(fā)者建立鏡像,但目前的鏡像也有諸多不穩(wěn)定、不可靠的情況。
?
阿里云Composer 鏡像的推出
今年七月,阿里云提供了 Packagist/Composer 全量鏡像服務(wù),其秒級同步的能力、快速穩(wěn)定的下載服務(wù)、頁面上的動態(tài)數(shù)據(jù)展示得到了開發(fā)者的一致好評。
?
阿里云Composer 鏡像的升級
11月16日開始,由于 Composer 鏡像出現(xiàn)了間歇性無法訪問情況,不少網(wǎng)友通過阿里云釘釘服務(wù)群反應(yīng)阿里云鏡像出現(xiàn)不可用的情況,主要 zlib_decode 和 404 錯誤。在測試其他鏡像作對比時發(fā)現(xiàn),其他鏡像也存在此類情況。接到反饋后,我們第一時間進行問題排查:
問題定位:阿里工程師立即查看系統(tǒng)狀態(tài)和日志,未發(fā)現(xiàn)異常。初步懷疑是由于 CDN 接入層收國際網(wǎng)絡(luò)延遲導(dǎo)致不可用。
驗證:阿里工程師筆將相同的數(shù)據(jù)回傳至國內(nèi) Bucket ,在今經(jīng)多次、多地域直接訪問測試,均成功。
決心升級:以往偶爾遇到這種問題,都被當(dāng)做正常現(xiàn)象對待,而此次持續(xù)時間較長,影響面廣,為了徹底解決這類問題,阿里決定升級鏡像系統(tǒng)部署方案,直接將最新數(shù)據(jù)傳回國內(nèi)。
?
已知現(xiàn)有 Packagist 鏡像的問題
1)同步的數(shù)據(jù)不是 Packagist 的根數(shù)據(jù)。事實上,官方的根數(shù)據(jù)不對外公開,開發(fā)者平時所訪問的數(shù)據(jù)是鏡像,甚至是鏡像的鏡像。當(dāng)客戶端發(fā)起請求后,請求會被官方 DNS 指向其他的鏡像站,這些鏡像數(shù)據(jù)與根數(shù)據(jù)之間已經(jīng)存在延遲。而由于國際網(wǎng)絡(luò)或系統(tǒng)設(shè)計原因,曾經(jīng)出現(xiàn)初次官方鏡像站與根數(shù)據(jù)長達數(shù)小時不同步 的情況。
2)沒有處理代碼包 dist。大多數(shù)依賴包的源代碼存儲在在github、gitlab上,因為網(wǎng)絡(luò)問題,也會導(dǎo)致使用者下載速度慢,甚至下載失敗。這也是鏡像站需要關(guān)注處理的,一般鏡像只提供 meta 數(shù)據(jù)(包數(shù)據(jù))。例如官方推薦的 Webysther's mirror code 鏡像同步系統(tǒng)就不處理dist。
3)本地文件存儲。目前已知的其他鏡像系統(tǒng),是將文件存儲在本地,或至少先存儲在本地再上傳,這樣不僅會消耗大量本地磁盤空間,還存在系統(tǒng)最大子目錄限制,會使得系統(tǒng)存在致命瓶頸。優(yōu)化版本使用的軟連接方案也會隨著包的無限增長需要重構(gòu)。
4)單進程,性能表現(xiàn)不佳,消耗 CPU、內(nèi)存資源大。且處理數(shù)據(jù)耗時長,更新速度慢,系統(tǒng)的設(shè)計導(dǎo)致任務(wù)不能分發(fā),且同步時間間隔越長,同步的時間越常。
5)沒有數(shù)據(jù)錯誤統(tǒng)計,官方源數(shù)據(jù)存在錯誤,也需要直觀的展示,讓開發(fā)者了解情況。
6)系統(tǒng)同步狀態(tài)、數(shù)據(jù)不可視化,鏡像是否已更新?什么時候更新?今天更新了多少?下一次什么時候更新?這些數(shù)據(jù)開發(fā)者都不知道。
?
阿里云鏡像的優(yōu)勢
阿里云鏡像的架構(gòu)核心目標是實時、快讀、穩(wěn)定、可移植、可擴展,且具備對數(shù)據(jù)進行自我修復(fù)的能力。那么阿里云鏡像和其他鏡像有什么區(qū)別?阿里云鏡像又是如何做到秒級同步的呢?
?
官方合作
在數(shù)據(jù)上,阿里云與 Packagist 官方合作,經(jīng)過和 Packagist 溝通,阿里云在距離官方根數(shù)據(jù)最近的城市節(jié)點部署了服務(wù)器,同時阿里云的服務(wù)器 IP地址 被加入 Packagist 白名單,允許直接、頻繁地訪問其根數(shù)據(jù)(Meta)。獲取和解析 Meta 后,系統(tǒng)從代碼倉庫中下載源代碼壓縮包,再通過阿里云洛神網(wǎng)絡(luò)不限帶寬的將數(shù)據(jù)傳回國內(nèi),這從最大程度上保證了國內(nèi)用戶可以及時、快速地獲取最新數(shù)據(jù)。開發(fā)者使用 Composer 安裝依賴的數(shù)據(jù),都是鏡像,甚至是鏡像的鏡像。例如官方在新加坡的鏡像,就數(shù)次出現(xiàn)長達數(shù)小時的不更新,以此為鏡像源的鏡像站就無法為開發(fā)者提供正常的服務(wù)。
?
實時
阿里云實時同步源數(shù)據(jù),對于以下場景的用戶具有十分重要的意義:
自主研發(fā)高性能系統(tǒng)
同步系統(tǒng)由阿里云自主研發(fā),采用 Golang 編寫,使用 Redis 做任務(wù)隊列,心跳協(xié)程將更新的數(shù)據(jù)文件分發(fā)到任務(wù)隊列,30個協(xié)程各自分工獲取數(shù)據(jù)傳回國內(nèi)OSS。這意味著所要同步的數(shù)據(jù)不再是一個單進程按照順序一個一個傳輸,而是多個協(xié)程,甚至是多臺機上的多個協(xié)程一起分工,這又將同步時間大幅度縮短。
?
只分發(fā)有效任務(wù)
在任務(wù)分發(fā)的機制上,實現(xiàn)了任務(wù)不重復(fù),由于內(nèi)存會記錄已經(jīng)成功處理過的任務(wù)和已分發(fā)的任務(wù),所以不會分發(fā)舊文件,也不會發(fā)布相同的任務(wù),這避免無效、重復(fù)工作,更是大幅度的減少了工作量,降低延遲。
?
重試機制
對于數(shù)據(jù)獲取錯誤的情況,系統(tǒng)具有重試機制,對于因為網(wǎng)絡(luò)問題暫時訪問錯誤的源數(shù)據(jù)、代碼包,系統(tǒng)會重試請求。
?
文件存儲
阿里云 Composer 全量鏡像,依靠阿里云強大的 OSS 存儲源數(shù)據(jù)和代碼壓縮包,不占用本地磁盤,在避免最大子目錄的問題的同時,還能輕松移植、擴展系統(tǒng)。
?
錯誤記錄
記錄和統(tǒng)計官方錯誤,阿里云將官方記錄當(dāng)中的一些錯誤記錄下來,在方便內(nèi)部隨時排查問題的同時,也能更準確的了解 Packagist 的情況。
?
自我修復(fù)
處理不成功的任務(wù)不會被記錄,在間隔時間極短的下一次同步中會得到修復(fù)。而執(zhí)行錯誤的任務(wù)則會使用重試修復(fù)。
如果需要人工修復(fù),只需刪除響應(yīng)的 KEY,系統(tǒng)即可重新執(zhí)行并更新狀態(tài)。
?
CDN 支撐
鏡像數(shù)據(jù)對外,接入了阿里云全國 CDN 節(jié)點,阿里云強大的網(wǎng)絡(luò)基礎(chǔ)設(shè)施保證了開發(fā)者如絲般順滑的使用體驗。
?
狀態(tài)數(shù)據(jù)可視化
鏡像系統(tǒng)數(shù)據(jù)狀態(tài)可視,在阿里云 Composer 全量鏡像的官方頁面上,動態(tài)顯示 Packagist 最后更新時間,阿里云同步耗時、下一次刷新 CDN 的時間,系統(tǒng)同步的狀態(tài)和數(shù)據(jù)讓開發(fā)者“心中有數(shù)”。
?
?
免費全量鏡像站,開發(fā)者的福音
阿里做鏡像站的歷史最早可追溯至2011年,從最開始阿里內(nèi)部的需求,擴展到為更廣大的開發(fā)者免費投入資源,提供更快、更穩(wěn)定的鏡像資源。從最初的幾臺設(shè)備,成長為現(xiàn)在覆蓋主流語言和主流操作系統(tǒng)的全量鏡像站。并且,在這個過程中,一直堅持免費為開發(fā)者提供鏡像資源,不斷追求更快、更穩(wěn)定的服務(wù)。
目前阿里云鏡像站不僅提供Centos、Ubuntu、 Fedora、Arch Linux、 Deepin 等10多個發(fā)行版的軟件安裝源和ISO下載服務(wù), 還提供Python, Php 等多款開發(fā)語言的包管理鏡像服務(wù)以及nvidia-cuda, homebrew, kubernetes等 10 多款垂直倉庫的鏡像服務(wù)。每月下載包文件數(shù)量已經(jīng)超過 7 億次。
國內(nèi)鏡像所做的是緩存所有安裝包和元數(shù)據(jù)到自己的服務(wù)器,并通過國內(nèi) CDN 進行加速,實現(xiàn) Composer require/install/update 的操作,并達到最快速度。阿里云的 PHP Composer 全量鏡像能夠?qū)崿F(xiàn)與 PHP Packagist 官方實時同步,通過自研的鏡像同步系統(tǒng),實現(xiàn)多協(xié)程分工同步、數(shù)據(jù)自我修復(fù)的能力,在保證快速同步的同時,也能快速修復(fù)因網(wǎng)絡(luò)不穩(wěn)定造成的數(shù)據(jù)錯誤。
?
?
總結(jié)
以上是生活随笔為你收集整理的PHP 依赖镜像出问题后,阿里工程师的一顿“神操作“令人叫绝!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么技能产品经理不会提,但技术人必须懂?
- 下一篇: 浅谈php7的重大新特性_PHP7的新特