Como construir uma verificação de integridade do MongoDB no HAProxy?

3

Há um exemplo fastcgi de uma verificação de integridade binária no blog HAProxy . Como eu poderia construir uma verificação semelhante para o MongoDB, de modo que estou fazendo uma verificação de integridade mais robusta para MongoDB - um que verifica se o servidor está realmente lá e respondendo em vez de apenas verificar se uma porta está aberta?

Seria útil se a verificação de integridade fosse genérica o suficiente para trabalhar com os vários componentes de fragmentação MongoDB (servidor de configuração, mongos , mongod ).

    
por Adam C 01.09.2014 / 16:55

2 respostas

6

Em primeiro lugar, vale a pena notar que você terá que estar executando o HAProxy 1.5 ou posterior para usar o tcp-check (a partir da gravação desta resposta, a versão 1.5.3 é a versão estável atual). Infelizmente o Ubuntu 14.04 (por exemplo) vem com a versão 1.4, então você precisará instalar a partir de outra fonte. Pessoalmente eu usei os pacotes daqui para poder manter tudo instalado via apt .

O exemplo listado no blog é um bom ponto de partida. Usando-o como um modelo, tudo o que precisamos fazer é escolher um comando apropriado para executar, depois dividir esse comando em hexadecimal e construir a verificação apropriada para o MongoDB. O MongoDB protocolo de ligação é documentado e publicado, então, em teoria, você poderia construir com base na especificação, mas existem maneiras mais fáceis de desconstruir esse comando. Existem dissectores incorporados no Wireshark que permitem inspecionar o tráfego do MongoDB e fornece uma visão útil do hex com destaque para nos ajudar nossos esforços aqui.

O comando que usaremos aqui é o comando ping . Como é de se esperar, ele deve ser leve e retornar mesmo de um servidor sob carga pesada, o que o torna adequado para um comando de verificação de integridade. Qualquer comando desse tipo pode ser escrito usando a mesma metodologia, se você quiser usar outra coisa, mas sempre seja cauteloso ao usar um comando que exija um bloqueio de qualquer tipo, ou possa adicionar carga ao seu banco de dados.

Para ilustrar como obter do comando que você executa para o hex, aqui está uma pequena captura do comando que eu construí, destacado em Wireshark , tendo sido decodificado:

Combasenessasinformações,vamoscriarnossaverificaçãodeintegridadeTCP.Voucomentarsobreasváriaspeçasparaexplicardeondeelasvêm,ecadaumadeveserfácilosuficienteparaencontrarnalistaacima:

optiontcp-check#MongoDBWireProtocoltcp-checksend-binary39000000#MessageLength(57)tcp-checksend-binaryEEEEEEEE#RequestID(randomvalue)tcp-checksend-binary00000000#ResponseTo(nothing)tcp-checksend-binaryd4070000#OpCode(Query)tcp-checksend-binary00000000#QueryFlagstcp-checksend-binary746573742e#fullCollectionName(test.$cmd)tcp-checksend-binary24636d6400#continuedtcp-checksend-binary00000000#NumToSkiptcp-checksend-binaryFFFFFFFF#NumToReturn#StartofDocumenttcp-checksend-binary13000000#DocumentLength(19)tcp-checksend-binary01#Type(Double)tcp-checksend-binary70696e6700#Ping:tcp-checksend-binary000000000000f03f#Value:1tcp-checksend-binary00#Termtcp-checkexpectstringok

Seriabomusarumacorrespondênciabináriacompletanarespostatambém,masinfelizmentenãohácomopreveraIDdasolicitaçãogeradapeloservidorparacadaresposta;portanto,essacorrespondênciacompletafalhará(nãohácomoignorarseletivamentepartesdeumacorrespondênciabinária).

EDIT:8desetembrode2014AgradecemosaoscomentáriosdestePerguntaserespostasde Baptiste e Felix Voltei para testar novamente a correspondência binária parcial que parecia falhar inicialmente - parece que foi apenas uma No caso de eu transcrever o binário incorretamente para a resposta, alterei a resposta para refletir isso.

A string "ok" é apenas uma verificação OK - qualquer resposta desse tipo significará que o servidor em questão ainda está respondendo, mas a verificação limitada é um pouco insatisfatória. Embora uma verificação de resposta completa não seja possível, tudo após o ID da solicitação é utilizável.

Portanto, aqui está a verificação binária de trabalho para a parte utilizável da resposta quebrada, novamente usando o Wireshark para extrair as partes como acima:

# Check for response (starting after request ID)
tcp-check expect binary EEEEEEEE # Response To (from the check above)
tcp-check expect binary 01000000 # OpCode (Reply)
tcp-check expect binary 00000000 # Reply Flags (none)
tcp-check expect binary 0000000000000000# Cursor ID (0)
tcp-check expect binary 00000000 # Starting From (0)
tcp-check expect binary 11000000 # Document Length (17)
tcp-check expect binary 01 # Type (Double) 
tcp-check expect binary 6f6b # ok
tcp-check expect binary 00000000000000f03f # value: 1
tcp-check expect binary 00 # term

Todos os itens acima foram testados com sucesso com o MongoDB 2.6.4 e o HAProxy 1.5.3

    
por 01.09.2014 / 16:55
1

A resposta de Adam é a certa e o procedimento é o que eu uso também. Dito isso, não tenho certeza se a resposta está correta, já que o servidor deve responder também a cadeias binárias. Adam, você pode confirmar que funciona com o seu exemplo? Caso contrário, o 6f6b correspondente também deve funcionar:

tcp-check espera o binário 6f6b

Baptiste

    
por 02.09.2014 / 14:16