携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
1.elasticsearch的介绍
1.1.elasticsearch简介
elasticsearch是一个实时的分布式搜索引擎,它能让你以一个之前从未有过的速度和规模去搜索你的数据,它被用作全文检索,结构化搜索, 分析以及这三个功能的组合。
\
elasticsearch是一个基于Apache Lucene的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为迄今为止最先进、性能最好的、功能 最全的搜索引擎库,但是Lucene只是一个库,想要用它,必须使用java 来作为开发语音并将其直接集成到你的应用中,Lucene非常复杂,需要深入了解检索的相关知识来理解是如何工作的,Elasticsearch也使用 java开发并使用Lucene作为其核心来实现所有搜索的功能,但是它的目的 是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 简单来说就是:之前操作Lucene都是直接去Lucene进行操作,复杂性相当多,而有了Elasticsearch之后,Elasticsearch在Lucene的基础上 又封装了一层,用户使用的时候也只是在封装好的那一层进行使用,由Elasticsearch去调用Lucene完成一些复杂性的过程,从而实现全文检索
\
elasticsearch简称ES
1.2.elasticsearch的功能
- 分布式的搜索引擎和数据分析引擎
-
- 搜索就是类似于百度,查找各种网页
- 数据分析就类似于博客统计累计访问量,电商平台的销量前十
- 全文检索、结构化检索、数据分析
-
- 全文检索类似于sql中的模糊查询,全文进行搜索
- 结构化搜索就类似于指定查询,查找到对应的一行
- 对海量数据进行近实时处理
-
- 分布式:ES自定将海量数据分撒到多台服务器上存储和检索
- 海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了
- 进实时:检索个数据要花费1小时,(这时就不要近实时,做好进行离线批量处理),在秒级别对数据进行搜索和分析
\
1.3.elasticsearch的应用场景
站点搜索、系统搜索、数据分析
- 基维百科
- The Guardian新闻网站
- 论坛
- GitHub
- 电商网站
- 日志数据分析
- 商品价格监控网站
- BI系统
1.4.elasticsearch的特点
- 可以作为一个大型分布式集群、处理PB级别的数据,服务大公司,也可以运行在单机上面,服务小公司
- elasticsearch主要将全文检索、数据分析以及分布式技术结合在一起,形成了独一无二的es
- 对用户而言是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下,就可以作为生产系统的环境来用了,数据量不打,操作不是太复杂
- elasticsearch作为传统数据库的一个补充,提供了数据库不能提供的很多功能
1.5.elasticsearch的数据格式
elasticsearch使用json作为文档的序列化格式,json序列化被大多数编程语言所支持,并且已经成为nosql领域的标准格式,简单、简洁、易于阅读
JSON(javaScript Object Notation)
\
2.elasticsearch的部署
2.1.elasticsearch的安装访问
| 安装方式 | 优点 | 缺点 |
|---|---|---|
| docker | 1.部署方便2.直接run就可以使用3.启动迅速 | 1.需要有docker知识2.修改配置复杂3.数据存储需要挂载目录 |
| tar | 1.部署灵活2.对系统侵占性小 | 1.需要自己写启动管理文件2.目录需要提前规划好 |
| rpm | 1.部署方便2.启动脚本安装即用3.存放目录标准化 | 1.软件各个组件分撒在不同的目录2.卸载可能不干净2.默认配置需要修改 |
| ansible | 1.极其灵活2.批量部署速度快 | 1.需要有ansible知识2,提前准备好所有文件 |
\
2.2.部署elasticsearch
1.准备Java环境 [root@192.168.100.142 ~]# yum -y install java [root@192.168.100.142 ~]# java -version openjdk version "1.8.0_282" OpenJDK Runtime Environment (build 1.8.0_282-b10) OpenJDK 64-Bit Server VM (build 25.282-b10, mixed mode) 2.下载elasticsearch rpm包 [root@192.168.100.142 ~]# mkdir soft [root@192.168.100.142 ~]# cd soft [root@192.168.100.142 ~]# wget artifacts.elastic.co/downloads/e… [root@192.168.100.142 ~/soft]# ll -h -rw-r--r--. 1 root root 109M 11月 15 08:58 elasticsearch-6.6.0.rpm 3.安装elasticsearch [root@192.168.100.142 ~/soft]# yum -y localinstall elasticsearch-6.6.0.rpm 4.启动elasticsearch [root@192.168.100.142 ~/soft]# systemctl daemon-reload [root@192.168.100.142 ~/soft]# systemctl start elasticsearch [root@192.168.100.142 ~/soft]# systemctl enable elasticsearch
注意下图这个提示是要求重新加载一下systemctl,否则修改配置文件重启时会报错
2.3.验证是否启动elasticsearch
#1.curl方式,目前只能通过127.0.0.1访问,因为配置文件中已经写死 [root@192.168.100.142 ~/soft]# curl 127.0.0.1:9200 { "name" : "dghGCtD", "cluster_name" : "elasticsearch", "cluster_uuid" : "BuEV6sgjQsKLYp85_J2Jxg", "version" : { "number" : "6.6.0", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "a9861f4", "build_date" : "2019-01-24T11:27:09.439740Z", "build_snapshot" : false, "lucene_version" : "7.6.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" } #2.查看端口和进程 [root@192.168.100.142 ~/soft]# netstat -lnpt | grep 9200 tcp6 0 0 127.0.0.1:9200 :::* LISTEN 2974/java tcp6 0 0 ::1:9200 :::* LISTEN 2974/java [root@192.168.100.142 ~/soft]# lsof -i:9200 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 2974 elasticsearch 205u IPv6 40280 0t0 TCP localhost:wap-wsp (LISTEN) java 2974 elasticsearch 207u IPv6 39770 0t0 TCP localhost:wap-wsp (LISTEN) [root@192.168.100.142 ~/soft]# ps aux | grep elasticsearch elastic+ 2974 1.3 34.2 3690328 1323516 ? Ssl 11:38 1:32 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupan cyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+Alw aysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-Om itStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio .netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable. jmx=true -Djava.io.tmpdir=/tmp/elasticsearch-3798624426712404376 -XX:+HeapDumpOnOutOfMemor yError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err _pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+ PrintGCApplicationStoppedTime -Xloggc:/var/log/elasticsearch/gc.log -XX:+UseGCLogFileRotat ion -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/usr/share/elasticsearc h -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.typ e=rpm -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var /run/elasticsearch/elasticsearch.pid --quiet elastic+ 3116 0.0 0.1 72140 5108 ? Sl 11:38 0:00 /usr/share/elasticsearc /modules/x-pack-ml/platform/linux-x86_64/bin/controller root 4423 0.0 0.0 112728 980 pts/0 S+ 13:31 0:00 grep --color=auto elasti csearch
\
2.4.elasticsearch配置文件介绍
#rpm -qc 服务 查看服务的安装路径 [root@192.168.100.142 ~/soft]# rpm -qc elasticsearch /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/jvm.options /etc/elasticsearch/log4j2.properties /etc/elasticsearch/role_mapping.yml /etc/elasticsearch/roles.yml /etc/elasticsearch/users /etc/elasticsearch/users_roles /etc/init.d/elasticsearch /etc/sysconfig/elasticsearch /usr/lib/sysctl.d/elasticsearch.conf /usr/lib/systemd/system/elasticsearch.service
\
| 文件 | 作用 |
|---|---|
| /etc/elasticsearch/elasticsearch.yml | 主配置文件 |
| /etc/elasticsearch/jvm.options | jvm 内存调优文件 |
| /etc/init.d/elasticsearch | init启动脚本 |
| /etc/sysconfig/elasticsearch | 环境变量相关,不需要改动 |
| /usr/lib/sysctl.d/elasticsearch.conf | 环境变量相关 |
| /usr/lib/systemd/system/elasticsearch.service | systemctl启动脚本 |
2.5.elasticsearch调优
2.5.1.jvm调优
配置文件路径/etc/elasticsearch/jvm.options 主要修改: -Xms1g //最小内存 -Xmx1g //最大内存 最大最小设置成一样的 elasticsearch特别费系统内存,因此这个配置文件调优是必做的,一般调优方式就是一半的系统内存给elasticsearch使用,但是切记不要超过30G,30G以后 性能不会再提升反而会下降有一点,假如系统内存就30G如何分配,首先给8G内存,等用一段时间后觉得不够用在调整到到16G,在不够用24G,24G以后就不要在 使用了,因为要给系统留一部分内存在生产环境时可以把数据拷贝到测试环境具体测试用多少内存比较合适
\
[root@192.168.100.142 ~/soft]# vim /etc/elasticsearch/jvm.options -Xms1g -Xmx1g
\
2.5.2.swap调优
官方建议关掉swap交换分区(关掉swap交换分区,可以防止数据一直在交换,导致iOPS变高)
[root@192.168.100.142 ~/soft]# free -h total used free shared buff/cache available Mem: 3.7G 2.0G 837M 25M 919M 1.5G Swap: 2.0G 0B 2.0G [root@192.168.100.142 ~/soft]# swapoff -a [root@192.168.100.142 ~/soft]# free -h total used free shared buff/cache available Mem: 3.7G 2.0G 838M 25M 919M 1.5G Swap: 0B 0B 0B #永久关闭 [root@192.168.100.142 ~/soft]# vim /etc/fstab /dev/mapper/centos-swap swap swap defaults 0 0 #把这一行给删掉即可
2.6.配置elasticsearch
\
配置文件最主要的配置
| 配置 | 含义 |
|---|---|
| node.name: node-1 | 节点名称,集群模式的时候使用 |
| path.data: /data/elasticsearch | 数据存储路径 |
| path.logs: /var/log/elasticsearch | 日志存储路径 |
| bootstrap.memory_lock: true | 锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区,频繁的交换,会导致IOPS变高,简单来说就是锁定物理内存,让jvm配置的内存生效 |
| network.host: 192.168.81.240 | 主机IP |
| http.port: 9200 | 端口 |
\
#1.修改主配置文件 [root@192.168.100.142 ~/soft]# vim /etc/elasticsearch/elasticsearch.yml cluster.name: es-application node.name: node-1 path.data: /data/elasticsearch path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 192.168.100.142 http.port: 9200 #2.创建数据路径并授权 [root@192.168.100.142 ~]# mkdir -p /data/elasticsearch [root@192.168.100.142 ~]# chown -R elasticsearch:elasticsearch /data/elasticsearch/ 修改属主的理由,因为elasticsearch是由普通用户管理的,因此需要修改属主 默认路径就是这个用户 [root@192.168.100.142 ~]# ll -d /var/lib/elasticsearch/ drwxr-x---. 3 elasticsearch elasticsearch 19 3月 17 11:31 /var/lib/elasticsearch/ #3.重启elasticsearch [root@192.168.100.142 ~]# systemctl restart elasticsearch.service 这里会报错,报错解决查看2.7
\
2.7.elasticsearch故障排查
2.7.1.memory is not locked
报错内容如下 memory locking requested for elasticsearch process but memory is not locked 这个是由于我们配置bootstrap.memory_lock: true这个参数的导致的,为了锁定物理内存使jvm配置的内存生效,解决方案可以参考官方文档
\
[root@192.168.100.142 ~]# tail -f /var/log/elasticsearch/elasticsearch.log [2021-03-17T11:31:24,659][INFO ][o.e.c.m.MetaDataIndexTemplateService] [dghGCtD] adding template [.monitoring-alerts] for index patterns [.monitoring-alerts-6] [2021-03-17T11:31:24,685][INFO ][o.e.c.m.MetaDataIndexTemplateService] [dghGCtD] adding template [.monitoring-kibana] for index patterns [.monitoring-kibana-6-*] [2021-03-17T11:31:24,788][INFO ][o.e.l.LicenseService ] [dghGCtD] license [a9b67889-50fa-4fae-a0ae-f7545d3a6f6c] mode [basic] - valid [2021-03-17T13:51:29,133][INFO ][o.e.n.Node ] [dghGCtD] stopping ... [2021-03-17T13:51:29,153][INFO ][o.e.x.w.WatcherService ] [dghGCtD] stopping watch service, reason [shutdown initiated] [2021-03-17T13:51:29,279][INFO ][o.e.x.m.p.l.CppLogMessageHandler] [dghGCtD] [controller/3116] [Main.cc@148] Ml controller exiting [2021-03-17T13:51:29,289][INFO ][o.e.x.m.p.NativeController] [dghGCtD] Native controller process has stopped - no new native processes can be started [2021-03-17T13:51:29,301][INFO ][o.e.n.Node ] [dghGCtD] stopped [2021-03-17T13:51:29,301][INFO ][o.e.n.Node ] [dghGCtD] closing ... [2021-03-17T13:51:29,387][INFO ][o.e.n.Node ] [dghGCtD] closed
\
解决方法
[root@192.168.100.142 ~]# mkdir /etc/systemd/system/elasticsearch.service.d/ [root@192.168.100.142 ~]# vim /etc/systemd/system/elasticsearch.service.d/override.conf [Service] LimitMEMLOCK=infinity #重启 [root@192.168.100.142 ~]# systemctl daemon-reload [root@192.168.100.142 ~]# systemctl restart elasticsearch #访问 [root@192.168.100.142 ~]# curl 192.168.100.142:9200 { "name" : "node-1", "cluster_name" : "es-application", "cluster_uuid" : "Eh6K_jd7RbCnei_-7SH1sQ", "version" : { "number" : "6.6.0", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "a9861f4", "build_date" : "2019-01-24T11:27:09.439740Z", "build_snapshot" : false, "lucene_version" : "7.6.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
\
2.7.2.内存不足导致启动失败
报错如下 11月 15 10:19:44 elastic elasticsearch[34005]: OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you sho...Threads=N
\
这个报错就是内存不足了,可以重新调整一下jvm内存或者增加物理内存即可解决此问题 我的物理内存是2G 我的jvm配置如下
\
[root@elastic ~]# vim /etc/elasticsearch/jvm.options -Xms512m -Xmx512m 重启即可
\
2.8.报错总结
- 配置文件没有任何修改
- 配置文件没有修改ip地址
- 系统内存只有1个G,启动失败
- 配置文件参数拼写错误,启动失败
- 没有修改内存锁定,启动失败
\
3.elasticsearch术语及概念
- 索引词
-
- 在elasticsearch中索引词是一个能够被索引的精确值,foo,FOO,Foo几个单词是不同的索引词,索引词是可以通过term查询进行准确的搜索
- 文本
-
- 文本是一段普通的非结构化文字,通常文本会被拆成一个个的索引词,存储在elasticsearch的索引库中,为了让文本能够进行搜索,文本字段需要事先进行分析,当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文件
- 分析
-
- 分析是将文本转换成索引词的过程,分析的结果依赖于分词器,比如FOOBaR,Foo-Bar和foobar都可能会被分析成相同的索引词foo和bar,这些索引词存储在elasticsearch的索引库中
- 集群
-
- 集群是由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能,在所有节点,一个集群有一个唯一的名称默认为elasticsearch,此名称很重要,因为每一个节点只能是集群的一部分,当该节点被设置为相同的集群名称中,就会自动加入集群,当需要有多个集群的时候,需要确保每个集群的名称不能重复发,否则节点可能加入错误的集群,一个节点只能添加一个集群
- 节点
-
- 一个节点是一个逻辑上独立的服务,它是集群的一个部分,可以存储数据,并参数与集群的索引和搜索功能,就像集群一样,节点也有唯一的名字,在启动的时候分配,如果你不想要默认名称,你可以定义任何你想要的节点名,这个名字在集群中很重要,在elasticsearch集群中通过节点名称进行管理和通信,一个节点可以被配置加入到一个特定的集群,默认情况下,每个节点会加入一个名称elasticsearch的集群中
- 分片
-
- 分片就是把一份数据分散的存储到不同的节点上
- 分片是单个Lucene实例,这是elasticsearch管理的比较底层的功能,索引是指向主分片和副本分片的逻辑空间,对于使用,只需要指定分片的数量,其他不需要做过多的事情,在开发使用的过程中,我们对应的对象都是索引,elasticsearch会自动管理集群中的所有分片,当发生故障的时候elasticsearch会把分片移动到不同的节点或者添加新节点
- 一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储限制,elasticsearch可以将索引分解成多个分片,当你创建一个索引,你可以简单地定义你想要的分片数量,每个分片本身都是一个全功能的、独立的单元
- 副本分片
-
- 每一个分片有零个或多个副本,副本主要是分片的复制。有两个目的,一是增加高可用性,当主分片失败的是,可以从副本分片中选择一个作为主分片,二是提高性能,当查询的时候可以到住分片或者副本分片中查询
- 分片允许水平分割扩展数据
- 分片允许分配合并行操作,从而提高性能和吞吐量
- 索引
-
- 索引是具有相同结构的文档集合,类似于数据库中的库
- 类型
-
- 在索引中,可以定义一个或多个类型,类型是索引的逻辑分区,在一般情况下,一种类型被定义为具有一组公共字段的文档,例如运行一个博客,可以把所有的数据存储在一个索引中,在这个索引中,可以定义一类是用户数据,一类是博客数据,一类是评论数据,类似于数据库中的表
- 文档
-
- 文档是存储在elasticsearch中的一个json格式的字符串,它就像在关系数据库中表的一行,每个存储在索引中的一个文档都有一个类型和一个ID,每个文档搜狐一个json对象,类似于数据库中的行
- 映射
-
- 映射就像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型以及一个索引范围内的设置
- 字段
-
- 文档中包含零个或多个字段
- 主键
-
- ID是一个文件的唯一表示,如果在存库的时候没有提供ID,系统会自动生成一个ID
- 复制
-
- 复制是一个非常有用的功能,不然会有单点问题,当网络中的某个节点出现问题的时候,复制可以对故障进行转移,保证系统的高可用
\
\
\
\
\
\
\
\
\
\
\