简单的分布式结构是什么样的?

简介: 简单分布式结构通过分发服务器将请求分配给多台具备完整索引的索引服务器,实现负载均衡与高吞吐。虽不减少单次查询时间,但可通过拆分索引、分散内存加载来降低检索规模,提升单次效率,是分布式检索优化的关键思路。(238字)

一个完备的分布式系统会有复杂的服务管理机制,包括服务注册、服务发现、负载均衡、流量控制、远程调用和冗余备份等。在这里,我们先抛开分布式系统的实现细节,回归到它的本质,也就是从「让多台服务器共同承担任务」入手,来看一个简单的分布式检索系统是怎样工作的。

首先,我们需要一台接收请求的服务器,但是该服务器并不执行具体的查询工作,它只负责任务分发,我们把它叫作 分发服务器。真正执行检索任务的是 多台索引服务器,每台索引服务器上都保存着完整的倒排索引,它们都能完成检索的工作。

当分发服务器接到请求时,它会根据负载均衡机制,将当前查询请求发给某台较为空闲的索引服务器进行查询。具体的检索工作由该台索引服务器独立完成,并返回结果。

现在,分布式检索系统的结构你已经知道了,那它的效率怎么样呢?举个例子,如果一台索引服务器一秒钟能处理 1000 条请求,那我们同时使用 10 台索引服务器,整个系统一秒钟就能处理 10000 条请求了。也就是说,这样简单的分布式系统,就能大幅提升整个检索系统的处理能力。

但是,这种简单的分布式系统有一个问题:它仅能提升检索系统整体的「吞吐量」,而不能缩短一个查询的检索时间。也就是说,如果单机处理一个查询请求的耗时是 1 秒钟,那不管我们增加了多少台机器,单次查询的检索时间依然是 1 秒钟。所以,如果我们想要缩短检索时间,这样的分布式系统是无法发挥作用的。

那么,我们能否利用多台机器,来提升单次检索的效率呢?我们先来回顾一下,在前面讨论工业级的倒排索引时我们说过,对于存储在磁盘上的大规模索引数据,我们要尽可能地将数据加载到内存中,以此来减少磁盘访问次数,从而提升检索效率。

根据这个思路,当多台服务器的总内存量远远大于单机的内存时,我们可以把倒排索引拆分开,分散加载到每台服务器的内存中。这样,我们就可以避免或者减少磁盘访问,从而提升单次检索的效率了。

即使原来的索引都能加载到内存中,索引拆分依然可以帮助我们提升单次检索的效率。这是因为,检索时间和数据规模是正相关的。当索引拆分以后,每台服务器上加载的数据都会比全量数据少,那每台服务器上的单次查询所消耗的时间也就随之减少了。

因此,索引拆分是检索加速的一个重要优化方案,至于索引应该如何拆分,以及拆分后该如何检索,工业界也有很多不同的实现方法。你可以先自己想一想,然后我们再一起来看看,工业界一般都是怎么做的。

相关文章
|
11月前
|
编解码 算法 前端开发
java后端开发学习路线+避坑指南
java后端开发学习路线+避坑指南
|
11月前
|
存储 索引
如何使用「全量索引结合增量索引」方案?
采用“全量索引+增量索引”方案可高效处理大规模数据更新。系统周期生成不可变的全量索引,提升检索性能;实时新增数据则构建内存中的增量索引,支持快速写入。查询时合并两者结果,并通过删除列表标记已删数据,避免脏数据返回。结合Double Buffer机制,还可实现无锁访问,显著提升系统并发能力与检索效率。(238字)
|
11月前
什么是局部敏感哈希?
局部敏感哈希(LSH)是一种将高维数据映射为低维编码的技术,使相似数据更可能生成相近或相同的哈希值。不同于传统哈希对微小变化敏感,LSH通过随机超平面划分空间,使邻近点在多个划分中大概率落入同侧,从而获得相似哈希码。常用海明距离衡量哈希值相似性,适用于近似最近邻搜索与大规模文本去重等场景。
|
11月前
|
负载均衡 算法 网络协议
负载均衡:节点负载差距这么大,为什么收到的流量还一样?
本文讲解RPC框架中的负载均衡机制,对比传统Web负载均衡,阐述其由调用端自主选择节点的优势。针对业务提出“智能调控流量”需求,提出自适应负载均衡方案:通过收集服务节点的CPU、内存、响应耗时等指标进行打分,动态调整节点权重,结合随机权重算法实现流量合理分配,提升系统稳定性和可用性。
|
11月前
|
机器学习/深度学习 搜索推荐 算法
推荐引擎:没有搜索词,「头条」怎么找到你感兴趣的文章?
资讯类App通过“下拉刷新”精准推荐内容,背后依赖推荐引擎的检索技术。它基于用户行为数据构建用户画像与文章画像,结合协同过滤、内容召回等算法,实现个性化推荐,并通过多路召回与分层排序提升效率与准确性。
|
11月前
|
SQL 算法 Java
MybatisPlus讲义
本项目基于若依框架与AI技术,打造智慧养老管理系统。涵盖来访、入住、服务、财务等模块,分管理后台与家属端,结合Vue3、SpringBoot、Redis、物联网等技术,融合大模型与AI工具,助力高效开发,响应中国智慧养老发展趋势。
|
11月前
|
存储
LSM 树是如何检索的?
LSM树检索先查内存中的C0树,命中则直接返回;未命中再查磁盘C1树。为避免返回过期数据,删除操作会在C0树中标记key为“已删除”,查询时遇此标记即返回失败,并在滚动归并时批量清理C1树中对应数据,实现高效、延迟删除。
|
11月前
|
Docker 容器
Dockerfile
Dockerfile是构建Docker镜像的脚本文件,包含一系列指令,每条指令创建一个镜像层。编写时需用大写指令、按序执行,#为注释。通过docker build构建镜像,再用docker run运行容器。构建时,Docker引擎逐条执行指令,提交每一层变更,最终生成新镜像。
|
11月前
|
存储 索引
直接进行多次查询会有什么问题?
直接多次查询会增加次数与开销。以GeoHash查找最近加油站为例,逐步扩大范围虽可行,但“逐圈扩展”效率低,查询次数多;“缩短编码”虽快,却需重复二分查找,浪费资源。优化需平衡查询次数与存储成本。
|
11月前
|
存储 缓存 自然语言处理
如何使用磁盘上的倒排文件进行检索?
利用倒排文件检索时,优先将词典加载至内存以提升效率。通过哈希表或B+树定位关键词,再读取对应文档列表(posting list)。若其过长,则采用分层索引(如跳表、B+树)按需加载;结合LRU缓存常用数据,减少磁盘IO,提高检索性能。