squid e cache de downloads de dnf / yum

5

Desculpe se esta é uma pergunta de novato. Eu tento descrever a situação primeiro, então a quest de lula vai entrar.

As instalações atuais do Fedora / Centos têm em seus arquivos de configuração normais em /etc/yum.repos.conf um metalink que se parece com isso.

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

Este metalink realmente faz o yum / dnf escolher um site de servidor "aleatório" (escolhido pelo servidor aleatoriamente geograficamente por região do mundo de acordo com a localização pelo cliente do metalink).
Isso também é usado em caso de download lento para alternar para o próximo site melhor.

Notei que devido ao docker ter muitos downloads, por isso estou pensando em usar um proxy de squid que todas as máquinas devem usar. Mas essa estratégia "aleatória" de yum / dnf me preocupa. Eu entendo a intenção do fedora / centos de distribuir a carga desses repositórios gratuitos, então na verdade eu não quero prejudicar essa estratégia

O squid pode, de alguma forma, detectar inteligentemente, que o cliente apenas usa "outro fedora / centos repo url" e inteligentemente armazenar em cache isso? A lista de metalink em si parece ser bastante estável (apenas muda a ordem quando solicitado, mas a lista em si parece ser a mesma).

Intenção: Não armazene 1000 cópias do mesmo arquivo, apenas porque ele é de um servidor diferente.

Como eu faria isso com a lula?

EDIT: Alguém tem experiência usando este link para caching de dnf / yum?

    
por Mandragor 09.03.2017 / 16:21

2 respostas

4

Respondendo a minha própria pergunta. Descobri que o squid tem suporte para lidar com esse tipo de problema com o script storeid_file_rewrite. A única coisa complicada é obter uma lista válida de URLs, que representam os mesmos repositórios. Parece funcionar bem até agora.

Adicionado ao squid.conf o seguinte

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

Para obter o conteúdo para o fedora.db (cachear o fedora 25 neste momento) é um truque para obter os urls da lista de espelhos

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

Você precisa converter o "url" no resultado "tmp.db" no formato explicado aqui link . Isso pode possivelmente automatizado (quaisquer voluntários?)

Então você tem algo como "fedora.db", que é usado no squid.conf acima.

^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

EDIT: Alternativa, um caminho mais perigoso, mas talvez também suficiente, um padrão mais global correspondendo assim:

\/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

Fontes :

por 10.03.2017 / 12:57
0

Você pode usar o uso de baseurl, como sugerido aqui: link

Então use:

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

em vez de:

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

Isso evita os problemas com o metalink, tornando as coisas um pouco menos dinâmicas.

Se você fosse usar o baseurl, suspeito que outra forma de conseguir o que você está tentando fazer seria usar o apache ou nginx (eu escolheria nginx) como um proxy reverso para o espelho de repo.

A menos que você use o squid para outros propósitos, acho que de fato eu prefiro configurar o nginx como um espelho local do que usar os espelhos da internet como um backend / upstream.

    
por 09.03.2017 / 16:31