分布式搜索引擎

1、说一下es的分布式架构原理(es是如何实现分布式的)?

es是基于lucene实现的分布式搜索引擎——elasticsearch。核心思想是在多台机器上启动多个es进程实例,组成了一个es集群。

es中存储数据的基本单位是索引,比如说你现在要在es中存储一些订单数据,你就应该在es中创建一个索引,order_idx,所有的订单数据就都写到这个索引里面去,一个索引差不多就是相当于是mysql里的一张表。

index -> type -> mapping -> document -> field。

type:没法跟mysql里去对比,一个index里可以有多个type。好比说,有一个index,是订单index,里面专门是放订单数据。就好比说你在mysql中建表,有些订单是实物商品的订单,就好比说一件衣服,一双鞋子;有些订单是虚拟商品的订单,就好比说游戏卡,话费充值。就两种订单大部分字段是一样的,但是少部分字段可能有略微的一些差别。所以就会在订单index里,建两个type,一个是实物商品订单type,一个是虚拟商品订单type。相当于每个type代表是具体的一个mysql中的表。

mapping:每个type有一个mapping,如果你认为一个type是一个具体的一个表,index代表了多个type的同属于的一个类型,mapping就是这个type的表结构定义,定义字段类型;

document:实际上你往index里的一个type里面写的一条数据,叫做一条document,一条document就代表了mysql中某个表里的一行数据

field:每个document有多个field,每个field就代表了这个document中的一个字段的值

es是如何实现分布式的:

搭建es cluster集群配合ha机制实现主从架构之后,es底层存储数据的流程:首先创建一个索引,这个索引中的数据就会被分成多个shard切片,通过路由算法也就是计算id的hash值,然后与分片数进行floorMod运算(整个过程类似hash取余)。将数据分别放入到对应的节点上,每个节点都有自身的主从架构(HA机制),每个节点上的主从架构中,又分了primary shard和replication shard,也就是主shard和拷贝shard,一个节点下只能是一个primaryshard 对应多个replication shard ,写数据只能通过primary shard写入,读数据可以通过replication shard,这样就实现了读写分离
————————————————
版权声明:本文为CSDN博主「键盘源」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37909508/article/details/99223073

2、写入和查询的工作流程

客户端插入数据。选择一个机器作为(协调节点),通过hash协调到对应的primary shard中。primary再同步到replica。
写入变化:
1、写入primary时,先写入buff内存中。同时写一个translog日志文件
2、buff快慢了。或者一定时间(一般为1秒),会通过refresh来刷新到segmentfile中。不过首先会写入到oscache里。进入到oscache中时就可以被客户端搜索到了。{准实时的原因}。
3、数据进入到oscache中后。buff就会清空。不过translog里的数据在不断的增大。大到一定的阈值。就会触发commit操作。
4、commit发生后,会把buffer里现有的数据refresh到oscache中。清空buffer
5、将一个commit point写入磁盘文件中,标识了这个commitpoint对应的所有segmentfile
6、强行把oscache中的所有数据fsync到segment file中。
7、清空translog,再重启一个translog,commit完成。默认30分钟自动执行一次,但是过大。也会触发commit。我们可以通过手动flush来实现commit。会把所有的oscache刷到磁盘中
8、其实translog也是先写的oscache,5秒后再写入磁盘。因此。有可能会丢掉5秒所有的数据、也可以通过修改参数来保证每次数据都写入。不过就性能降低。
在这里插入图片描述
删除数据
1、有删除请求。会创建一个.del文件中进行标识、把doc标识为deleted状态。那么搜索的时候根据.del文件就知道这个doc被删除了
2、更新操作。就是先删除再写入
3、buffer每次refresh,都产生一个segmetfile文件。太多了之后。就进行merge,每次merge的时候就会把标识为deleted的doc给物理删除掉。然后把一个新的segmentfile写入磁盘、这里会有一个commitpoint,标识所有新的segmentfile,然后打开segmentfile供搜索使用、同时删除旧的segment
在这里插入图片描述
读取数据
在这里插入图片描述
搜索数据
在这里插入图片描述

ES性能调优

es的调优主要就是让一些热词、频词进入到内存中去。
1、扩大filesystemcache的容量
2、数据预热:对一些热词。隔一段时间进行一次查询。保持在内存中
3、冷热分离:冷词和热词分开
4、document模型:减少复杂查询。
5、es分页,scroll api来进行逐个分页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值