Elasticsearch

ES分布式架构

ES底层是基于lucene的,核心思想是在多台服务器上启动多个es进程实例,组成一个es集群
建立一个索引时,将索引拆分成多个shard,每个shard存储部分数据,然后这个shard多个备份,每个shard都有一个primary shard,负责写入数据,但是还有几个replica shard,每个primary shard写入数据之后就会同步到其他几个replica shard上去

通过这个replica的方案,每个shard有多个备份,如果某个机器宕机了,还有别的数据副本备份在其他机器,从而实现了高可用

es集群有多个节点,会自动选举出一个master的节点,这个master节点主要是管理维护索引元数据,负责切换primary shard和replica shard身份,如果master节点宕机了,就会重新选举出一个节点为master;如果其他节点宕机了,就会由master节点将那台机器的primary shard的身份转移到其他机器的replica shard,接着如果修复了那台机器,master节点会控制将缺失的replica shard分配过去,同步修改数据,让集群恢复正常

ES的结构

es中存储数据的基本单位是索引(index),索引相当于mysql的一个数据库,索引之后是类型(type)(mysql数据库里的表),一个索引可以有多个type,每个type的字段差不多,但是会略有一点区别;type之后是mapping,mapping代表这个type的结构定义,每个type会有一个mapping,定义表里面有哪些字段和类型;之后是document,类似于mysql的一条记录,往index的type里面插入一条数据,就是指插入一条document;每个document有多个field,每个field代表这个document的一个字段的值,类似mysql的一个字段
index-->type-->mapping-->document-->field

ES写数据过程

客户端选择一个node发送请求,这个node这时被称作coordinating node(协调节点),coordinating node对document进行路由,将请求转发给对应的带有primary shard的node,coordinating node 如果发现primary node和所有的replica node都写完之后,会返回响应结果给客户端

image

ES读数据过程

可以通过doc id来查询,会根据doc id进行hash,判断doc id被分配到那个shard上去,从那个shard去查询

  • 客户端发送一个请求到任意一个node,这个node这时被称作coordinating node(协调节点)
  • coordinating nodedoc id进行hash,并将请求转发给对应的node,此时会使用round-robin随机轮询算法,在primary shard以及其所有的replica shard里面随机选一个,让读请求负载均衡
  • 接受请求的node返回documentcoordinating nodecoordinating node 返回document给客户端

ES搜索数据过程

  • 客户端发送请求到一个node,这个node这时被称作coordinating node(协调节点)
  • coordinating node会将搜索请求转发到所有的shard对应的primary shardreplica node
  • query phrase:每个shard将自己的的搜索结果返回给coordinating node,由coordinating node对结果进行合并,排序,分页等,产出最终结果
  • fetch Phrase:coordinating node根据doc id去各个节点拉取实际的document数据,最终返回给客户端

ES写数据底层原理

  • coordinating nodedocument路由之后,实际写数据的primary shard会先将document写入内存buffer,在buffer里的时候数据是搜索不到的同时将数据写入translog日志文件。如果buffer快满了,或者到一定时间,就会将buffer数据refresh到一个新的segment file,但是此时数据不是直接进入segment file磁盘文件,而是先进入os cache
  • 每隔1s,es将buffer写入一个新的segment file,每秒钟会产生一个新的磁盘文件segment file,这个segment file就存储着最近1sbuffer写入的数据
  • 如果buffer没有数据,不会执行refresh操作;如果有,默认是1s1次refresh
  • 只要buffer被写进了os cache,就可以被检索到,所以写入的数据默认是1s后能看到,所以es被称作准实时
  • 当重复上述步骤时,translog会越来越大,当translog大到一定长度时,就会触发commit操作
    • commit第一步,会将buffer数据refreshos cache中去,然后清空buffer,然后将一个commit point写入磁盘,里面标识着这个commit point对应的所有的segment file
    • 同时强行将os cache中的数据fsync到磁盘文件中去
    • 最后清空translog日志,重启一个translog
    • 这个commitflush,默认是30分钟一次
      translog:在执行commit之前,数据要么在buffer,要么在os cache,都属于内存区域,一旦机器宕机,数据就会丢失,所以translog日志能够帮助在宕机的时候恢复数据
      translog其实也是先写入 os cache 的,默认每隔5秒刷一次到磁盘中去,所以默认情况下,可能有 5 秒的数据会仅仅停留在 buffer 或者 translog 文件的 os cache 中,如果此时机器挂了,会丢失 5 秒钟的数据。

删除/更新底层原理

如果是删除操作commit的时候会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个doc被删除了
如果是更新操作,就是将原来的doc标识为deleted状态,然后重新写入一条数据

buffer 每次 refresh 一次,就会产生一个 segment file,所以默认情况下是 1 秒钟一个 segment file,这样下来 segment file会越来越多,此时会定期执行merge。每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleteddoc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开 segment file供搜索使用,同时删除旧的segment file

倒排索引

  • 在搜索引擎中,每个文档都有一个对应的文档ID,文档内容被表示为一系列关键词的集合
    倒排索引就是关键词到文档ID的映射,每个关键词都对应这一系列的文件,这些文件中都出现了关键词
DocID Doc
1 谷歌地图之父跳槽 Facebook
2 谷歌地图之父加盟 Facebook
3 谷歌地图创始人拉斯离开谷歌加盟 Facebook
4 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关
5 谷歌地图之父拉斯加盟社交网站 Facebook

对文档进行分词之后,得到以下倒排索引

WordId Word DocIds
1 谷歌 1,2,3,4,5
2 地图 1,2,3,4,5
3 之父 1,2,4,5
4 跳槽 1,4
5 Facebook 1,2,3,4,5
6 加盟 2,3,5
7 创始人 3
8 拉斯 3,5
9 离开 3
10 4
.. .. ..

另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。

那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询 Facebook,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容