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
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