Elasticsearch学习笔记 - 07: CRUD操作深入详解(使用Kibana)

读写 Document

ElasticSearch 中的每个索引都被划分为分片,每个分片可以有多个副本。这些副本称为复制组,在添加或删除文档时必须保持同步。如果做不到这一点,从一份拷贝中读取与从另一份拷贝中读取将导致非常不同的结果。保持分片副本同步并提供从中读取的服务的过程称为数据复制模型。

Elasticsearch 的数据复制模型是基于主备份模型的。该模型基于从充当主分片的复制组中获得一个副本。其他副本称为复制分片。主节点作为所有索引操作的主要入口点。它负责验证它们并确保它们

1.验证传入操作并在结构上无效时拒绝它(例如:在对象字段中需要一个数字)
2.在本地执行操作,即索引或删除相关文档。这也将验证字段的内容并在需要时拒绝(例如:关键字值对于Lucene中的索引来说太长了)。
3。将操作转发到当前同步副本集中的每个副本。如果有多个副本,则并行执行。
4.一旦所有副本成功执行操作并对主副本作出响应,主副本就会向客户机确认请求已成功完成。是正确的。一旦主服务器接受了索引操作,主服务器还负责将该操作复制到其他副本。

基本写模型

Elasticsearch 中的每个索引操作首先使用路由解析到一个复制组,通常基于文档ID。一旦确定了复制组,该操作将在内部转发到该组的当前主分片。主分片负责验证操作并将其转发到其他副本。

基本流程如下:

1.验证传入操作并在结构上无效时拒绝它(例如:在对象字段中需要一个数字)
2.在本地执行操作,即索引或删除相关文档。这也将验证字段的内容并在需要时拒绝(例如:关键字值对于 Lucene 中的索引来说太长了)。
3。将操作转发到当前同步副本集中的每个副本。如果有多个副本,则并行执行。
4.一旦所有副本成功执行操作并对主副本作出响应,主副本就会向客户机确认请求已成功完成。

   错误处理:
   在索引过程中,许多事情可能会出错——磁盘可能会被破坏,节点可以彼此断开,或者一些配置错误可能导致一个副本的操作失败,尽管它在主服务器上是成功的。这些都是罕见的,但主要的是要对它们做出反应。
   另外一种情况是如果主服务器不可用,托管主节点的节点将向master发送一条消息。索引操作将等待(默认情况下最多1分钟),以便master服务器将其中一个副本提升为一个新的主节点。然后,该操作将被转发到新的主服务器进行处理。请注意,主服务器(master)还监控各个节点的健康状况,并可能决定主动降级主节点。这通常发生在持有主节点的节点通过网络问题与集群隔离的情况下。为了更好的理解master服务器与主分片所在服务器的关系,下面给出一个ElasticSearch的集群说明图:

其中NODE1为整个集群的master服务器,而第一个复制组(P0,R0,RO,其主分片所在服务器NODE3),第二个复制组(P1,R1,R1,其主分片所在服务器NODE1)。
   一旦在主服务器上成功执行了操作,主服务器就必须确保数据最终一致,即使由于在副本上执行失败或由于网络问题导致操作无法到达副本(或阻止副本响应)造成的。为了避免数据在复制组内数据的不一致性(例如在主分片中执行成功,但在其中一两个复制分片中执行失败),主分片在如果未在指定时间内(默认一分钟)未收到复制分片的成功响应或是收到错误响应,主分片会向Master服务器发送一个请求,请求从同步副本中删除有问题的分片,当主分片确认删除有问题的副本时,Master会指示删除有问题的副本。同时,master还会指示另一个节点开始构建新的分片副本,以便将系统恢复到一个健康状态。
   主分片将一个操作转发到副本时,首先会使用副本数来验证它仍然是活动的主节点。如果由于网络分区(或长GC)而被隔离,那么在意识到它已经被降级之前,它可能会继续处理传入的索引操作并转发到从服务器。来自陈旧的主服务器的操作将会被副本拒绝。当主接受到来自副本的响应为拒绝它的请求时,此时的主分片会向Master服务器发送请求,最终将知道它已经被替换了,后续操作将会路由到新的主分片服务器上。
   如果没有副本,那会发生什么呢?
   这是一个有效的场景,可能由于配置而发生,或者是因为所有的副本都失败了。在这种情况下,主分片要在没有任何外部验证的情况下处理操作,这可能看起来有问题。另一方面,主分片服务器不能自己false其他的分片(副本),而是请求master服务器代表它这样做。这意味着master服务器知道主分片是该复制组唯一的可用拷贝。因此,我们保证master不会将任何其他(过时的)分片副本提升为一个新的主分片,并且任何索引到主分片服务器的操作都不会丢失。当然这样意味着我们只使用单一的数据副本,物理硬件问题可能导致数据丢失。
   注:在一个ElasticSearch集群中,存在两个维度的选主。Master节点的选主、各个复制组主分片的选主。

基本读模型

当节点接收到读请求时,该节点负责将其转发到持有相关分片的节点、整理响应并响应客户机。我们将该节点称为该请求的协调节点。

基本流程如下:

1.常需要从多个分片读取,每个分片表示数据的不同子集。
2.从分片复制组中选择每个相关分片的活动副本。它可以是主节点,也可以是副本。默认情况下,Elasticsearch 只是在分片副本之间进行轮询。
3.将分片级读取请求发送到所选副本。
4.结合结果并做出响应。

自动生成ID

如果没有提供文档的 ID,会默认用当前计算出的的哈希值作为文档 ID,

路由

默认情况下,分片位置(或路由)是通过使用文档id值的散列来控制的

ES的各个概念的含义

1)GET:获取请求对象的当前状态。 
2)POST:改变对象的当前状态。 
3)PUT:创建一个对象。 
4)DELETE:销毁对象。 
5)HEAD:请求获取对象的基础信息。

MySql与ElasticSearch概念对比
MySqlElasticSearch
DatabaseIndex
TableType
RowDocument
ColumnField
SchemaMapping
IndexEverything is indexed
SQLQuery DSL
SELECT * FROM  table ...GET http://
UPDATE table SET ...PUT http://

 

1.新建文档(在Index/type下)相当于 Mysql 中(在某Database的Table)下插入一行数据

PUT blog/ariticle/1
{
"title":"New version of Elasticsearch released!",
"content":"Version 1.0 released today!",
"tags":["announce","elasticsearch","release"]
}

返回

{
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

 

2.检索文档(类似mysql search 搜索select*操作)

GET /blog/ariticle/1/

返回

{
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "New version of Elasticsearch released!",
    "content" : "Version 1.0 released today!",
    "tags" : [
      "announce",
      "elasticsearch",
      "release"
    ]
  }
}

如果未找到会提示0)

{
- "_index": "blog",
- "_type": "ariticle",
- "_id": "11",
- "found": false
}

3.更新文档(类似 mysql update 操作)

POST /blog/ariticle/1/_update/
{"script":"ctx._source.content = \"new version 2.0 20160714\""}

返回

{
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

4.删除文档(类似 mysql delete 操作)

DELETE /blog/ariticle/8

返回

{
  "_index" : "blog",
  "_type" : "ariticle",
  "_id" : "8",
  "_version" : 1,
  "result" : "not_found",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值