【Elasticsearch系列十四】Elasticsearch

2024-09-20 22:55:32 浏览数 (1)

1.什么是 Elasticsearch

ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。

官网地址

2.Elasticsearch 的功能

  • 分布式的搜索引擎和数据分析引擎
  • 搜索:互联网搜索、电商网站站内搜索、OA 系统查询
  • 数据分析:电商网站查询近一周哪些品类的图书销售前十;新闻网站,最近 3 天阅读量最高的十个关键词,舆情分析。
  • 全文检索,结构化检索,数据分析
    • 全文检索:搜索商品名称包含 java 的图书 select *from books where book_name like"%java%".
    • 结构化检索:搜索商品分类为 spring 的图书都有哪些,selectfrom books where category_id='spring'
    • 数据分析:分析每一个分类下有多少种图书,select category_id,count(*) from books group by category_id
  • 海量数据进行近实时的处理
    • 分布式:ES 自动可以将海量数据分散到多台服务器上去存储和检索,经行并行查询,提高搜索效率。相对的,Lucene 是单机应用。
    • 近实时:数据库上亿条数据查询,搜索一次耗时几个小时,是批处理(batch-processing)。而 es 只需秒级即可查询海量数据,所以叫近实时。秒级。

3.Elasticsearch 的使用场景

  • 维基百科,类似百度百科,“网络七层协议”的维基百科,全文检索,高亮,搜索推荐
  • Stack Overflow(国外的程序讨论论坛),相当于程序员的贴吧。遇到 it 问题去上面发帖,热心网友下面回帖解答。
  • GitHub《开源代码管理),搜索上千亿行代码。
  • 电商网站,检索商品
  • 日志数据分析,logstash 采集日志,ES 进行复杂的数据分析(ELK 技术,elasticsearch logstash kibana )
  • 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅《java 编程思想》的监控,如果价格低于 27 块钱,就通知我,我就去买。
  • BI 系统,商业智能(Business lntelligence)。大型连锁超市,分析全国网点传回的数据,分析各个商品在什么季节的销售量最好、利润最高。成本管理,店面租金、员工工资、负债等信息进行分析。从而部署下一个阶段的战略目标。
  • 百度搜索,第一次查询,使用 es。OA、ERP 系统站内搜索。

4.Elasticsearch 的特点

  • 可拓展性:大型分布式集群(数百台服务器)技术,处理 PB 级数据,大公司可以使用。小公司数据量小,也可以部署在单机。大数据领域使用广泛。
  • 技术整合:将全文检索、数据分析、分布式相关披术整合在一起:lucene(全文检索),商用的数据分析软件(BI 软件),分布式数据库(mycat)
  • 部署简单:开箱即用,很多默认配置不需关心,解压完成直接运行即可。拓展时,只需多部署几个实例即可,负载均衡、分片迁移集群内部自己实施。
  • 接口简单:使用 restful api 经行交互,跨语言。
  • 功能强大:Elasticsearch 作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能,如全文检索,同义词处理,相关度排名。

5.lucene 和 elasticsearch 的关系

Lucene:最先进功能最强大的搜索库,直接基于 lucene 开发,非常复杂,api 复杂.

Elasticsearch:基于 lucene,封装了许多 lucene 底层功能,提供简单易用的 restful api 接口和许多语言的客户端,如 java 的高级客户端(Java Hijgh Level REST Client)和底层客户端(Java Low Level REST Client)

6.Elasticsearch 核心概念

NRT(Near Realtime):近实时

  • 写入数据时,过 1 秒才会被搜索到,因为内部在分词、录入索引。
  • es 搜索时:搜索和分析数据需要秒级出结果。

Cluster:集群

包含一个或多个启动着 es 实例的机器群。通常一台机器起一个 es 实例。同一网络下,集名一样的多个 es 实例自动组成集群,自动均衡分片等行为。默认集群名为"elasticsearch"。

Node:节点

每个 es 实例称为一个节点。节点名自动分配,也可以手动配置。

Document:文档

es 中的最小数据单元。一个 document 就像数据库中的一条记录。通常以 json 格式显示。多个 document 存储于一个索引(Index)中。

Index:索引

包含一堆有相似结构的文档数据。

索引创建规则:

  • 仅限小写字母
  • 不能包含、/、*、?、”、<、>、|、#以及空格符等特殊符号
  • 从 7.0 版本开始不再包含冒号
  • 不能以、或 开头或者_下划线开头
  • 不能超过 255 个字节

Field:字段

就像数据库中的列(Columns),定义每个 document 应该有的字段。

Type:类型

每个索引里都可以有一个或多个 type,type 是 index 中的一个逻辑数据分类,type 下的 document.都有相同的 field.

注意:6.0 之前的版本有 type(类型)概念,type 相当于关系数据库的表,ES 官方将在 ES9.0 版本中彻底删除 type。

shard:分片

index 数据过大时,将 index 里面的数据,分为多个 shard,分布式的存储在各个服务器上面。可以支持海量数据和高并发,提升性能和吞吐量,充分利用多台机器的 cpu。

replica:副本

在分布式环境下,任何一台机器都会随时宕机,如果宕机,index 的一个分片没有,导致此 index 不能搜索。所以,为了保证数据的安全,我们会将每个 index 的分片经行备份,存储在另外的机器上。保证少数机器宕机 es 集群仍可以搜索。

能正常提供查询和插入的分片我们叫做主分片(primary shard),其余的我们就管他们叫做备份的分片(replica shard)。

es6 默认新建索引时,5 分片,1 副本,也就是一主一备,共 10 个分片。所以,es 集群最小规模为两台。es7 1 分片,1 副本,一共 2 分片。

7.核心概念对比

关系型数据库 mysql

非关系型数据库 Elasticsearch

数据库 Database

索引 Index

表 Table

索引 Index(原为 Type)

数据行 Row

文档 Document

数据列 Column

字段 Field

约束 Schema

映射 Mapping

8.文档数据格式

  1. 应用系统的数据结构都是面向对象的,具有复杂的数据结构。
  2. 对象存储到数据库,需要将关联的复杂对象属性插到另一张表,查询时再拼接起来。
  3. es 面向文档,文档中存储的数据结构,与对象一致。所以一个对象可以直接存成一个文档。
  4. es 的 documentjson 数据格式来表达。

而在 es 中,一个学生存成文档如下:

代码语言:json复制
{
  "id": "1",
  "name": "张三",
  "last_name": "zhang",
  "classInfo": {
    "id": "1",
    "className": "三年二班"
  }
}

9.悲观锁乐观锁

为控制并发问题,我们通常采用锁机制。分为悲观锁和乐观锁两种机制。

  • 悲观锁:很悲观,所有情况都上锁。此时只有一个线程可以操作数据。具体例子为数据库中的行级锁、表级锁、读锁、写锁等。
  • 悲观锁特点:优点是方便,直接加锁,对程序透明。缺点是效率低。
  • 乐观锁:很乐观,对数据本身不加锁。提交数据时,通过一种机制验证是否存在冲突,如 es 中通过版本号验证。
  • 乐观锁特点:优点是并发能力高。缺点是操作繁琐,在提交数据时,可能反复重试多次。

10.ES 并发控制

基于_version 的版本控制,es 对于文档的增删改都是基于版本号

代码语言:apl复制
PUT /book/_doc/2
{
    "id":1,
    "title":"这是一11文章",
    "content":"xxxxx",
    "comment":"备注信息",
    "mobile":"13344556677"
}
代码语言:json复制
{
  "_index": "book",
  "_type": "_doc",
  "_id": "2",
  "_version": 20,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 26,
  "_primary_term": 1
}

多次执行返回的_version 是递增的

11.配置文件详解

配置文件的地址,可以参考部署 elasticsearch 的基础文档里面有说明.

代码语言:properties复制
#配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: elasticsearch

#节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
node.name: "Franz Kafka"

#指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
node.master: true

#指定该节点是否存储索引数据,默认为true。
node.data: true

#设置默认索引分片个数,默认为5片。
index.number_of_shards: 5

#设置默认索引副本个数,默认为1个副本。
index.number_of_replicas: 1

#设置配置文件的存储路径,默认是es根目录下的config文件夹。
path.conf: /path/to/conf

#设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
path.data: /path/to/data
path.data: /path/to/data1,/path/to/data2

#设置临时文件的存储路径,默认是es根目录下的work文件夹。
path.work: /path/to/work

#设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.logs: /path/to/logs

#设置插件的存放路径,默认是es根目录下的plugins文件夹
path.plugins: /path/to/plugins

#设置为true来锁住内存。因为当jvm开始swapping时es的效率 会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。 同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。
bootstrap.mlockall: true

#设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。
network.bind_host: 192.168.0.1


#设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.publish_host: 192.168.0.1

#这个参数是用来同时设置bind_host和publish_host上面两个参数。
network.host: 192.168.0.1

#设置节点间交互的tcp端口,默认是9300。
transport.tcp.port: 9300

#设置是否压缩tcp传输时的数据,默认为false,不压缩。
transport.tcp.compress: true

#设置对外服务的http端口,默认为9200。
http.port: 9200

#设置内容的最大容量,默认100mb
http.max_content_length: 100mb

#是否使用http协议对外提供服务,默认为true,开启。
http.enabled: false

#gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。
gateway.type: local

#设置集群中N个节点启动时进行数据恢复,默认为1。
gateway.recover_after_nodes: 1

#设置初始化数据恢复进程的超时时间,默认是5分钟。
gateway.recover_after_time: 5m

#设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
gateway.expected_nodes: 2

#初始化数据恢复时,并发恢复线程的个数,默认为4。
cluster.routing.allocation.node_initial_primaries_recoveries: 4

#添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
cluster.routing.allocation.node_concurrent_recoveries: 2

#设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
indices.recovery.max_size_per_sec: 0

#设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
indices.recovery.concurrent_streams: 5

#设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 1

#设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
discovery.zen.ping.timeout: 3s

#设置是否打开多播发现节点,默认是true。
discovery.zen.ping.multicast.enabled: false

#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]

#下面是一些查询时的慢日志参数设置
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace: 200ms

Elasticsearch 的主要优点包括:

  1. 分布式设计:Elasticsearch 天然支持分布式,可以很容易地横向扩容,处理 PB 级结构化或非结构化数据。
  2. 高效的搜索能力:Elasticsearch 提供了全文搜索功能,支持模糊查询、前缀查询、通配符查询等,并且具有强大的聚合分析功能。
  3. 快速的查询速度:Elasticsearch 的底层使用 Lucene 作为搜索引擎,并在此之上做了多重优化,保证了用户对数据查询的需求。
  4. 易用性:Elasticsearch 提供了简单的 RESTful API,天生的兼容多语言开发,上手容易,开箱即用。
  5. 丰富的生态圈:Elasticsearch 有丰富的插件和工具,如 Logstash、Kibana、Beats 等,形成了强大的 Elastic Stack 生态。

Elasticsearch 的使用场景包括:

  1. 应用搜索:为网站或应用程序提供搜索功能,如电商、社交媒体等。
  2. 日志记录和日志分析:收集、存储和分析服务器日志、应用日志等。
  3. 基础设施监控:监控服务器、网络设备等基础设施的性能指标。
  4. 安全分析:分析安全日志,进行入侵检测和威胁分析。
  5. 地理位置数据分析:处理地理空间数据,提供地理位置搜索服务。
  6. 商业智能:对商业数据进行分析,提供决策支持。

Elasticsearch 的引入主要是为了应对大数据环境下的海量数据检索和实时分析需求,它通过分布式架构和高效的索引机制,提供了快速的搜索和分析能力。然而,Elasticsearch 也存在一些潜在风险,如响应时间问题和任务恢复延迟等,需要通过优化配置和维护来降低这些风险的影响。

0 人点赞