elasticserach

原文链接:https://zhuanlan.zhihu.com/p/62892586

微信公众号:芋道源码里的文章。

https://blog.csdn.net/wangnan9279/article/details/79287846 Elasticsearch架构原理


分布式实时性搜索,实现复杂快速搜索
原理:? 倒排
数据怎么存储?
段:segment存储每次生成的倒排索引;commit管理所由segment
分布式存储一致性:
eg:客户端将数据发送给node1节点(主节点),根据id计算分片为shard0, shard0存储在Node3上,请求到Node3,并行将数据发送给shard0的副本分片node1和node2。
分片是elasticsearch自动分配,均匀
怎么防止数据丢失?
写入内存,每哥30分钟持久化到磁盘;
写入内存时记录日志,日志每隔5秒持久化到硬盘。
怎么实现实时性?
先写入内存
怎么动态更新索引?
新收到的数据写到新的索引文件里,新接收到的数据生成一个新的segment,segment再存储到硬盘里。
为什么快?
一是倒排索引,二是开新文件,新文件带来问题,文件数太多,开新线程合并。
冷热数据读写分离
大查询,大量读IO,CPU使用率上升,会影响新数据的写入,可能要仿照MySQL集群一样,读写分离。


elasticsearch原理

反向索引。

加入我要根据一个关键字去查找文档,由于没有关键字到文档这种索引。我只能从1号文档遍历到最后一个文档,看文档中有没有关键字。

但是如果我将文档进行分词,以这些分词作为key, 文档的位置作为value,就可以直接通过key去找到value了。

elasticserach重要组成部分

索引,类型,文档

  • 索引:理解为mysql的数据库。存放数据的地方

  • 类型:理解为数据库的表。记录每个文档的类型。

  • 文档:理解为数据库的行。记录每个文档。

举个例子怎么存储数据

比如一首诗,有诗题、作者、朝代、字数、诗内容等字段,那么首先,我们可以建立一个名叫 Poems 的索引,然后创建一个名叫 Poem 的类型,类型是通过 Mapping 来定义每个字段的类型。

比如诗题、作者、朝代都是 Keyword 类型,诗内容是 Text 类型,而字数是 Integer 类型,最后就是把数据组织成 Json 格式存放进去了。
在这里插入图片描述
在这里插入图片描述

  • 词典存储在内存,倒排文件存储在硬盘。

elasticsearch怎么做到分布式,可扩展性,近实时搜索的?

  • 分布式:主从架构,master,slave。
  • 可扩展:分片,类似于分布式文档。
  • 高可用:副本,一个挂掉,还有副本可用。
  • 实时:并没有增加一条数据就写入磁盘,而是延迟写。
  • 写写入内存,达到一秒或内存满,再写入硬盘。从内存中拿,很快,实现实时。
    • 内存数据丢失:日志系统,记录还没有持久化到磁盘的数据。
    • 写入内存,并记录到日志。
    • 内存满或达到一秒,写入硬盘。
    • 日志达到30分钟,或日志满,写入硬盘。

Keyword和text区别

Keyword 类型是不会分词的,直接根据字符串内容建立反向索引,Text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立反向索引。

elasticsearch怎么进行分布式存储

Elasticsearch 也是会对数据进行切分,同时每一个分片会保存多个副本,其原因和 HDFS 是一样的,都是为了保证分布式环境下的高可用。

  • 绿色块时数据数据块。
  • 是主从架构,在 Elasticsearch 中,节点是对等的,节点间会通过自己的一些规则选取集群的 Master,Master 会负责集群状态信息的改变,并同步给其他节点。
  • 只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以 Route 到集群中的任意节点,所以数据写入压力是分散在整个集群的。

什么规则选举master?

怎么routing?
hash(routing) % number_of_primary_shards
routing: 默认为文档的id。
number_of_primary_shards: 分片数量
所以分片数量不会改变

在这里插入图片描述
在这里插入图片描述

elasticsearch还有哪些应用

用 Elasticsearch 搭建 ELK 系统,也就是日志分析系统。其中 E 就是 Elasticsearch,L 是 Logstash,是一个日志收集系统,K 是 Kibana,是一个数据可视化平台。

  • 日志搜集系统好处:假如一个分布式系统有 1000 台机器,系统出现故障时,我要看下日志,还得一台一台登录上去查看,非常麻烦。
  • 如果日志进入 ELK 系统中,我们直接在 Kibana 就能看到日志情况。如果再接入一些实时计算模块,还能做实时报警功能。
  • elasticsearch强大的反向索引功能。根据关键字就能找到关键的错误日志了。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值