在CentOS 8/7上设置Elasticsearch群集|带有Ansible的Ubuntu 20.04/18.04

时间:2020-02-23 14:31:26  来源:igfitidea点击:

Elasticsearch是一个功能强大的开源RESTful分布式实时搜索和分析引擎,它提供了全文搜索功能。 Elasticsearch基于Apache Lucene构建,该软件可根据Apache 2许可免费获得。在本文中,我们将使用Ansible自动化工具在CentOS 8/7和Ubuntu 20.04/18.04上安装Elasticsearch Cluster。

本教程Linux用户在CentOS 8/CentOS 7和Ubuntu 20.04/18.04 Linux系统上安装和配置高度可用的多节点Elasticsearch集群。 ElasticSearch的一些关键用途是日志分析,搜索引擎,全文搜索,业务分析,安全情报等。

在此设置中,我们将安装具有Ansible角色的Elasticsearch 7.x Cluster。使用的角色是ElasticSearch官方项目,它使我们可以灵活选择。

Elasticsearch节点类型

Elasticsearch节点有两种常见类型:

  • 主节点:负责集群范围的操作,例如索引管理和将数据分片存储分配给数据节点。
  • 数据节点:它们保存索引数据的实际分片,并处理所有CRUD,搜索和聚合操作。它们消耗更多的CPU,内存和I/O

设置要求

在开始之前,我们至少需要安装和更新三台CentOS 8/7服务器。需要具有sudo特权或者root用户的用户才能执行操作。我的设置基于以下节点结构。

服务器名称规格服务器角色
elk-master-0116gb ram,8vpcusMaster
elk-master-0216gb ram,8vpcusMaster
elk-master-0316GB ram,8vpcusMaster
elk-data0132gb ram,16vpcusData
elk-data0232gb ram,16vpcusData
elk-data0332gb ram,16vpcusData

注意:

  • 对于小型环境,可以将节点用于数据和主操作。

存储注意事项

对于数据节点,建议在考虑可伸缩性的情况下正确配置存储。在我的实验室中,每个数据节点在/data下都装有500GB磁盘。这是通过以下命令配置的。

警告:不要复制和运行命令,它们只是参考点。

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

在工作站上安装Ansible

我们将使用Ansible在CentOS 8/7上设置Elasticsearch Cluster。确保在计算机中安装了Ansible,以便于管理。

在Fedora上:

sudo dnf install ansible

在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

对于任何其他发行版,请参阅Ansible官方安装教程。

通过查询版本确认在计算机中安装Ansible。

$ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/var/home/jkmutai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.7.6 (default, Jan 30 2017, 09:44:41) [GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]

导入Elasticsearch ansible角色

安装Ansible后,我们现在可以使用星系将Elasticsearch ansible角色导入本地系统。

$ansible-galaxy install elastic.elasticsearch,7.6.2

- downloading role 'elasticsearch', owned by elastic
- downloading role from https://github.com/elastic/ansible-elasticsearch/archive/7.6.2.tar.gz
- extracting elastic.elasticsearch to /var/home/jkmutai/.ansible/roles/elastic.elasticsearch
- elastic.elasticsearch (7.6.2) was installed successfully

其中7.6.2是要下载的Elasticsearch角色的发行版。我们可以在发布页面上找到要安装的Elasticsearch版本的匹配项。

该角色将添加到~/.ansible/roles目录中。

$ls ~/.ansible/roles
total 4.0K
drwx------. 15 jkmutai jkmutai 4.0K Jan  1 16:28 elastic.elasticsearch

使用Elasticsearch群集主机配置ssh。

$vim ~/.ssh/config

这样,我的其他配置就可以根据环境进行更新了。

# Elasticsearch master nodes
Host elk-master01
  Hostname 95.216.167.173
  User root
Host elk-master02
  Hostname 95.216.195.161
  User root
Host elk-master03
  Hostname 95.217.159.46
  User root

# Elasticsearch worker nodes
Host elk-data01
  Hostname 95.216.195.178
  User root
Host elk-data02
  Hostname 95.217.159.52
  User root
Host elk-data03
  Hostname 95.217.159.43
  User root

确保已将ssh密钥复制到所有计算机。

--- 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

确认我们无需密码验证即可使用ssh。

$ssh elk-master01
Warning: Permanently added '95.216.167.173' (ECDSA) to the list of known hosts.
[theitroad@localhost ~]#

如果ssh私钥有密码短语,请将其保存以避免在每台机器上出现提示。

$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)

创建Elasticsearch Playbook并运行它

现在已经配置了所有前提条件,现在让我们创建一个Playbook文件进行部署。

$vim elk.yml

我的内容如下。

- 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: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46:9300"
      discovery.seed_hosts: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46: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: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46:9300"
      discovery.seed_hosts: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46: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

重要说明:

  • 主节点的node.master设置为true,node.data设置为false。
  • 数据节点的node.data设置为true,node.master设置为false。
  • es_enable_xpack变量在安装ElasticSearch开源版本时设置为false。
  • cluster.initial_master_nodes和discovery.seed_hosts指向主节点
  • /data/elasticsearch/data是存储Elasticsearch数据分片的位置,出于性能和可伸缩性的原因,建议将其与OS安装分开放置。
  • /data/elasticsearch/logs是存储Elasticsearch日志的位置。
  • 目录将由ansible任务自动创建。我们只需要确保/data是Elasticsearch所需数据存储的安装点。

有关更多自定义选项,请查看项目github文档。

创建库存文件

创建一个新的列表文件。

$vim hosts
[elk-master-nodes]
elk-master01
elk-master02
elk-master03

[elk-data-nodes]
elk-data01
elk-data02
elk-data03

设置全部后,运行Playbook。

$ansible-playbook -i hosts elk.yml

应该开始执行。请耐心等待,因为这可能需要几分钟。

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]
.......

成功的ansible执行将具有类似于以下的输出。

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

确认在Ubuntu/CentOS上安装Elasticsearch Cluster

登录到主节点之一。

$ssh elk-master01

检查集群运行状况。

$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
}

检查主节点。

$curl -XGET 'http://localhost:9200/_cat/master'
G9X__pPXScqACWO6YzGx3Q 95.216.167.173 95.216.167.173 elk-master01

查看数据节点:

$curl -XGET 'http://localhost:9200/_cat/nodes'
95.217.159.43   7 47 1 0.02 0.03 0.02 di - elk-data03
95.216.167.173 10 34 1 0.00 0.02 0.02 im * elk-master01
95.217.159.46  13 33 1 0.00 0.01 0.02 im - elk-master03
95.216.195.161 14 33 1 0.00 0.01 0.02 im - elk-master02
95.217.159.52   7 47 1 0.00 0.03 0.03 di - elk-data02
95.216.195.178  6 47 1 0.00 0.02 0.02 di - elk-data01

确认我们现在在CentOS 8/7和Ubuntu 20.04/18.04 Linux系统上拥有一个Clean Elasticsearch Cluster。