◆王耀华 刘咏霖 张 磊
Linux下高效可靠的应用同步升级技术
◆王耀华1刘咏霖2张 磊1
(1.武汉深之度科技有限公司研发中心 北京 10080;2.武汉深之度科技有限公司技术部 北京 10080)
为了能够向用户提供既可靠又高效的系统及软件更新方法,我们设计了以镜像源管理服务器为主的软件更新方案。本文详细介绍了镜像源管理服务器技术的设计方案,并对技术方案进行了理论分析,对技术方案的验证方法和验证结论做了详细的分析和说明。镜像源管理服务器技术在实现中,相较于当前Linux通用的镜像源更新方案,能够避免单一镜像源更新不够及时的问题、源服务器网络负载过高问题,为用户提供稳定且快速的资源下载。
镜像源;apt;系统及软件更新
本设计可分为两部分:镜像源管理和客户端下载优化。其中,镜像源管理主要是通过采集镜像源的流量情况来确定关键镜像源,当官方资源出现更新时,优先提示关键镜像源进行资源同步。客户端下载优化主要是根据当前各镜像源的下载情况来确定最优镜像站列表,指示客户端向最优镜像站请求资源,以使客户端实现稳定、快速的资源下载。
目前,基于Linux的大部分操作系统在系统和应用升级方案中都是采用单一镜像站更新的升级方式,系统服务商首先同步更新资源到官方镜像站,其他非官方镜像站再从官方镜像站同步。但是用户只能单一地从某个镜像站更新系统和应用,随着镜像站的不断增加,系统用户的不断积累,单一的镜像站已经无法满足系统和应用的正常升级,而非官方镜像站又有更新不及时、用户体验不佳或者根本无法使用的问题,给用户系统和应用升级造成困难。
当今通常采用的技术方案为,官方同步更新资源到镜像非官方镜像站会定期主动同步官方镜像站资源,用户通过修改镜像站地址,切换到网络情况较好的镜像站下载更新系统和应用。此方案会造成如下缺陷:
(1)无法确保非官方镜像站的同步情况,可能存在同步不完整的情况;
(2)无法确保优质的网络资源;
(3)当单一的镜像站太多人使用后,宽带无法满足日益增长的用户需求;
(4)镜像站的同步时间不同,造成用户接受更新的时间也不同。
为解决现通用技术暴露的缺点,我们采用建立镜像源管理服务器的方法,此技术方案主要是通过对镜像站流量、链接数量及网络情况进行分析,在服务端上面做选择,生成最优镜像站集合,客户端用户在不用人工参与选择的情况下面,通过智能算法优先选择最优镜像站点集合,再通过分布式算法,确保用户能够通过最优镜像站集合,分布式下载,快速高效完成系统和应用的升级。
现有技术方案系统结构如图1所示。
现有方案的资源更新过程如下:
镜像源A~C是官方资源站的镜像站,镜像源A~C按照预设的周期(例如每x小时同步一次)分别从官方资源站同步资源(系统或应用)。当有资源更新时,系统服务商130将更新后的系统或应用上传至官方资源站服务器110,服务器110将更新后的系统或应用文件存储到软件仓库120。当用户有更新系统或软件的需求时,需要从多个镜像源(官方站或镜像源A~C)中手动选择一个,向选中的镜像源服务器发起下载请求,并接收服务器返回的数据。
由于各镜像源设定的同步时间与官方资源站的更新时间存在时间差,且镜像源可能出现同步失败的情况,因此,不能保证镜像源A~C的软件仓库120A~120C时刻与官方软件仓库120中的数据保持一致,用户可能出现下载失败的情况。当下载失败时,用户需要手动更换镜像源,向更换后的镜像源再次发起下载请求。
图1 现有技术方案系统结构
为针对现有技术中存在的问题做出了相应的改进。改进后的系统结构图如图2所示。
本方案分为服务端和客户端。
服务端是根据镜像站得到各种维度的数据,辅助判断版本发布和更新的时间节点,以及软件仓库的实际情况,确保用户能够在同一时间快速地从不同服务器分流更新系统和应用。
服务端分为:仓库流量分析和镜像源管理两个部分,仓库流量分析主要是对所有的镜像源的流量(逻辑流量)、实际流量进行统计,并对各镜像站的使用量进行统计。
上文中所述的逻辑流量,是指通过当前用户装机量和本次推送更新数据大小,以及当前镜像站的使用比例,计算出逻辑上,当前镜像站向客户端传输速率和使用总流量;实际流量,是根据官方镜像的日志文件,统计出选定时间维度下,官方镜像所使用的流量。例如,一次更新持续10了分钟,我们读取最近10分钟的日志文件,计算这些日志文件所发送的数据量总和,然后将数据量总和除以时长(10分钟),就是镜像站的实际流量。
此方案的革新点在于改进了apt客户端,并设置了相应的镜像源管理服务器150。管理服务器150可以获取各镜像源的当前状态,并从中选取一些镜像源为最优镜像源,然后形成列表。当用户有更新系统或软件的需求时,客户端向管理服务器150发起下载请求,改进的apt会测试多个最优镜像列表,根据最适合当前用户网络状态的最优镜像源,从中获取一个更加准确的列表信息。管理服务器将会此列表返回给客户端,随后客户端再向最优镜像源请求资源。最优镜像源出现异常时,客户端将异常情况上报给管理服务器150,管理服务器重新为客户端指定一个最优镜像源,客户端向新的最优镜像源请求资源。
图2 改进后的系统结构
镜像源管理主要的作用是管理已有的镜像站、新增镜像站,以及对镜像站的同步状态进行监控。每次发布系统和应用更新的时候,对关键镜像源的状态进行管理,并依据状态进行发布确认。
图3 镜像源管理服务
已有镜像源是一个集合,从中可以挑选最优镜像源列表,没有记录在镜像源管理工具的镜像经过测试都可以被加入,标记为新增镜像源,新增镜像源则要经过一段时间的测试和使用,才能进入最优镜像源列表。
对于镜像源同步进度的检测,因为镜像源技术方式不同,cdn会存在不同ip的站点,我们在cdn类检测的时候会检测每个站点的实际情况。
客户端通过对Linux下载器(apt)进行优化,不再单一地从固定镜像站获取资源,而是优先选择服务端生成的最优镜像站集合,即从获取到的最优镜像源列表中进行本地测试,再利用我们设计的算法通过下载次数,下载出错次数,下载延时等信息在系统后端判断出的、资源状态最好的镜像源列表。如果当前镜像站同步进度不为100% 是不会统计到最优镜像源列表。当某个资源下载异常时及时切换到其他优质下载资源上面,并且上报异常镜像站点。
如果出现下载资源切换,网络中断等情况导致下载终止,此设计也支持断点续传,并且为保证网络的通畅性,本设计采用分布式下载。分布式下载是指一次更新或下载,同时使用5个本地测试筛选的最优镜像源列表集。客户端同时向多个镜像站请求资源。
部分核心代码如下:
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;
}
通过本技术方案,可以解决在有限宽带资源和镜像站的情况下,集合社区资源,解决Linux桌面操作系统在各种复杂网络环境下,都能及时高效完成系统和应用的升级。避免了当用户需要升级软件,但镜像源更新不足的情况,以及为用户提供干净便捷的软件升级渠道,保障了用户系统更新前后安全性和易管理性。
对比Windows平台,其软件安装和更新最容易捆绑恶意插件,本技术通过统一的镜像源管理服务器,保证了软件更新的纯净,不仅保障了用户操作系统的整洁,也不会有恶意插件使机器性能降低,运用此技术,也可有效地解决应用软件间的兼容问题和依赖问题,给用户提供最方便易用的应用部署策略,同时用户也不必担心安装的软件内含恶意插件的情况。
[1]薛辉辉,孙伟,王大岁. 一种linux操作系统的调试方法[M].西安电子科技大学出版社,2016.