Inicialização e desligamento do nó de análise do princípio Elasticsearch

Inicialização e desligamento do nó de análise do princípio Elasticsearch


Este capítulo analisa o processo de inicialização e desligamento de um único nó. Como olhar o processo que analisa a configuração, verificar o ambiente, o módulo de inicialização interno , bem como lidar com o nó ** "kill" ** do tempo.

1. O que o processo de inicialização fez

Em geral, a tarefa do processo de inicialização do nó é fazer os seguintes tipos de trabalho:

  • Analise a configuração, incluindo arquivos de configuração e parâmetros de linha de comando.
  • Verifique os ambientes externos e internos, como versão JVM, parâmetros de kernel do sistema operacional, etc.
  • Inicialize recursos internos, crie módulos internos e inicialize detectores.
  • Inicie cada submódulo e thread de manutenção de atividade.

2. Análise do processo de inicialização

2.1 Iniciar o script

Quando iniciamos o ES por meio do script de inicialização bin / elasticsearch, o script carrega o programa Java por meio de exec. código mostrado abaixo:

exec \ #执行命令
    "$JAVA" \ #Java程序路径
    $ES_JAVA_OPTS \ #JVM选项
    -Des.path.home="$ES_HOME" \ #设置path.home路径
    -Des.path.conf="$ES_PATH_CONF" \ #设置path.conf路径
    -Des.distribution.flavor="$ES_DISTRIBUTION_FLAVOR" \
    -Des.distribution.type="$ES_DISTRIBUTION_TYPE" \
    -cp "$ES_CLASSPATH" \ #设置 java classpath
    org.elasticsearch.bootstrap.Elasticsearch \ #指定main函数所在类
    "$@" #传递给main函数命令行参数

A variável ES_JAVA_OPTS contém os parâmetros da JVM, cujo conteúdo vem da análise do arquivo de configuração config / jvm.options.

Se o parâmetro -d for adicionado ao executar o script de inicialização:

bin/elasticsearch -d

Em seguida, o script de inicialização adicionará <& - & em exec. A função de <& - é fechar a entrada padrão, que é o 0º fd no processo. A função de & é fazer com que o processo seja executado em segundo plano.

2.2 Analisando parâmetros de linha de comando e arquivos de configuração

Os parâmetros de linha de comando atualmente suportados são os seguintes, que não são usados ​​na inicialização por padrão, conforme mostrado na tabela a seguir:

parâmetro significado
-E Defina uma configuração. Por exemplo, para definir o nome do cluster: -E "cluster.name = my_cluster", geralmente é definido por meio do arquivo de configuração, não na linha de comando
-V, --version Imprimir informação do número da versão
-d, --daemonize Início de fundo
-h, --help Imprimir informações de ajuda
-p, --pidfile Crie um arquivo pid no caminho especificado na inicialização, o que salva o pid do processo atual, e então você pode fechar o processo visualizando o arquivo pid
-q, --quiet Desligue a saída padrão e a saída de erro padrão do console
-s, --silent Informações mínimas de saída do terminal (o padrão é normal)
-v, --verbose Informações detalhadas de saída do terminal

Em aplicações reais de engenharia, é recomendado adicionar -d e -p aos parâmetros de inicialização, por exemplo:

bin/elasticsearch -d -p es.pid

Existem os dois arquivos de configuração a seguir analisados ​​aqui, jvm.options é analisado no script de inicialização.

  • elasticsearch.yml #Main arquivo de configuração
  • log4j2.properties #Log arquivo de configuração

2.3 Carregar configuração de segurança

O que é uma configuração de segurança? Basicamente, trata-se de informações de configuração.Uma vez que são informações de configuração, geralmente são gravadas em um arquivo de configuração. Vários arquivos de configuração do ES foram mencionados nos capítulos anteriores. A "configuração de segurança" aqui é para resolver que algumas informações sensíveis não são adequadas para serem colocadas no arquivo de configuração, porque o arquivo de configuração é salvo em texto simples.Embora o sistema de arquivos seja protegido com base nos direitos do usuário, ainda não é suficiente. Portanto, o ES criptografa essas informações de configuração confidenciais e as coloca em um arquivo separado: config / elasticsearch.keystore. Em seguida, forneça alguns comandos para visualizar, adicionar e excluir configurações.

Que tipo de informação de configuração é adequada para ser colocada no arquivo de configuração de segurança? Por exemplo, configuração relacionada à segurança no X-Pack, LDAP base_dn e outras informações (equivalente ao nome de usuário e senha para efetuar login no servidor).

2.4 Verifique o ambiente interno

O ambiente interno se refere à integridade e correção do próprio pacote de software ES. incluir:

  • Verifique a versão Lucene. Cada versão do ES requer o uso da versão Lucene. Verifique a versão Lucene aqui para evitar que alguém substitua o pacote jar incompatível.
  • Verifique o conflito do jar e saia do processo se o conflito for encontrado.

2.5 Verifique o ambiente externo

O "nó" no ES é encapsulado como um módulo Node quando é implementado. Chame outros componentes internos na classe Node e forneça métodos de inicialização e desligamento para o exterior.A inspeção do ambiente externo é realizada em Node.start ().

O ambiente externo se refere à JVM e aos parâmetros relacionados ao sistema operacional no tempo de execução, que são chamados de " Boostrap Check " no ES . Na versão anterior do ES, o ES detectou algumas configurações irracionais e as registrou no log para continuar a execução. Mas às vezes os usuários perdem esses logs. Para evitar a descoberta de problemas posteriormente, o ES verifica esses parâmetros importantes durante a fase de inicialização.Algumas configurações que afetam o desempenho serão marcadas como erros, para que os usuários prestem bastante atenção a esses parâmetros.

Todas essas verificações são encapsuladas individualmente na classe BoostrapChecks. Existem atualmente os seguintes itens de detecção:

2.5.1 Verificação do tamanho do heap

Se o tamanho de heap inicial (Xms) da JVM for diferente do tamanho de heap máximo (Xmx), pode haver uma pausa quando o tamanho de heap da JVM é ajustado durante o uso . Portanto, deve ser definido com o mesmo valor.

Se bootstrap.mempry_block estiver ativado , o JVM bloqueará o tamanho inicial do par na inicialização. Se o tamanho inicial do heap for diferente do tamanho máximo do heap, após as mudanças no tamanho do heap, pode não ser garantido que todos os heaps JVM estejam bloqueados na memória.

Para passar nesta verificação, o tamanho do heap deve ser configurado.

2.5.2 Verificação do Descritor de Arquivo

Em sistemas baseados em UNIX, "arquivos" podem ser arquivos físicos comuns ou arquivos virtuais, e os soquetes de rede também são descritores de arquivo. O processo ES requer muitos descritores de arquivo. Por exemplo, cada fragmento possui muitos segmentos e cada segmento possui muitos arquivos. Também inclui muitas conexões de rede com outros nós.

Para passar nesta verificação, você precisa ajustar a configuração padrão do sistema. No Linux, execute ulimit -n 65536 (válido apenas para o terminal atual) ou configure " - nofile 65536" no arquivo ** / etc / security / limits.conf * (válido para todos os usuários). Limits.conf no Ubuntu é ignorado por padrão, e o módulo pam_limits.so precisa ser habilitado.

Como a versão do Ubuntu é atualizada de forma relativamente rápida e o ambiente de produção não é adequado para atualizações frequentes, recomendamos o uso do CentOS como sistema operacional do servidor.

* soft nofile 131072
* hard nofile 131072

2.5.3 Verificação de bloqueio de memória

O ES permite que os processos usem apenas memória física, evitando o uso de partições de troca. Na verdade, recomendamos desabilitar diretamente a partição de troca do sistema operacional em um ambiente de produção. Agora, implantamos a era em que a memória precisa ser trocada para o disco rígido devido à memória insuficiente.Para servidores, quando a memória está realmente esgotada, a troca para o disco rígido causará mais problemas.

Habilite a opção bootstrap.memory_lock para permitir que o ES bloqueie a memória. Quando essa verificação é ativada e o bloqueio falha, a execução dessa verificação falha.

2.5.4 Número máximo de verificação de threads

O ES decompõe a solicitação em execução em cada nó e cada estágio usa um pool de threads diferente para executar. Portanto, o processo ES precisa criar muitos threads.Esta verificação é para garantir que o processo ES tenha autoridade para criar threads suficientes. Esta verificação é realizada apenas em sistemas Linux. Você precisa ajustar o número máximo de threads que um processo pode criar. Este valor é de pelo menos 2.048.

Para passar nesta verificação, você pode modificar o nproc no arquivo ** /etc/security/limits.conf para completar a configuração

* soft nproc 131072
* hard nproc 131072

E /etc/security/limits.d/90-nproc.conf

* soft nproc 131072
* hard nproc 131072

2.5.5 Verificação máxima de memória virtual

Lucene usa mmap para mapear parte do índice para o espaço de endereço do processo. A verificação de memória virtual máxima garante que o processo ES tenha espaço de endereço suficiente. Essa verificação é executada apenas no Linux.

Para passar esta verificação, você pode modificar o ** / / segurança etc / limits.conf arquivo e defina como a ilimitada **.

* soft as unlimited
* hard as unlimited

2.5.6 Verificação do tamanho máximo do arquivo

Arquivos de segmento e arquivos de log de transações são armazenados no disco local e podem ser muito grandes. Em um sistema operacional com um limite máximo de tamanho de arquivo, isso pode causar falha de gravação. Recomenda-se definir o tamanho do maior arquivo como ilimitado.

Para passar nessa verificação, você pode modificar o arquivo ** /etc/security/limites.conf e modificar o fsize para ilimitado **.

* soft fsize unlimited
* hard fsize unlimited

2.5.7 Verificando o número máximo de áreas de memória virtual

O processo ES precisa criar muitas áreas mapeadas na memória.Esta verificação é para garantir que o kernel permite que pelo menos 262144 áreas mapeadas na memória sejam criadas. Essa verificação é realizada apenas no Linux.

Para passar nesta verificação, você pode executar o seguinte comando (temporariamente eficaz, inválido após a reinicialização):

sysctl -w vm.max_map_count = 262144

Ou adicione uma linha vm.max_map_count = 262144 ** ao arquivo ** / etc / sysctl.conf e execute o seguinte comando (imediatamente e permanentemente):

vm.max_map_count=262144
sysctl -p

2.5.8 Verificação de OnError e OnOutOfMemoryError

Se a JVM encontrar um erro fatal (OnError) ou (OnOutOfMemoryError), as opções da JVM OnError e OnOutOfMemoryError podem executar comandos arbitrários.

No entanto, por padrão, o filtro de chamada do sistema ES está habilitado (seccomp) e o fork será bloqueado. Portanto, o uso de OnError ou OnOutOfMemoryError não é compatível com filtros de chamada do sistema.

Para passar nesta verificação, não ative OnError ou OnOutOfMemoryError, mas atualize para Java 8u92 e use ExitOnOutOfMemoryError.

Para evitar que o nó ES fique em um estado morto e incapaz de se recuperar após o estouro de memória, afetando todo o cluster, deixe o processo travar quando o processo aparecer OOM, saia do cluster ES com um alarme e reinicie.
Adicione parâmetros de inicialização JVM em config / jvm.options:

-XX:+ExitOnOutOfMemoryError

2.6 Iniciar módulos internos

Após a verificação do ambiente ser concluída, inicie cada submódulo. Os submódulos são criados na classe Node, e seus respectivos métodos start () são chamados quando são iniciados, por exemplo:

  • discovery.start ();
  • clusterServer.start ();
  • nodeConnectionsService.start ();

O método de início do submódulo é basicamente inicializar dados internos, criar pool de threads, iniciar pool de threads e outras operações.

2.7 Iniciar tópico de keepalive

Chame o método keepAliveThread.start () para iniciar o thread keepalive, o thread em si não realiza um trabalho específico. O thread principal será encerrado após a execução do processo de inicialização. O thread keepalive é o único thread do usuário, e sua função é manter o processo em execução. Em um programa Java, há apenas um encadeamento do usuário. Saia do processo quando o número de fios de iogurte for zero.

3. Processo de desligamento do nó

Agora discutiremos o processo de desligamento de um único nó. Imagine que, quando atualizamos a configuração e atualizamos a versão do cluster ES, precisamos "matar" o processo ES para desligar o nó. Mas a operação de matar é segura? Qual é o impacto se o nó estiver executando operações de leitura e gravação neste momento? Se o nó for o mestre, o que o mestre deve fazer? Como é feito o processo de fechamento? Quais os riscos que a destruição de nós traz?

A resposta é: o processo ES irá capturar o sinal SIGTERM (o sinal padrão do comando kill) para processamento, chamar o método de parada de cada módulo e dar a eles a oportunidade de parar o serviço e sair com segurança.

  1. O nó mestre está desligado

    Durante a reinicialização do cluster, se o nó mestre for encerrado , o cluster reelegerá o mestre. Durante este período, o cluster tem um estado de curta duração sem mestre. Se o nó mestre no cluster for implantado separadamente, depois que o novo mestre for eleito, você pode pular o gateway e o processo de recuperação, caso contrário, o novo mestre precisa redistribuir os fragmentos mantidos pelo antigo mestre: promover outras réplicas para serem os fragmentos principais e alocar O novo fragmento de réplica.

  2. O nó de dados está desligado

    Se o nó de dados for fechado, a conexão TCP para o pedido de leitura e gravação também será fechada e a operação de gravação falhará para o cliente. No entanto, se o processo de escrita atingiu o link do motor, a escrita será concluída normalmente, mas o cliente não consegue perceber o resultado. Neste momento, o cliente tenta novamente. Se o ID gerado automaticamente for usado, o conteúdo dos dados será repetido.

Em resumo, o impacto da atualização contínua é a interrupção da solicitação de gravação atual e o processo de alocação de fragmentos que pode ser causado pela reinicialização do nó mestre. Geralmente é mais rápido atualizar um novo shard primário, portanto, tem pouco efeito na disponibilidade de gravação do cluster.

Quando o fragmento primário da parte do índice não é alocado, se o ID gerado automaticamente for usado, se a gravação continuar, o cliente poderá tentar novamente a falha (a solicitação atinge o fragmento primário que foi alocado com sucesso), mas estará em um diferente A distorção de dados ocorre entre fatias e o grau de distorção depende do número de períodos.

4. Fechar a análise do processo

Durante o processo de inicialização do nó, um gancho de desligamento é adicionado ao método de configuração Bootstrap # .Quando o processo recebe o sinal SIGTERM (sinal padrão de eliminação) ou SIGINT do sistema, o processo de desligamento do nó é chamado.

Existem doStop e doClose no Serviço de cada módulo, que são utilizados para tratar do processo normal de fechamento deste módulo. O processo geral de fechamento do nó está localizado no Nó # cloase. Na implementação do método close, primeiro chame o doStop de cada módulo e, em seguida, atravesse cada módulo novamente para executar doClose. O código de implementação principal é o seguinte:

if(lifecycle.started()){
    
    
    stop();//调用各个模块的dostop方法
}
List<Closeable> toClose = new ArrayList<>();
//在toClose中添加所需要关闭的Service,以nodeService为例
toClose.add(nodeService);
......
//调用各模块doClose方法
IOUtils.close(toClose);

O fechamento de cada módulo tem uma certa relação de sequência, tomando doStop como exemplo, chame o método doStop de cada módulo na ordem mostrada na tabela a seguir.

serviço Introdução
ResourceWatcherService Serviço de monitoramento de recursos gerais
HttpServerTransport Serviço de transmissão HTTP, fornecendo serviço de interface REST
SnapshotsService Serviço de instantâneo
SnapshotShardsService Responsável por iniciar e interromper instantâneos de nível de fragmento
IndicesClusterStateService Depois de receber as informações de status do cluster, processe as operações relacionadas ao índice
Descoberta Gerenciamento de topologia de cluster
RoutingService Tratamento de redirecionamento (migração de fragmentos entre nós)
ClusterService Serviço de gerenciamento de cluster. Gerenciar principalmente tarefas de cluster e publicar o status do cluster
NodeConnectionsService Serviço de pipeline de conexão de nó
MonitorService Fornece nível de processo, nível de sistema, sistema de arquivos e serviços de monitoramento JVM
GatewayService Responsável pela persistência e recuperação de metadados de cluster
SearchService Processando pedido de pesquisa
Serviço de transporte Serviço de transporte subjacente
plugins Todos os plugins atuais
IndicesService Responsável por operações de índice, como criação e exclusão de índices

Tomados em conjunto, a sequência de fechamento é aproximadamente a seguinte:

  • Feche o instantâneo e o HTTPServer e não responda mais às solicitações REST do usuário.
  • Feche o gerenciamento de topologia da máquina e não responda mais às solicitações de ping.
  • Feche o módulo de rede e deixe o nó offline.
  • Execute o processo de fechamento de cada plug-in.
  • Feche IndicatorsService.

Por fim, o IndicatorService é fechado porque os recursos que precisam ser liberados durante este período são os mais longos.

5. Execute o desligamento durante a leitura e gravação do fragmento

O seguinte analisa os nós que são desligados durante o processo de execução de leitura e gravação.

5.1 Fechado durante a escrita

Quando uma thread grava dados, ela adiciona um bloqueio de gravação ao Engine. O método doStop de IndicesService indexa todos os índices neste nó e executa removeIndex. Quando o flushAndClose do Engine é executado (primeiro liberar e depois fechar o Engine), ele também adicionará um bloqueio de gravação ao Engine. Como o bloqueio de gravação foi adicionado à operação de gravação, o bloqueio de gravação aguardará até que a gravação seja concluída. Portanto, o processo de gravação de dados não será interrompido. Mas como o módulo de rede está fechado, a conexão do cliente será desconectada. O cliente deve lidar com a falha, embora o processo de gravação do servidor ES ainda esteja em andamento.

5.2 Fechar o processo de leitura

Quando uma thread lê dados, ela adiciona um bloqueio de leitura ao Engine. O bloqueio de gravação em flushAndClose aguardará a conclusão do processo de leitura. No entanto, como a conexão é fechada, ela não pode ser enviada ao cliente, fazendo com que ele falhe na leitura.

A figura a seguir mostra o processo do mecanismo flushAndClose:Insira a descrição da imagem aqui

Durante o processo de desligamento do nó, o doStop de IndicatorService define um tempo limite para o mecanismo. Se flushAnd estiver esperando, CountDownLatch.await continuará o seguinte processo por padrão por 1 dia.

6. O nó mestre é desligado

Quando o nó mestre é encerrado, não há nenhum processamento especial como imaginado. O nó executa o processo de encerramento normalmente. Quando o módulo TransportSerice é encerrado, o cluster reelege um novo mestre. Portanto. Durante a reinicialização contínua, haverá um período de tempo em um estado sem proprietário.

7. Resumo

  1. De modo geral, o processo de inicialização do nó é inicializar e verificar. Após cada submódulo iniciar de forma assíncrona, ele carrega dados locais ou seleciona o mestre, se junta ao cluster, etc., que são apresentados separadamente nos capítulos seguintes.
  2. O nó tem a oportunidade de processar dados incompletos quando é encerrado, mas pode não ser tarde demais para notificar o cliente depois de escrito. Incluindo tarefas que ainda não foram executadas no pool de threads, elas têm a chance de serem executadas dentro de um determinado período de tempo limite.

O tempo para que a integridade do cluster mude de Vermelho para Verde é consumido principalmente na manutenção da consistência dos shards primários e secundários. Também podemos escolher permitir que o cliente grave quando a integridade do cluster for Amarelo, mas alguma segurança de dados será sacrificada.

/etc/security/limits.conf
文件描述符配置
* soft nofile 131072
* hard nofile 131072


最大线程数检查
* soft nproc 131072
* hard nproc 131072
/etc/security/limits.d/90-nproc.conf
* soft nproc 1024

最大虚拟内存检查
* soft as unlimited
* hard as unlimited
最大文件大小检查
* soft fsize unlimited
* hard fsize unlimited

虚拟内存区域最大数量检查
/etc/sysctl.conf
vm.max_map_count=262144
件描述符配置
* soft nofile 131072
* hard nofile 131072


最大线程数检查
* soft nproc 131072
* hard nproc 131072
/etc/security/limits.d/90-nproc.conf
* soft nproc 1024

最大虚拟内存检查
* soft as unlimited
* hard as unlimited
最大文件大小检查
* soft fsize unlimited
* hard fsize unlimited

虚拟内存区域最大数量检查
/etc/sysctl.conf
vm.max_map_count=262144

8. Siga-me

Pesquise a conta pública do WeChat: o caminho para uma arquitetura Java forte
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/dwjf321/article/details/104649928
Recomendado
Clasificación