学习目标
(文章摘自乐字节)
Elasticsearch简介与安装
什么是Elasticsearch?
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
Lucene与Elasticsearch关系?
Lucene不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:
-
分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
-
实时分析的分布式搜索引擎。
-
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流。
Elasticsearch的上手是非常简单的。它附带了很多非常合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,
它安装好了就可以使用了,用很小的学习成本就可以变得很有生产力。
随着越学越深入,还可以利用Elasticsearch更多高级的功能,整个引擎可以很灵活地进行配置。可以根据自身需求来定制属于自己的Elasticsearch。
Elasticsearch与Solr对比
优缺点
Elasticsearch
优点
-
Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
-
Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
-
处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
-
Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
-
各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。
缺点
- 还不够自动(不适合当前新的Index Warmup API,即冷启动/预热数据的方式。当系统长期处于低水位的情况下,流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。)
Solr
简介
Solr是Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4 还增加了NoSQL支持。
Solr是用Java编写、运行在Servlet容器(如 Apache Tomcat 或Jetty)的一个独立的全文搜索服务器。 Solr采用了 Lucene Java 搜索库为核心的全文索引和搜索,并具有类似REST的HTTP/XML和JSON的API。Solr强大的外部配置功能使得无需进行Java编码,便可对 其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。
2010年 Apache Lucene 和 Apache Solr 项目合并,两个项目是由同一个Apache软件基金会开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。
现实生活中我们都知道大多数网站或应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。
这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr是一个独立的**企业级搜索应用服务器,**它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。它通过使用类似REST的HTTP API,确保你能从几乎任何编程语言来使用Solr。
优点
-
Solr有一个更大、更成熟的用户、开发和贡献者社区。
-
支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
-
Solr比较成熟、稳定。
-
不考虑建索引的同时进行搜索,速度更快。
缺点
- 建立索引时,搜索效率下降,实时索引搜索效率不高。
性能
当单纯的对已有数据进行搜索时,Solr更快。
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。
综上所述,Solr的架构不适合实时搜索的应用。
实际生产环境测试
下图为将搜索引擎从Solr转到Elasticsearch以后的平均查询速度有了50倍的提升。
热度
结果如下:
Elasticsearch与关系型数据库对比
-
一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(ES7中已作废),类型中包含了很多文档(行),每个文档又包含了很多字段(列)。
-
传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。
-
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。
Elasticsearch部署与启动
下载
安装
单机版
将文件上传至服务器
创建 es 目录
mkdir -p /usr/local/elasticsearch/es1
解压文件至 es 目录
tar -zxvf elasticsearch-7.4.2-linux-x86_64.tar.gz -C /usr/local/elasticsearch/es1/
启动,报错
cd /usr/local/elasticsearch/es1/elasticsearch-7.4.2/
bin/elasticsearch
错误1
future versions of Elasticsearch will require Java 11; your Java version from
[/usr/local/java/jdk1.8.0_231/jre] does not meet this requirement
ES 7.4.2需要JDK11,如果电脑安装了过低的JDK版本,会提示如下信息,ES 为了方便用户使用,自己集成了OpenJDK,但是如果系统环境变量中有JDK会优先使用环境变量中的JDK。所以我们如果既想使用自己的JDK版本又想使用ES 7 版本需要修改 ES 配置文件。
解决:
修改配置文件 elasticsearch-env
vim bin/elasticsearch-env
在文件首行添加如下信息
JAVA_HOME="/usr/local/elasticsearch/es1/elasticsearch-7.4.2/jdk/"
错误2
java.lang.RuntimeException: can not run elasticsearch as root
因为当前是 root 用户,es 默认不允许 root 用户操作。
解决:
创建 es 用户组和 es 用户,并将其添加到用户组 es 中
groupadd es
useradd es -g es
更改 es 文件夹及内部文件的所属用户及组为 es:es
chown -Rf es:es /usr/local/elasticsearch/
切换到 es 用户再次启动
su es
bin/elasticsearch
Elasticsearch的对外服务端口默认是9200,客户端访问是9300。通过启动日志信息可以看到四个警告信息。记住它们,因为一会将会变为错误信息,我们需要对他们做出处理。
[2019-12-02T10:18:37,235][WARN ][o.e.b.BootstrapChecks ] [localhost.localdomain] max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2019-12-02T10:18:37,240][WARN ][o.e.b.BootstrapChecks ] [localhost.localdomain] max number of threads [3795] for user [es] is too low, increase to at least [4096]
[2019-12-02T10:18:37,244][WARN ][o.e.b.BootstrapChecks ] [localhost.localdomain] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2019-12-02T10:18:37,247][WARN ][o.e.b.BootstrapChecks ] [localhost.localdomain] the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
ElasticSearch后端启动命令
bin/elasticsearch -d
在本机通过curl命令
[es@localhost root]$ curl http://127.0.0.1:9200
{
"name" : "localhost.localdomain",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "2I3zMPlQTV2c2_HWCJf5cQ",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
如果需要远程访问,还需要以下步骤
修改config/elasticsearch.yml
文件
vi config/elasticsearch.yml
实际生产环境请添加允许访问的IP,学习时使用0.0.0.0放行所有IP
network.host: 0.0.0.0
切换至root用户添加防火墙规则,重启防火墙,学习时直接关闭防火墙
su root
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT
systemctl restart iptables.service
切换es用户重启elasticsearch,重启之前先查询es进程然后杀死进程
kill -9 进程号
bin/elasticsearch -d
访问,报错
ERROR: [4] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max number of threads [3795] for user [es] is too low, increase to at least [4096]
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[4]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
错误1:Elasticsearch进程的最大文件描述符[4096]太低,请至少增加到[65535]
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/vm-max-map-count.html
错误2 :用户[es]可以创建的最大线程数[3795]太低,请至少增加到[4096]
解决
vi /etc/security/limits.conf
在文件末尾添加如下信息
es soft nofile 65535
es hard nofile 65535
es soft nproc 4096
es hard nproc 4096
错误3:最大虚拟内存区域vm.max_map_count[65530]太低,请至少增加到[262144]
解决
vi /etc/sysctl.conf
在文件末尾添加如下信息
vm.max_map_count = 262144
重新加载虚拟内存配置
sysctl -p
错误4:当前配置不适合生产环境使用;必须至少配置[discovery.seed_hosts,discovery.seed_providers,cluster.initial_master_nodes]
之一
discovery.seed_hosts
:集群发现配置,提供集群中符合主机要求的节点的列表. 每个值的格式为host:port
或host
,其中port
默认为设置transport.profiles.default.port
discovery.seed_providers
:以文件的方式提供主机列表,可以动态修改,而不用重启节点(容器化环境适用)
cluster.initial_master_nodes
:指定可以成为 master
的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算
过时配置 | 新配置 |
---|---|
discovery.zen.ping.unicast.hosts | discovery.seed_hosts |
discovery.zen.hosts_provider | discovery.seed_providers |
无 | cluster.initial_master_nodes(7新添加) |
解决:
vi config/elasticsearch.yml
在文件末尾添加如下信息
discovery.seed_hosts: ["192.168.10.100"]
cluster.initial_master_nodes: ["192.168.10.100"]
重启,访问
ES已经可以正常访问了,但是我们在每次启动时都会看到一个警告信息
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
这是提醒你 CMS
垃圾收集器在 JDK 9 就开始被标注为@Deprecated
,JDK 11支持的垃圾回收器为G1
和ZGC
,而ZGC
在JDK 11 还处于实验阶段。
参考资料:
修改config/jvm.options
配置文件
vi config/jvm.options
将:-XX:+UseConcMarkSweepGC
改为:-XX:+UseG1GC
以后启动将不再有警告信息。
集群版
Elasticsearch天生就是为分布式而生的搜索引擎,我们搭建一下集群环境
注意:不要使用刚才的单机版,重新解压一份新的ES搭建,因为刚才的单机版ES已经运行过会生成一些默认配置如果在其之上继续搭建可能会导致ES无法组成集群环境。
修改config/elasticsearch.yml
vi config/elasticsearch.yml
cluster.name: es # 集群名称,同一集群要一致
node.name: node-1 # 集群下各节点名称
http.port: 9200 # 端口
# 跨域请求配置(为了让类似head的第三方插件可以请求es)
http.cors.enabled: true
http.cors.allow-origin: "*"
# 集群发现配置
discovery.seed_hosts: ["192.168.10.100", "192.168.10.100", "192.168.10.100"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
discovery.zen.ping_timeout: 60s
注意:如果设置了node.name
需要将cluster.initial_master_nodes
改为对应节点名称。
切换至root用户,将刚才的es1目录复制两份分别为es2、es3
su root
cd /usr/local/elasticsearch
cp -Rf es1/ es2
cp -Rf es1/ es3
更改es文件夹及内部文件的所属用户及组为es:es
chown -Rf es:es es2/
chown -Rf es:es es3/
切换至es用户,修改es2的config/elasticsearch.yml
cluster.name: es # 集群名称,同一集群要一致
node.name: node-2 # 集群下各节点名称
http.port: 9201 # 端口
切换至es用户,修改es3的config/elasticsearch.yml
cluster.name: es # 集群名称,同一集群要一致
node.name: node-3 # 集群下各节点名称
http.port: 9202 # 端口
添加防火墙规则并重启防火墙,学习时关闭防火墙
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9201 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9202 -j ACCEPT
systemctl restart iptables.service
前台启动两台es服务器
/usr/local/elasticsearch/es1/elasticsearch-7.4.2/bin/elasticsearch
/usr/local/elasticsearch/es2/elasticsearch-7.4.2/bin/elasticsearch
先启动node-1和node-2,我们还有一个知识点需要讲解了以后再启动node-3效果会更好。
“status”: “red”
表示集群环境不ok,“status”: “green”
表示集群环境ok
- green:最健康得状态,说明所有的分片包括备份都可用
- yellow:基本的分片可用,但是备份不可用(或者是没有备份)
- red:部分的分片可用,表明分片有一部分损坏。此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好
提示:如果虚拟机1 G 1 CPU,这时候就算你启动node-3也会报错
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Not enough space' (errno=12)
at org.elasticsearch.tools.launchers.JvmErgonomics.flagsFinal(JvmErgonomics.java:111)
at org.elasticsearch.tools.launchers.JvmErgonomics.finalJvmOptions(JvmErgonomics.java:79)
at org.elasticsearch.tools.launchers.JvmErgonomics.choose(JvmErgonomics.java:57)
at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:89)
错误信息的意思就是默认分配的 jvm 空间大小不足,无法启动。
修改每个节点下的config/jvm.options
配置文件
vi config/jvm.options
将默认大小1g改为512m,注意着点别改成512g了。
-Xms512m
-Xmx512m
Elasticsearch插件安装
可视化工具
在学习和使用Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。
以下插件三选一即可,不需要都安装。
head
在学习和使用Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。head可以完美帮我们快速学习和使用es。
head 插件在ES 5版本以前开箱即用非常简单,ES 5版本以后需要运行在node环境下,所以我们要先准备一下环境。
安装
- 安装Git
yum -y install git
- 安装Node
根据自己的需求下载对应的版本
将文件上传至服务器并解压
mkdir -p /usr/local/nodejs
tar -xvf node-v12.13.1-linux-x64.tar.xz -C /usr/local/nodejs/
配置环境变量
配置环境变量
export NODE_HOME=/usr/local/nodejs/node-v12.13.1-linux-x64
export PATH=$PATH:$NODE_HOME/bin
查看版本
node -v
(文章摘自乐字节)