ceph est un logiciel permettant d'effectuer du stockage d'une maniere repartie sur plusieurs serveurs. La configuration de celui-ci n'est pas une chose simple car elle dépend de l'infrastructure dont on dispose. les explications ici ont été fait sur un ou plusieurs serveurs proxmox car ceph y est simple d'installation. J'ai écris aussi cette entrée de blog car il n'y a pas beaucoup de ressources sur ceph en francais sur la facon de réfléchir et penser sur la facon de stocker les données.
La premiere chose a savoir est qu'il faut penser a 2 choses :
- la declaration d'un espace de stockage (ceph denome ceci 'pool')
- comment cet espace de stockage doit etre répliquer afin de ne pas perdre de données. (la crushmap)
1 exemple : un serveur avec 2 disques. par defaut ceph considère qu'un bloc de donnée doit etre répartie 3 fois afin d'eviter de le perdre en cas de probleme avec un disque ou un host. dans cet example le serveur aura 1 monitor et 1 manager. les 2 disques sont les 2 osd disponibles pour l'infrastructure. (en plus de celui présent pour faire fonctionner le systeme proxmox).
Dans ce cas precis, ceph fonctionne comme du RAID-1, les données sont présentent sur les 2 disques, le pool doit donc etre configuré en min-rep=1 et max-rep=2. il faut aussi modifier la crushmap afin d'indiquer pour le pool que celui-ci doit répliquer les données non pas entre les hosts (nous n'avons qu'un seul serveur) mais entre les osd. cela se fait de la maniere suivante :
rule monPool { ruleset 1 type replicated step take default step choose firstn 0 type osd step emit }
la valeur 0 signifie que l'on prend l'ensemble des osd disponible (si il y a une valeur alors cela replique les données que sur le nombre voulu et donc prend la main sur la configuration du pool).
Si l'on veux etre dans la configuration d'un pool par defaut (3 copies avec minimum 2 présentent) il nous faudrait 3 disques pour les osd sur le serveur dans ce cas le pool pourra etre configuré en 3/2 (si un disque tombe il reste 2 copies de la données).
autre exemple : 4 serveurs répartie 2 et 2 dans 2 salles differentes avec le meme nombre de disques dedié aux osd (c'est tres important d'avoir la meme quantité de stockage sur chaque serveur d'un cluster ceph).
Ici il faut reflechir a ce qui peux etre innaccessible. Il peux y avoir un probleme avec un disque, un serveur ou carrement avec une salle complete (genre probleme electrique ou coupure du reseau sur une salle, fortement possible lors d'une mise a jours d'un element du reseau).
Nous allons donc installer un monitor sur chaque serveur afin de palier au probleme de reboot d'un serveur ainsi si un serveur tombe, il faut aussi un manager dans chaque salle de maniere a avoir toujours un manager de disponible. cependant en cas de perte d'une salle les 2 monitors present ne pourront pas elire un maitre car il faut un nombre impaire pour départager le vote. Il est donc necessaire d'installer un monitor sur un serveur connecter aux 2 salles (generalement dans un autre local technique connecter doublement au 2 salles centrales ou se trouve les serveurs ceph. Sur ce serveur on installe uniquement un monitor et un manager de secours. La necessité d'un nombre impaire de monitor est donc dans ce cas bien visible. Si une salle tombe nous avons 3 monitors et donc le quorum est ok.
dans notre cas precis et afin d'avoir une securisation des données, il faut que notre pool soit configure en 4/2. chaque données sera repliquer sur chaque serveur dans les 2 salles. si une salle tombe ceph continura a fonctionner car il y aura toujours 3 monitors et 2 copie de la données sur chaque serveur de la salle qui restera vivante (ici peu importe le disque sur le serveur, de toute facon il y a asser de copies au cas ou un disque tombe)
En cas de perte d'une salle pas de probleme, il y a 3 monitor actif et 2 copies de données (une sur chaque serveur)
En cas de perte d'un serveur pas de probleme il y aura toujours 3 copies présentes
En cas de perte d'un disque pas de probleme non plus il y aura toujours 3 copies présentes
du coup la crushmap sera plutot la suivante (j'ecris ici ce que proxmox ne configura pas par defaut et donc qu'il faudra rajouter a la main) :
room salle1 { alg straw2 hash 0 item serveur1 weight <valeur en terabits 1T = 1.00000> item serveur2 weight <valeur en terabits 1T = 1.00000> } room salle2 { alg straw2 hash 0 item serveur3 weight <valeur en terabits 1T = 1.00000> item serveur4 weight <valeur en terabits 1T = 1.00000> } root default { alg straw hash 0 item salle1 weight <valeur en terabits 1T = 1.000> item salle2 weight <valeur en terabits 1T = 1.000> } # rules rule monPool { ruleset 1 type replicated step take default step choose firstn 2 type room step chooseleaf firstn 2 type host set emit }
</code> ici nous voulons 2 copies allants dans chaque salles et au moins 2 copies sur chaque host. le pool etant configuré en 4 copies avec 2 copies minimum.