题 鱿鱼和dnf / yum下载缓存


对不起,如果这是一个新手问题。我首先尝试描述情况,然后鱿鱼questin将进来。

当前的Fedora / Centos安装在/etc/yum.repos.conf中的正常配置文件中有一个看起来像这样的metalink。

metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch

这个metalink实际上使yum / dnf选择一个“随机”服务器站点(由服务器随机地按照地理位置由世界地区根据metalink客户端的位置选择)。
这也用于缓慢下载以切换到下一个更好的站点。

我注意到由于docker构建了大量的下载,这就是我考虑所有机器必须使用的squid代理的原因。但是这种yum / dnf的“随机”策略让我很担心。我确实理解fedora / centos分配这个免费存储库的负载的意图,所以实际上我不想破坏这个策略

鱿鱼能以某种方式智能地检测到客户端只使用“另一个fedora / centos repo url”并智能地缓存这个吗? metalink列表本身似乎非常稳定(它只是在被问到时改变顺序,但列表本身似乎是相同的)。

意图:不要存储同一文件的1000份副本,只是因为它来自不同的服务器。

我怎么用鱿鱼呢?

编辑:有人有使用这个的经验 http://wiki.squid-cache.org/Features/StoreID 用于缓存dnf / yum?


5
2018-03-09 15:21




您是否考虑过运营本地镜像,无论是私有还是公共镜像?如果你这样做,你可以配置Fedora MirrorManager service - 生成这些metalink结果的东西 - 以便来自网络块的请求首先获得服务器。 - mattdm
本地镜子是我的后备。但后来我必须处理“频繁更新镜像”。我宁愿把它留给“官方”网站。 - Mandragor
是的,我明白了。但是,如果你改变主意,这很容易 Fedora快速镜像。 - mattdm
这真的是你应该运行本地镜像的情况。您拥有的服务器(或容器!)越多,它对您的好处就越多。我有一个私有的本地镜像已经有一段时间了,而MirrorManager只是告诉所有客户端先打它。 - Michael Hampton♦


答案:


回答我自己的问题。发现squid支持使用storeid_file_rewrite脚本处理这类问题。唯一棘手的事情是获得一个有效的URL列表,它们代表相同的存储库。到目前为止似乎工作正常。

添加到squid.conf以下

store_id_program /usr/lib64/squid/storeid_file_rewrite /etc/squid/fedora.db
store_id_access allow localnet
store_id_access deny all

获取fedora.db的内容(此时缓存fedora 25)是获取镜像列表中的URL的一些技巧

basearch="x86_64"
releasever=25
mirrorlist="https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearc
curl -s "$mirrorlist" >tmp.db

您需要将“tmp.db”结果中的“url”转换为此处说明的格式 http://wiki.squid-cache.org/Features/StoreID/DB。这可能是自动化的(任何志愿者?)

然后你会得到像这样的“fedora.db”,它在上面的squid.conf中使用。

^http:\/\/ftp\.halifax\.rwth-aachen\.de\/fedora\/linux\/releases\/25\/Everything\/(x86_64\/[a-zA-Z0-9\-\_\.\/]+rpm)$    http://repo.mirrors.squid.internal/fedora/25/$1
^http:\/\/mirror2\.hs-esslingen\.de\/fedora\/linux\/releases\/25\/Everything\/(x86_64\/[a-zA-Z0-9\-\_\.\/]+rpm)$        http://repo.mirrors.squid.internal/fedora/25/$1
^http:\/\/fedora\.tu-chemnitz\.de\/pub\/linux\/fedora\/linux\/releases\/25\/Everything\/(x86_64\/[a-zA-Z0-9\-\_\.\/]+rpm)$      http://repo.mirrors.squid.internal/fedora/25/$1

... much more

编辑:替代方案,一个更危险的路径,但也许也足够了,这样一个更全局的模式匹配:

\/fedora\/linux\/releases\/([0-9]+)\/Everything/x86_64\/(.*)$   http://repo.mirrors.squid.internal/fedora/releases/$1/$2
\/fedora\/linux\/updates\/([0-9]+)\/x86_64\/(.*)$       http://repo.mirrors.squid.internal/fedora/updates/$1/$2

来源


4
2018-03-10 11:57



如果误报的风险略高,您可以尝试使用 \/fedora\/linux\/releases\/[0-9]+\/Everything (和要抓住的东西 updates也是),而不是单独列出每个镜像。大多数镜子都应遵循相同的内部结构。 - mattdm
你是对的。更新 - Mandragor


您可以考虑使用baseurl,如下所示: http://serverascode.com/2014/03/29/squid-cache-yum.html

所以使用:

baseurl=http://mirror.fedoraproject.org/fedora/$releasever/os/$basearch/

代替:

metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch

这可以通过降低动态性来避免metalink的问题。

如果你打算使用baseurl,我怀疑另一种实现你想要做的事情的方法是使用apache或nginx(我会选择nginx)作为repo镜像的反向代理。

除非你打算将鱿鱼用于其他目的,否则我认为我可能实际上倾向于将nginx设置为本地镜像而不是使用互联网镜像作为后端/上游。


0
2018-03-09 15:31



我无法控制所有用户机器(并更改其配置)。但我可以控制网络,以便他们必须使用代理。如果我能控制所有配置,我会使用baseurl。 - Mandragor