ElasticSearch 基础知识点与安装部署
1.ES是什么
ElasticSearch,简称ES,是一个开源的、高扩展的、分布式全文搜索引擎,
是整个ElasticStack技术栈的核心,它可以近乎实时的存储、检索数据。
它具有非常优秀的扩展性,可以扩展到上百台服务器,处理PB级别的数据。
一句话总结:是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。
2.全文索引
Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差
的:
- 搜索的数据对象是大量的非结构化的文本数据。
- 文件记录量达到数十万或数百万个甚至更多。
- 支持大量基于交互式文本的查询。
- 需求非常灵活的全文搜索查询。
- 对高度相关的搜索结果但有特殊需求,但是没有可用的关系数据库可以满足。
- 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。
为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎,全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
3.Lucene
Lucene 是 Apache 软件基金会 Jakarta 项目组的一个子项目,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在 Java 开发环境里 Lucene 是一个成熟的免费开源工具。就其本身而言,Lucene 是当前以及最近几年最受欢迎的免费 Java 信息检索程序库。但 Lucene 只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。
目前市面上主流的两款搜索引擎软件:Elasticsearch 和 Solr,
这两款都是基于 Lucene 搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作 修改、添加、保存、查询等等都十分类似。
4.ES和Solr
Elasticsearch 和 Solr 都是开源搜索引擎,那么我们在使用时该如何选择呢?
- 根据Google搜索趋势结果表明,与 Solr 相比,Elasticsearch 具有很大的吸引力,但这并不
意味着 Apache Solr 已经死亡。虽然有些人可能不这么认为,但 Solr 仍然是最受欢迎的搜索引擎之一,它拥有强大的社区和开源支持。 - 与 Solr 相比,Elasticsearch 易于安装且非常轻巧,你可以在几分钟内安装并运行Elasticsearch。但是,如果 Elasticsearch 管理不当,这种易于部署和使用可能会成为一个问题。基于 JSON 的配置很简单,但如果要为文件中的每个配置指定注释,那么它不适合您。总的来说,如果你的应用使用的是JSON,那么 Elasticsearch 是一个更好的选择。否则,请使用 Solr,因为它的 schema.xml 和 solrconfig.xml 都有很好的文档记录。
- Solr 拥有更大,更成熟的用户,开发者和贡献者社区。ES 虽拥有的规模较小但活跃的用户社区以及不断增长的贡献者社区。
- Solr 更成熟,但 ES 增长迅速,更稳定。
- Solr 是一个非常有据可查的产品,具有清晰的示例和 API 用例场景。 Elasticsearch 的文档组织良好,但它缺乏好的示例和清晰的配置说明。
- Elasticsearch 在开源日志管理用例中占据主导地位,许多组织在 Elasticsearch 中索引它们的日志以使其可搜索。
特征 | Solr/SolrCloud | ElasticSearch |
---|---|---|
社区和开发者 | Apache软件基金和社区支持 | 单一商业实体及员工 |
节点发现 | zookeeper,在大量项目中成熟且经过实战实测 | Zen内置与ES本身,需要专用的主节点才能进行分裂脑保护 |
碎片放置 | 本质上是静态,需要手动工作来迁移分片,从Solr7开始Autoscaling API允许一些动态操作 | 动态,可以根据集群状态按需一栋分片 |
高速缓存 | 全局,每个段更改无效 | 每段,更适合动态更改数据 |
分析引擎性能 | 非常适合精确计算的静态数据 | 结果的准确性取决于数据放置 |
全文搜索功能 | 基于Lucene的语言分析,多建议,拼写检查,丰富的高亮显示支持 | 基于Lucene的语言分析,单一建议API实现,高亮显示,重新计算 |
DevOps支持 | 尚未完全,但即将到来 | 非常好的API |
非平面数据处理 | 嵌套文档和父-子支持 | 嵌套和对象类型的自然支持允许几乎无限的嵌套和父-子支持 |
查询DSL | JSON(有限),XML(有限) 或URL参数 | JOSN |
索引/收集领导控制 | 领导者安置控制和领导者重新平衡甚至可以节点上的负载 | 不可能 |
机器学习 | 内置-在流聚合之上,专注于逻辑回归和学习排名贡献模块 | 商业功能,专注于异常值以及时间顺序数据 |
5.ES应用案例
- GitHub:2013年初,抛弃了Solr,采取ES来做PB级别的搜索,GitHub使用ES搜索20TB的数据,包括13亿文件和1300亿行代码。
- 百度:目前广泛使用ES作为文本数据分析,采集百度所有服务器上的各类指标及用户自定义数据,通过各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括:云分析,网盟,预测,百度文库,直达号,钱包,风控等等)
- 新浪:使用ES分析处理32亿条实时日志
- 阿里:使用ES构建日志采集和分析体系
- Stack Overflow:解决Bug问题的网站,全英文,编程人员交流的网站
6.ES安装部署
ES官网:https://www.elastic.co/cn
截止2022年3月27日,ES最新版本8.1.1。本文使用的版本为7.15.2
6.1 windows单点
windows版的ES安装非常简单,解压即安装完毕,解压后的ES的目录结构如下:
目录 | 含义 |
---|---|
bin | 可执行脚本目录 |
config | 配置目录 |
jdk | 内置JDK目录 |
lib | 类库 |
logs | 日志目录 |
modules | 模块目录 |
plugins | 插件目录 |
解压完成后进入bin目录,点击elasticsearch.bat即可启动ES服务
**注意:**9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的
Elasticsearch 是使用 java 开发的,且 7.8 版本的 ES 需要 JDK 版本 1.8 以上,默认安装包带有 jdk 环境,如果系统配置 JAVA_HOME,那么使用系统默认的 JDK,如果没有配置使用自带的 JDK,一般建议使用系统配置的 JDK。
ES默认JVM初始内存配置为4G,根据电脑/服务器配置自行修改config/jvm.options
-Xms1g
-Xmx1g
6.2 Linux单机
Linux单点服务与windows基本一直,进入bin目录,运行./elasticsearch脚本即可启动
注意:
因为安全问题,Elasticsearch 不允许 root 用户直接运行,所以要创建新用户,在 root 用户中创建新用户
useradd es #新增 es 用户
passwd es #为 es 用户设置密码
userdel -r es #如果错了,可以删除再加
chown -R es:es /opt/module/es #文件夹所有者
6.3 Linux集群
准备好ES包和es用户后
更改配置文件
修改/config/elasticsearch.yml 文件
# 加入如下配置
#集群名称
cluster.name: cluster-es
#节点名称,每个节点的名称不能重复
node.name: node-1
#ip 地址,每个节点的地址不能重复
network.host: hadoop102
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["hadoop102:9300","hadoop103:9300","hadoop104:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
修改Linux:/etc/security/limits.conf
es soft nofile 65536
es hard nofile 65536
修改Linux:/etc/security/limits.d/20-nproc.conf,分发文件
# 在文件末尾中增加下面内容
es soft nofile 65536
es hard nofile 65536
* hard nproc 4096
# 注:* 带表 Linux 所有用户名称
修改Linux:/etc/sysctl.conf
vm.max_map_count=655360
重新加载:
sysctl -p
分别在不同节点服务器上启动ES
#启动
bin/elasticsearch
#后台启动
bin/elasticsearch -d
启动完成后,验证:
也可使用Google浏览器插件:ElasticSearch Head
标星号的node-1即为配置的主节点master
提问:当手动杀掉node-1ES进程,集群会怎样?全挂还是推举出新的主节点?
如图:当结束掉主节点的进程,集群会重新推选出新的主节点,此时变成node-3成为主节点,集群健康值已变成yellow。并且此时访问的是hadoop103。主节点hadoop102已访问不通。
6.4 知识关联:集群分发脚本
当服务是集群方式部署时,我们只需改动一个服务器的配置文件,再执行脚本分发,即可将改动的配置文件同步至所有集群内的服务器中:详细可见文章大数据笔记(四)-Hadoop集群脚本分发和群起
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=102; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done