Déploiement de Ceph chez Ippon Hosting

La résilience des données est une problématique qui ne date pas d’hier, tout comme la haute disponibilité de l’accès à ces données. Le stockage réparti semble être la solution à ces problèmes. La notion de stockage objet devient également de plus en plus importante, dans l’optique de pouvoir interfacer sa solution de stockage avec sa solution de IaaS ou de PaaS, voire avec un service externe. Face au nombre grandissant de demandes de la part de nos clients, concernant ce type de mécanisme, Ippon Hosting s’est tourné vers le projet Ceph.

Pour deployer Ceph au sein d’Ippon Hosting nous avons eu besoin des éléments suivants:

  • Serveur de stockage : Carte réseau dédiée pour l’accès et une autre pour la réplication des données entre les nœuds.
  • VM de Management
  • VM pour la RadosGW (Passerelle API vers Ceph)

Voici le schéma d’architecture dessiné :

Pour l’ensemble de nos serveurs, le système d’exploitation installé est Ubuntu 12.04.4 LTS amd64.
Il faut commencer par installer la VM de management qui permettra de gérer l’ensemble des nœuds.

Installation VM Management

Configuration d’apt

Voici les commandes a exécuter :

wget -q -O- ‘https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc’ | sudo apt-key add –
echo deb http://ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt-get update && sudo apt-get install ceph-deploy

L’installation du paquet ceph-deploy permettra de gérer l’installation du parc à distance

Création et configuration de l’utilisateur Ceph :

sudo useradd -d /home/ceph -m ceph
sudo passwd ceph
echo “ceph ALL = (root) NOPASSWD:ALL” | sudo tee /etc/sudoers.d/ceph
sudo chmod 0440 /etc/sudoers.d/ceph
su – ceph
ssh-keygen

Pour que le serveur de management puisse atteindre l’ensemble des nœuds, il faut s’assurer qu’il y ait la résolution de nom. Pour aller plus vite nous allons utiliser le fichier système : /etc/hosts

10.0.0.1 ceph01
10.0.0.2 ceph02
10.0.0.3 ceph03

Mise en place des nœuds :

Sur l’ensemble des nœuds à faire gérer par la VM de Management, il faut configurer l’utilisateur Ceph et y placer la clé SSH de l’utilisateur Ceph :

sudo useradd -d /home/ceph -m ceph
sudo passwd ceph
echo “ceph ALL = (root) NOPASSWD:ALL” | sudo tee /etc/sudoers.d/ceph
sudo chmod 0440 /etc/sudoers.d/ceph

Sur le serveur de management:

ssh-copy-id cephXX

Désormais le serveur management peut y déployer les paquets et les configurations Ceph.

Installation de Ceph

Nous utiliserons 3 Serveurs de Stockage ayant 4 disques de 4 To et 2 disques SSD de 60Go (ceph01, ceph02, ceph03). Ces serveurs seront nos nœuds de stockage.

Installation

On crée le répertoire qui hébergera les informations de configuration de notre cluster sur la VM d’admin :

ceph@cephmngnt01:~$ mkdir my-cluster/

Et on installe Ceph sur les nœuds en définissant l’hôte ceph01 serveur de monitoring :

ceph@cephmngnt01:~$ cd my-cluster
ceph@cephmngnt01:~/my-cluster$ ceph-deploy new ceph01
ceph@cephmngnt01:~/my-cluster$ ceph-deploy install ceph01 ceph02 ceph03
ceph@cephmngnt01:~/my-cluster$ ceph-deploy mon create-initial

Le serveur mon permet de monitorer la disponibilité des disques de chaque noeuds (Ceph OSD Up/Down). Si le serveur mon tombe, le cluster tombe. C’est pour cela qu’il est important d’avoir un nombre IMPAIRE de serveur mon, un minimum de 3 pour assurer un bon fonctionnement.

Configuration d’un serveur monitor

Nous ajoutons donc deux serveurs mon :

ceph@cephmngnt01:~/my-cluster$ ceph-deploy mon create ceph02 ceph03

On peut valider que les serveurs de monitoring sont bien ajoutés par cette commande :

ceph@cephmngnt01:~/my-cluster$ ceph quorum_status –format json-pretty
{ “election_epoch”: 200,
“quorum”: [
0,
1,
2],
“quorum_names”: [
“ceph01”,
“ceph02”,
“ceph03”],
“quorum_leader_name”: “ceph01”,
“monmap”: { “epoch”: 3,
“fsid”: “UUID”,
“modified”: “2014-05-28 10:32:23.494382”,
“created”: “0.000000”,
“mons”: [
{ “rank”: 0,
“name”: “ceph01”,
“addr”: “10.0.0.1:6789\/0”},
{ “rank”: 1,
“name”: “ceph02”,
“addr”: “10.0.0.2:6789\/0”},
{ “rank”: 2,
“name”: “ceph03”,
“addr”: “10.0.0.3:6789\/0”}]}}

Enfin nous allons modifier le fichier de configuration ceph.conf :

ceph@cephmngnt01:~/my-cluster$ vim ceph.conf
[…..]
mon_initial_members = ceph01, ceph02, ceph03
mon_host = 10.0.0.1, 10.0.0.2, 10.0.0.3
[…..]
[mon.0]
host = ceph01
mon addr = 10.0.0.1:6789
[mon.1]
host = ceph02
mon addr = 10.0.0.2:6789
[mon.2]
host = ceph03
mon addr = 10.0.0.3:6789

Désormais il faut configurer Ceph pour lui indiquer d’utiliser deux réseaux différents pour le cluster et l’accès :

ceph@cephmngnt01:~/my-cluster$ vim ceph.conf
[…..]
filestore_xattr_use_omap = true
public network = 10.0.0.0/24
cluster network = 192.168.3.0/24
[…..]

Configuration des OSD

L’OSD correspond à un espace disque, l’OSD peut être une partition ou un disque en entier. On va exporter le journal du disque OSD vers un disque SSD.
Dans notre cas sur les serveurs ceph01, ceph02 et ceph03 les disques suivants seront les espaces utilisés :

  • /dev/sdc
  • /dev/sdd
  • /dev/sde
  • /dev/sdf

Leurs journaux seront respectivement /dev/sdb1,2,3,4

Pour commencer nous allons créer les partitions sur /dev/sdb sur les nœuds Ceph :

root@ceph0X:~# parted /dev/sdb
GNU Parted 2.3
Utilisation de /dev/sdb
Bievenue sur GNU Parted ! Tapez ‘help’ pour voir la liste des commandes.
(parted) print
Modèle: ATA INTEL SSDSC2CT06 (scsi)
Disque /dev/sdb : 60,0GB
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : gpt
Numéro Début Fin Taille Système de fichiers Nom Fanions
(parted) mkpart 1 xfs 1 10241
(parted) mkpart 2 xfs 10242 20482
(parted) mkpart 3 xfs 20483 30723
(parted) mkpart 4 xfs 30724 40964
(parted) print
Modèle: ATA INTEL SSDSC2CT06 (scsi)
Disque /dev/sdb : 60,0GB
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : gpt
Numéro Début Fin Taille Système de fichiers Nom Fanions
1 1049kB 10,2GB 10,2GB 1
2 10,2GB 20,5GB 10,2GB 2
3 20,5GB 30,7GB 10,2GB 3
4 30,7GB 41,0GB 10,2GB 4

Nous avons désormais 10Go pour les journaux des 4 disques de 4To, on peut déployer les OSD.

Il faut se connecter sur le serveur de Management:

ceph@cephmngnt01:~/my-cluster$ ceph-deploy –overwrite-conf osd create ceph0{1,2,3}:sdc:/dev/sdb1
ceph@cephmngnt01:~/my-cluster$ ceph-deploy –overwrite-conf osd create ceph0{1,2,3}:sdd:/dev/sdb2
ceph@cephmngnt01:~/my-cluster$ ceph-deploy –overwrite-conf osd create ceph0{1,2,3}:sde:/dev/sdb3
ceph@cephmngnt01:~/my-cluster$ ceph-deploy –overwrite-conf osd create ceph0{1,2,3}:sdf:/dev/sdb4

Ces commandes ont créé les OSDs sur les nœuds :

/dev/sdc1 3,7T 39M 3,7T 1% /var/lib/ceph/osd/ceph-X
/dev/sdd1 3,7T 12G 3,7T 1% /var/lib/ceph/osd/ceph-X
/dev/sde1 3,7T 2,9G 3,7T 1% /var/lib/ceph/osd/ceph-X
/dev/sdf1 3,7T 8,5G 3,7T 1% /var/lib/ceph/osd/ceph-X

Pour finaliser le cluster, nous allons pousser le fichier de configuration ceph.conf présent sur le serveur de management sur l’ensemble des nœuds :

ceph@ih-prd-cephmngnt01:~/my-cluster$ ceph-deploy –overwrite-conf admin ceph01 ceph02 ceph03 ih-prd-cephmngnt01

Et nous validons le bon fonctionnement

ceph@ih-prd-cephmngnt01:~/my-cluster$ ceph health
HEALTH_OK

De même que nous validons que les serveurs mon fonctionne

ceph@ih-prd-cephmngnt01:~/my-cluster$ ceph quorum_status –format json-pretty
{ “election_epoch”: 28,
“quorum”: [
0,
1,
2],
“quorum_names”: [
“ceph01”,
“ceph03”,
“ceph04”],
“quorum_leader_name”: “ceph01”,
“monmap”: { “epoch”: 3,
“fsid”: “UUID”,
“modified”: “2014-05-28 10:32:23.494382”,
“created”: “0.000000”,
“mons”: [
{ “rank”: 0,
“name”: “ceph01”,
“addr”: “10.0.0.1:6789\/0”},
{ “rank”: 1,
“name”: “ceph02”,
“addr”: “10.0.0.2:6789\/0”},
{ “rank”: 2,
“name”: “ceph03”,
“addr”: “10.0.0.3:6789\/0”}]}}

Désormais on peut l’utiliser avec plusieurs méthodes :

  • Object Gateway : API S3 ou API Swift, pour cela il faut mettre en place une RadosGW
  • Block Device : Utilisation via libvirt/librbd ou via la commande rbd

Ces méthodes seront présentées dans un autre article.

Tweet about this on TwitterShare on FacebookGoogle+Share on LinkedIn

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


*