>_Criando um Cluster para Elasticsearch 2.3 no CentOS 7.2

elastic-log

O Elasticsearch é uma ferramenta para buscas de código aberto (opensource) que tem capacidade para tratar de grandes quantidades de dados em tempo real. Ele foi desenvolvido para simplificar o Apache Lucene que possui certa complexidade.

E o que é o Apache Lucene?

O Apache Lucene, ou simplesmente Lucene, é um software de busca e uma API de indexação de documentos, escrito na linguagem de programação Java.

Como surgiu o Elasticsearch?

Shay Banon criou o projeto Compass em 2004 e ao planejar sua terceira versão, percebeu que seria necessário reescrever grande parte do código para criar uma solução de pesquisa escalável. Assim ele criou uma solução construída a partir do zero e usou uma interface comum, JSON sobre HTTP, adequado para sistemas que utilizam Java como linguagem de programação. A primeira versão do ElasticSearch foi lançada em fevereiro de 2010.

Com ele é possível disponibilizar os dados em tempo real, podendo ser distribuído e configurado para ser apresentado em alta disponibilidade.

Um pouco de teoria:

No Elasticsearch, um documento pertence a um Tipo e esses tipos estão localizados dentro de um índice. Um índice é como um ‘banco de dados relacional’.

Índices de Relações.
O layout mais fácil e mais familiar segue o que você esperaria de um banco de dados relacional. Você pode pensar em um índice como um banco de dados.

MySQL => Databases => Tables => Columns/Rows
Elasticsearch => Indices => Types => Documents with Properties

Um cluster ElasticSearch pode conter vários índices (bancos de dados), que por sua vez contêm vários índices (tabelas). Estes índices armazenam vários documentos (linhas), e cada documento possui a suas propriedades (colunas).

Indexar um documento é armazená-lo em um índice, para que ele possa ser consultado posteriormente. O Elasticsearch utiliza uma técnica chamada índice invertido que permite com que os usuários executem procuras rápidas por palavras-chave e localizem os documentos que correspondem a uma determinada consulta.

Existe também o conceito de node (nó) que é uma instância do Elasticsearch em execução. Um cluster é um grupo de nós com o mesmo cluster.name que trabalham juntos e compartilham dados para prover escalabilidade e alta disponibilidade.

Fonte:
https://tasafo.wordpress.com/2014/08/09/iniciando-com-elasticsearch/

Ambiente desse tutorial
elasticsearch-cluster

Servidores ElasticSearch:
IP: 192.168.10.50/24 elasticsearch-1 (CentOS 7.2).
IP: 192.168.10.51/24 elasticsearch-2 (CentOS 7.2).

Servidor Load Balance:
IPs: 172.11.0.37/24 e 192.168.10.52/24 haproxy (CentOS 7.2).

Configurando os servidores Elasticsearchs.

Passo 1 – Instalando o Elasticsearch nos servidores elasticsearch 1 e 2.
Baixando a chave do repositório.

# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

Criando o arquivo elasticsearch.repo.

# vim /etc/yum.repos.d/elasticsearch.repo

Repositório.

[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

Passo 2 – Atualizando os servidores e em seguida instalando o Openjdk e o Elasticsearch.

# yum update -y
# yum install java-1.8.0-openjdk.x86_64 -y
# yum install elasticsearch -y

Passo 3 – Criando o diretório /elasticsearch – Este diretório será responsável por manter os shards.

# mkdir /elasticsearch

Passo 4 – Setando a permissão no diretório.

# chown elasticsearch.elasticsearch /elasticsearch

Passo 5 – Gerando uma cópia dos arquivos de configuração do Elasticsearch.

# cd /etc/elasticsearch/
# cp elasticsearch.yml elasticsearch.yml-old
# cp logging.yml logging.yml-old

Passo 6 – Ajustando o arquivo de inicialização do Elasticsearch em ambos os servidores elasticsearch 1 e 2.
Obs: Altere somente as variáveis abaixo:

# vim /etc/sysconfig/elasticsearch
# Set ES_HEAP_SIZE to 50% of available RAM, but no more than 31g
#ES_HEAP_SIZE=2g
PARA
ES_HEAP_SIZE=3g


# Elasticsearch data directory
#DATA_DIR=/var/lib/elasticsearch
PARA
DATA_DIR=/elasticsearch


Habilitar somente IPV4.
# Additional Java OPTS
#ES_JAVA_OPTS=
PARA
ES_JAVA_OPTS="-Djava.net.preferIPv4Stack=true"

# Path to the GC log file
#ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log
PARA
ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log

# Elasticsearch logs directory
#LOG_DIR=/var/log/elasticsearch
PARA
LOG_DIR=/var/log/elasticsearch

Passo 7 – Habilitando o Elasticsearch para iniciar durante a inicialização do sistema operacional.

# systemctl daemon-reload
# systemctl enable elasticsearch.service

Passo 8 – Ajustando o arquivo elasticsearch.yml no servidor elasticsearch-1.

# vim /etc/elasticsearch/elasticsearch.yml
# cluster.name: my-application
PARA
cluster.name: tutoriaisgnulinux

# node.name: node-1
PARA
node.name: elasticsearch-1
node.master: true
node.data: true
discovery.zen.ping.multicast.enabled: false

# path.data: /path/to/data
PARA
path.data: /elasticsearch

# network.host: 192.168.0.1
PARA
network.host: 192.168.10.50

# discovery.zen.ping.unicast.hosts: ["host1", "host2"]
PARA
discovery.zen.ping.unicast.hosts: ["elasticsearch-1", "elasticsearch-2"]

#Impedir que o "split brain", configure em todos os nodes (número total de nodes / 2 + 1):
# discovery.zen.minimum_master_nodes: 3
PARA
discovery.zen.minimum_master_nodes: 2

# Adicione as váriavies abaixo:
# Tem de espera para o node responder.
discovery.zen.ping.timeout: 15s
# Essa configuracao ira definir como sera a alocacao das shards.
# Permite a alocacao para todos os tipos de shards.
# all: Permite a alocação para todos os tipos de shards.
# primaries: Permite a alocacao apenas para shrds prmarios.
# new_primaries: Permite a alocacao apenas para shards primarios em novos indices.
# none: desabilita alocacao de shards.
cluster.routing.allocation.enable: all

# Permite a JVM bloquear a memoria e impedir que ele seja trocado pelo sistema operacional.
bootstrap.mlockall: true
# A configuracao do buffer de indexacao permite controloar a quantidade de memoria que sera alocada para o processo de indexacao.
indices.memory.index_buffer_size: 50%
# Cada shard tem um log de transacao, essa configuracao permite dizer depois de quantas operacoes ele pode fezer um flush.
index.translog.flush_threshold_ops: 50000
# Definicao para numero de shareds para cada indice.
index.number_of_shards: 3
# numero de replicas: Essa configuracao permite definr o numero de indices por replicas, esse numero nunca pode ser superior ao numero de nodes do cluster.
index.number_of_replicas: 1
# Essa configuracao define o tipo de busca do pool de threads para melhorar o consumo da memoria.
threadpool.search.type: fixed
# Controla a numero de threads de buscas e tem como valor padrao o numero de cores.
threadpool.search.size: 20
# Essa configuracao permite controlar o tamanho da fila para pedidos de buscas pendentes.
threadpool.search.queue_size: 200
# Aqui eh definido o tipo de indexacao do pool de threads. 
threadpool.index.type: fixed
# Controla o numero de threads para indexacoes e tem como valor padrao o numero de cores x 5.
# 12 cores x 5 = 60.
threadpool.index.size: 5
# Essa configuracao permite controlar o tamanho da fila para pedidos pendentes de indexacoes.
threadpool.index.queue_size: 200

Passo 9 – Copiando o arquivo elasticsearch.yml do servidor elasticsearch-1 para o servidor elasticsearch-2.

# scp elasticsearch.yml root@elasticsearch-2:/etc/elasticsearch/

Passo 10 – Ajustando o arquivo elasticsearch.yml no servidor elasticsearch-2.

# cd /etc/elasticsearch/
# vim elasticsearch.yml

Altere conforme exemplo abaixo:

node.name: elasticsearch-2
network.host: 192.168.10.51

Passo 11 – Iniciando o Elasticsearch.

# systemctl start elasticsearch.service

Passo 12 – Verificando se o Elasticsearch foi iniciado com sucesso.

# systemctl status elasticsearch -l
* elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
   Active: active (running) since Sex 2016-06-10 10:30:16 BRT; 2min 16s ago

Passo 13 – Validando o Elasticsearch – servidor elasticsearch-1
Já sabemos que o Elasticsearch disponibiliza uma api restFul. Logo podemos fazer um teste executado o seguinte comando:

# curl http://elasticsearch-1:9200
{
  "name" : "elasticsearch-1",
  "cluster_name" : "tutoriaisgnulinux",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}

Passo 14 – Validando o Elasticsearch – servidor elasticsearch-2

# curl http://elasticsearch-2:9200
{
  "name" : "elasticsearch-2",
  "cluster_name" : "tutoriaisgnulinux",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}

Passo 15 – Criando o primeiro dado.

# curl -X POST 'http://192.168.10.50:9200/tutoriaisgnulinux/post/1' -d '{ "Linux": "DevOps" }'
{"_index":"tutoriaisgnulinux","_type":"post","_id":"1","_version":3,"_shards":{"total":2,"successful":2,"failed":0},"created":false}[root@dc1-stn0

Passo 16 – Fazendo a busca do dado no servidor elasticsearch-1.
Para recuperar os dados salvos anteriormente, poderemos executar o seguinte comando:

# curl -X GET 'http://192.168.10.50:9200/tutoriaisgnulinux/post/1?pretty'
{
  "_index" : "tutoriaisgnulinux",
  "_type" : "post",
  "_id" : "1",
  "_version" : 3,
  "found" : true,
  "_source" : {
    "Linux" : "DevOps"
  }
}

Passo 17 – Fazendo a busca do dado no servidor elasticsearch-2.

# curl -X GET 'http://192.168.10.51:9200/tutoriaisgnulinux/post/1?pretty'
{
  "_index" : "tutoriaisgnulinux",
  "_type" : "post",
  "_id" : "1",
  "_version" : 3,
  "found" : true,
  "_source" : {
    "Linux" : "DevOps"
  }
}

Passo 18 – Verificando se houve o ajuste automático do Virtual Memory no arquivo sysctl.conf. O local do arquivo se encontra no /usr/lib/sysct.d. Caso não possua este arquivo, basta criá-lo manualmente.

# cat /usr/lib/sysctl.d/elasticsearch.conf 
vm.max_map_count=262144

Passo 19 – Ajustando o tamanho do Virtual Memory através do comando sysctl. Não necessário, caso o Passo 18 obteve sucesso.

# sysctl -w vm.max_map_count=262144

Configurando o Servidor HAproxy.

O HAProxy é oferecido como um confiável balanceador de carga de alto desempenho para HTTP e TCP. Na prática ele recebe as conexões dos usuários e atua como um proxy, criando um canal entre o usuário e um dos servidores de aplicação.

Passo 1 – Instalando o HAproxy.

# yum install haproxy -y
# systemctl enable haproxy

Passo 2 – Gerando um backup do arquivo de configuração.

# cd /etc/haproxy/
# cp haproxy.cfg haproxy.cfg-old

Passo 3 – Ajustando o arquivo HAproxy.

# vim haproxy.cfg
# Global
global
        log         127.0.0.1 local2
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon

# Defaults
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option redispatch
        retries 3
        timeout client 35s
        timeout server 60s
        timeout connect 5s
        timeout http-keep-alive 10s

listen elasticsearch-TCP-80 172.11.0.37:80
        stats enable
        stats uri /stats
        stats realm Haproxy\ Statistics
        stats auth user:password

# listen
listen elasticsearch-TCP-9200 192.168.10.52:9200
        mode tcp
        option tcpka
        option tcplog
        balance roundrobin
        server elasticsearch-1 192.168.10.50:9200 check
        server elasticsearch-2 192.168.10.51:9200 check

Passo 4 – Verificando a estrutura do Load Balance pela interface Web do HAproxy.

haproxy-elasticsearch
Passo 5 – Realizando a consulta pelo IP do HAproxy.

# curl -X GET 'http://192.168.10.52:9200/'
{
  "name" : "elasticsearch-2",
  "cluster_name" : "tutoriaisgnulinux",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}
# curl -X GET 'http://192.168.10.52:9200/'
{
  "name" : "elasticsearch-1",
  "cluster_name" : "tutoriaisgnulinux",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}

Feito.
😉

>_Criando um Cluster para Elasticsearch 2.3 no CentOS 7.2
Tagged on:     

2 thoughts on “>_Criando um Cluster para Elasticsearch 2.3 no CentOS 7.2

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

%d blogueiros gostam disto: