Nginx + Elasticsearch: Segmentando Leitura e Escrita

Thiago Barradas
thiagobarradas
Published in
4 min readDec 15, 2020
Nginx + Elasticsearch: Como e por quê separar a leitura da escrita?

O Nginx pode tornar ainda melhor a arquitetura e o crescimento do seu cluster de Elasticsearch, permitindo o controle do fluxo HTTP tratando as requisições e respostas, incluindo autenticação via SSO/SAML, LDAP, entre outros meios de autenticação e autorização, balanceamento de carga (load balancer) para distribuição de requisições entre os coordinators/data/hot nodes, entre outros recursos interessantíssimos. Hoje, vamos falar sobre um ponto que me ajudou muito na projeção e compreensão das minhas reais necessidades em um cluster de Elasticsearch de alta performance: a segmentação da leitura e da escrita.

Porque separar a leitura e a escrita?

Existem diversos motivos para justificar tanto a segmentação da leitura e da escrita, como para utilizar um proxy reverso na frente da sua aplicação ou serviço. Dentre esses motivos, temos como principal o fato de manter o domínio de quais aplicações fazem cada tipo de operação, garantindo previsibilidade em toda manutenção no cluster e nas aplicações, que necessitam ser desenvolvidas ou ajustadas com esse mindset.

Normalmente, as aplicações que utilizam o Elasticsearch são segmentadas na camada de persistência (seja uma aplicação, ETL, etc) e as aplicações de leitura (dashboards, analytics, lojas de e-commerce, sites, etc).

Com o nginx na “frente”, conseguimos permitir a configuração do seu firewall liberando ou bloqueando quem precisa ou não acessar determinado recurso (leitura ou escrita) e também facilitamos alterações no cluster, com as regiões de escrita e leitura. Por exemplo, se tenho necessidade de manter a escrita próxima do meu ETL ou Banco de dados primário, e a leitura próxima da aplicação ou do cliente fazendo roteamentos realmente inteligentes. Obviamente essa configuração vai depender totalmente da arquitetura do seu cluster e do seu negócio.

Exemplo de arquitetura e configuração

Exemplo de arquitetura com Nginx atuando como proxy reverso acoplado aos coordinators nodes.

Nesse exemplo, o nginx está sendo executado em cada nó coordinator. Para permitir a segmentação da leitura e escrita, essa solução atende todos requisitos necessários. Se você utiliza o Kibana é importante ressaltar a necessidade de um DNS para read-write, requerido para o funcionamento do Kibana. Para isso adicionaremos uma configuração a mais e um DNS (seguindo o exemplo, https://elasticsearch-readwrite.xxx.com) permitindo o seu uso.

No exemplo de configuração do nginx que será disponibilizado, essa configuração estará presente.

Exemplo de arquitetura com Nginx atuando como proxy reverso e load balancer antes (fora) do cluster.

No exemplo acima, temos um cluster do nginx na frente do cluster de elasticsearch. A diferença para o formato anterior, além de ser necessário administrar o cluster do nginx é a possibilidade para extender o seu comportamento, permitindo que a leitura e a escrita sejam feitas em “regiões” diferentes de forma mais prática e escalável do que a solução anterior.

Com duas regiões separadas, com objetivo de aproximar os serviços e reduzir a latência, utilizar apenas um cluster do nginx pode ser um “tiro no pé”, pois do que adianta a leitura na região de São Paulo e a escrita na Califórnia, se voce possui apenas um cluster do nginx em apenas uma das regiões? O seu pacote tcp irá percorrer um caminho a mais. Ao invés de reduzir, você estará somente aumentando o seu tempo de resposta.

Para ter esse ganho significativo, você precisa ter um cluster do nginx também em cada região. Não pense que ganhar 100ms, 200ms em uma requisição é algo fácil e de baixo custo, quando mais otimizado mais estratégias como essa você precisa “planejar” e “executar”. Veja o resultado na figura abaixo.

Exemplo de arquitetura com Nginx atuando como proxy reverso e load balancer antes (fora) do cluster com duas regiões.

E você deve estar se perguntando: “Mas pra fazer isso eu posso por um load balancer para meus clients de cada região e tá tudo certo!” — Errado!

De certa forma funcionaria, mas você perderia a segmentação da leitura e da escrita, como proposto no artigo.

Configuração no Nginx

Exemplo de configuração no Nginx para segmentar leitura e escrita.

Multiregião no Cluster de Elasticsearch

Para configurar o seu cluster de elasticsearch para funcionar com multiplas regiões, alocar shards de forma “equilibrada” entre as regiões entre outras configurações associadas, dá uma olhadinha em Shard Allocation Awareness.

O objetivo desse artigo é tirar nosso pensamento de arquitetura unicamente do serviço e compreender que serviços auxiliares podem nos ajudar para atingir otimizações para a administração, tempo de resposta, entre outros. Aqui foi possível entender um pouco de como o nginx pode ser uma ferramenta poderosa aliado com o elasticsearch. Espero que seja útil e contribua para sua otimização também. Até a próxima! 👋

--

--

Thiago Barradas
thiagobarradas

Microsoft MVP, Elastic Contributor. Entusiasta de novas tecnologias e arquiteto de software na Stone. Cultuador do hábito de formar cabeças pensantes.