ES学习分享

一、ES是什么

Elasticsearch是一个基于Apache Lucene的开源搜索引擎,通过简易的API来隐藏Lucene的复杂性。ES的基本结构包括,Cluster集群(由n个节点组成),Node实例节点,Index索引(一系列documents的集合),Shard分片(索引的数据是分配到各个分片的),Replica备份节点(相应有Primay Shard主分片)

ES学习分享_第1张图片

ES架构

ES学习分享_第2张图片

ES和RDMS的区别

二、ES不是什么

1、ES不是数据库,不是可靠的数据存储系统。

三、Mapping映射

mapping相当于数据库的表结构,决定了ES在建立倒排索引、进行检索时对文档采取的相关策略,如数字类型、日期类型、文件类型等。在写数据前ES不强制要求创建mapping,因为ES有动态识别和创建的机制,但是非常不建议使用ES的动态识别和创建的机制,因为很多情况下这并非你所需要。推荐的做法是在写数据之前仔细的创建mapping

四、Template模板

模板是描述表结构(mapping)和表设置(setting)的数据结构,在ES中创建一个索引模板,其本质就是包含mapping及分片信息,模板中有个属性  template  表示该模板用来匹配什么样的索引。比如"template:timingsoa-*“,创建的所有以timingsoa开头的索引,将会应用这个模板,一般用来匹配按周期创建的索引,例如 timingsoa-20190417

{
  "template": "timingsoa-*",
  "settings": {
    "index": {
      "refresh_interval": "1s",
      "number_of_shards": "4",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "timingsoa": {
      "properties": {
        "time": {
          "format": "yyyy-MM-dd HH:mm:ss",
          "type": "date"
        },
        "className": {
          "type": "keyword"
        },
        "methodName": {
          "type": "keyword"
        },
        "invokeNo": {
          "type": "keyword"
        },
        "threadId": {
          "type": "keyword"
        },
        "invokeIp": {
          "type": "keyword"
        },
        "message": {
           "analyzer": "ik_smart",
            "type": "text"
        },
        "lineNumber": {
          "type": "integer"
        },
        "invokeSerialNum": {
          "type": "integer"
        }
      }
    }
  }
}

索引存在Linux服务器的文件系统上,背后是文件系统,不是类似HDFS的文件系统

五、Routing路由

rouing就是hash key,这个key决定写入和查询的分片id

六、Alia别名

PUT timingsoa
{
   "mappings": {
        "timingsoa": {
          "properties": {
            "time": {
              "format": "yyyy-MM-dd HH:mm:ss",
              "type": "date"
            },
            "className": {
              "type": "keyword"
            },
            "methodName": {
              "type": "keyword"
            },
            "invokeNo": {
              "type": "keyword"
            },
            "threadId": {
              "type": "keyword"
            },
            "invokeIp": {
              "type": "keyword"
            },
            "message": {
               "analyzer": "ik_smart",
                "type": "text"
            },
            "lineNumber": {
              "type": "integer"
            },
            "invokeSerialNum": {
              "type": "integer"
            }
           }
          },
       "aliases": {
          "admin_w": {},
          "admin_r": {}
       }
    }

为什么需要别名https://www.elastic.co/guide/en/elasticsearch/guide/current/index-aliases.html

七、ES集群

1、节点发现

多播方式,也是ES的默认使用方式,但是无法跨网络组建集群。另外一种是单播方式,可以跨网络组建集群

2、主节点选举

所有配置有master:true的节点,根据节点id进行排序,然后取出第一个作为主节点

3、存活检测

有两种错误检测方式,一种是master节点ping集群中所有其他的节点来验证他们是否存活,另一种是每个节点ping master节点来验证它是否存活

4、容灾

ES中的index,首先会进行分片,每一个分片数据一般都会有自己的副本数据,ES分配分片的策略会保证同一个分片数据和自己的副本不会分配到同一个节点上

4.1 恢复的目标是保证集群中分片的副本数不变

5、扩容和缩容

整个过程不影响集群的读写功能,但是由于多了复制分片和迁移分片的过程,集群的读写性能受影响

八、ES写入文档过程

ES学习分享_第3张图片

ES学习分享_第4张图片 图片来自https://zhuanlan.zhihu.com/p/34669354

另外ES没有原地update的能力,所有的update都是标记删除老文档。并发update同一条document,ES内部采用了乐观并发的处理,并发修改的操作直到最后要提交是才加锁检查版本号,如果发现修改之前获取的版本号已经改变(即已经被人修改),那么会抛出这个异常,然后由用户决定如何处理该异常

九、ES查询文档过程

ES学习分享_第5张图片

ES学习分享_第6张图片 图片来自 https://zhuanlan.zhihu.com/p/34674517

当然你可以指定perference,指定在主分片查询或者先主后副等等

十、ES索引创建过程

ES学习分享_第7张图片

十一、ES新节点加入过程

ES学习分享_第8张图片

十二、ES规范

12.1、Mapping设计规范

1、禁用mapping的dynamic

12.2、索引设计规范

1、设置合理的number_of_shards

12.3、查询规范

1、search type不要用dfs_query_then_fetch,用query_then_fetch足够

十三、其他

1、倒排索引


推荐阅读:

你可能感兴趣的:(ES学习分享)