Ceph is a free software distributed file system initially created by Sage Weil. Ceph's main goals are to be
POSIX-compatible, and completely distributed without a single point of failure. The data is seamlessly replicated,
making it fault tolerant.
Architecture
Ceph est composé de 3 composants :
- ceph-osd (Object Storage Device), qui s'appuie sur une partition XFS ou Btrfs de préférence. Pour cette première utilisation je choisis Btrfs. C'est ce process qui va stocker les données et attributs sur disque.
- ceph-mds (Metadata Server), est le cache distribué de metadata. Mais ces metadatas sont stockés sur disque via ceph-osd. Ce process nécéssite donc beaucoup de mémoire.
- ceph-mon (Monitor), est le process qui chapote un peu le tout, c'est sur ce process que les clients se connectent. Il ne nécéssite pas énormément de ressource, mais contrairement aux 2 précédents process, il en faut au moins 3. S'ils fonctinnent en binome, il faut que les 2 répondent, donc il suffit qu'un seul tombe pour que tout tombe !
Connaissant ces contraintes, je suis parti sur cette configuration :
- 2 serveurs puissants, identiques, qui feront tourner ces 3 process.
- 2 serveurs cheaps, qui ne feront tourner qu'une instance ceph-mon chacun.
Installation
Ceph est une techno hyper récente, ça fait 3 ans qu'ils indiquent sur leur site qu'il ne faut absolument pas l'utiliser en production, je vais donc partir sur un environnement technique récent:
- Debian Wheezy, elle est freezée et doit sortir prochainement en stable
- kernel "maison" 3.5.3, qui est en faite un kernel Debian avec la config Debian, compilé avec make-kpkg, j'ai juste ajouté les modules suivants :
CONFIG_CEPH_LIB=m
# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
CONFIG_CEPH_FS=m
- - packages ceph provenant de ceph.com : ceux de wheezy sont en version 0.43, j'ai rencontré des problèmes qui ont été résolue, depuis la version 0.48 est grandement conseillée.
# cat /etc/apt/sources.list.d/ceph.list
deb http://ceph.com/debian/ wheezy main
# wget -q -O- https://raw.github.com/ceph/ceph/master/keys/release.asc | sudo apt-key add -
# apt-get install ceph
Configuration
Chaque process a besoin de son dossier :
Data-01:/var/local# mkdir mon mds osd
/var est une partition ext4, et on a besoin d'une partition btrfs pour le démon osd :
Data-01:~# grep btrfs /etc/fstab
/dev/sda9 /var/local/osd/osd.0 btrfs rw,noatime 0 0
Je vous passe les étapes de création d'un kernel, de formatage d'une partition, etc....
Tout est dans le fichier de configuration /etc/ceph/ceph.conf, prenez donc le temps de le faire correctement. Voici ma version, adapté à cette architecture :
[global]
auth supported = cephx
keyring = /etc/ceph/keyring.bin
max open files = 131072
log file = /var/log/ceph/$name.log
pid file = /var/run/ceph/$name.pid
[mon]
mon data = /var/local/mon/$name
[mon.Data-01]
host = Data-01
mon addr = 10.0.11.1:6789
[mon.Data-02]
host = Data-02
mon addr = 10.0.11.2:6789
[mon.Mon-01]
host = Mon-01
mon addr = 10.0.7.201:6789
[mon.Mon-02]
host = Mon-02
mon addr = 10.0.7.202:6789
[mds]
keyring = /etc/ceph/keyring.$name
[mds.Data-01]
host = Data-01
[mds.Data-02]
host = Data-02
[osd]
osd data = /var/local/osd/$name
keyring = /etc/ceph/keyring.$name
osd journal = /var/local/osd/$name/journal
osd journal size = 1024 ; journal size, in megabytes
# le nom des instances OSD doivent être des ids :
[osd.0]
host = Data-01
osd data = /var/local/osd/$name
[osd.1]
host = Data-02
osd data = /var/local/osd/$name
La plupart des tutoriaux trouvés sur le net zappent la partie authentification, comme j'ai l'intention de m'en servir en production, voici la procédure :
Data-01:/var/local# ceph-authtool /etc/ceph/keyring.bin --create-keyring --name client.admin --gen-key --bin
creating /etc/ceph/keyring.bin
Data-01:/var/local# ceph-authtool --print-key /etc/ceph/keyring.bin > /etc/ceph/secret
Data-01:/var/local# chmod 600 /etc/ceph/secret
Data-01:/var/local# ceph-authtool /etc/ceph/keyring.bin --name client.admin --cap osd allow --cap mds allow --cap mon allow
Ensuite, il faut créer le filesystem, mais cette création va interroger tous les serveurs définis dans le fichier de configuration, il faut donc au préalable copier la config :
Data-01:~# for s in Mon-01 Mon-02 Data-02 ; do rsync -av /etc/ceph/ $s:/etc/ceph/; done
Enfin on peut créer le FS en spécifiant le keyring :
Data-01:~# mkcephfs -a -c /etc/ceph/ceph.conf -k /etc/ceph/keyring.bin --mkbtrfs
Si tout se passe bien, il est temps de démarrer l'ensemble des serveurs, on peut le faire en une seule commande, depuis n'importe quel des 4 serveurs :
Data-01:~# /etc/init.d/ceph -a start
Utilisation
Bien, ben on va maintenant monter la partition CephFS ! D'abord avec un test à la main :
Data-01:/var/local# mount -t ceph -o name=admin,secretfile=/etc/ceph/secret Data-01.local:/ /var/local/data/
mount: error writing /etc/mtab: Invalid argumentData-01:/etc/ceph#
Cette erreur est étrange, mais ne pose aucun problème, au contraire pour moi elle indique que le montage s'est bien passé 
Par acquis de conscience, je vais ensuite démonter cette partition, puis tenter de la monter sur chaque serveur ceph-mon, et ne rencontrerais aucune difficulté.
Pour avoir un montage CephFS redondant, il est impératif de monter cette partition en spécifiant tous les ceph-mon dans l'instruction de montage, on peut le faire en séparant chaque ceph-mon par une virgule :
Data-01:~# grep ceph /etc/fstab
Mon-01,Mon-02,Data-01,Data-02:/ /var/data/ ceph noauto,name=admin,secretfile=/etc/ceph/secret 0 0
A ce moment, je me suis mis à faire tout un tas de tests: arrêter ceph sur un serveur monitor, puis sur un des serveurs de Data, puis juste un ceph-mon, juste un ceph-osd, juste un ceph-mds .... tant qu'il y en a un qui tourne, ça fonctionne, c'est formidable ! D'ailleurs, un truc à savoir, que je n'ai trouvé dans aucune doc, mais plutôt en lisant le script d'init, c'est comment faire pour arrêter un seul process sur un seul serveur :
Mon-02:~# /etc/init.d/ceph stop mon.Mon-02
L'état du cluster est visible avec la commande ceph -s :
Data-01:~# ceph -s
health HEALTH_OK
monmap e1: 4 mons at {Data-01=10.0.11.1:6789/0,Data-02=10.0.11.2:6789/0,Mon-01=10.0.7.201:6789/0,Mon-02=10.0.7.202:6789/0}, election epoch 40, quorum 0,1,2,3 Data-01,Data-02,Mon-01,Mon-02osdmap e59: 2 osds: 2 up, 2 in
pgmap v1066: 384 pgs: 384 active+clean; 29904 bytes data, 2351 MB used, 440 GB / 462 GB avail
mdsmap e68: 1/1/1 up {0=Data-01=up:active}
J'ai ensuite continuer ma config initiale, poser des données composés de 25k fichiers pour 2.3GB et depuis 2 semaines je ne rencontre aucun soucis. Dans ces conditions, voilà ce que donne un top :
3257 root 20 0 313m 164m 5112 S 0.0 0.3 1:11.94 /usr/bin/ceph-mds -i Data-01 --pid-file
/var/run/ceph/mds.Data-01.pid -c /etc/ceph/ceph.conf
3354 root 20 0 459m 105m 5024 S 0.0 0.2 2:33.72 /usr/bin/ceph-osd -i 0 --pid-file /var/run/ceph/osd.0.pid
-c /etc/ceph/ceph.conf
3103 root 20 0 139m 16m 3764 S 0.3 0.0 3:19.21 /usr/bin/ceph-mon -i Data-01 --pid-file
/var/run/ceph/mon.Data-01.pid -c /etc/ceph/ceph.conf
A voir avec le temps, pour l'instant Ceph remplit les conditions que je m'étais imposées : pas de SPoF, stable.



