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