Engenharia

Replicação entre datacenters com replicação entre clusters do Elasticsearch

A replicação entre datacenters é um requisito para aplicativos de missão crítica no Elasticsearch há algum tempo e anteriormente era resolvida parcialmente com tecnologias adicionais. Com o lançamento da replicação entre clusters no Elasticsearch 6.7, nenhuma tecnologia adicional é necessária para replicar dados em datacenters, regiões geográficas ou clusters do Elasticsearch.

A CCR (replicação entre clusters) permite a replicação de índices específicos de um cluster do Elasticsearch para um ou mais clusters do Elasticsearch. Além da replicação entre datacenters, há uma variedade de casos de uso adicionais para a CCR, incluindo a localidade de dados (a replicação de dados para que residam mais próximos a um servidor de aplicativo/usuário, como a replicação de um catálogo de produtos para 20 datacenters diferentes no mundo inteiro) ou a replicação de um cluster do Elasticsearch para um cluster de relatórios central (p. ex.: 1000 agências bancárias no mundo todo que gravam em seu cluster local do Elasticsearch e replicam de volta para um cluster na sede para fins de relatórios).

Neste tutorial para replicação entre data centers com o CCR, trataremos brevemente sobre os aspectos básicos do CCR, destacaremos as opções de arquitetura e os meios termos, configuraremos uma amostra de implantação entre data centers e destacaremos os comandos administrativos. Introdução à replicação entre clusters no Elasticsearch.

O CCR é um recurso de nível platinum e está disponível por meio da licença de avaliação de 30 dias que pode ser ativada pela API de avaliação inicial ou diretamente no Kibana.

Aspectos básicos da CCR

A replicação é configurada no nível do índice (ou com base em um padrão de índice)

O CCR é configurado no nível do índice no Elasticsearch. Configurando a replicação no nível do índice, há inúmeras estratégias de replicação disponíveis, incluindo a replicação de alguns índices em uma direção, outros índices em outra direção e arquiteturas entre datacenters granulares.

Os índices replicados são somente leitura

Um índice pode ser replicado por um ou mais clusters do Elasticsearch. Cada cluster que está sendo replicado no índice mantém uma cópia somente leitura do índice. O índice ativo capaz de aceitar gravações é chamado líder. As cópias somente leitura passivas desse índice são chamadas seguidoras. Não existe um conceito de uma eleição para um novo líder; quando um índice líder não está disponível (como em uma falha de cluster/datacenter), outro índice precisa ser escolhido explicitamente para gravações pelo administrador de aplicativo ou cluster (mais provavelmente em outro cluster).

Os padrões do CCR foram escolhidos para uma ampla variedade de casos de uso de alto throughput

Não é recomendável alterar os valores padrão sem um entendimento total de como o ajuste de um valor afetará o sistema.  A maioria das opções pode ser encontrada na API seguidora de criação, como "max_read_request_operation_count" ou "max_retry_delay". Em breve publicaremos uma postagem sobre como ajustar esses parâmetros para cargas de trabalho exclusivas.

Requisitos de segurança

Conforme descrito no CCR Getting Started Guide (Guia de introdução ao CCR), o usuário no cluster de origem deve ter o privilégio de cluster “read_ccr”, e os privilégios de índice “monitor” e “read”. No cluster de destino, o usuário deve ter o privilégio “manage_ccr”, e os privilégios de índice “monitor”, “read”, “write” e “manage_follow_index”. Os sistemas de autenticação centralizados também podem ser usados, como LDAP.

Amostras de arquiteturas de CCR entre datacenters

Datacenters de produção e de DR

Screen Shot 2019-04-04 at 10.21.55 AM.png

Os dados são replicados do datacenter de produção para o datacenter de DR. Na hipótese de o datacenter de produção não estar disponível, o datacenter de DR poderá ser usado.

Mais de dois datacenters

Screen Shot 2019-04-04 at 10.22.09 AM.png

Os dados são replicados do datacenter A para vários datacenters (B e C no diagrama). Os datacenters B e C agora têm uma cópia somente leitura do índice no datacenter A.

Replicação em cadeia

Screen Shot 2019-04-04 at 10.22.19 AM.png

A replicação em vários datacenters também pode ocorrer em cadeia. Neste exemplo, o índice líder está no datacenter A. Os dados são replicados do datacenter A para o datacenter B, e o datacenter C replica do seguidor no datacenter B, para criar um padrão de replicação em cadeia.

Replicação bidirecional

Screen Shot 2019-04-04 at 10.22.30 AM.png

Como a replicação é configurada no nível do índice, um índice líder pode ser mantido por datacenter. Os aplicativos podem gravar no índice local em cada datacenter e ler em vários índices para ter uma visão global de todas as informações.

Tutorial de implantação entre datacenters

1. Instalação

Para este tutorial, usaremos dois clusters e ambos estarão no computador local. Fique à vontade para localizar os clusters em qualquer lugar desejado.

  • ‘us-cluster’ : este é o nosso “cluster US ”, e vamos executar localmente na porta 9200. Vamos replicar os documentos do cluster dos EUA para o cluster do Japão.
  • ‘japan-cluster’ : este é o nosso "Japan cluster”; vamos executar localmente na porta 8200. O cluster do Japão manterá um índice replicado do cluster dos EUA.

Screen Shot 2019-04-04 at 10.22.44 AM.png

2. Definir os clusters remotos

Ao instalar o CCR, os clusters do Elasticsearch devem saber dos outros clusters do Elasticsearch. Esse é um requisito unidirecional, em que o cluster de destino manterá as conexões unidirecionais com o cluster de origem. Definiremos outros clusters do Elasticsearch como clusters remotos e especificaremos um alias para descrevê-los.

Queremos garantir que o nosso ‘japan-cluster’ saiba do ‘us-cluster’. A replicação no CCR se baseia em pull e não exige especificarmos uma conexão do ‘us-cluster’ com o ‘japan-cluster’.

Vamos definir o ‘us-cluster’ por meio de uma chamada à API no ‘japan-cluster’

# No japan-cluster, vamos definir como o us-cluster pode ser acessado
PUT /_cluster/settings
{
"persistent" : {
"cluster" : {
"remote" : {
"us-cluster" : {
"seeds" : [
"127.0.0.1:9300"
]
}
}
}
}
}

(Para comandos baseados em API, recomendamos usar o console de ferramentas de desenvolvimento no Kibana, que pode ser encontrado por meio de Kibana -> Dev tools -> Console)

A chamada à API anterior define um cluster remoto com alias “us-cluster” que pode ser acessado em "127.0.0.1:9300". Um ou mais seeds podem ser especificados, e geralmente é recomendável especificar mais de um para o caso de um seed não estar disponível durante a fase de handshake.

Mais detalhes sobre como configurar clusters remotos podem ser encontrados em nossa documentação de referência sobre como definir um cluster remoto.

Também é importante observar a porta 9300 para conexão com o ‘us-cluster’; o ‘us-cluster’ está escutando o protocolo HTTP na porta 9200 (como é o padrão, e especificado no arquivo elasticsearch.yml para o nosso 'us-cluster'). Entretanto, a replicação ocorre usando o protocolo de transporte do Elasticsearch (para comunicação entre nós); o padrão é a porta 9300.

Há uma IU de gerenciamento para clusters remotos no Kibana; neste tutorial vamos apresentar a IU e a API para o CCR. Para acessar a IU de cluster remoto no Kibana, clique em “Management” (ícone de engrenagem) no painel de navegação esquerdo e navegue para “Remote Clusters” (Clusters remotos) na seção Elasticsearch.

Screen Shot 2019-03-27 at 2.17.24 PM.png

IU de gerenciamento de clusters remotos do Elasticsearch no Kibana

3. Criar um índice para replicação

Vamos criar um índice chamado ‘products’ em nosso ‘us-cluster’, vamos replicar esse índice do nosso ‘us-cluster’ de origem para o ‘japan-cluster’ de destino:

No ‘us-cluster’:

# Criar índice do produto
PUT /products
{
"settings" : {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 0,
"soft_deletes" : {
"enabled" : true
}
}
},
"mappings" : {
"_doc" : {
"properties" : {
"name" : {
"type" : "keyword"
}
}
}
}
}

Talvez você tenha percebido a configuração “soft_deletes”. As exclusões suaves são necessárias para que um índice atue como índice líder para o CCR (consulte Those Who Don’t Know History para saber mais):

soft_deletes: Uma exclusão suave ocorre sempre que um documento existente é excluído ou atualizado. Retendo essas exclusões suaves até limites configuráveis, o histórico de operações pode ser retido nos shards líderes e disponibilizados às tarefas de shard seguidor à medida que ele reproduz o histórico de operações.

Como os shards seguidores replicam operações do líder, ele deixará marcadores nos shards líderes para que os líderes saibam onde no histórico os seguidores estão. As operações de exclusão suave abaixo desses marcadores são qualificadas para serem mescladas. Acima desses marcadores, os shards líderes reterão essas operações durante o período de arrendamento de retenção do histórico de um shard, que tem como padrão doze horas. Esse período determina a quantidade de tempo em que um seguidor pode estar offline antes de estar sob risco de falhar fatalmente bem atrás e precisando fazer novo bootstrap do líder.

4. Iniciar replicação

Agora que criamos um alias para o nosso cluster remoto e criamos um índice que gostaríamos de replicar, vamos iniciar a replicação.

Em nosso ‘japan-cluster’:

PUT /products-copy/_ccr/follow
{
"remote_cluster" : "us-cluster",
"leader_index" : "products"
}

O endpoint contém ‘products-copy’, que é o nome do índice replicado no cluster ‘japan-cluster’. Estamos replicando do cluster ‘us-cluster’ que definimos anteriormente, e o nome do índice que estamos replicando é chamado ‘products’ no cluster ‘us-cluster’.

É importante observar que o nosso índice replicado é somente leitura e não pode aceitar operações de gravação.

E é isso! Configuramos um índice para replicar de um cluster do Elasticsearch para outro!

Screen Shot 2019-03-27 at 2.18.37 PM.png

IU de gerenciamento do CCR no Kibana

Iniciar replicação para padrões de índice

Você pode ter reparado que o exemplo anterior não funcionará muito bem para casos de uso baseados em tempo, em que há um índice por dia ou para uma quantidade de dados. A API do CCR também contém métodos para definir padrões de autoseguimento, ou seja, quais padrões de índice devem ser replicados.

Podemos usar a API do CCR para definir um padrão de autoseguimento

PUT /_ccr/auto_follow/beats
{
"remote_cluster" : "us-cluster",
"leader_index_patterns" :
[
"metricbeat-*",
"packetbeat-*"
],
"follow_index_pattern" : "{{leader_index}}-copy"
}

A amostra de chamada à API anterior replicará um índice que começa com ‘metricbeat’ ou ‘packetbeat’.

Também podemos usar a IU do CCR no Kibana para definir um padrão de autoseguimento.

Screen Shot 2019-03-27 at 2.20.07 PM.png

IU de gerenciamento do CCR para padrões de autoseguimento no Kibana

5. Teste de instalação de replicação

Agora que temos o índice dos nossos produtos replicado do ‘us-cluster’ para o ‘japan-cluster’, vamos inserir um documento de teste e verificar se ele foi replicado.

No cluster ‘us-cluster’:

POST /products/_doc
{
"name" : "My cool new product"
}

Agora vamos consultar o ‘japan-cluster’ para garantir que o documento foi replicado:

GET /products-copy/_search

Devemos ter um único documento presente, que foi gravado no ‘us-cluster’ e replicado para o ‘japan-cluster’.

{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "products-copy",
"_type" : "_doc",
"_id" : "qfkl6WkBbYfxqoLJq-ss",
"_score" : 1.0,
"_source" : {
"name" : "My cool new product"
}
}
]
}
}

Obervações de administração entre datacenters

Vamos analisar algumas APIs administrativas para o CCR, configurações ajustáveis, e vamos descrever o método para converter um índice replicado para um índice normal no Elasticsearch.

APIs administrativas para replicação

Há inúmeras APIs administrativas úteis para o CCR no Elasticsearch. Elas podem ser úteis em depurar a replicação, modificar configurações de replicação ou reunir diagnósticos detalhados.

# Retornar todas as estatísticas relacionadas ao CCR
GET /_ccr/stats
# Pausar replicação para um determinado índice
POST //_ccr/pause_follow
# Retomar replicação, na maioria dos casos depois que ela foi pausada
POST //_ccr/resume_follow
{
}
# Desacompanhar um índice (parar a replicação para o índice de destino), que primeiramente exige que a replicação esteja pausada
POST //_ccr/unfollow
# Estatísticas para um índice seguidor
GET //_ccr/stats
# Remover um padrão de autoseguimento
DELETE /_ccr/auto_follow/
# Exibir todos os padrões de autoseguimento ou obter um padrão de autoseguimento por nome
GET /_ccr/auto_follow/
GET /_ccr/auto_follow/

Mais detalhes sobre as APIs administrativas do CCR estão disponíveis na documentação de referência do Elasticsearch.

Conversão de um índice seguidor em um índice normal

Podemos usar um subconjunto das APIs administrativas anteriores para converter um índice seguidor em um índice normal no Elasticsearch, capaz de aceitar gravações.

Em nosso exemplo anterior, tínhamos uma instalação bem simples. Lembre-se de que o índice ‘products-copy’ replicado em nosso ‘japan-cluster’ é somente leitura e não pode aceitar gravações. Na hipótese de querermos converter o índice ‘products-copy’ em um índice normal no Elasticsearch (capaz de aceitar gravações), poderemos executar os comandos a seguir. Lembre-se de que as gravações em nosso índice original ('products') pode continuar, e queremos restringir as gravações primeiro ao nosso índice ‘products’, antes de converter nosso índice ‘products-copy’ para um índice normal do Elasticsearch.

# Pausar replicação
POST //_ccr/pause_follow
# Fechar o índice
POST /my_index/_close
# Desacompanhar
POST //_ccr/unfollow
# Abrir o índice
POST /my_index/_open

Continuar análise de CCR no Elasticsearch

Elaboramos este guia para ajudá-lo a começar com o CCR no Elasticsearch e esperamos que ele seja suficiente para você se familiarizar com o CCR, conhecer as várias APIs do CCR (incluindo as IUs disponíveis no Kibana) e experimentar o recurso. Entre os recursos adicionais estão o guia de introdução à replicação entre clusters e o guia de referência das APIs de replicação entre clusters.

Como sempre, faça seus comentários em nossos fóruns de discussão e envie dúvidas, pois certamente as responderemos assim que for possível.