https://segmentfault.com/a/1190000005844120
概述
内部因素
es的一致性主要有两个方面:
-
使用lucene索引机制带来的refresh问题
-
使用分片和复制带来的副本一致性问题(
consistency:one、all、quorum
)
外部因素
外部因素的话,就是如果使用db跟es的同步机制的话,那么这里的同步有一定的延时,另外也有可能因为异常情况发生不一致的情况,比如事务回滚之类的。
更新操作之后refresh
org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Cannot save 'null' entity.");
elasticsearchOperations.index(createIndexQuery(entity));
elasticsearchOperations.refresh(entityInformation.getIndexName());
return entity;
}
public <S extends T> List<S> save(List<S> entities) {
Assert.notNull(entities, "Cannot insert 'null' as a List.");
Assert.notEmpty(entities, "Cannot insert empty List.");
List<IndexQuery> queries = new ArrayList<IndexQuery>();
for (S s : entities) {
queries.add(createIndexQuery(s));
}
elasticsearchOperations.bulkIndex(queries);
elasticsearchOperations.refresh(entityInformation.getIndexName());
return entities;
}
一旦有更改就refresh到filesystem cache,这样就可以被搜索到。
副本一致性问题
但是还有一个问题,一旦有多个replication,就涉及到一致性的问题。
-
如果consistency是one,那么写入速度快,不能保证读到最新的更改;
-
如果是quorum则是相对折中的版本,write的时候,W>N/2,即参与写入操作的节点数W,必须超过副本节点数N的一半。如果是quorum策略,则读取要保证一致性的话,就得使用read quorum,读取N个副本中的W个然后仲裁得到最新数据。或者是指定从primary上面去读。
相关的类
org/elasticsearch/action/WriteConsistencyLevel.java
org/elasticsearch/action/RealtimeRequest.java
-
realtime request
es提供了realtime request,就是从translog里头读,可以保证是最新的。
public class GetRequest extends SingleShardRequest<GetRequest> implements RealtimeRequest {
//......
}
但是注意get是最新的,但是检索等其他方法不是(如果需要搜索出来也是最新的,需要refresh,这个会刷新该shard但不是整个index,因此如果read请求分发到repliac shard,那么可能读到的不是最新的数据,这个时候就需要指定preference=_primary
)。
-
all策略即强一致的策略
小结
如果要保证读的强一致:
-
当write consistency不是all的时候,需要指定从primary shard读
-
当write consistency为all的时候,而且replication是sync模式(默认),无需额外指定,如果replication是async模式,则需要从primary shard读取。
curl -XGET 192.168.99.100:9200/myindex/_settings
curl -XPUT '192.168.99.100:9200/myindex/_settings' -d '
{
"index" : {
"action.write_consistency" : "all"
}
}'
但是都需要在update的时候手工refresh。
如果是读多写少的应用(特别是replica不多的时候),则可以指定write consistency为all,这样就可以很好地利用replica shard的读来提升es的读性能呢。
相关推荐
内容包括9部分 一、 Elasticsearch 简介 简单描述Elasticsearch Elasticsearch的特性 分布式、全文检索、近实时搜索和分析、高可用、模式自由、restful 讲述Elasticsearch的架构和...九、Elasticsearch写一致性保障
1. ES集群构成 2. 节点发现 4. 错误检测 5. 集群扩缩容 7. 结 1. 该master-eligible节点的当前状态不是master 2. 该m
而之前在实现过程中也遇到过很多场景化问题,本文将挑选其中比较经典的分布式一致性问题进行探讨。数据容错是大数据计算引擎面临的主要问题之一。目前,主流的开源大数据比如ApacheSpark和Apache
VaR具有一阶随机占优一致性,而ES具有二阶随机占优一致性;等熵风险测度利用了整个分布的信息,不再是简单的0-1风险测度,这与VaR和ES显著不同. 而且,等熵风险测度具有更高阶的随机占优一致性,这使得该风险测度...
拉普拉斯约束精度矩阵估计的存在性与高维一致性_Laplacian Constrained Precision Matrix Estimation Existence and High Dimensional Consistency.pdf
此篇文章主要选取关键性指标,数据校验数据源Hive和目标ES内的数据是否一致; 因为你不知道将Hive的数据导入到了ElasticSearch后,数据量是否准确,所以需要钉钉报警校验ElasticSearch和Hive数据仓库内的数据质量,...
Khronos OpenGL / OpenGL ES一致性测试 该存储库包括external/openglcts目录下的Khronos OpenGL / OpenGL ES CTS。 有关更多信息,请参见 。 Android的角度 可以按照的说明为Android构建ANGLE。 可以使用--angle-...
在本文中,基于[15]中提出的思想,我们制定了一个“ Grassmann扩展”方案,用于构造Yang-Baxter映射的非交换(Grassmann)扩展及其相关的PΔEs系统。... 我们证明了某些系统在其Grassmann扩展中保留了3D一致性属性。
为了在所有低级客户端(Ruby,Python等)上保持一致性,客户端接受简单的关联数组作为参数。 从URI到文档主体的所有参数都在关联数组中定义。 从7.4.0版开始,将使用脚本自动生成所有端点(和名称空间)。 该脚本...
elasticsearch-...为了在所有低级客户端(Ruby,Python等)上保持一致性,客户端接受简单的关联数组作为参数。 从URI到文档主体的所有参数都在关联数组中定义。 从7.4.0版开始,所有端点(和名称空间)
修改了状态数据采集源,改用ES的/_cluster/state描述ES的状态数据,实现了Zookeeper和Zen的一致性。 改进了数据采集者,减少了网络流量。修改了数据采集者为Master,以前是全部节点汇报自己节点状态数据,改进后由...
弹性搜索分布式RESTful搜索引擎 Elasticsearch是为云构建的分布式RESTful搜索引擎。 功能包括: 分布式且高度可用的搜索引擎。 每个索引均使用可配置数量的分片进行完全分片。 每个分片可以具有一个或多个副本。 对...
从多个维度讲解,百度对Elasticsearch的优化改进。 • 分布式SQL查询层 • 权限管理 • Online schema change • DistributedLog 数据一致性 • 多集群数据同步 • 多租户资源隔离
Elasticsearch是一个基于Lucene的搜索服务器,Elasticsearch也是使用Java编写的,它的内部使用Lucene做索引与搜索,但是它的目的是使用全文检索变得简单,通过隐藏Lucene的复杂性,取而代之的提供一套简单一致的...
弹性搜索分布式RESTful搜索引擎 Elasticsearch是为云构建的分布式RESTful搜索引擎。 功能包括: 分布式且高度可用的搜索引擎。 每个索引均使用可配置数量的分片进行完全分片。 每个分片可以具有一个或多个副本。 对...
Elasticsearch中没有一个单独的组件是全新的或者是革命性的。全文搜索很久之前就已经可以做到了, 就像早就出现了的分析系统和分布式数据库。革命性的成果在于将这些单独的,有用的组件融合到一个单一的、一致的、...
很明显这种模式是不可持续发展的,这种双写到各个数据存储系统中可能导致不可维护和扩展,数据一致性问题等,需要引入分布式事务,成本和复杂度也随之增加。我们可以通过CDC(ChangeDataCapture)工具进行解除耦合,...