Configurar el clúster Elasticsearch en CentOS/Ubuntu con Ansible |
Elasticsearch es un potente motor de análisis y búsqueda distribuido en tiempo real, RESTful y de código abierto que brinda la capacidad de realizar búsquedas de texto completo. Elasticsearch se basa en Apache Lucene y el software está disponible gratuitamente bajo la licencia Apache 2. En este artículo, instalaremos un Elasticsearch Cluster en CentOS 8/7 y Ubuntu 20.04/18.04 utilizando la herramienta de automatización Ansible.
Este tutorial ayudará a los usuarios de Linux a instalar y configurar un clúster Elasticsearch multinodo de alta disponibilidad en sistemas Linux CentOS 8/CentOS 7 y Ubuntu 20.04/18.04. Algunos de los usos clave de ElasticSearch son análisis de registros, motores de búsqueda, búsqueda de texto completo, análisis de negocios, inteligencia de seguridad, entre muchos otros.
En esta configuración, instalaremos Elasticsearch 7.x Cluster con la función Ansible. El rol que utilizamos es el proyecto oficial de ElasticSearch y le brinda flexibilidad de elección.
Tipo de nodos de Elasticsearch
Hay dos tipos comunes de nodos Elasticsearch:
- Nodos maestros: responsables de las operaciones de todo el clúster, como la gestión de índices y la asignación de almacenamiento de fragmentos de datos a los nodos de datos.
- Nodos de datos: contienen los fragmentos reales de datos indexados y manejan todas las operaciones CRUD, de búsqueda y de agregación. Consumen más CPU, Memoria y E/S
Requisitos de configuración
Antes de comenzar, necesitará al menos tres servidores CentOS 8/7 instalados y actualizados. Se requerirá un usuario con privilegios sudo o root para realizar las acciones. Mi configuración se basa en la siguiente estructura de nodos.
Server Name | Specs | Server role |
elk-master-01 | 16gb ram, 8vpcus | Master |
elk-master-02 | 16gb ram, 8vpcus | Master |
elk-master-03 | 16gb ram, 8vpcus | Master |
elk-data01 | 32gb ram, 16vpcus | Data |
elk-data02 | 32gb ram, 16vpcus | Data |
elk-data03 | 32gb ram, 16vpcus | Data |
NOTA :
- Para entornos pequeños, puede utilizar un nodo para operaciones maestras y de datos.
Consideraciones de almacenamiento
Para los nodos de datos, se recomienda configurar el almacenamiento correctamente teniendo en cuenta la escalabilidad. En mi laboratorio, cada nodo de datos tiene un disco de 500 GB montado en /data. Esto se configuró con los siguientes comandos.
ADVERTENCIA: No copie ni ejecute los comandos, son solo un punto de referencia.
sudo parted -s -a optimal -- /dev/sdb mklabel gpt
sudo parted -s -a optimal -- /dev/sdb mkpart primary 0% 100%
sudo parted -s -- /dev/sdb align-check optimal 1
sudo pvcreate /dev/sdb1
sudo vgcreate vg0 /dev/sdb1
sudo lvcreate -n lv01 -l+100%FREE vg0
sudo mkfs.xfs /dev/mapper/vg0-lv01
echo "/dev/mapper/vg0-lv01 /data xfs defaults 0 0" | sudo tee -a /etc/fstab
sudo mount -a
Paso 1: instale Ansible en la estación de trabajo
Usaremos Ansible para configurar Elasticsearch Cluster en CentOS 8/7. Asegúrese de que Ansible esté instalado en su máquina para facilitar la administración.
En Fedora:
sudo dnf install ansible
En CentOS:
sudo yum -y install epel-release
sudo yum install ansible
RHEL 7/RHEL 8:
### RHEL 8 ###
sudo subscription-manager repos --enable ansible-2.9-for-rhel-8-x86_64-rpms
sudo yum install ansible
### RHEL 7 ###
sudo subscription-manager repos --enable rhel-7-server-ansible-2.9-rpms
sudo yum install ansible
ubuntu:
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
Para cualquier otra distribución, consulte la guía de instalación oficial de Ansible.
Confirme la instalación de Ansible en su máquina consultando la versión.
$ ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.17 (default, Jul 1 2022, 15:56:32) [GCC 7.5.0]
Paso 2: Importar el rol ansible de Elasticsearch
Después de instalar Ansible, ahora puede importar la función ansible de Elasticsearch a su sistema local usando galaxy.
$ ansible-galaxy install elastic.elasticsearch
- downloading role 'elasticsearch', owned by elastic
- downloading role from https://github.com/elastic/ansible-elasticsearch/archive/v7.17.0.tar.gz
- extracting elastic.elasticsearch to /root/.ansible/roles/elastic.elasticsearch
- elastic.elasticsearch (v7.17.0) was installed successfully
Donde 7.x.y es la versión de lanzamiento de la función Elasticsearch que se descargará. Puede consultar la página de lanzamientos para encontrar una coincidencia con la versión de Elasticsearch que desea instalar.
El rol se agregará al directorio ~/.ansible/roles.
$ ls ~/.ansible/roles
elastic.elasticsearch
Configure su ssh con hosts de clúster de Elasticsearch.
$ vim ~/.ssh/config
Así se ven mis configuraciones adicionales: actualícelas para adaptarlas a su entorno.
# Elasticsearch master nodes
Host elk-master01
Hostname 192.168.10.2
User root
Host elk-master02
Hostname 192.168.10.3
User root
Host elk-master03
Hostname 192.168.10.4
User root
# Elasticsearch worker nodes
Host elk-data01
Hostname 192.168.10.2
User root
Host elk-data02
Hostname 192.168.10.3
User root
Host elk-data03
Hostname 192.168.10.4
User root
Asegúrese de haber copiado las claves ssh en todas las máquinas.
### Master nodes ###
for host in elk-master0{1..3}; do ssh-copy-id $host; done
### Worker nodes ###
for host in elk-data0{1..3}; do ssh-copy-id $host; done
Confirme que puede realizar ssh sin autenticación de contraseña.
$ ssh elk-master01
Warning: Permanently added '95.216.167.173' (ECDSA) to the list of known hosts.
[root@elk-master-01 ~]#
Si su clave ssh privada tiene una frase de contraseña, guárdela para evitar que se le solicite en cada máquina.
$ eval `ssh-agent -s` && ssh-add
Enter passphrase for /var/home/jkmutai/.ssh/id_rsa:
Identity added: /var/home/jkmutai/.ssh/id_rsa (/var/home/jkmutai/.ssh/id_rsa)
Paso 3: cree el libro de jugadas de Elasticsearch y ejecútelo
Ahora que todos los requisitos previos están configurados, creemos un archivo Playbook para la implementación.
$ vim elk.yml
El mío tiene el contenido a continuación.
- hosts: elk-master-nodes
roles:
- role: elastic.elasticsearch
vars:
es_enable_xpack: false
es_data_dirs:
- "/data/elasticsearch/data"
es_log_dir: "/data/elasticsearch/logs"
es_java_install: true
es_heap_size: "1g"
es_config:
cluster.name: "elk-cluster"
cluster.initial_master_nodes: "192.168.10.2:9300,192.168.10.3:9300,192.168.10.4:9300"
discovery.seed_hosts: "192.168.10.2:9300,192.168.10.3:9300,192.168.10.4:9300"
http.port: 9200
node.data: false
node.master: true
bootstrap.memory_lock: false
network.host: '0.0.0.0'
es_plugins:
- plugin: ingest-attachment
- hosts: elk-data-nodes
roles:
- role: elastic.elasticsearch
vars:
es_enable_xpack: false
es_data_dirs:
- "/data/elasticsearch/data"
es_log_dir: "/data/elasticsearch/logs"
es_java_install: true
es_config:
cluster.name: "elk-cluster"
cluster.initial_master_nodes: "192.168.10.2:9300,192.168.10.3:9300,192.168.10.4:9300"
discovery.seed_hosts: "192.168.10.2:9300,192.168.10.3:9300,192.168.10.4:9300"
http.port: 9200
node.data: true
node.master: false
bootstrap.memory_lock: false
network.host: '0.0.0.0'
es_plugins:
- plugin: ingest-attachment
Notas clave:
- Los nodos maestros tienen node.masterr establecido en true y node.data establecido en false.
- Los nodos de datos tienen node.data establecido en true y node.master establecido en false.
- La variable es_enable_xpack se establece en false para la instalación de la edición de código abierto ElasticSearch.
- cluster.initial_master_nodes & discovery.seed_hosts apuntan a nodos maestros
- /data/elasticsearch/data es donde se almacenará el fragmento de datos de Elasticsearch. Se recomienda que sea una partición separada de la instalación del sistema operativo por razones de rendimiento y escalabilidad.
- /data/elasticsearch/logs es donde se almacenarán los registros de Elasticsearch.
- Los directorios se crearán automáticamente mediante una tarea ansible. Solo necesita asegurarse de que /data sea un punto de montaje del almacén de datos deseado para Elasticsearch.
Para obtener más opciones de personalización, consulte la documentación de github del proyecto.
Crear archivo de inventario
Cree un nuevo archivo de inventario.
$ vim hosts
[elk-master-nodes]
elk-master01
elk-master02
elk-master03
[elk-data-nodes]
elk-data01
elk-data02
elk-data03
Cuando todo esté configurado, ejecute el Playbook.
$ ansible-playbook -i hosts elk.yml
La ejecución debería comenzar. Tenga paciencia ya que esto podría tardar algunos minutos.
PLAY [elk-master-nodes] ********************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************
ok: [elk-master02]
ok: [elk-master01]
ok: [elk-master03]
TASK [elastic.elasticsearch : set_fact] ****************************************************************************************************************
ok: [elk-master02]
ok: [elk-master01]
ok: [elk-master03]
TASK [elastic.elasticsearch : os-specific vars] ********************************************************************************************************
ok: [elk-master01]
ok: [elk-master02]
ok: [elk-master03]
.......
Una ejecución ansible exitosa tendrá un resultado similar al siguiente.
PLAY RECAP *********************************************************************************************************************************************
elk-data01 : ok=38 changed=10 unreachable=0 failed=0 skipped=119 rescued=0 ignored=0
elk-data02 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0
elk-data03 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0
elk-master01 : ok=38 changed=10 unreachable=0 failed=0 skipped=119 rescued=0 ignored=0
elk-master02 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0
elk-master03 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0
Vea la siguiente captura de pantalla.
Paso 4: Confirmar la instalación de Elasticsearch Cluster
Inicie sesión en uno de los nodos maestros.
$ ssh elk-master01
Verifique el estado de salud del clúster.
$ curl http://localhost:9200/_cluster/health?pretty
{
"cluster_name" : "elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 6,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
Verifique los nodos maestros.
$ curl -XGET 'http://localhost:9200/_cat/master'
G9X__pPXScqACWO6YzGx3Q 95.216.167.173 95.216.167.173 elk-master01
Ver nodos de datos:
$ curl -XGET 'http://localhost:9200/_cat/nodes'
192.168.10.4 7 47 1 0.02 0.03 0.02 di - elk-data03
192.168.10.2 10 34 1 0.00 0.02 0.02 im * elk-master01
192.168.10.4 13 33 1 0.00 0.01 0.02 im - elk-master03
192.168.10.3 14 33 1 0.00 0.01 0.02 im - elk-master02
192.168.10.3 7 47 1 0.00 0.03 0.03 di - elk-data02
192.168.10.2 6 47 1 0.00 0.02 0.02 di - elk-data01
Como se confirmó, ahora tiene un clúster Clean Elasticsearch en el sistema Linux CentOS 8/7 y Ubuntu 22.04/20.04/18.04.
Cursos en vídeo de aprendizaje de Elasticsearch
- Clase magistral completa de Elasticsearch con Logstash y Kibana
- Elasticsearch 7 y Elastic Stack: en profundidad y práctico
- Guía completa de Elasticsearch
- Clase magistral completa de Elasticsearch con Logstash y Kibana
- Procesamiento de datos con Logstash (y Filebeat)
Guías similares:
- Instale Graylog 3 con Elasticsearch 6.x en CentOS 8/RHEL 8 Linux
- Cómo eliminar datos del índice Elasticsearch con curl