Système de stockage distribué

Ceph est un système de stockage pour grappe de calcul opensource. Sur une infrastructure distribuée, hautement disponible et tolérante aux pannes, plusieurs interfaces ont été développées:

  • une API de périphériques bloc: RBD
  • une API de stockage objet compatible avec OpenStack: Rados GW
  • une API de système de fichiers (distant et partageable): CephFS

Toutes ces caractéristiques font des technologies Ceph un système largement utilisé dans les environnements OpenStack:

  • RBD peut fournir le support à l'exécution des machines virtuelles, ainsi qu'au stockage des images systèmes
  • Rados GW peut fournir le stockage objet nécessaire à fournir Swift ou en support à Gnocchi
  • CephFS peut fournir le support à la migration des VM ou au module manilla

L'architecture de Ceph repose principalement sur un ensemble d'agents:

  • les moniteurs (ceph-mon)
  • les gestionnaires de disques (ceph-osd)
  • la passerelle objet (ceph-rgw)
  • le gestionnaire pour système de fichier (ceph-mds)

Déploiement de Ceph

Dans l'architecture proposée (à 3 ctrl), chaque ctrl fournit tous les services.

Ceph dispose d'un outils pour automatiser son déploiement: ceph-deploy. La documentation associée à Ceph est très complète et décrit précisément les différents cas d'utilisation et d'optimisation de Ceph. C'est lui que nous utilisons dans cette partie.

Pour ce qui nous concerne, l'installation de Ceph se résume à:

  • configurer le dépôt pour Ceph sur chacun des ctrl:

    cat <<EOF > /srv/salt/state/ceph/apt.sls
    deb https://download.ceph.com/debian-jewel/ jessie main:
      pkgrepo.managed:
        - humanname: CephJewel
        - file: /etc/apt/sources.list.d/ceph-jewel.list
        - key_url: https://download.ceph.com/keys/release.asc
        - refresh_db: true
    EOF
    
  • configurer un compte utilisateur dédié Ceph (cephadm dans notre cas):

    • sur chacun des nœuds
    • ayant la possibilité de faire des SSH entres les comptes Ceph des ctrl
    • ayant la possibilité de réaliser des sudo sans mot de passe depuis le compte Ceph
    # cat <<EOF >> /srv/salt/pillars/users.sls
    cephadm:
      enforce_password: True
      empty_password: False
      sudouser: True
      sudo_rules:
        - ALL=(ALL) NOPASSWD:ALL
      ssh_keys:
        privkey: |
          -----BEGIN RSA PRIVATE KEY-----
          xxx
          -----END RSA PRIVATE KEY-----
        pubkey: ssh-rsa AAAA...
      ssh_auth:
        - ssh-rsa AAAA...
    
  • installer ceph-deploy sur un des nœuds et l'employer pour configurer la grappe de stockage:

    # cat <<EOF > /srv/salt/states/ceph/deploy.sls
    ceph-deploy:
      pkg.installed
    
    ceph-deploy new:
      cmd.run:
        - name: ceph-deploy new --fsid {{pillar['ceph']['fsid']}} ctrl-1.data ctrl-2.data ctrl-3.data
        - user: cephadm
        - require:
          - pkg: ceph-deploy
        - creates:
          - /home/cephadm/ceph.conf
          - /home/cephadm/ceph.mon.keyring
    
    /home/cephadm/ceph.conf:
      file.append:
        - text:
          - osd pool default size = 2
          - osd pool default min size = 1
          - osd pool default pg num = 128
          - osd pool default pgp num = 128
          - osd crush chooseleaf type = 1
        - onchanges:
          - cmd: ceph-deploy new
    
    ceph-deploy install:
      cmd.run:
        - name: ceph-deploy install --no-adjust-repos ctrl-1 ctrl-2 ctrl-3
        - user: cephadm
        - onchanges:
          - file: /home/cephadm/ceph.conf
    
    ceph-deploy mon create-initial:
      cmd.run:
        - name: ceph-deploy --overwrite-conf mon create-initial
        - user: cephadm
        - onchanges:
          - cmd: ceph-deploy install
        - creates:
          - /home/cephadm/ceph.client.admin.keyring
          - /home/cephadm/ceph.bootstrap-mds.keyring
          - /home/cephadm/ceph.bootstrap-osd.keyring
    
    ceph-deploy admin:
      cmd.run:
        - name: ceph-deploy --overwrite-conf admin ctrl-1 ctrl-2 ctrl-3
        - user: cephadm
        - onchanges:
          - cmd: ceph-deploy mon create-initial
    
    mds:
      cmd.run:
        - name: ceph-deploy mds create ctrl-1 ctrl-2 ctrl-3
        - user: cephadm
        - onchanges:
          - cmd: ceph-deploy mon create-initial
    
    rgw:
      cmd.run:
        - name: ceph-deploy rgw create ctrl-1 ctrl-2 ctrl-3
        - user: cephadm
        - onchanges:
          - cmd: ceph-deploy mon create-initial
    EOF
    

    Ce fichier permet la construction d'une grappe de stockage Ceph sans disque associé, comme l'atteste la commande suivante:

    # ceph -s
        cluster aea09d65-eb65-4a26-abe7-2cc050a2de9c
         health HEALTH_ERR
                192 pgs are stuck inactive for more than 300 seconds
                192 pgs stuck inactive
                no osds
         monmap e1: 3 mons at {ctrl-1=192.168.124.11:6789/0,ctrl-2=192.168.124.12:6789/0,ctrl-3=192.168.124.13:6789/0}
                election epoch 6, quorum 0,1,2 ctrl-1,ctrl-2,ctrl-3
         osdmap e2: 0 osds: 0 up, 0 in
                flags sortbitwise
          pgmap v3: 192 pgs, 2 pools, 0 bytes data, 0 objects
                0 kB used, 0 kB / 0 kB avail
                     192 creating
    
  • les paquets actuellement disponibles souffrent de 2 petits bugs (pour une plateforme Debian jessie):

    • l'emplacement du binaire sgdisk corrigé par un lien symbolique:

      # cat << EOF > /srv/salt/state/ceph/patch.sls
      /usr/sbin/sgdisk:
        file.symlink:
          - target: /sbin/sgdisk
      EOF
      
    • la création d'une règle udev pour la mise en place des liens symboliques by-parttypeuuid:

      # cat <<EOF > /srv/salt/states/ceph/files/60-ceph-by-parttypeuuid.rules
      #
      # Make sure /dev/disk/by-parttypeuuid is populated because
      # ceph-disk activate-all relies on it.
      #
      
      # forward scsi device event to corresponding block device
      ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
      
      ACTION=="remove", GOTO="persistent_storage_end_two"
      
      SUBSYSTEM!="block", GOTO="persistent_storage_end_two"
      
      # skip rules for inappropriate block devices
      KERNEL=="fd*|mtd*|nbd*|gnbd*|btibm*|md*", GOTO="persistent_storage_end_two"
      
      # ignore partitions that span the entire disk
      TEST=="whole_disk", GOTO="persistent_storage_end_two"
      
      # for partitions import parent information
      ENV{DEVTYPE}=="partition", IMPORT{parent}="ID_*"
      
      # skip unpartitioned removable media devices from drivers which do not send "change" events
      ENV{DEVTYPE}=="disk", KERNEL!="sd*|sr*", ATTR{removable}=="1", GOTO="persistent_storage_end_two"
      
      # probe filesystem metadata of disks
      KERNEL!="sr*", IMPORT{program}="/sbin/blkid -o udev -p $tempnode"
      
      # NEW: by-parttypeuuid links (type.id)
      ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_TYPE}=="?*", ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-parttypeuuid/$env{ID_PART_ENTRY_TYPE}.$env{ID_PART_ENTRY_UUID}"
      
      LABEL="persistent_storage_end_two"
      EOF
      
      # cat <<EOF >> /srv/salt/state/ceph/patch.sls
      /lib/udev/rules.d/60-ceph-by-parttypeuuid.rules:
        file.managed:
          - source: salt://ceph/files/60-ceph-by-parttypeuuid.rules
      EOF
      
  • ajouter les disques durs (en détruisant l'ensemble de leurs contenus) au sein de la grappe Ceph

    # cat <<EOF > /srv/salt/states/ceph/disks.sls
    {% for hdd in pillar['iodisks'][grains['host']] %}
    
    ceph-disk prepare {{hdd}}:
      cmd.run:
        - name: sudo ceph-disk prepare --zap --cluster ceph --cluster-uuid {{pillar['ceph']['fsid']}} --fs-type xfs {{hdd}}
        - user: cephadm
    
    {% endfor %}
    
    ceph-disk activate-all:
      cmd.run:
        - name: sudo ceph-disk activate-all
        - user: cephadm
    EOF
    

    Ce fichier permet l'ajout des disques dans la grappe de stockage Ceph, comme l'atteste la commande suivante:

    # ceph -s
        cluster aea09d65-eb65-4a26-abe7-2cc050a2de9c
         health HEALTH_OK
         monmap e1: 3 mons at {ctrl-1=192.168.124.11:6789/0,ctrl-2=192.168.124.12:6789/0,ctrl-3=192.168.124.13:6789/0}
                election epoch 6, quorum 0,1,2 ctrl-1,ctrl-2,ctrl-3
         osdmap e24: 6 osds: 6 up, 6 in
                flags sortbitwise
          pgmap v73: 704 pgs, 6 pools, 1636 bytes data, 171 objects
                218 MB used, 30435 MB / 30653 MB avail
                     704 active+clean
    

Automatisation

L'intégration de toutes ces étapes se fait à l'aide du fichier d'orchestration suivant:

# cat <<EOF > /srv/salt/states/orch/ceph.sls
apt:
  salt.state:
    - tgt: '*'
    - sls: ceph.apt

ceph-deploy install:
  salt.state:
    - tgt: '{{pillar['firstnode']}}.*'
    - sls: ceph.deploy

patch ctrl:
  salt.state:
    - tgt: 'ctrl*'
    - sls: ceph.patch

ceph-disk:
  salt.state:
    - tgt: 'ctrl*'
    - sls: ceph.disks
EOF

La mise en œuvre de toutes ces configurations se fait avec:

# salt-run state.orchestrate orch.ceph

À l'aide de l'outil osfs, pour tout reconstruire jusqu'à cette étape, il suffit de faire:

# osfs env-build --target ceph

Première page / Page précédante / Sommaire / Page suivante / Dernière page