Resolvendo PGs Inconsistent No CEPH Manualmente
Recentemente eu tive um problema de badblock em um dos discos que gerou uma inconsistent na PG e o cluster não conseguiu se resolver automaticamente, mesmo tirando o disco defeituoso do cluster e parando a OSD associada.
As soluções abaixo me ajudaram a resolver meu problema que se estendeu por alguns dias. Caso tenha suporte recomendo abrir um chamado ou faça por sua conta e risco.
A solução 1 resolver a maioria dos casos e no meu caso não houver impacto nem downtime.
Problema ocorreu no Ubuntu 16.4 com Jewel utilizando FileStore replica de 3.
Antes de iniciar recomendo a leitura do meu post “Ceph Scrubbing” será fundamental você entender esse cara antes de começar.
1 - Buscando pgs inconsistente no nosso caso “5.163”
# ceph health detail | grep inconsistent
HEALTH_ERR
pg 5.163 is active+remapped+inconsistent+wait_backfill, acting [26,45,135]
Podemos ver que apresentou também em quais OSDs estão essas pgs [26,45,135] execute o comando abaixo para descobrir em quais servidores estão as OSDs
root@serv-117:/home/bruno.carvalho# ceph osd find 26
{
"osd": 16,
"ip": "10.0.0.14:6842\/21992",
"crush_location": {
"host": "stor-121",
"rack": "sata",
"root": "default"
}
}
root@serv-117:/home/bruno.carvalho# ceph osd find 45
{
"osd": 91,
"ip": "10.0.0.15:6814\/8362",
"crush_location": {
"host": "stor-122",
"rack": "sata",
"root": "default"
}
}
root@serv-117:/home/bruno.carvalho# ceph osd find 135
{
"osd": 30,
"ip": "10.0.0.17:6812\/10485",
"crush_location": {
"host": "stor-124",
"rack": "sata",
"root": "default"
}
}
2 - Logue no servidor da OSD primaria e busque o objeto problemático, se objeto problemático estiver na primaria não esqueça de descer com primary-affinity.()
# grep -Hn 'ERR' /var/log/ceph/ceph-osd.26.log (apresentar uma tripa de erro, o importante será o nome do objeto )
..... log [ERR] : 5.163 ....
udata.3b2ab5c0fdd3f.00000000000059d2__head_892078F9__4
.....
No Monitor podemos buscar com o comando abaixo (apresenta um json grande, porem o importante é o nome do objeto, algo parecido com nome do comando acima.)
# rados list-inconsistent-obj 5.163--format=json-pretty
Se nescessário jogue a OSD primário para outra OSD.
# ceph osd primary-affinity 26 0
3 - Logue nos servidores das 3 OSDs, busque o arquivo e verifique o md5 do objeto, seu tamanho e identifique o que está diferente entre os 3, no caso o objeto diferente será o que você irar remover para mandar o cluster se recuperar.
# find /var/lib/ceph/osd/ceph-26/current/5.163_head/ -name '*00000000000059d2*' -ls
...
/var/lib/ceph/osd/ceph-26/current/5.163_head/rbd\\udata.3b2ab5c0fdd3f.00000000000059d2__head_892078F9__4
# md5sum /var/lib/ceph/osd/ceph-26/current/5.163_head/rbd\\udata.3b2ab5c0fdd3f.00000000000059d2__head_892078F9__4\
d12a1f042f2a98a79943c990d3a5b2c8 /var/lib/ceph/osd/ceph-26/current/5.163_head/rbd\\udata.3b2ab5c0fdd3f.00000000000059d2__head_892078F9__4
4 - Set noout no cluster
# ceph osd set noout
5 - Pare a OSD
# systemctl stop ceph-osd@26
6 - Execute o flush do journal
# ceph-osd -i 26 --flush-journal
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2018-08-23 18:31:57.691076 7f69269888c0 -1 flushed journal /var/lib/ceph/osd/ceph-26/journal for object store /var/lib/ceph/osd/ceph-26
7 - Remova o Objecto com problema
# rm -rf /var/lib/ceph/osd/ceph-26/current/5.163_head/rbd\\udata.3b2ab5c0fdd3f.00000000000059d2__head_892078F9__4
8 - Corrigindo permissão da OSD
# chown ceph:ceph -R /var/lib/ceph/osd/ceph-26/current/omap/
9 - Subindo OSD
# systemctl start ceph-osd@26
10 - Tira o noout no cluster e aguarde o cluster ficar com apenas a pg inconsistent
# ceph osd unset noout
11 - Vamos agora executar um repair para corrigir o problema.
# ceph pg repair 5.163
Agora veja o log da OSD primaria.
# tail -f /var/log/ceph/ceph-osd.26.log
2018-08-23 18:33:30.568207 7fc1ee195700 -1 log_channel(cluster) log [ERR] : 5.163 shard 26 missing 5:9f1e0491:::rbd_data.3b2ab5c0fdd3f.00000000000059d2:head
2018-08-23 18:33:30.568212 7fc1ee195700 0 log_channel(cluster) do_log log to syslog
2018-08-23 18:33:36.274075 7fc1ee195700 -1 log_channel(cluster) log [ERR] : 5.163 repair 1 missing, 0 inconsistent objects
2018-08-23 18:33:36.274079 7fc1ee195700 0 log_channel(cluster) do_log log to syslog
2018-08-23 18:33:36.274142 7fc1ee195700 -1 log_channel(cluster) log [ERR] : 5.163 repair 1 errors, 1 fixed
2018-08-23 18:33:36.274144 7fc1ee195700 0 log_channel(cluster) do_log log to syslog
No log acima podemos ver “log [ERR] : 5.163 repair 1 errors, 1 fixed” isso mostra que ele encontrou o objecto que faltava e corrigiu criando novamente a replica.
Solução 2
Identificar e remover o objeto problemático na OSD excluindo com ceph-object-tools executando com deep-scrub
Com o objeto problemático já identificado, execute os procedimentos: 4, 5 e 6 após sigar os procedimentos abaixo
1 - Com a OSD down localize o objeto
# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26 --journal /var/lib/ceph/osd/ceph-26/journal --pgid 5.163 --op list | grep rbd_data.3b2ab5c0fdd3f.00000000000059d2
["5.163",{"oid":"rbd_data.3b2ab5c0fdd3f.00000000000059d2","key":"","snapid":-2,"hash":3828189539,"max":0,"pool":5,"namespace":"","max":0}]
2 - Removendo Objeto.
# ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-26 --journal /var/lib/ceph/osd/ceph-26/journal --pgid 5.163 '{"oid":"rbd_data.3b2ab5c0fdd3f.00000000000059d","key":"","snapid":-2,"hash":3828189539,"max":0,"pool":5,"namespace":"","max":0}' remove
remove #5:c691b427:::rbd_data.3b2ab5c0fdd3f.00000000000059d2:head#
3 - Corrigir permissão
# chown -R ceph:ceph /var/lib/ceph/osd/ceph-135/current/omap/
4 - Iniciar OSD
# systemctl start ceph-osd@26
5 - Execute o deep-scrub na pg (Veja artigo do “Ceph Scrubbing”, para execução com espaço de tempo menor)
# ceph pg deep-scrub 5.163
O deep-scrub no CEPH é um processo que passa em todas OSDs para verificar inconsitencia dos dados e corrigir eventuais problemas, podemos comparar ao fsck. Dependendo das configurações do seu Cluster o deep-scrub não executará imediatamente, verifique no log da OSD primaria ou execute o seguinte comando query pg e veja data da ultima vez que ele passou.
Se o deep-scrub não for executado, verifique as configurações de osd_scrub_max_interval, também é importante verificar o osd_scrub_load_threshold, pois se sua CPU estiver e um certo limite o deep-scrub não rodará.
Leia mais sobre: “Ceph Scrubbing”
6 - Query pg
# ceph pg 5.163 query
..................
"last_deep_scrub_stamp": "2018-08-23 15:48:42.107928",
..................
Também podemos verificar logo no final do comando query o deep-scrub sendo executado na PG.
"scrub": {
"scrubber.epoch_start": "57000",
"scrubber.active": 1,
"scrubber.state": "WAIT_REPLICAS",
"scrubber.start": "5:578cfc17:::rbd_data.57e3dd6b7d297f.000000000000b063:0",
"scrubber.end": "5:578cff8c:::rbd_data.552a0c53cb890c.00000000000046aa:0",
"scrubber.subset_last_update": "58460'37642760",
"scrubber.deep": true,
"scrubber.seed": 4294967295,
"scrubber.waiting_on": 1,
"scrubber.waiting_on_whom": [
"48"
Após o termino do deep-scrub provavelmente sua pg já estará OK.
No próximo post irei apresentar:
- Métricas de Latência no Ceph
Referência: http://lists.ceph.com/pipermail/ceph-users-ceph.com/