Elasticsearch入门2

Elasticsearch入门系列

  • Elasticsearch入门 1
  • Elasticsearch入门2
  • 继续上一篇《Elasticsearch入门1笔记》

    这一篇主要记录 Elastic的集群、节点和分片

    集群

    节点Node

    • 运行中的 Elasticsearch 实例称为一个 节点
    • 集群是由一个或者多个拥有相同 cluster.name 配置的节点组成
    • 主节点负责管理集群范围内的所有变更(索引和节点)
    • 主节点并不需要涉及到文档级别的变更和搜索等操作

    分片

    • 一个 分片 是一个底层的 工作单元 ,它仅保存了 全部数据中的一部分
    • 分片是一个 Lucene 的实例(本身就是一个完整的搜索引擎)
    • 文档被存储和索引到分片内(应用程序是直接与索引交互)
    • 利用分片将数据分发到集群内各处,集群规模扩大或者缩小时, 数据仍然均匀分布在集群里
    • 主分片的数目决定着索引能够保存的最大数据量(主分片最大能够存储 Integer.MAX_VALUE - 128 个文档)
    • 副本分片只是一个主分片的拷贝(冗余备份, 读写分离)
    • 索引建立的时候就已经确定了主分片数(无法修改),但是副本分片数可以随时修改
    1
    2
    3
    4
    5
    6
    # 修改副本分片数量
    PUT请求
    http://127.0.0.1:9200/索引/_settings
    {
    "number_of_replicas" : 2
    }
    分片数据存储

    分片数据存储规则

    1
    shard = hash(routing) % number_of_primary_shards

    routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。

    通过routing的路由参数 ,通过这个参数我们可以自定义文档到分片的映射。

    主分片副本分片交互

    发送请求到集群中的任一节点,每个节点都有能力处理任意请求。每个节点都知道集群中任一文档位置。

    新建、索引和删除文档

    image-20180923202844784

    1. 客户端向 Node 1 发送新建、索引或者删除请求。
    2. 节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
    3. Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。

    客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成。

    取回一个文档

    image-20180923203720049

    1、客户端向 Node 1 发送获取请求。

    2、节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。 在这种情况下,它将请求转发到 Node 2 (负载均衡)。

    3、Node 2 将文档返回给 Node 1 ,然后将文档返回给客户端。

    局部更新文档

    image-20180923204013365

    1. 客户端向 Node 1 发送更新请求。
    2. 它将请求转发到主分片所在的 Node 3
    3. Node 3 从主分片检索文档,修改 _source 字段中的 JSON ,并且尝试重新索引主分片的文档。 如果文档已经被另一个进程修改,它会重试步骤 3 ,超过 retry_on_conflict 次后放弃。
    4. 如果 Node 3 成功地更新文档,它将新版本的文档并行转发到 Node 1Node 2 上的副本分片,重新建立索引。 一旦所有副本分片都返回成功, Node 3 向协调节点也返回成功,协调节点向客户端返回成功。

    PS: 当发送请求的时候, 为了扩展负载,更好的做法是轮询集群中所有的节点。

    集群健康

    包含了许多的统计数据

    1
    2
    GET请求
    127.0.0.1:9200/_cluster/health
    1
    2
    3
    4
    5
    6
    7
    {
    "cluster_name": "elasticsearch",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 1,
    ...
    }

    status:存在3种状态

    • green(所有分片正常)
    • yellow(主分片区正常)
    • red(无法运行)

    乐观并发控制

    当文档创建、更新或删除时, 新版本的文档必须复制到集群中的其他节点。

    Elasticsearch利用 _version 号来确保 应用中相互冲突的变更不会导致数据丢失。

    image-20180923193819130

     上一篇

    笔记