1 引言
1.1 什么是elasticsearch?
ElasticSearch是一个分布式,高性能、高可用、可伸缩的搜索和分析系统 。
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
1.2 什么是Elastic Stack套件?
单纯的elasticsearch提供了数据搜索分析,但是:
- 它仅提供了RESTful API,没有提供界面,不太方便,所以通常安装kibana组件提供Web界面,包括操作和监控等。
- elasticsearch不具备数据采集功能,通常通过在源端系统部署filebeat采集数据(包括从文件和数据库中采集等),filebeat采集得到的数据可以直接传给elasticsearch。还可以filebeat采集的数据先通过logstash,在logstash里完成加工、过滤、转换等预处理再传给elasticsearch。
所以在实际使用中,经常以套件组合形式使用。
Elastic Stack,前身缩写是ELK,就是ElasticSearch + LogStash + Kibana。 现在的Elastic Stack除了下图右侧的ELK,还包括左侧的主键。
1.3 ES的使用场景
- 网上商场,搜索商品.
- ES配合logstash,kibana,日志分析.
假设用数据库做搜索,当用户在搜索框输入“四川火锅”时,数据库通常只能把这四个字去进行全部匹配。可是在文本中,可能会出现“推荐四川好吃的火锅” 或者“火锅在四川的特色”,这时候就没有结果了。
而且:
1.海量数据组合条件查询
2.毫秒级或者秒级返回数据
2 elasticsearch基本概念
2.1 近实时(NRT)
ES是一个近实时的搜索引擎(平台),代表着从添加数据到能被搜索到只有很少的延迟。(大约是1s)这里的延迟是搜索search的延迟,直接查询query是无延迟的。
2.2 文档document
Elasticsearch是面向文档的,文档是所有可搜索数据的最小单元。可以把文档简单理解为关系型数据库中的一条记录。每个文档有唯一的ID,文档会被序列化成json格式,保存在Elasticsearch中。同样json对象由字段组成,给个字段都有自己的类型(字符串,数值,布尔,二进制,日期范围类型)。当我们创建文档时,如果不指定类型,Elasticsearch会帮我们自动匹配类型。每个文档都一个ID,你可以自己指定,也可以让Elasticsearch自动生成。json格式,支持数组/嵌套,在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。
2.3 索引index
索引是具有某种相似特性的文档集合。例如,您可以拥有客户数据的索引、产品目录的另一个索引以及订单数据的另一个索引。索引由一个名称(必须全部是小写)标识。在单个集群中,您可以定义任意多个索引。Index体现了逻辑空间的概念,每个索引都有自己的mapping定义,用于定义包含文档的字段名和字段类型。Index体现了物理空间的概念,索引中的数据分散在shard上。可以将其暂时理解为 MySql中的 database。
索引的mapping和setting
- mapping:定义文档字段的类型
- setting:定义不同数据的分布
2.4 类型type(Deprecated)
一个索引可以有多个类型。例如一个索引下可以有文章类型,也可以有用户类型,也可以有评论类型。在一个索引中不能再创建多个类型,在以后的版本中将删除类型的整个概念。
从6.0开始,type已经被逐渐废弃。在6.0中默认类型(_doc)。(虽然在6.0中,一个index还可以创建多个types,但不推荐这么做)
从7.0开始,一个索引下默认有且只有一个类型(_doc),不能自行创建类型。
2.5 节点node
节点是一个Elasticsearch实例,本质上就是一个java进程,节点也有一个名称(默认是随机分配的),当然也可以通过配置文件配置,或者在启动的时候,-E node.name=node1指定。此名称对于管理目的很重要,因为您希望确定网络中的哪些服务器对应于ElasticSearch集群中的哪些节点。
在Elasticsearch中,节点的类型主要分为如下几种:
-
master eligible节点:
每个节点启动后,默认就是master eligible节点,可以通过
node.master: false
禁止master eligible可以参加选主流程,成为master节点
当第一个节点启动后,它会将自己选为master节点
每个节点都保存了集群的状态,只有master节点才能修改集群的状态信息
-
data节点
可以保存数据的节点。负责保存分片数据,在数据扩展上起到了至关重要的作用
-
Coordinating 节点
负责接收客户端请求,将请求发送到合适的节点,最终把结果汇集到一起
每个节点默认都起到了Coordinating node的职责
开发环境中一个节点可以承担多个角色,生产环境中,建议设置单一的角色,可以提高性能等
2.6 分片shards
索引可能存储大量数据,这些数据可能会超出单个节点的硬件限制。例如,占用1TB磁盘空间的10亿个文档的单个索引可能不适合单个节点的磁盘,或者速度太慢,无法单独满足单个节点的搜索请求。
为了解决这个问题,ElasticSearch提供了将索引细分为多个片段(称为碎片)的能力。创建索引时,只需定义所需的碎片数量。每个分片(shard)本身就是一个完全功能性和独立的“索引”,可以托管在集群中的任何节点上。
为什么要分片?
- 它允许您水平拆分/缩放内容量
- 它允许您跨碎片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量
如何分配分片以及如何将其文档聚合回搜索请求的机制完全由ElasticSearch管理,并且对作为用户的您是透明的。主分片数在索引创建时指定,后续不允许修改,除非Reindex
2.7 分片的副本replicas of shard
在随时可能发生故障的网络/云环境中,非常有用,强烈建议在碎片/节点以某种方式脱机或因任何原因消失时使用故障转移机制。为此,ElasticSearch允许您将索引分片的一个或多个副本复制成所谓的副本分片,简称为副本分片。
为什么要有副本?
- 当分片/节点发生故障时提供高可用性。因此,需要注意的是,副本分片永远不会分配到复制它的原始/主分片所在的节点上。
- 允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。
总而言之,每个索引可以分割成多个分片。索引也可以零次(意味着没有副本)或多次复制。复制后,每个索引将具有主分片(从中复制的原始分片)和副本分片(主分片的副本)。
可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您还可以随时动态更改副本的数量。您可以使用收缩和拆分API更改现有索引的分片数量,建议在创建索引时就考虑好分片和副本的数量。
默认情况下,ElasticSearch中的每个索引都分配一个主分片和一个副本,这意味着如果集群中至少有两个节点,则索引将有一个主分片和另一个副本分片(一个完整副本),每个索引总共有两个分片。
3 linux ELK的安装
高版本还是低版本elasticssearch,都不要使用root用户安装和启动,使用root用户启动是极不好的习惯。
注意从elasticssearch7.0开始,它会自动检测,若roott用户启动会提示失败。
3.1 规划
- elasticsearch的版本几个月就升一个大版本号,版本号变得太快。 实际上高版本大同小异。这里以6.8.3为例。ELK三件套的版本号和filebeat的版本号应该完全一致,避免兼容性问题。
- 确保Linux已经安装了JDK(含JVM),推荐使64bit的的 1.8.0_131或更高的版本JVM。
- 由于ELK三件套通常安装在一起(同一台机器上),因此我们先建立一个elk文件夹,在elk文件夹下分别有三个子目录放不同的软件,结构如下:
elk
∟ elasticsearch-6.8.3
∟ kibana-6.8.3-linux-x86_64
∟ logstash-6.8.3
3.2 操作系统调整
elasticsearch对操作系统配置有要求,不然启动时会报错。
- 操作系统默认的max_map_count[65530]太低,至少增加到[262144]。使用root用户vim /etc/sysctl.conf 文件中增加以下配置
vm.max_map_count=262145
然后root用户执行:sysctl -p
使配置生效
- 最大文件描述符[4096]对于elasticsearch进程可能太低,至少增加到[65535] 使用root用户vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
修改后,重新登录通常即可生效,可是使用ulimit -a
查看当前值
- 注意防火墙。需要配置防火墙端口,或者关闭防火墙。
3.2 elasticsearch安装
-
(非root用户)登录linux,下载最新的elasticsearch包 下载地址https://www.elastic.co/cn/downloads/elasticsearch 。然后解压即可
cd /home/zyplanke/elk curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.3.tar.gz tar -xvf elasticsearch-6.8.3.tar.gz
-
配置elasticsearch的配置。编辑vim config/elasticsearch.yml
cluster.name: mycluster # 集群名,所有节点node都应配置相同的集群名 node.name: node1 # 本节点名,同一集群下不同的node名字不能重复 network.host: 0.0.0.0 # 本节点监听本地IP,全零为本地所有网卡 http.port: 9200 # http 协议的端口 transport.tcp.port: 9301 # 集群内节点之间的通信端口。 path.data: /elasticsearch/data # 数据存放的路径(目录需要提前创建好,确保有权限) path.logs: /elasticsearch/logs # 日志存放的路径(目录需要提前创建好,确保有权限)
-
调整elasticsearch使用的jvm内存大小(可不调整,可选步骤) vim config/jvm.options
-Xms1g -Xmx1g
-
elasticsearch使用了log4j2作为日志配置,如需要可调整日志配置(可选步骤)vim config/log4j2.properties
-
进入解压后的 elasticsearch文件夹的bin目录下 执行./elasticsearch 启动
-
启动后,可以通过浏览器访问http://192.168.43.201:9200/,正常结果如下,表明elasticsearch启动成功。
3.3 浏览器插件elasticsearch-head(可选)
这时一款chrome浏览器的插件,可以图形化监视和管理elasticsearch。需要在google应用商店下载插件安装(需翻墙):
3.4 kibana安装
-
(非root用户)登录linux,下载最新的kibana包 下载地址