💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
- 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 1.什么是 Elasticsearch
- 2.Elasticsearch 的功能
- 3.Elasticsearch 的使用场景
- 4.Elasticsearch 的特点
- 5.lucene 和 elasticsearch 的关系
- 6.Elasticsearch 核心概念
- 7.核心概念对比
- 8.文档数据格式
- 9.悲观锁乐观锁
- 10.ES 并发控制
- 11.配置文件详解
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.文档数据格式
- 应用系统的数据结构都是面向对象的,具有复杂的数据结构。
- 对象存储到数据库,需要将关联的复杂对象属性插到另一张表,查询时再拼接起来。
- es 面向文档,文档中存储的数据结构,与对象一致。所以一个对象可以直接存成一个文档。
- es 的
document
用json
数据格式来表达。
而在 es 中,一个学生存成文档如下:
{
"id": "1",
"name": "张三",
"last_name": "zhang",
"classInfo": {
"id": "1",
"className": "三年二班"
}
}
9.悲观锁乐观锁
为控制并发问题,我们通常采用锁机制。分为悲观锁和乐观锁两种机制。
悲观锁
:很悲观,所有情况都上锁。此时只有一个线程可以操作数据。具体例子为数据库中的行级锁、表级锁、读锁、写锁等。悲观锁特点:
优点是方便,直接加锁,对程序透明。缺点是效率低。乐观锁:
很乐观,对数据本身不加锁。提交数据时,通过一种机制验证是否存在冲突,如 es 中通过版本号验证。乐观锁特点:
优点是并发能力高。缺点是操作繁琐,在提交数据时,可能反复重试多次。
10.ES 并发控制
基于_version
的版本控制,es 对于文档的增删改都是基于版本号
。
PUT /book/_doc/2
{
"id":1,
"title":"这是一11文章",
"content":"xxxxx",
"comment":"备注信息",
"mobile":"13344556677"
}
{
"_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 的基础文档里面有说明.
#配置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
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙