想象你走进一座现代化图书馆。馆藏几百万册图书,但你绝不会一本本翻找。你来到门口的查询台,说出书名或主题,几秒后就有工作人员告诉你“在3层科技区第2排书架”。你转身去找书架时可能没意识到:每本新书早在入馆时就被编目、分类、贴上标签,还被整理出一叠“关键词卡片”塞进巨大的检索柜。Solr的故事,就是这座图书馆如何运作的完整蓝图。它把“关键词卡片”整理成一种叫倒排索引的结构,让查询时不必翻遍整座图书馆——只要查一下卡片柜,就能立刻知道哪些书包含你想要的词。而Solr的架构与核心配置,则决定了图书馆如何划分阅览室(Core)、如何制定编目规则(schema)、如何写运营手册(solrconfig.xml)、如何组建全市总分馆网络(SolrCloud)。今天,我们就像参观图书馆一样,从门口查询台到地下书库,把Solr层层看个明白。

岗位关联

掌握Solr架构与核心配置,是搜索工程师搭建可靠检索系统的核心能力——无论是电商搜索、日志分析还是内容推荐,Solr都是背后那个默默工作的“图书管理员”。理解它,你就能在任何需要“找东西”的场景里游刃有余。

目录
  1. 可视化演示
  2. 分层架构:图书馆的部门分工
  3. 核心配置:图书馆的运营手册矩阵
  4. 索引构建:把书变成关键词卡片
  5. 查询处理:读者的问题如何被解答
  6. 性能优化:让图书馆更快地找书
  7. SolrCloud:全市图书馆联网
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示Solr架构(RequestHandler/Core/Schema)、索引流程、查询处理和性能优化策略,含六边网格背景和发光动画,交互切换各环节。

本节配有交互动效(进入视口后自动加载,约 3KB)。

分层架构:图书馆的部门分工

一座图书馆要高效运转,必须先有清晰的部门分工:门口是导引台,往里走是编目室,深处是书库书架,旁边是阅览区。Solr这台“搜索服务器”同样按职责分成四个楼层:客户端层、请求处理层、索引搜索层、存储层。每一层只做好自己的事,并通过标准接口与上下层通信——就像图书馆不同部门之间的工作交接单。

客户端层是所有请求的出发点:浏览器、App、Java或Python客户端,把用户的一句话包装成HTTP请求,敲响图书馆的大门。请求处理层(RequestHandler、SearchComponent、QueryParser)则像服务台工作人员:接过请求、看懂诉求、编排执行步骤。真正的体力活由索引搜索层完成——IndexSearcher手持倒排索引卡片,快速定位候选文档。最后,存储层(Directory)负责把索引文件稳稳当当放在磁盘上,就像书库深处的一排排书架。

用数学语言看,Solr的查询处理可以表示为一个复合函数:先解析、再搜索,最终返回响应。请求在层与层之间单向流转,结果再逐层回传,这就是Solr分层架构的核心数据流。

这四层各司其职,图书馆才不会在高峰时段乱成一锅粥。你问“分布式系统在哪个书库”,导引台听懂问题(解析),书库管理员检索卡片柜(搜索),最后把位置写在便签上递给你(响应)。分层不是Solr发明的规矩,而是所有复杂系统能稳定运转的通用法则。

R=fsearch∘fparse(q)\displaystyle R = f_{search} \circ f_{parse}(q)
这个公式表示:一个查询请求 q 先经过解析函数 f_parse 变成内部查询对象,再被搜索函数 f_search 处理,最终得到响应 R。Solr的多层架构不过是对这个复合函数的结构化实现。
  1. 原始查询用户提交的查询串,如“分布式系统书籍”
    qq
  2. 解析变换把自然语言查询标准化为内部查询对象
    fparse(q)f_{parse}(q)
  3. 搜索处理在倒排索引中完成匹配、打分与排序
    fsearch(⋅)f_{search}(\cdot)
  4. 复合函数先解析后搜索,得到最终响应结果
    R=fsearch∘fparse(q)R = f_{search} \circ f_{parse}(q)

核心配置:图书馆的运营手册矩阵

每个图书馆都有一本运营手册,规定开放时间、借阅规则、服务窗口如何设置。Solr的核心配置就是这样一套手册组合,由三个文件协同工作:总控配置文件(solrconfig.xml)、字段编目规则(managed-schema)、核心属性配置(core.properties)。它们一个管“怎么运转”,一个管“怎么编目”,一个管“我是谁”。

solrconfig.xml是Solr的“总闸”——它定义请求处理器(requestHandler)如何工作、三大缓存(filterCache、queryResultCache、documentCache)的容量、自动提交(autoCommit)的触发条件、插件从哪个目录加载。managed-schema则定义索引的“编目规则”:字段名有哪些、字段类型是什么、中文文本用哪个分词器(analyzer)。例如title字段需要使用中文分词器,而sku商品编码字段只需要keyword精确匹配。core.properties是每个核心(Core)的“门牌号”:记录核心名称与数据目录位置,让Solr启动时准确找到每个Core的家。

三个文件共同构成一个核心实例的配置全集。Solr在创建Core时,会依次读取这些文件完成初始化;任何一处配置错误,都可能导致启动失败或检索行为异常。

这三个文件就像图书馆的“运营手册+编目规则+分馆门牌”。你在管理界面新建Core时,Solr会照着它们把阅览室搭起来;改错一个配置,图书馆可能延迟开馆(启动失败)甚至书架散架(索引损坏)。所以老手都会提醒:改配置前先备份,这是图书馆的安全条款。

Ccore={solrconfig.xml, managed-schema, core.properties}\displaystyle C_{core} = \{ \text{solrconfig.xml},\ \text{managed-schema},\ \text{core.properties} \}
每个Solr核心实例的配置,由solrconfig.xml(运营手册)、managed-schema(编目规则)和core.properties(门牌信息)三者共同组成,缺一不可。
  1. 核心配置集合每个Solr Core实例拥有的全部配置文件
    CcoreC_{core}
  2. 总控文件负责请求处理器、缓存参数、自动提交策略
    solrconfig.xml\text{solrconfig.xml}
  3. 编目规则定义字段、字段类型与分词器配置
    managed-schema\text{managed-schema}
  4. 属性文件记录核心名称与数据目录路径
    core.properties\text{core.properties}

索引构建:把书变成关键词卡片

一本新书入馆,编目员不会直接把它扔上书架,而是先做一张“关键词卡片”:书名拆成词、作者、主题、标签,分门别类塞进检索柜。Solr索引构建做的就是这件事——把文档变成一张张可检索的卡片。

Solr的核心创新是倒排索引(Inverted Index):把“文档→包含哪些词”的正排视角,翻转成“词项→包含它的文档列表”的倒排视角。构建过程有三个关键环节。首先用分词器(Analyzer)将文档文本切分成词项,同时执行转小写、去停用词等过滤——把“的、了、吗”这类噪声词丢掉。接着为每个词项生成倒排记录(Posting),记录文档ID及词频、位置信息——相当于在卡片上写明“这本书在第几排书架第几格”。随后在提交(Commit)时把内存中的索引刷入磁盘,形成段(Segment)。后台还有段合并(Merge)线程把小段合并成大段,减少文件碎片,就像定期整理检录柜、合并散乱的卡片堆。

从数学上看,倒排索引就是一个从词项到文档集合的映射函数:

有了这套“关键词卡片柜”,查询时不再需要一本本翻书,而是像管理员那样直接抽出一张卡片“搜索”,上面列着1号和3号书架,顺着号码取书。这就是搜索引擎能在毫秒级时间内响应亿万文档的核心秘密——不翻书,翻卡片。

Inv(t)={d∈D∣t∈d}\displaystyle Inv(t) = \{ d \in D \mid t \in d \}
这个词的倒排记录表,就是所有包含词项 t 的文档集合。给定一个词,系统能立即回答“哪些文档提到了它”,而不必遍历全部文档。
  1. 词项t分词后得到的关键词,如“搜索”、“索引”
    tt
  2. 文档全集D所有被索引的文档组成的集合
    DD
  3. 包含条件文档d的文本中出现了词项t
    t∈dt \in d
  4. 倒排映射词项t对应的全部文档集合,即倒排记录表
    Inv(t)={d∈D∣t∈d}Inv(t) = \{ d \in D \mid t \in d \}

查询处理:读者的问题如何被解答

当读者走到服务台说“我要找讲分布式的书”,管理员要做的远不止翻卡片——先要判断读者是否想要“分布式系统”“分布式架构”等泛化概念,再从候选卡片中挑出最相关的几本排序推荐。Solr的查询处理链路正是这套流程的自动化。

Solr查询处理从查询解析器(QParser)起步。edismax解析器能把用户输入拆分成多个字段的加权查询,例如同时搜索标题和正文。查询串被编译为Lucene Query对象后,IndexSearcher在倒排索引上执行匹配,得到候选文档集合。随后使用BM25打分算法对候选集排序——这是当前搜索领域的主流相关度模型,它综合词频(出现越多越相关,但边际收益递减)和逆文档频率(越罕见越有区分度),并对长文档施加长度归一化惩罚。最后,结果集处理器完成分页(start/rows)、高亮(highlight)、归组(group)等加工,把最终结果交给响应层。

BM25的公式看起来复杂,但拆开看并不吓人:

这套组合拳下来,服务台不再“是个讲分布式的都报给你”,而是把最贴近需求的几本排在前面。你看到的结果页排序,背后就是BM25在悄悄计算每一篇文档的相关度分数。

Score(d,q)=∑t∈qIDF(t)⋅ft,d(k1+1)ft,d+k1(1−b+b⋅lendavgdl)\displaystyle \text{Score}(d,q) = \sum_{t \in q} \text{IDF}(t) \cdot \frac{f_{t,d}(k_1+1)}{f_{t,d} + k_1\left(1-b+b\cdot \frac{len_d}{avgdl}\right)}
这个公式衡量文档 d 与查询 q 的相关性:每个查询词 t 的“稀有度加分”乘以“词频贡献”,最后把查询里所有词的得分加起来。词频越高得分越高,但有个上限(饱和),长文档的词频还会被打折,防止长文章靠堆字数取胜。
  1. 查询词求和对用户查询里的每个词项分别计算贡献并累加
    ∑t∈q\sum_{t \in q}
  2. 逆文档频率词项在全库越罕见,IDF值越大,区分度越高
    IDF(t)\text{IDF}(t)
  3. 词频饱和因子词频贡献受k1参数调控,出现10次和100次的差距不会无限拉大
    ft,d(k1+1)ft,d+k1(⋯ )\frac{f_{t,d}(k_1+1)}{f_{t,d}+k_1(\cdots)}
  4. 长度归一化长文档的词频要按比例打折,避免长文作弊
    b⋅lendavgdlb \cdot \frac{len_d}{avgdl}

性能优化:让图书馆更快地找书

热门书借阅量巨大,如果每次都跑到三楼去取,读者等得着急,管理员跑断腿。于是图书馆把热门书放到入口的推荐专架上。Solr也有自己的“热门专架”——缓存。

Solr提供三大缓存:filterCache缓存过滤器结果(如“分类=科技”),避免重复解析过滤条件;queryResultCache缓存查询返回的文档ID列表,让重复查询秒回;documentCache缓存最近访问的完整文档,节省磁盘IO。但缓存不是越大越好——它消耗的JVM堆内存正是GC压力的来源。并发控制同样关键:autoCommit间隔决定索引刷盘频率、maxBooleanClauses限制单次查询的布尔子句数量、线程池参数影响吞吐上限。调优时必须配合Solr Admin UI的Stats页面、JVM监控(jstat/GC日志)定位瓶颈,再动手调整,而不是盲猜。

缓存的有效性可以用一个简单指标衡量——命中率。命中率高说明缓存确实在发挥作用;命中率低,白白占着内存,就该考虑调小或换策略了。

建了热门书专架也不是越多越好——专架占空间,堆得太满反而挡住通道。命中率就是告诉管理员:这个专架到底值不值得占地方。Solr调优的本质,是在空间与时间之间找平衡的取舍艺术。

HitRate=HitsHits+Misses\displaystyle \text{HitRate} = \frac{Hits}{Hits + Misses}
命中率 = 缓存命中的请求数 ÷ 总请求数。它直观反映了“热门专架”到底有多少人在用。
  1. 命中次数请求直接在缓存中返回结果,无需走完整查询链路
    HitsHits
  2. 未命中次数缓存中没有对应数据,需要重新查询索引
    MissesMisses
  3. 命中率命中次数占全部请求次数的比例,越接近1越好
    HitRate=HitsHits+Misses\text{HitRate} = \frac{Hits}{Hits + Misses}

SolrCloud:全市图书馆联网

一个城市往往有多个图书馆分馆,读者在任意分馆都能借到全城藏书——靠的是统一检索、馆际调拨和协调办公室。SolrCloud正是把“单座图书馆”升级为“全市图书馆联盟”的分布式方案。

SolrCloud将一个Collection(逻辑索引)水平切分成多个分片(Shard),每个分片只存一部分数据;每个分片又有若干副本(Replica),既能防数据丢失,又能分摊读流量。ZooKeeper在这里扮演“协调办公室”的角色:维护集群元数据(分片在哪些节点、哪个副本是leader)、实现leader选举、支持集群节点互相发现。当查询到达时,客户端先访问ZooKeeper获取路由信息,再定位到具体分片执行操作。得益于这套机制,集群可以横向扩容新节点、故障时自动转移leader、滚动升级不中断服务。

分片和副本的数量直接影响集群的规模与可用性。假设每个分片固定R个副本,那么整个Collection的物理副本总数就是二者的乘积:

分馆再多,缺乏协调办公室就会乱套——哪本书在哪个馆、哪本被借走了,都必须有中心账本。ZooKeeper就是那个账本兼调度员,让“全市联网借书”成为可能。理解了这套总分馆体系,你就明白了SolrCloud既是搜索集群,也是高可用架构的样板间。

Total=Nshards×Rfactor\displaystyle \text{Total} = N_{shards} \times R_{factor}
分片数乘以副本因子,等于整个 SolrCloud 集群中实际维护的物理副本总数。它决定了集群要占用多少存储与计算资源,也决定了能承受多大规模的故障。
  1. 分片数集合被水平切分为多少个数据分片
    NshardsN_{shards}
  2. 副本因子每个分片配置多少个物理副本
    RfactorR_{factor}
  3. 总副本数整个集合在集群中的物理副本总量
    Total=Nshards×Rfactor\text{Total} = N_{shards} \times R_{factor}

AI 应用场景

电商商品搜索

阶段:检索召回 + 相关性排序

解决的问题:传统数据库的LIKE查询在海量商品上做模糊匹配效率极低,无法处理同义词、拼写纠错和相关性排序。Solr用倒排索引加BM25,把“查全表”变成“查卡片柜”。

具体案例:某电商平台将数千万商品写入Solr,用户输入“红色连衣裙”时,分词器切出“红色”“连衣裙”,倒排索引瞬间召回候选,BM25按相关度排序返回前20条。平台还配置了同义词词典,让“红裙”也能召回“红色连衣裙”。

日志集中检索

阶段:数据索引 + 跨节点检索

解决的问题:业务日志分散在多台服务器,排障时用grep翻大文件效率极低,难以按时间范围、traceId、关键字组合查询。

具体案例:运维团队搭建SolrCloud,把多台机器上的应用日志按天建立索引,配置3分片+2副本保证高可用。排障时用“traceId + 时间范围”组合查询,日志命中从分钟级降到毫秒级,配合ZooKeeper的故障转移机制,集群稳定运行不掉线。

内容平台去重

阶段:内容召回 + 相似度判定

解决的问题:内容平台从不同渠道抓取资讯,大量相似或重复稿件需要识别,纯人工去重成本极高。

具体案例:用Solr对每篇文章的标题和正文构建倒排索引,新稿进入时基于重叠词项的比例做相似度判定,重复稿件自动打上“疑似转载”标签。借力Solr的索引构建与批量更新能力,日均处理数万篇文章。

Python 演示

python46 行
"""简化版 Solr 倒排索引:构建与查询演示"""import re  class InvertedIndex:    def __init__(self):        self.postings = {}        self.doc_count = 0     def analyze(self, text):        return [w for w in re.split(r'[^\w\u4e00-\u9fa5]+', text) if w]     def add_doc(self, text):        self.doc_count += 1        doc_id = self.doc_count        for term in set(self.analyze(text)):            self.postings.setdefault(term, []).append(doc_id)        return doc_id     def search(self, query):        terms = self.analyze(query)        if not terms:            return []        result = set(self.postings.get(terms[0], []))        for term in terms[1:]:            result &= set(self.postings.get(term, []))        return sorted(result)  def main():    idx = InvertedIndex()    docs = [        "Solr 是基于 Lucene 的搜索引擎",        "Solr 支持分布式部署与容灾",        "Lucene 是最流行的索引库",    ]    for text in docs:        print("文档%d: %s" % (idx.add_doc(text), text))     query = "Solr 搜索引擎"    print("\n查询: %s" % query)    print("命中文档: %s" % idx.search(query))  if __name__ == "__main__":    main()
目的:用纯Python实现一个微型倒排索引——模拟Solr从文档分词、建立倒排记录表到查询取交集的完整链路,方便直观理解核心原理。
  1. self.postings.setdefault(term, []).append(doc_id)对每个词项建立“词→文档ID列表”的映射,这正是倒排索引的核心数据结构。
  2. self.doc_count += 1每篇文档获得唯一ID,就像图书馆给每本书编索书号。
  3. re.split(r'[^\w\u4e00-\u9fa5]+', text)简易分词:按非字母/数字/中文字符切分,相当于Solr里Analyzer的“切词”动作。
  4. result = set(self.postings.get(terms[0], []))取第一个查询词对应的文档集合作为结果起点。
  5. result &= set(self.postings.get(term, []))对后续每个查询词取交集,实现多个词必须同时命中的"AND"语义。
  6. if __name__ == "__main__":Python标准入口写法,让脚本既可被导入也可直接运行。

常见误区

误区以为Solr像关系型数据库那样用二维表存数据,查询就是在表里逐行扫描找匹配,所以把SQL习惯直接搬到Solr上。

正解Solr本质是倒排索引:以词为线索指向文档,类似书末的关键词索引页;而MySQL用B+树按行存储。Solr擅长全文检索与相关度排序,MySQL擅长事务与复杂关联查询,二者是不同物种,不能互相替代。

为何常见:Solr管理界面有类似表格的数据预览,查询语法也支持冒号过滤,容易让人误以为它就是“能搜的数据库”。

误区以为改完managed-schema文件保存即可,不用重启也不用重新加载,下次查询就能用到新字段。

正解修改managed-schema后,必须执行Core Reload(重新加载)或重启Solr实例才会生效;如果改的是已有字段的分词器或类型,通常还需要重建索引,否则旧索引无法按新规则正确检索。

为何常见:Solr支持热加载配置,管理界面有"Reload"按钮,小白常常点了保存就当完事了,忽略了索引与配置的同步关系。

误区认为分片数越多,每个分片数据越少,查询自然越快,于是无限增加分片。

正解分片增多后,一次查询需要向所有分片广播请求,再聚合各分片返回的结果做全局排序,协调开销显著增加。分片数应该根据数据量、文档大小和单节点性能合理规划,通常控制在节点CPU核数的合理倍数内。

为何常见:分布式系统“越多越好”的直觉——数据分散存储确实能降单点压力,但忽略了查询聚合的通信成本。

误区把filterCache和queryResultCache设到JVM堆内存上限,认为大缓存一定能大幅提升性能。

正解缓存占用的是JVM堆内存,设得过大必然挤压索引缓存和临时对象空间,导致频繁Full GC,查询反而变慢。正确做法是先看命中率(HitRate),命中率太低就调小或检查查询是否使用了随机参数。

为何常见:“空间换时间”的直觉让人以为缓存多多益善,忽略了JVM内存是有限的共享资源。

误区以为reindex和restart是一回事,重启后索引就“重建”好了。

正解重启只是重新加载磁盘上已有的索引文件;重建索引(full reindex)则是从数据源(数据库、文件、消息队列)重新读取全部文档,走完分词、构建倒排索引的完整流程,可能要跑几小时甚至几天。

为何常见:运维命令里既有restart也有reload,实际遇到“索引和配置对不上”时,新手第一反应是重启,却不知道问题出在索引数据本身已经过期。

面试题

Q1. Solr中承载一个独立索引库的基本单元是什么?

单选题 · easy

  • A.Core(核心)← 正确答案
  • B.Index(索引)
  • C.Shard(分片)
  • D.Segment(段)

答案:A。Core是Solr中一个独立的核心实例,拥有自己的配置和索引目录,就像图书馆里独立的阅览室。Shard是SolrCloud中的分片概念,Segment是Lucene底层索引段的称呼,都不是独立的索引库单元。

Q2. 倒排索引中,词项“搜索”对应的记录表存储的是什么?

单选题 · easy

  • A.包含该词的全部文档ID← 正确答案
  • B.文档里所有的词项集合
  • C.与该词含义相近的词语
  • D.文档的权重评分信息

答案:A。倒排索引是“词→文档列表”的映射,“搜索”这个词项后面挂的是所有包含它的文档ID。选项B描述的是正排索引(文档→词项),C是词典扩展,D是排序阶段的信息,都不属于倒排记录表的核心内容。

Q3. solrconfig.xml 主要负责配置的是?

单选题 · mid

  • A.字段类型与分词规则
  • B.请求处理器与缓存参数← 正确答案
  • C.文档内容的存储结构
  • D.客户端的认证授权

答案:B。solrconfig.xml是Solr的“运营总手册”,负责请求处理器、缓存、自动提交策略等运行时行为。字段类型与分词规则属于managed-schema的职责;文档内容存储由Lucene目录管理,不是配置文件的直接内容。

Q4. Solr中 managed-schema 文件的核心作用是?

单选题 · mid

  • A.设定自动提交与段合并策略
  • B.定义字段类型与分词器配置← 正确答案
  • C.配置 ZooKeeper 集群地址
  • D.管理系统运行时的用户权限

答案:B。managed-schema定义字段、字段类型和分析器,相当于图书馆的“编目规则”。自动提交与段合并策略在solrconfig.xml里;ZooKeeper配置在solrcloud相关配置文件中;用户权限由安全插件管理,都不属于schema的职责。

Q5. 查询时Solr用下列哪种结构快速定位文档?

单选题 · mid

  • A.正排索引表
  • B.倒排索引表← 正确答案
  • C.B+树索引表
  • D.哈希散列表

答案:B。Solr基于Lucene构建,查询时依赖倒排索引从词项出发定位文档,这正是“查卡片柜”的秒级定位方式。正排索引用于从文档取词,B+树是数据库的索引结构,哈希表不是Lucene的核心检索结构。

Q6. SolrCloud中 ZooKeeper 主要负责的职责是?

单选题 · hard

  • A.存储全部索引数据并备份
  • B.维护元数据与领导选举协调← 正确答案
  • C.对文档内容执行分词过滤
  • D.直接处理用户的查询请求

答案:B。ZooKeeper是SolrCloud的“协调办公室”:维护分片与副本的元数据、执行leader选举、管理集群节点状态。索引数据存储在Solr节点本身,分词由analyzer完成,查询由Solr的搜索组件处理,这些都不是ZooKeeper的职责。

Q7. 下列哪个不属于 Solr 的常见缓存类型?

单选题 · mid

  • A.filterCache 过滤器缓存
  • B.queryResultCache 查询结果缓存
  • C.documentCache 文档加载缓存
  • D.accessCache 访问日志缓存← 正确答案

答案:D。Solr三大经典缓存是filterCache、queryResultCache和documentCache,分别缓存过滤结果、查询ID列表和文档内容。accessCache不是Solr的标准缓存类型,属于干扰项。

Q8. 以下哪些属于 Solr 核心配置文件的组成?

多选题 · mid

  • A.solrconfig.xml 总控配置← 正确答案
  • B.managed-schema 字段编目← 正确答案
  • C.core.properties 核心属性← 正确答案
  • D.log4j2.xml 日志配置

答案:ABC。Solr核心配置三件套是solrconfig.xml(运营手册)、managed-schema(编目规则)和core.properties(门牌)。log4j2.xml管理日志输出,虽然也是配置文件,但不属于“核心配置三件套”的范畴。

Q9. 关于倒排索引的说法,正确的有哪些?

多选题 · hard

  • A.倒排索引是词项到文档列表的映射← 正确答案
  • B.倒排索引是文档到词项列表的映射
  • C.分词器直接决定索引中词项的内容← 正确答案
  • D.倒排索引一旦构建就完全不可更新

答案:AC。倒排索引的核心就是“词→文档列表”,所以A对B错。分词器决定了文档被切成哪些词项,C对。Solr支持增量更新与段合并,索引可以不断追加和优化,D错。记住口诀:“正排看文档,倒排找词条”。

Q10. SolrCloud 提升系统可用性的手段包括?

多选题 · easy

  • A.将索引水平切分为多个分片← 正确答案
  • B.为分片配置多个副本节点← 正确答案
  • C.借助 ZooKeeper 实现故障转移← 正确答案
  • D.所有副本必须部署在同一台机器

答案:ABC。分片分担数据压力、副本提供冗余、ZooKeeper负责协调与故障转移,三者共同提升可用性。副本必须部署在不同节点上才有意义,否则一台机器宕机,副本和主分片同时丢失,D选项描述错误。