En corto

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1. Clase del OSD. Si ya tiene una (hdd/ssd/nvme automática), quítala primero: Ceph no la pisa
ceph osd crush rm-device-class osd.5
ceph osd crush set-device-class sas osd.5

# 2. Regla que solo coloca datos en esa clase (root "default", dominio de fallo "host")
ceph osd crush rule create-replicated replicated_sas default host sas

# 3. Pool nuevo sobre la regla, dado de alta como storage en Proxmox
pveceph pool create vm-sas --crush_rule replicated_sas --add_storages 1

# ...o mover un pool que ya existe (reequilibra todos sus datos)
pveceph pool set vm-fast --crush_rule replicated_sas

Por qué

La regla por defecto de Ceph (replicated_rule) reparte objetos entre todos los OSD sin mirar qué disco hay debajo. En un clúster mixto eso significa que el pool “rápido” también cae en los discos lentos y rinde como el peor de ellos.

Desde Luminous cada OSD lleva una device class. Ceph la detecta sola al arrancar (hdd, ssd o nvme) y una CRUSH rule puede limitarse a una clase: internamente crea una jerarquía sombra (default~sas) con solo esos OSD y coloca ahí todo el pool. La clase es una etiqueta libre: además de las automáticas puedes usar sas, sata, archive o lo que te sirva para separar.

Ver el estado

1
2
3
4
5
6
7
ceph osd tree                        # columna CLASS por OSD
ceph osd crush class ls              # clases que existen
ceph osd crush class ls-osd sas      # OSD de una clase
ceph osd crush tree --show-shadow    # las jerarquías sombra default~<clase>
ceph osd crush rule ls
ceph osd crush rule dump replicated_sas
ceph osd pool ls detail              # crush_rule <id> de cada pool

Cambiar la clase de un OSD

Si el OSD ya tiene clase, set-device-class no la sobrescribe:

1
2
Error EBUSY: osd.5 has already bound to class 'hdd', can not reset class to 'sas';
use 'ceph osd crush rm-device-class <id>' to remove old class first

De ahí el rm-device-class previo. Varios OSD de una vez:

1
2
ceph osd crush rm-device-class osd.5 osd.6 osd.7
ceph osd crush set-device-class sas osd.5 osd.6 osd.7

No existe un paso de “crear la clase”: el ceph osd crush class create de las primeras versiones de Luminous se eliminó, y la clase aparece con el primer OSD que la recibe. Para renombrarla en todo el clúster, ceph osd crush class rename sas sas-10k.

Una clase asignada a mano sobrevive a los reinicios del OSD: al arrancar, el OSD intenta poner su clase automática y recibe el mismo EBUSY. Si prefieres que los OSD nuevos nazcan sin clase para asignarla tú, ceph config set osd osd_class_update_on_start false; a cambio, ningún OSD nuevo tendrá clase automática.

La regla

1
2
3
ceph osd crush rule create-replicated <nombre> <root> <dominio-de-fallo> <clase>
ceph osd crush rule create-replicated replicated_sas default host sas
ceph osd crush rule create-replicated replicated_nvme default host nvme
  • root es default salvo que hayas montado tu propio árbol CRUSH.
  • host como dominio de fallo pone cada réplica en un nodo distinto. Con size 3 necesitas al menos tres nodos con OSD de esa clase, o los PG se quedan undersized.
  • Para pools erasure-coded la clase va en el perfil: pveceph pool create ec-sas --erasure-coding k=4,m=2,device-class=sas.

El pool

Nuevo, con storage de Proxmox incluido:

1
pveceph pool create vm-sas --crush_rule replicated_sas --size 3 --min_size 2 --add_storages 1

Existente: pveceph pool set vm-fast --crush_rule replicated_sas, o en la GUI Ceph → Pools → Edit → Crush Rule. Es lo mismo que ceph osd pool set vm-fast crush_rule replicated_sas. El cambio dispara un backfill de todo el pool hacia los OSD de la clase; hazlo en ventana de mantenimiento y síguelo con ceph -s.

Trampas

  • Cuenta los OSD antes de la regla. Tres nodos, size 3, y solo dos con discos sas: el pool nunca llega a active+clean.
  • Las clases automáticas se equivocan con controladoras RAID/HBA que presentan SSD como rotacionales. Revisa ceph osd tree después de añadir discos y corrige con rm-device-class + set-device-class.
  • Mover un pool grande de regla es mover todos sus datos. Sube osd_max_backfills solo si sabes lo que haces; por defecto va lento a propósito.
  • Borrar un pool que se resiste: pveceph pool destroy <pool> --force --remove_storages (los datos se van con él).

Ver también