随着工业互联网和大数据应用的不断发展,对海量数据的处理、数据内容快速搜索的需求越来越重要。而且最近本人工作上也接触到的相关技术也越来越多。本文将开启Elastic Stack基础知识的学习和使用。随手留下学习记录,共勉于此。
Elastic Stack也称为ELK Stack,ELK是三个开源项目的首字缩写,他们是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎(本文的重点内容)。Logstash 是服务器端数据处理管道,能同时从多个来源采集数据,转换数据,然后将数据发送到 Elasticsearch,Mysql等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elastic Stack 也可以认为是 ELK Stack 的更新换代产品。它又加入了Beats项目,更加能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。重点是所有均免费且开放。提示:详见官方网站
Elasticsearch是在 Apache Lucene 的基础上开发而成的一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。它以其简单的 REST 风格 API、分布式特性、速度和可扩展性而出名。
Elasticsearch 索引是指相互关联的文档集合,以 JSON 文档的形式存储。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。
Elasticsearch 使用的是倒排索引的数据结构,允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。在索引过程中,Elasticsearch 会存储文档并构建倒排索引,用户可以近实时地对文档数据进行搜索使用。通过索引 API 既可以向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。
由于在速度和可扩展性方面表现出色,而且支持多种类型的数据。因此适用广泛的应用场景:
Elasticsearch的版本众多,本集群的搭建是基于CentOS7.x操作系统,选择的是Elasticsearch7.8.1版本。注意必须使用JAVA 8+ 环境才能运行。 准备三台虚拟机,并将以下信息添加进/etc/hosts中:
192.168.156.50 es-n0
192.168.156.51 es-n1
192.168.156.52 es-n2
以上虚拟机配置均为CPU为2核,4G内存的配置。大家可以根据自己的实际情况调整。
提示:此处省略操作系统和Java的安装。
以下操作步骤需要在所有集群节点进行,以首节点es-n0为例:
[root@es-n0 ~]# vim /etc/sysctl.conf
vm.max_map_count=655360
#添加以下内容到/etc/security/limits.conf文件尾
[root@es-n0 ~]# vim /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
[root@es-n0 ~]# vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65536
#关闭防火墙并重启系统
[root@es-n0 ~]# systemctl disable firewalld
[root@es-n0 ~]# reboot
[root@es-n0 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz
[root@es-n0 ~]# tar zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz -C /usr/local/
[root@es-n0 ~]# cd /usr/local/
#重命名以下目录
[root@es-n0 ~]# mv elasticsearch-7.8.1 elasticsearch
为了安全,Elasticsearch是不允许直接使用root启动的。 因此需额外创建一个用户来运行Elasticsearch服务。
#创建用户:elasticsearch
[root@es-n0 ~]# adduser elasticsearch
#设置用户账号密码:elasticsearch
[root@es-n0 ~]# passwd elasticsearch
#将对应的elasticsearch文件夹权限赋给该用户
[root@es-n0 ~]# chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
切换系统用户,使用elasticsearch用户登录。
#切换用户
[root@es-n0 ~]# su elasticsearch
[elasticsearch@es-n0 root]$
#进入elasticsearch的主配置目录,修改JVM配置
[elasticsearch@es-n0 ~]$ cd /usr/local/elasticsearch/
#找到JVM配置参数,一般为2G,不超过32G。
[elasticsearch@es-n0 config]$ vim jvm.options
-Xms2g
-Xmx2g
Elasticsearch的主配置文件为elasticsearch.yml,配置如下内容:
[elasticsearch@es-n0 config]$ vim elasticsearch.yml
cluster.name: elasticsearch
node.name: node-1
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/cluster-logs
network.host: 192.168.156.50
http.port: 9200
discovery.seed_hosts: ["192.168.156.50", "192.168.156.51", "192.168.156.52"]
#此处的node需要与node.name设置的名字保持一致,不用跟主机名一致,或者直接IP地址
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 是否允许跨域REST请求
http.cors.enabled: true
# 允许 REST 请求来自何处
http.cors.allow-origin: "*"
#开启权限认证后,es-head-master访问elasticsearch需要的配置
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
需要创建配置文件中的data和cluster-logs目录。
[elasticsearch@es-n0 config]$ cd ..
[elasticsearch@es-n0 elasticsearch]$ mkdir -p data cluster-logs
[elasticsearch@es-n0 elasticsearch]$ ll
total 1496
drwxr-xr-x. 2 elasticsearch elasticsearch 4096 Jul 22 2020 bin
drwxr-xr-x. 2 elasticsearch elasticsearch 16384 Apr 25 20:13 cluster-logs
drwxr-xr-x. 5 elasticsearch elasticsearch 222 Aug 13 14:44 config
drwxr-xr-x. 3 elasticsearch elasticsearch 19 Aug 14 2020 data
drwxr-xr-x. 9 elasticsearch elasticsearch 107 Jul 22 2020 jdk
drwxr-xr-x. 3 elasticsearch elasticsearch 4096 Jul 22 2020 lib
-rw-r--r--. 1 elasticsearch elasticsearch 13675 Jul 22 2020 LICENSE.txt
drwxr-xr-x. 2 elasticsearch elasticsearch 4096 Aug 12 16:38 logs
drwxr-xr-x. 47 elasticsearch elasticsearch 4096 Jul 22 2020 modules
-rw-r--r--. 1 elasticsearch elasticsearch 544318 Jul 22 2020 NOTICE.txt
drwxr-xr-x. 2 elasticsearch elasticsearch 6 Jul 22 2020 plugins
-rw-r--r--. 1 elasticsearch elasticsearch 8165 Jul 22 2020 README.asciidoc
OK,基本的配置已经完成。
Elasticsearch启动时确保当前用户为elasticsearch
[elasticsearch@es-n0 elasticsearch]$ whoami
elasticsearch
#启动
[elasticsearch@es-n0 elasticsearch]$ ./bin/elasticsearch
[2021-08-13T14:56:05,280][INFO ][o.e.n.Node ] [node-1] version[7.8.1]...
[2021-08-13T14:56:05,326][INFO ][o.e.n.Node ] [node-1] JVM home ...
......
[2021-08-13T14:56:09,864][INFO ][o.e.p.PluginsService ] [node-1] loaded module...
[2021-08-13T14:56:18,844][INFO ][o.e.n.Node ] [node-1] initialized
[2021-08-13T14:56:18,845][INFO ][o.e.n.Node ] [node-1] starting ...
......
[2021-08-13T14:56:20,943][INFO ][o.e.n.Node ] [node-1] started
当出现started时表示启动完成。
另外,后台运行有两种方式可用:
# 方式一:参数方式
[elasticsearch@es-n0 elasticsearch]$ ./bin/elasticsearch -d
# 方式二:系统nohup方式
[elasticsearch@es-n0 elasticsearch]$ nohup ./bin/elasticsearch &
安装完后需要进行单机测试:
[elasticsearch@es-n0 elasticsearch]$ curl 192.168.156.50:9200
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "dmZNmDdxRiaOT5PtuHW9dA",
"version" : {
"number" : "7.8.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "b5ca9c58fb664ca8bf9e4057fc229b3396bf3a89",
"build_date" : "2020-07-21T16:40:44.668009Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
正常显示以上JSON文本,即视为安装成功。
集群剩余节点的安装也没啥特殊的地方,只要仔细重复执行a ~ f 步骤即可,就不再过多啰嗦了。 唯一需要注意的地方是配置文件elasticsearch.yml的内容修改。下面专门贴出来:
# es-n1节点上
[elasticsearch@es-n1 config]$ vim elasticsearch.yml
cluster.name: elasticsearch
node.name: node-2
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/cluster-logs
network.host: 192.168.156.51
http.port: 9200
discovery.seed_hosts: ["192.168.156.50", "192.168.156.51", "192.168.156.52"]
#此处的node需要与node.name设置的名字保持一致,不用跟主机名一致,或者直接IP地址
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 是否允许跨域REST请求
http.cors.enabled: true
# 允许 REST 请求来自何处
http.cors.allow-origin: "*"
#开启权限认证后,es-head-master访问elasticsearch需要的配置
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
# es-n2节点上
[elasticsearch@es-n2 config]$ vim elasticsearch.yml
cluster.name: elasticsearch
node.name: node-3
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/cluster-logs
network.host: 192.168.156.52
http.port: 9200
discovery.seed_hosts: ["192.168.156.50", "192.168.156.51", "192.168.156.52"]
#此处的node需要与node.name设置的名字保持一致,不用跟主机名一致,或者直接IP地址
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 是否允许跨域REST请求
http.cors.enabled: true
# 允许 REST 请求来自何处
http.cors.allow-origin: "*"
#开启权限认证后,es-head-master访问elasticsearch需要的配置
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
Elasticsearch集群的启动,主要就是把各个节点上的Elasticsearch服务启动完成即可,并没有特别的地方,而且各节点是均等的,启动没有先后次序。集群会根据各节点的状态随机选择一个Master主节点,其余节点为Slave节点。
#查看集群节点状态:
[elasticsearch@es-n0 ~]$ curl -X GET "192.168.156.50:9200/_cat/nodes?v"
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.156.51 39 54 0 0.00 0.01 0.05 dilmrt * node-2
192.168.156.50 50 96 1 0.00 0.01 0.05 dilmrt - node-1
192.168.156.52 32 56 0 0.00 0.01 0.05 dilmrt - node-3
#查看集群健康状态:
[elasticsearch@es-n0 ~]$ curl -X GET "192.168.156.50:9200/_cat/health?v"
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1628841534 07:58:54 elasticsearch green 3 3 40 20 0 0 0 0 - 100.0%
#查看集群中索引文档的状态
[elasticsearch@es-n0 ~]$ curl -X GET "192.168.156.50:9200/_cat/indices?v"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green close wcm lKrKm-XgSh-3MUMj6MPKqw 1 1
green open queue-doc If-zY-__TDWdSS-l858-_g 1 1 189 0 93.3kb 46.6kb
至此,Elasticsearch集群搭建完毕。