◆王耀華 劉詠霖 張 磊
Linux下高效可靠的應(yīng)用同步升級(jí)技術(shù)
◆王耀華1劉詠霖2張 磊1
(1.武漢深之度科技有限公司研發(fā)中心 北京 10080;2.武漢深之度科技有限公司技術(shù)部 北京 10080)
為了能夠向用戶提供既可靠又高效的系統(tǒng)及軟件更新方法,我們?cè)O(shè)計(jì)了以鏡像源管理服務(wù)器為主的軟件更新方案。本文詳細(xì)介紹了鏡像源管理服務(wù)器技術(shù)的設(shè)計(jì)方案,并對(duì)技術(shù)方案進(jìn)行了理論分析,對(duì)技術(shù)方案的驗(yàn)證方法和驗(yàn)證結(jié)論做了詳細(xì)的分析和說(shuō)明。鏡像源管理服務(wù)器技術(shù)在實(shí)現(xiàn)中,相較于當(dāng)前Linux通用的鏡像源更新方案,能夠避免單一鏡像源更新不夠及時(shí)的問(wèn)題、源服務(wù)器網(wǎng)絡(luò)負(fù)載過(guò)高問(wèn)題,為用戶提供穩(wěn)定且快速的資源下載。
鏡像源;apt;系統(tǒng)及軟件更新
本設(shè)計(jì)可分為兩部分:鏡像源管理和客戶端下載優(yōu)化。其中,鏡像源管理主要是通過(guò)采集鏡像源的流量情況來(lái)確定關(guān)鍵鏡像源,當(dāng)官方資源出現(xiàn)更新時(shí),優(yōu)先提示關(guān)鍵鏡像源進(jìn)行資源同步。客戶端下載優(yōu)化主要是根據(jù)當(dāng)前各鏡像源的下載情況來(lái)確定最優(yōu)鏡像站列表,指示客戶端向最優(yōu)鏡像站請(qǐng)求資源,以使客戶端實(shí)現(xiàn)穩(wěn)定、快速的資源下載。
目前,基于Linux的大部分操作系統(tǒng)在系統(tǒng)和應(yīng)用升級(jí)方案中都是采用單一鏡像站更新的升級(jí)方式,系統(tǒng)服務(wù)商首先同步更新資源到官方鏡像站,其他非官方鏡像站再?gòu)墓俜界R像站同步。但是用戶只能單一地從某個(gè)鏡像站更新系統(tǒng)和應(yīng)用,隨著鏡像站的不斷增加,系統(tǒng)用戶的不斷積累,單一的鏡像站已經(jīng)無(wú)法滿足系統(tǒng)和應(yīng)用的正常升級(jí),而非官方鏡像站又有更新不及時(shí)、用戶體驗(yàn)不佳或者根本無(wú)法使用的問(wèn)題,給用戶系統(tǒng)和應(yīng)用升級(jí)造成困難。
當(dāng)今通常采用的技術(shù)方案為,官方同步更新資源到鏡像非官方鏡像站會(huì)定期主動(dòng)同步官方鏡像站資源,用戶通過(guò)修改鏡像站地址,切換到網(wǎng)絡(luò)情況較好的鏡像站下載更新系統(tǒng)和應(yīng)用。此方案會(huì)造成如下缺陷:
(1)無(wú)法確保非官方鏡像站的同步情況,可能存在同步不完整的情況;
(2)無(wú)法確保優(yōu)質(zhì)的網(wǎng)絡(luò)資源;
(3)當(dāng)單一的鏡像站太多人使用后,寬帶無(wú)法滿足日益增長(zhǎng)的用戶需求;
(4)鏡像站的同步時(shí)間不同,造成用戶接受更新的時(shí)間也不同。
為解決現(xiàn)通用技術(shù)暴露的缺點(diǎn),我們采用建立鏡像源管理服務(wù)器的方法,此技術(shù)方案主要是通過(guò)對(duì)鏡像站流量、鏈接數(shù)量及網(wǎng)絡(luò)情況進(jìn)行分析,在服務(wù)端上面做選擇,生成最優(yōu)鏡像站集合,客戶端用戶在不用人工參與選擇的情況下面,通過(guò)智能算法優(yōu)先選擇最優(yōu)鏡像站點(diǎn)集合,再通過(guò)分布式算法,確保用戶能夠通過(guò)最優(yōu)鏡像站集合,分布式下載,快速高效完成系統(tǒng)和應(yīng)用的升級(jí)。
現(xiàn)有技術(shù)方案系統(tǒng)結(jié)構(gòu)如圖1所示。
現(xiàn)有方案的資源更新過(guò)程如下:
鏡像源A~C是官方資源站的鏡像站,鏡像源A~C按照預(yù)設(shè)的周期(例如每x小時(shí)同步一次)分別從官方資源站同步資源(系統(tǒng)或應(yīng)用)。當(dāng)有資源更新時(shí),系統(tǒng)服務(wù)商130將更新后的系統(tǒng)或應(yīng)用上傳至官方資源站服務(wù)器110,服務(wù)器110將更新后的系統(tǒng)或應(yīng)用文件存儲(chǔ)到軟件倉(cāng)庫(kù)120。當(dāng)用戶有更新系統(tǒng)或軟件的需求時(shí),需要從多個(gè)鏡像源(官方站或鏡像源A~C)中手動(dòng)選擇一個(gè),向選中的鏡像源服務(wù)器發(fā)起下載請(qǐng)求,并接收服務(wù)器返回的數(shù)據(jù)。
由于各鏡像源設(shè)定的同步時(shí)間與官方資源站的更新時(shí)間存在時(shí)間差,且鏡像源可能出現(xiàn)同步失敗的情況,因此,不能保證鏡像源A~C的軟件倉(cāng)庫(kù)120A~120C時(shí)刻與官方軟件倉(cāng)庫(kù)120中的數(shù)據(jù)保持一致,用戶可能出現(xiàn)下載失敗的情況。當(dāng)下載失敗時(shí),用戶需要手動(dòng)更換鏡像源,向更換后的鏡像源再次發(fā)起下載請(qǐng)求。
圖1 現(xiàn)有技術(shù)方案系統(tǒng)結(jié)構(gòu)
為針對(duì)現(xiàn)有技術(shù)中存在的問(wèn)題做出了相應(yīng)的改進(jìn)。改進(jìn)后的系統(tǒng)結(jié)構(gòu)圖如圖2所示。
本方案分為服務(wù)端和客戶端。
服務(wù)端是根據(jù)鏡像站得到各種維度的數(shù)據(jù),輔助判斷版本發(fā)布和更新的時(shí)間節(jié)點(diǎn),以及軟件倉(cāng)庫(kù)的實(shí)際情況,確保用戶能夠在同一時(shí)間快速地從不同服務(wù)器分流更新系統(tǒng)和應(yīng)用。
服務(wù)端分為:倉(cāng)庫(kù)流量分析和鏡像源管理兩個(gè)部分,倉(cāng)庫(kù)流量分析主要是對(duì)所有的鏡像源的流量(邏輯流量)、實(shí)際流量進(jìn)行統(tǒng)計(jì),并對(duì)各鏡像站的使用量進(jìn)行統(tǒng)計(jì)。
上文中所述的邏輯流量,是指通過(guò)當(dāng)前用戶裝機(jī)量和本次推送更新數(shù)據(jù)大小,以及當(dāng)前鏡像站的使用比例,計(jì)算出邏輯上,當(dāng)前鏡像站向客戶端傳輸速率和使用總流量;實(shí)際流量,是根據(jù)官方鏡像的日志文件,統(tǒng)計(jì)出選定時(shí)間維度下,官方鏡像所使用的流量。例如,一次更新持續(xù)10了分鐘,我們讀取最近10分鐘的日志文件,計(jì)算這些日志文件所發(fā)送的數(shù)據(jù)量總和,然后將數(shù)據(jù)量總和除以時(shí)長(zhǎng)(10分鐘),就是鏡像站的實(shí)際流量。
此方案的革新點(diǎn)在于改進(jìn)了apt客戶端,并設(shè)置了相應(yīng)的鏡像源管理服務(wù)器150。管理服務(wù)器150可以獲取各鏡像源的當(dāng)前狀態(tài),并從中選取一些鏡像源為最優(yōu)鏡像源,然后形成列表。當(dāng)用戶有更新系統(tǒng)或軟件的需求時(shí),客戶端向管理服務(wù)器150發(fā)起下載請(qǐng)求,改進(jìn)的apt會(huì)測(cè)試多個(gè)最優(yōu)鏡像列表,根據(jù)最適合當(dāng)前用戶網(wǎng)絡(luò)狀態(tài)的最優(yōu)鏡像源,從中獲取一個(gè)更加準(zhǔn)確的列表信息。管理服務(wù)器將會(huì)此列表返回給客戶端,隨后客戶端再向最優(yōu)鏡像源請(qǐng)求資源。最優(yōu)鏡像源出現(xiàn)異常時(shí),客戶端將異常情況上報(bào)給管理服務(wù)器150,管理服務(wù)器重新為客戶端指定一個(gè)最優(yōu)鏡像源,客戶端向新的最優(yōu)鏡像源請(qǐng)求資源。
圖2 改進(jìn)后的系統(tǒng)結(jié)構(gòu)
鏡像源管理主要的作用是管理已有的鏡像站、新增鏡像站,以及對(duì)鏡像站的同步狀態(tài)進(jìn)行監(jiān)控。每次發(fā)布系統(tǒng)和應(yīng)用更新的時(shí)候,對(duì)關(guān)鍵鏡像源的狀態(tài)進(jìn)行管理,并依據(jù)狀態(tài)進(jìn)行發(fā)布確認(rèn)。
圖3 鏡像源管理服務(wù)
已有鏡像源是一個(gè)集合,從中可以挑選最優(yōu)鏡像源列表,沒(méi)有記錄在鏡像源管理工具的鏡像經(jīng)過(guò)測(cè)試都可以被加入,標(biāo)記為新增鏡像源,新增鏡像源則要經(jīng)過(guò)一段時(shí)間的測(cè)試和使用,才能進(jìn)入最優(yōu)鏡像源列表。
對(duì)于鏡像源同步進(jìn)度的檢測(cè),因?yàn)殓R像源技術(shù)方式不同,cdn會(huì)存在不同ip的站點(diǎn),我們?cè)赾dn類檢測(cè)的時(shí)候會(huì)檢測(cè)每個(gè)站點(diǎn)的實(shí)際情況。
客戶端通過(guò)對(duì)Linux下載器(apt)進(jìn)行優(yōu)化,不再單一地從固定鏡像站獲取資源,而是優(yōu)先選擇服務(wù)端生成的最優(yōu)鏡像站集合,即從獲取到的最優(yōu)鏡像源列表中進(jìn)行本地測(cè)試,再利用我們?cè)O(shè)計(jì)的算法通過(guò)下載次數(shù),下載出錯(cuò)次數(shù),下載延時(shí)等信息在系統(tǒng)后端判斷出的、資源狀態(tài)最好的鏡像源列表。如果當(dāng)前鏡像站同步進(jìn)度不為100% 是不會(huì)統(tǒng)計(jì)到最優(yōu)鏡像源列表。當(dāng)某個(gè)資源下載異常時(shí)及時(shí)切換到其他優(yōu)質(zhì)下載資源上面,并且上報(bào)異常鏡像站點(diǎn)。
如果出現(xiàn)下載資源切換,網(wǎng)絡(luò)中斷等情況導(dǎo)致下載終止,此設(shè)計(jì)也支持?jǐn)帱c(diǎn)續(xù)傳,并且為保證網(wǎng)絡(luò)的通暢性,本設(shè)計(jì)采用分布式下載。分布式下載是指一次更新或下載,同時(shí)使用5個(gè)本地測(cè)試篩選的最優(yōu)鏡像源列表集??蛻舳送瑫r(shí)向多個(gè)鏡像站請(qǐng)求資源。
部分核心代碼如下:
GuestURI(const std::string& uri)
{
if(uri.substr(0, strlen("http")) != "http") {
return uri;
}
static bool debug = _config->FindB("Acquire::SmartMirrors::Debug");
static bool enabled = _config->FindB("Acquire::SmartMirrors::Enable");
if (!enabled) {
if (debug) {
std::clog << "SmartMirrors is disabled." << std::endl;
}
return uri;
}
static string official = normalizeURI(_config->Find("Acquire::SmartMirrors::MainSource"));
static string mirror = normalizeURI(_config->Find("Acquire::SmartMirrors::MirrorSource"));
static string detector = _config->Find("Acquire::SmartMirrors::GuestURI");
static bool exists = FileExists(detector);
if (!exists) {
return uri;
}
string cmd = detector + " " + uri + " " + official + " " + mirror;
std::tr1::shared_ptr
if (!out) {
return uri;
}
char buffer[1024] = {0};
std::string result = "";
while (!feof(out.get())) {
if (fgets(buffer, 1024, out.get()) != NULL)
result += buffer;
}
if(result.substr(0, strlen("http")) != "http") {
return uri;
}
if (debug && result != uri) {
printf("Using '%s' instead of '%s' ", result.c_str(), uri.c_str());
}
return result;
}
通過(guò)本技術(shù)方案,可以解決在有限寬帶資源和鏡像站的情況下,集合社區(qū)資源,解決Linux桌面操作系統(tǒng)在各種復(fù)雜網(wǎng)絡(luò)環(huán)境下,都能及時(shí)高效完成系統(tǒng)和應(yīng)用的升級(jí)。避免了當(dāng)用戶需要升級(jí)軟件,但鏡像源更新不足的情況,以及為用戶提供干凈便捷的軟件升級(jí)渠道,保障了用戶系統(tǒng)更新前后安全性和易管理性。
對(duì)比Windows平臺(tái),其軟件安裝和更新最容易捆綁惡意插件,本技術(shù)通過(guò)統(tǒng)一的鏡像源管理服務(wù)器,保證了軟件更新的純凈,不僅保障了用戶操作系統(tǒng)的整潔,也不會(huì)有惡意插件使機(jī)器性能降低,運(yùn)用此技術(shù),也可有效地解決應(yīng)用軟件間的兼容問(wèn)題和依賴問(wèn)題,給用戶提供最方便易用的應(yīng)用部署策略,同時(shí)用戶也不必?fù)?dān)心安裝的軟件內(nèi)含惡意插件的情況。
[1]薛輝輝,孫偉,王大歲. 一種linux操作系統(tǒng)的調(diào)試方法[M].西安電子科技大學(xué)出版社,2016.