Table des matières

Content Delivery Networks

Qu'est ce qu'un CDN ?

CDN signifie Content Delivery Network. C'est un réseau sur lequel on va pouvoir stocker des images, des vidéos ( en fait des contenus qui ne conviennent pas aux bases de données ou au NoSQL ).

La problématique d'utilisation d'un CDN ici est simple : on a plein de serveurs webs qui travaillent en parallèle, et on ne peut stocker d'informations sur ceux ci comme on pourrait le faire avec un serveur web classique. En effet, les autres serveurs webs ne pourraient y avoir accès. On doit donc stocker nos informations ailleurs. Pour ce qui est nombres et textes, des bases de données et du NoSQL seront utilisés.

Pour ce qui est des images / vidéos / autre uploadé par l'utilisateur il faut utiliser un espace de stockage centralisé. Utiliser directement un système d'espace de stockage centralisé ne suffit pas ( opérations concurrentes possibles, ce qui mènerait tel que je le vois à une coûteuse gestion gestion de verrou sur les serveurs webs … ). C'est là que les CDNs font leur entrée en jeu. En gros on met des données dessus depuis les serveurs webs, et on les récupère sur le CDN quand on en a besoin.

On attend par ailleurs d'un CDN que les contenus soit répliqués dans plusieurs DataCenter ( pour des raisons de coûts / performances ).

La solution classique et que beaucoup choisissent c'est des CDNs payants ( c'est après tout moins cher que de déployer et entretenir le sien … ) . Je peux citer ( merci wikipédia ) Amazon cloudfront, CDNetworks, CloudFlare … Vous l'aurez compris ( et vous devez commencer à me connaître … ), nous essayerons ici de trouver des pistes pour utiliser notre propre CDN ( et pas celui des voisins … ).

Utiliser CEPH

CEPH est un système de fichier orienté Object Storage. Il est donc particulièrement adapté pour être utilisé en temps que CDN.

Vous trouverez sur cette page des détails sur CEPH.

CEPH introduit une Object gateway, qui nous fournis une interface RESTFULL. On pourra donc, très simplement, depuis nos serveurs webs, via le protocole http ajouter / consulter / modifier / supprimer le contenu.

Instalation de CEPH Object Gateway

Nous allons installer CEPH Object Gateway sur un de nos moniteurs ( vous pouvez mettre sans problème deux CEPH Object gateway derrière un HAproxy… ).

Nous allons utiliser apache2 ainsi que FastCGI. Pour les installer, rien de plus simple :

  apt-get install apache2 libapache2-mod-fastcgi

On active ensuite les modules rewrite et fast-cgi :

  a2enmod rewrite
  a2enmod fastcgi

On crée les virtualHost rgw.conf : /etc/apache2

FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock
 
<VirtualHost *:80>
        ServerName benwa-ceph-master-1
        ServerAdmin benwa@minet.net
        DocumentRoot /var/www
 
        <IfModule mod_fastcgi.c>
                <Directory /var/www>
                        Options +ExecCGI
                        AllowOverride All
                        SetHandler fastcgi-script
                        Order allow,deny
                        Allow from all
                        AuthBasicAuthoritative Off
                </Directory>
        </IfModule>
 
        AllowEncodedSlashes On
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
        ServerSignature Off
 
</VirtualHost>

Puis on l'active :

  a2ensite rgw.conf

Et on désactive le virtual Host par défaut :

  a2dissite default

Bon maintenant créons le fichier /var/www/s3gw.fcgi :

#!/bin/sh
exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway

Maintenant il ne reste plus qu'à installer rados ( qui gère les objets de la CEPH Object Gateway ) :

  apt-get install radosgw

La configuration se fait ensuite dans /etc/ceph/conf :

[global]
        fsid = 1af68adc-4fff-46a5-ba0b-d0f7e9f12cca
        mon_initial_members = benwa-ceph-master-1, benwa-ceph-master-2
        mon_host = 192.168.103.222,192.168.103.223
        auth_cluster_required = cephx
        auth_service_required = cephx
        auth_client_required = cephx
        filestore_xattr_use_omap = true



[client.radosgw.gateway]
        host = benwa-ceph-master-1
        keyring = /etc/ceph/keyring.radosgw.gateway
        rgw socket path = /tmp/radosgw.sock
        log file = /var/log/ceph/radosgw.log
        rgw enable ops log = false

Comme nous utilisons l'authentification via cephx il nous faut générer nos clés :

    ceph-authtool --create-keyring /etc/ceph/keyring.radosgw.gateway
    chmod +r /etc/ceph/keyring.radosgw.gateway
    ceph-authtool /etc/ceph/keyring.radosgw.gateway -n client.radosgw.gateway --gen-key
    ceph-authtool -n client.radosgw.gateway --cap osd 'allow rwx' --cap mon 'allow rw' /etc/ceph/keyring.radosgw.gateway
    ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway

Chez moi ça marche ;-)

Limites

Cette fonctionnalité de CEPH est très sympa et rempli simplement le contrat fournit initialement. Néanmoins je note un certain nombre de bémols :

Je m'explique : imaginez youtube. Ils ont envie d'avoir plusieurs copies de la vidéo de Cyprien sur tous leurs data-centers afin de pouvoir tenir la charge, minimiser leurs transits de donnée, et fournir une meilleure qualité de service à leurs clients. En revanche ils ne voudront garder que deux exemplaires de ma vidéo sur l'usage de l'emmental rapé en Ukraine car tout le monde s'en fout, ce n'est pas demandé, et ça leur coute de l'espace disque.

Ce genre de politique peut être obtenue via CEPH en jouant sur les pools sur lequel on écrira l'objet. Décision prise par les serveurs webs ( pas cool ). Et pire, le résultat obtenu sera “statique” : si ma vidéo fait le buzz parce que j'ai mis un chapeau péruvien ridicule et que je zozotait, il sera assez difficile de la changer de pool, et le tout de manière transparente.

Bien sur tout ceci est à nuancer, et CEPH Object Gateway est vraiment un outil super, mais il ne conviendra à mon sens pas à certaines situations particulières et exigeantes.

Liens

Un CDN personnalisé ?

Bon, supposons que j'apporte un attention très poussée à la gestion de la réplication des données sur mon CDN. Je veux aussi pas surcharger mes liens internes. Comment faire ?

Bah j'ai cherché longtemps, et je n'ai pas trouvé. On va dire que proposer une solution libre et simple serait un de mes projets.

Architecture de la solution

L'architecture s’appuierai sur quatre éléments :

Un petit schéma vous permettra de mieux comprendre de quoi il en retourne…

Pour plus de souplesse, le système s'appuiera sur un ensemble de scores :

  1. Initial, envoyé lors du PUT ( permettra a la vidéo de Cyprien d'être directement dupliquée sur de nombreux data-centers…)
  2. En fonction du nombres de vues… L'objet serais copié en cas de nécessité vers les autres data-centers.

Clairement, compte tenu de ces choix il nous faut :

Conclusion

Le projet est dans les cartons et attend un peu de temps libre pour avancer.

Note : j'entrevois une difficultée : c'est l'authentification lors de l'accès au contenu… Comme on ne passe plus par les serveurs webs, ça complique les choses… A moins de renoncer dans ce cas à servir directement le client…

Benoit Tellier 2014/02/18 21:26