首页 > 代码库 > 创建,插入,删除一个document(createing,indexing and deleteing a document)
创建,插入,删除一个document(createing,indexing and deleteing a document)
创建,插入,删除的请求都是写操作,在把primary shard复制到相对应的replica shard之前,这些操作必须是成功的。如图:
下面将会有序列出使用crate,index,delete在primary shard和replica shard上成功操作document的必要步骤,正如上图所示一样。
1:客户端发送create,index,delete请求到node1,于是把请求转发到node3
2:node1使用document的_id判断得知这个document是在shar0上,这里primary shard0的备份也已经被分配了。
3:node3在primary shard上执行请求。如果执行成功,同时转发请求到node1和node2中的他的replica shard。一旦所有的replica shard执行成功,node3会把执行成功的消息报告给请求node(即node1),然后node1把成功的消息返回给客户端。
当客户端收到成功的响应时候,primary shard和所有的对应的replica shard的document都已经被修改了,说明了你的修改是安全的。
还有很多的可选的请求参数影响着这个流程,这些参数能牺牲数据的安全性而提高性能,这些可选项可少被使用,因为ES已经够快了,但是为了完整性,这里还是说一下的。
replication:这个参数的默认值是sync,这个能让primary shard在返回消息到客户端之前等着replica shard的成功响应。如果你设置了这个参数的值是async,那么primary shard将会在自己执行成功后就返回,但是请求转发到replica shard依然在进行,这样你就不知到replica shard时候是执行成功的。建议使用sync,因为在太多的请求的时候可以造成ES过载,那么客户端就不用等待请求执行完成了。
consistency:默认情况下,在写操作进行之前,primary shard需要一个quorum或者majority的shard备份(这个数据备份可以是primary也可以是replica的)是可用的。这个用来防止数据被写到网络工作部分的“错误的一面”。quorum是如下定义的:
int( (primary + number_of_replicas) / 2 ) + 1
这个consistency要么是one(就是primary shard),要么是all(primary shard和replica shard),要么是默认的shard备份的quorum或者majority。要注意的是number_of_replicas的数量就是index settings中指定的replica的数量,并不是当前激活的replica的数量。如果你指定的index有三个replica,那么quorum的计算方式如下:
int( (primary + 3 replicas) / 2 ) + 1 = 3
但是如果你仅仅启动了2个node,就会有没有激活的shard来满足quorum,这时你将不能index或者delete任何的document。
timeout:如果没有任何的shared副本能够利用将会发生什么呢。ES将会等待,等待shard的出现。默认情况下,这个等待将会持续一分钟,如果需要,你可以使用timeout参数指定等待的值:100就是100毫秒,30s就是30秒
一个新的index默认有1个replica,就是有两个激活的shard副本可以响应请求,以满足quorum的需要。然而,默认设置将会阻止我们在一个单node的cluster上做任何有用的事情。为了避免这个情况的发生,使用quorum的唯一的要求就是number_of_replicas要大于1。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/distrib-write.html