Comecei recentemente com ceph, herdei 1 cluster grande para manutenção e agora estou construindo cluster de recuperação. Por meio de um jogo de tentativa e fracasso, consegui criar regras de esmagamento que atendessem ao meu propósito, mas não consegui entender a sintaxe da definição de regras de esmagamento. Alguém poderia explicar (não faça referência aos documentos ceph, pois eles não explicam isso)?
Aqui está minha configuração de cluster de produção:
20 hosts distribuídos em 2 salas, 2 racks em cada sala, 5 servidores por rack, 10 OSDs por host, 200 OSDs no total.
Alguém queria uma configuração super segura, então a replicação é 2/4 e as regras são (supostamente) definidas para replicar para outra sala, 2 cópias em cada rack, 4 no total para cada objeto. Aqui está a regra:
rule replicated_nvme {
id 4
type replicated
min_size 1
max_size 100
step take default class nvme
step choose firstn 0 type room
step choose firstn 2 type rack
step chooseleaf firstn 1 type host
step emit
}
No meu novo cluster eu tenho uma configuração menor, então apenas 2 racks com 2 servidores cada para teste. Eu tentei isso, semelhante ao anterior, mas sem espaço:
rule replicated-nvme {
id 6
type replicated
step take default class nvme
step choose firstn 0 type rack
step chooseleaf firstn 1 type host
step emit
}
Porém, isso não produz o resultado desejado (com replicação 2/4 deve-se copiar para outro rack cada cópia para um servidor diferente). O que obtive foram 2 réplicas em servidores em racks diferentes e 2 cópias adicionais não criadas. Eu recebo isso do ceph:
pgs: 4/8 objects degraded (50.000%)
1 active+undersized+degraded
e vejo que apenas 2 OSDs são usados, não 4!
Então, joguei e mudei para isto:
rule replicated-nvme {
id 6
type replicated
step take default class nvme
step choose firstn 0 type rack
step chooseleaf firstn 0 type host
step emit
}
e funciona. Os PGs do pool são replicados para 4 OSDs em 2 racks (2 OSDs em cada rack). A única diferença é chooseleaf firstn 0 type host
em vez de chooseleaf firstn 1 type host
.
As perguntas são:
- qual é a diferença entre
choose
echooseleaf
- qual é o significado do número depois
firstn
- como é definida a hierarquia das etapas , o que é verificado antes e depois?
Resumindo, gostaria de saber a sintaxe das regras de crush.
Apenas para esclarecimento, embora o cluster de produção tenha um número par de hosts por sala/rack e até mesmo regras de replicação, a distribuição dos objetos não é muito uniforme. Ou seja, a distribuição dos PGs pode diferir em até 10% por OSD.
Suspeito que a primeira regra definida acima esteja errada e que apenas pelo grande número de OSDs a distribuição seja mais ou menos igual.