Elasticsearch到底能玩多大网上的数据量多大

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。elasticsearch最大支持查询数量是多少
/content/develop/Perl/Mastering_Regular_Expressions.pdf ...
你指的什麽股票?你自己的股票,在交易系统里可查到。公司的股票(流通股 非流通股)在股票K线图中,按F10就很方便查到。
答: l为什么胚胎在40多天停止发育?
答: 慢慢弄。我最开始只会装游戏;后来中国有了网络慢慢跟朋友上聊天室聊天;后来出了OICQ(现在叫QQ),又用那东西聊;然后上联众玩在线游戏(棋牌类);后来乱七八糟逛...
答: 七十年代的计算机网络X.25 分组交换网:各国的电信部门建设运行各种专用的网络体系结构:SNA,DNAInternet 的前身ARPANET进行实验运行八十年代...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区本篇讨论同时使用多个ES Cluster进行搜索的时候,如何保证数据的一致性。o 名词解释Cluster:集群,一个集群包含多个Node,且会有一个Master Node。Node:节点,一般来说一个机器部署一个Node。Shard:分片,指的是一个Index分成多少份,这些Shards会分散到各个Node上面。o 为什么要使用多个ES Cluster?高可用方面:Elastc
本篇讨论同时使用多个ES Cluster进行搜索的时候,如何保证数据的一致性。o 名词解释Cluster:集群,一个集群包含多个Node,且会有一个Master Node。Node:节点,一般来说一个机器部署一个Node。Shard:分片,指的是一个Index分成多少份,这些Shards会分散到各个Node上面。o 为什么要使用多个ES Cluster?高可用方面:ElastcSearch拥有许多高可用的特性,例如Replica,例如Data Node挂掉后的数据迁移,例如Master Node挂掉后的自动重选,但这不代表万无一失了。常见的坑是,某个Node表现糟糕但是偏偏又没挂(挂了反而更好),此时整个Cluster的性能就会被一个坑爹Node拖累,这往往就是雪崩的开始。因此,从高可用方面来考虑,应当部署多个ES Cluster(部分作为灾备)。性能方面:单个Cluster的搜索能力是有瓶颈的。Cluster越大,Node越多,自然Shard就越多。而Shard不是越多越好,Shard增多会导致通讯成本的增加、查询收束时Re-ranking环节的负担增加。如果有100台机器,那么比起一个100 Node、300 Shards的巨型Cluster,使用十个10 Node 30 Shards的小型Cluster可能表现会更好。o 什么叫多个ElastcSearch Cluster的一致性问题?本篇讨论的就是使用多个小型Cluster、而不是一个巨大Cluster进行搜索时会出现的问题。假设部署了两个Cluster,记为Cluster A和Cluster B,请求均摊去两个Cluster。有一天,你对两个Cluster同时新增了一条数据,但由于一些网络延迟之类的理由,A已经添加了但是B还没有,这时候一个用户搜索请求进来,可能会出现这么个情况:如果请求的pageSize=4。page=1时,用户请求去了Cluster B;page=2时,用户请求去了Cluster A。这样,用户会看到以下的结果:用户:黑人问号.jpg更糟糕的是,万一在ES前面有一层缓存挡着,而缓存不巧记录了这个诡异的结果,那影响就会扩大了(所有用户:黑人问号.jpg)。o 解决方案A:单点大法1. 进入业务请求低谷期时,把所有请求切去1个ES Cluster;2. 所有ES Cluster开始进行数据同步;3. 同步完毕后,同时准备离开请求低谷期了,请求开始均摊到多个ES Cluster上。优点:简单粗暴就是美。能简单粗暴解决的,就不要套复杂的东西。缺点:1)每天高峰期不能新增数据;2)必须要在低谷期内完成所有数据同步,万一数据同步流程很长且时间不可控则很难实现;3)单点要能够顶过低谷期,万一流量判断错误、或者被攻击,导致单点崩溃,可能发生严重事故。o 解决方案B:切别名大法多个ElastcSearch Index的名字切换是个原子操作(搜索"elasticsearch alias"),所以可以这样:1. 创建两个一样的Index(记为A1、A2);2. 同步数据到A1;3. 同步完后,设置别名A,指向刚刚同步好数据的A1(记为A-&A1);4. 使用A进行搜索,请求均摊到每个ES Cluster上;5. 每次Re-load的时候,所有ES Cluster将数据更新到那个待机中的Index(例如A-&A1,那么就更新A2,反之亦然)。在所有ES Cluster都完成数据更新后,同时切换别名(如A-&A1,则A-&A2,反之亦然)。优点:比方案A优雅多了。缺点:1)每个Index要创建两份,存储成本翻倍;2)跟方案A一样,不能实时添加数据。o 解决方案C:哈希大法1. 对请求进行哈希/散列,确保一个请求每次都会去到同一个ES Cluster;2. 每个ES Cluster该干嘛干嘛。优点:比方案B优雅多了,还能实时添加数据。缺点:万一其中一个ES Cluster挂掉了,怎么办?均摊请求的做法可以很轻松地将挂掉的ES Cluster整个踢出去,那哈希法呢?o 解决方案D:一致性哈希大法终于还是到了这一招,新增一层虚拟层,将每个ES Cluster抽象成一个环上的虚拟节点。每个请求在哈希后,先映射去虚拟层,再映射去真实的ES Cluster。由于每个ES Cluster都存储了完整的数据拷贝,我们并不需要考虑一致性哈希的数据迁移问题。每次新增/删除ES Cluster,就重新分配虚拟节点的位置(环上均分),就可以了。o 一个新的问题:如何确保多个ES Cluster的更新操作的一致性?上述全文都在讨论搜索的一致性,那么如何保证插入/更新的一致性呢?我的解法是,加入一层可以被多人重复消费的消息队列(例如Kafka),作为所有ES Cluster插入/更新的中间层。这个方案的好处是:1)主更新程序只有一个,提高可控性和发现问题的能力;2)使用消息队列来统一发布内容,降低了对数据源的压力;3)图中消费者这个角色,Elastic Stack官方提供了一个轻量级高可用解决方案,就是Beat。o 最后留一个小问题前文讨论了多个Cluster+缓存时出现的一致性问题,其实单Cluster+缓存也可能出现这个问题(极少就是了)。那么,有没有办法彻底解决这个问题呢?o 结语ElasticSearch本身是个分布式系统,但如果将其作为一个更大的分布式系统的一个单元的话,将会出现什么问题呢?本文希望可以通过循序渐进的方法,分析围绕ES的高可用方案设计,有许多问题是分布式系统里常见的问题,希望可以对读者有所启发。
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】数据库技术天团集体亮相,分享一线生产实践经验,告诉你踩过的坑、走过的路,都是老司机,靠谱!干货分享,不可错过!&&
举得几个例子都不太合适。
比如解释啥是一致性问题的例子,这个问题在搜索中肯定是存在的,比如搜索一个词,第一页返回了A,B,C后,索引系统又实时增加了一条相关数据D,那获取下一页的时候,可能排序是A,B,D,C这种,则第二页第一条结果就是C了,和第一页重复了,这个结果就不稳定了,但这个不稳定也算是预期内。要解决这个问题,ElasticSearch中有scroll功能,打个镜像就不会乱序,多集群时再加上按query和user id分发就可以了。
多集群时的一致性问题,我给你个例子:一条新数据M写进了集群1,没写进集群2,用户查询的时候,第一次请求发给了集群1 ,结果是A,B,M,用户再刷新一下,请求发给了集群2,结果是A,B,再刷新一下请求又发给了集群1,结果是A,B,M。在同步结束之前,用户的结果是变化的,不稳定的。这个就是个大问题了。
还有后面的解决方案,一会儿是集群维度,一会儿又变成了索引维度了。
感谢认真回复!
scroll不是个很好的方案,因为scroll的原理是把倒排索引持久化一段时间,是非常消耗内存的。scroll的主要用途是大量dump数据,在高并发搜索时是不会用的。
快速、完全托管的TB/PB级数据仓库解决方案,向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更...
凝聚阿里巴巴多年来在无线业务安全防御的成功经验和技术成果,并面向开发者和企业提供安全扫描、应用加固、安全组件、数...
消息队列(Message Queue,简称MQ)是阿里云商用的专业消息中间件,是企业级互联网架构的核心产品,基于...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...Elasticsearch操作数据后马上更新的办法 —技术博客
Elasticsearch操作数据后马上更新的办法
前言:我们经常有这样的需求,在对数据进行操作的时候,要及时返回刚刚操作完毕的数据,或者数据列表。比如加入存储一条数据后,我马上要返回数据的总条数,这个时候,会出问题,Elasticsearch会返回操作之前的数据,也就是假如开始有500条数据,我Insert了一条进去,按道理来说应该是501条,但是这个时候查询会发现,只有500条数据,再次请求又得到501条数据,这个是怎么回事呢?这个问题因为有延迟的关系(好像记得是3秒还是1秒来着)。有的人的做法比如有以下方法解决的。Thread.sleep(3000L);还有再请求一次的。但这些都不是解决方案,当你知道有方法的时候,你会自己笑自己。其实我看过这个网站的博客里有用到,但是群主没提到这个方法的作用。在:里有一句代码,如下:BulkRequestBuilder bulkRequest = ESTools.client.prepareBulk().setRefresh(true);这里的setRefresh(true);就是自动刷新的用处。所以在我们CRUD的时候,如果对数据增删改操作的时候,如果要及时返回最新数据,那么我们就需要加这个方法,及时刷新数据。当然也是可以配置刷新时间的,但是没必要,频繁的刷新会造成压力过大。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。
版权所属:
原文地址:
转载时必须以链接形式注明原始出处及本声明。
工具导航地图
JSON相关:
常用对照表:-
前&&&&&&&&&&端:-
转&&&&&&&&&&换:-
单位换算:-
生活工具:-
格式化、压缩:-
运算符优先级:-
二&&维&&码:-
站长工具:-
月供计算:-
税费计算: -
还款工具:-
时间工具:
进制转换:
程序员福利:
归属网站:
与我们合作:
搜索的内容将在这里展现。 提示:&搜索快捷键:Ctrl + F
/ &关闭快捷键:Esc2302人阅读
Elasticsearch(10)
上一篇文章介绍了ElasticSearch使用Repository和ElasticSearchTemplate完成构建复杂查询条件,简单介绍了ElasticSearch使用地理位置的功能。这一篇我们来看一下使用ElasticSearch完成大数据量查询附近的人功能,搜索N米范围的内的数据。准备环境本机测试使用了ElasticSearch最新版5.5.1,SpringBoot1.5.4,spring-data-ElasticSearch2.1.4.新建Springboot项目,勾选ElasticSearch和web。pom文件如下&?xml version=&1.0& encoding=&UTF-8&?&
&project xmlns=&http://maven.apache.org/POM/4.0.0& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.tianyalei&/groupId&
&artifactId&elasticsearch&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&packaging&jar&/packaging&
&name&elasticsearch&/name&
&description&Demo project for Spring Boot&/description&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-parent&/artifactId&
&version&1.5.4.RELEASE&/version&
&relativePath/& &!-- lookup parent from repository --&
&properties&
&project.build.sourceEncoding&UTF-8&/project.build.sourceEncoding&
&project.reporting.outputEncoding&UTF-8&/project.reporting.outputEncoding&
&java.version&1.8&/java.version&
&/properties&
&dependencies&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-data-elasticsearch&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-web&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-test&/artifactId&
&scope&test&/scope&
&/dependency&
&dependency&
&groupId&com.sun.jna&/groupId&
&artifactId&jna&/artifactId&
&version&3.0.9&/version&
&/dependency&
&/dependencies&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-maven-plugin&/artifactId&
&/plugins&
&/project&
新建model类Personpackage com.tianyalei.elasticsearch.
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.D
import org.springframework.data.elasticsearch.annotations.GeoPointF
import java.io.S
@Document(indexName=&elastic_search_project&,type=&person&,indexStoreType=&fs&,shards=5,replicas=1,refreshInterval=&-1&)
public class Person implements Serializable {
* 地理位置经纬度
* lat纬度,lon经度 &40.715,-74.011&
* 如果用数组则相反[-73.983, 40.719]
@GeoPointField
public int getId() {
public void setId(int id) {
public String getName() {
public void setName(String name) {
this.name =
public String getPhone() {
public void setPhone(String phone) {
this.phone =
public String getAddress() {
public void setAddress(String address) {
this.address =
我用address字段表示经纬度位置。注意,使用String[]和String分别来表示经纬度时是不同的,见注释。import com.tianyalei.elasticsearch.model.P
import org.springframework.data.elasticsearch.repository.ElasticsearchR
public interface PersonRepository extends ElasticsearchRepository&Person, Integer& {
看一下Service类,完成插入测试数据的功能,查询的功能我放在Controller里了,为了方便查看,正常是应该放在Service里package com.tianyalei.elasticsearch.
import com.tianyalei.elasticsearch.model.P
import com.tianyalei.elasticsearch.repository.PersonR
import org.springframework.beans.factory.annotation.A
import org.springframework.data.elasticsearch.core.ElasticsearchT
import org.springframework.data.elasticsearch.core.query.IndexQ
import org.springframework.stereotype.S
import java.util.ArrayL
import java.util.L
public class PersonService {
@Autowired
PersonRepository personR
@Autowired
ElasticsearchTemplate elasticsearchT
private static final String PERSON_INDEX_NAME = &elastic_search_project&;
private static final String PERSON_INDEX_TYPE = &person&;
public Person add(Person person) {
return personRepository.save(person);
public void bulkIndex(List&Person& personList) {
int counter = 0;
if (!elasticsearchTemplate.indexExists(PERSON_INDEX_NAME)) {
elasticsearchTemplate.createIndex(PERSON_INDEX_TYPE);
List&IndexQuery& queries = new ArrayList&&();
for (Person person : personList) {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(person.getId() + &&);
indexQuery.setObject(person);
indexQuery.setIndexName(PERSON_INDEX_NAME);
indexQuery.setType(PERSON_INDEX_TYPE);
//上面的那几步也可以使用IndexQueryBuilder来构建
//IndexQuery index = new IndexQueryBuilder().withId(person.getId() + &&).withObject(person).build();
queries.add(indexQuery);
if (counter % 500 == 0) {
elasticsearchTemplate.bulkIndex(queries);
queries.clear();
System.out.println(&bulkIndex counter : & + counter);
counter++;
if (queries.size() & 0) {
elasticsearchTemplate.bulkIndex(queries);
System.out.println(&bulkIndex completed.&);
} catch (Exception e) {
System.out.println(&IndexerService.bulkI& + e.getMessage());
注意看bulkIndex方法,这个是批量插入数据用的,bulk也是ES官方推荐使用的批量插入数据的方法。这里是每逢500的整数倍就bulk插入一次。package com.tianyalei.elasticsearch.
import com.tianyalei.elasticsearch.model.P
import com.tianyalei.elasticsearch.service.PersonS
import mon.unit.DistanceU
import org.elasticsearch.index.query.GeoDistanceQueryB
import org.elasticsearch.index.query.QueryB
import org.elasticsearch.search.sort.GeoDistanceSortB
import org.elasticsearch.search.sort.SortB
import org.elasticsearch.search.sort.SortO
import org.springframework.beans.factory.annotation.A
import org.springframework.data.domain.PageR
import org.springframework.data.domain.P
import org.springframework.data.elasticsearch.core.ElasticsearchT
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryB
import org.springframework.data.elasticsearch.core.query.SearchQ
import org.springframework.web.bind.annotation.GetM
import org.springframework.web.bind.annotation.RestC
import java.text.DecimalF
import java.util.ArrayL
import java.util.L
import java.util.R
@RestController
public class PersonController {
@Autowired
PersonService personS
@Autowired
ElasticsearchTemplate elasticsearchT
@GetMapping(&/add&)
public Object add() {
double lat = 39.929986;
double lon = 116.395645;
List&Person& personList = new ArrayList&&(900000);
for (int i = 100000; i & 1000000; i++) {
double max = 0.00001;
double min = 0.000001;
Random random = new Random();
double s = random.nextDouble() % (max - min + 1) +
DecimalFormat df = new DecimalFormat(&######0.000000&);
// System.out.println(s);
String lons = df.format(s + lon);
String lats = df.format(s + lat);
Double dlon = Double.valueOf(lons);
Double dlat = Double.valueOf(lats);
Person person = new Person();
person.setId(i);
person.setName(&名字& + i);
person.setPhone(&电话& + i);
person.setAddress(dlat + &,& + dlon);
personList.add(person);
personService.bulkIndex(personList);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery(&spring boot OR 书籍&)).build();
List&Article& articles = elas、ticsearchTemplate.queryForList(se、archQuery, Article.class);
for (Article article : articles) {
System.out.println(article.toString());
return &添加数据&;
geo_distance: 查找距离某个中心点距离在一定范围内的位置
geo_bounding_box: 查找某个长方形区域内的位置
geo_distance_range: 查找距离某个中心的距离在min和max之间的位置
geo_polygon: 查找位于多边形内的地点。
sort可以用来排序
@GetMapping(&/query&)
public Object query() {
double lat = 39.929986;
double lon = 116.395645;
Long nowTime = System.currentTimeMillis();
//查询某经纬度100米范围内
GeoDistanceQueryBuilder builder = QueryBuilders.geoDistanceQuery(&address&).point(lat, lon)
.distance(100, DistanceUnit.METERS);
GeoDistanceSortBuilder sortBuilder = SortBuilders.geoDistanceSort(&address&)
.point(lat, lon)
.unit(DistanceUnit.METERS)
.order(SortOrder.ASC);
Pageable pageable = new PageRequest(0, 50);
NativeSearchQueryBuilder builder1 = new NativeSearchQueryBuilder().withFilter(builder).withSort(sortBuilder).withPageable(pageable);
SearchQuery searchQuery = builder1.build();
//queryForList默认是分页,走的是queryForPage,默认10个
List&Person& personList = elasticsearchTemplate.queryForList(searchQuery, Person.class);
System.out.println(&耗时:& + (System.currentTimeMillis() - nowTime));
return personL
看Controller类,在add方法中,我们插入90万条测试数据,随机产生不同的经纬度地址。在查询方法中,我们构建了一个查询100米范围内、按照距离远近排序,分页每页50条的查询条件。如果不指明Pageable的话,ESTemplate的queryForList默认是10条,通过源码可以看到。启动项目,先执行add,等待百万数据插入,大概几十秒。然后执行查询,看一下结果。第一次查询花费300多ms,再次查询后时间就大幅下降,到30ms左右,因为ES已经自动缓存到内存了。可见,ES完成地理位置的查询还是非常快的。适用于查询附近的人、范围查询之类的功能。参考:ES根据地理位置查询&http://blog.csdn.net/bingduanlbd/article/details/
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:116304次
积分:1804
积分:1804
排名:千里之外
原创:66篇
转载:21篇
评论:29条
文章:46篇
阅读:67886
(4)(17)(21)(3)(12)(7)(1)(7)(8)(5)(1)(1)}

我要回帖

更多关于 网上的数据量多大 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信