您的位置:首页 > 其它

elasticsearch的路由选择

2016-04-13 18:55 267 查看
集群介绍:

cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的

shards 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改

replicas 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

recovery 代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复

river 代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。

gateway 代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

discovery.zen 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互

一份文档应该存储在哪里(文档的路由):

当你索引一个文档时,es会计算该文档的哈希值,并计算出该文档应该储存在哪一个分片上(被称为主分片),然后文档被复制到副本分片上;索引中的主要分片数量只能在索引创建时被指定,并且将来都不能在被更改:如果主要分片数量在索引创建后改变了,那么之前的所有路由结果都会变的不正确,从而导致文档不能被正确地获取;所有的文档API(get,
index, delete, buli, update和mget)都接受一个routing参数,它用来定制从文档到分片的映射。一个特定的routing值能够确保所有相关文档 - 比如属于相同用户的所有文档 - 都会被存储在相同的分片上。注意主分片可以有多个复制分片,但是相同的分片不会放在同一个节点上;保证了一个节点挂了之后的数据安全性;我们能够发送请求给集群中任意一个节点。每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点,所以也可以将请求转发到需要的节点

文档增删改的过程:



1 一共有三个节点的集群,一个请求发送给节点1
2 节点1使用文档id确定文档属于分片0(意味着p0为主分片,其他节点上的都是0的副本分片(r0)),它查找分片0所属节点,转发请求道此节点3上
3 在节点3上执行请求,如果成功,他转发请求道对应的节点1和2的复制分片上,当所有的复制节点报告成功,节点3报告成功到请求的节点上(节点1),请求的节点报告给客户端;
注意:例子中:请求的节点是 node1
处理请求的节点是 node3
node1和 node2上都包含主分片的复制分片
客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片。你的修改生效了

文档检索的过程:

文档能够从主分片或任意一个复制分片被检索,对于读请求,为了平衡负载,请求节点会为每个请求选择不同的分片——它会循环所有分片副本。可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到复制分片上。这时复制分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和复制分片都是可用的。

局部更新文档

update
API 结合了之前提到的读和写的模式。



下面我们罗列执行局部更新必要的顺序步骤:

客户端给
Node 1
发送更新请求。
它转发请求到主分片所在节点
Node 3

Node 3
从主分片检索出文档,修改
_source
字段的JSON,然后在主分片上重建索引。如果有其他进程修改了文档,它以
retry_on_conflict
设置的次数重复步骤3,都未成功则放弃。
如果
Node 3
成功更新文档,它同时转发文档的新版本到
Node 1
Node 2
上的复制节点以重建索引。当所有复制节点报告成功,
Node 3
返回成功给请求节点,然后返回给客户端。

update
API还接受《新建、索引和删除》章节提到的
routing
replication
consistency
timout
参数。

基于文档的复制

当主分片转发更改给复制分片时,并不是转发更新请求,而是转发整个文档的新版本。记住这些修改转发到复制节点是异步的,它们并不能保证到达的顺序与发送相同。如果Elasticsearch转发的仅仅是修改请求,修改的顺序可能是错误的,那得到的就是个损坏的文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: