1. 绪论
1.1 在典型互联网业务中,关系型数据库有哪些瓶颈?
- 可扩展性差: 难以应对海量数据和高并发读写,纵向扩展(升级硬件)成本高且有上限。
- 高并发下的I/O瓶颈: 当并发读写量巨大时,磁盘I/O成为主要瓶颈。
- 读写性能不足: 对于简单的查询-写入场景,关系型数据库的事务和锁机制带来较大开销。
- 固定表结构不灵活: schema 预定义且严谨,难以快速应对业务变化和存储半结构化/非结构化数据。
- 可用性问题: 传统的主从架构在主库故障时,切换可能不够自动化,存在服务中断风险。
1.2 分析NoSQL数据库的技术特点。
- 无固定Schema: 数据模型灵活,可以动态添加字段,适合快速迭代的开发模式。
- 高可扩展性: 支持水平扩展,通过添加节点来分散负载,通常采用分布式架构。
- 高性能: 通过简化数据模型(如键值对)、弱化一致性保证等方式,获得极高的读写吞吐量。
- 高可用性: 采用多副本、无中心节点等设计,保证系统在部分节点故障时仍能提供服务。
- 最终一致性: 遵循BASE理论,放宽对强一致性的要求,以换取系统的高可用和分区容错性。
1.3 NoSQL是否可以取代关系型数据库?描述两者的关系。
不可以取代 。两者是互补而非替代关系。
- 关系型数据库 : 适用于需要强一致性、复杂事务、结构化数据的场景,如银行交易、财务系统。
- NoSQL数据库 : 适用于高并发、海量数据、灵活 schema、最终一致性可接受 的场景,如社交网络、物联网、内容管理系统。
在现代架构中,两者常共存,形成混合持久化策略。
1.4 NoSQL可以解决大数据技术体系中的哪些问题?
- 海量数据存储问题: 通过水平扩展,支持PB级别的数据存储。
- 高并发读写问题: 通过分布式架构,将请求分散到多个节点,处理百万级并发。
- 多样数据类型问题: 灵活的数据模型可以存储日志、文档、图片、关系图等半结构化和非结构化数据。
- 高可用与容灾问题: 通过数据多副本和自动故障转移,保证系统7x24小时可用。
1.5 NoSQL的典型应用场景。
- 社交网络(如:用户关系图谱 - Neo4j)
- 内容管理/博客平台(如:文章存储 - MongoDB)
- 电商购物车/会话缓存(如:Redis)
- 物联网数据采集(如:传感器时序数据 - InfluxDB)
- 实时消息系统(如:Cassandra)
- 搜索引擎(如:Elasticsearch)
1.6 云计算的定义。
云计算是一种通过互联网("云")按需提供计算资源(包括服务器、存储、数据库、网络、软件、分析和智能)的模式,通常采用按使用量付费的定价模型。
1.7 云计算的基本特征。
- 按需自助服务
- 广泛的网络接入
- 资源池化
- 快速弹性伸缩
- 可计量的服务
1.8 云计算按照服务模式可以分为哪几类?分别指什么?
- IaaS(基础设施即服务): 提供最底层的计算、存储、网络等基础资源。用户无需管理底层基础设施,但需要控制和部署操作系统及应用程序。例如:AWS EC2, 阿里云ECS。
- PaaS(平台即服务): 提供应用程序的开发、运行环境,包括操作系统、数据库、Web服务器等。用户只需关注应用程序本身的开发和部署。例如:Google App Engine, Heroku。
- SaaS(软件即服务): 通过互联网提供完整的、可直接使用的应用程序。用户无需管理任何底层设施,直接使用软件。例如:Gmail, Salesforce, 钉钉。
1.9 什么是容器化技术。
容器化技术是一种操作系统级的虚拟化技术,用于将应用程序及其所有依赖项(库、环境变量、配置文件等)打包成一个独立的、标准化的单元(称为容器 )。该容器可以在任何支持该技术的环境中一致地运行。Docker 是其最典型的代表。
2. NoSQL数据库基本原理
2.1 描述分布式数据管理的特点。
- 数据分片: 将数据拆分成多个部分,分布到不同的节点上。
- 数据副本: 同一份数据在多个节点上存有副本,以提高可靠性和读性能。
- 一致性维护: 需要机制来保证多个副本之间的数据一致性。
- 高可用性: 部分节点故障时,系统整体仍能提供服务。
- 负载均衡: 请求被均匀分布到各个节点,避免单点过热。
2.2 什么是CAP原理?
CAP原理指出,一个分布式系统最多只能同时满足一致性 、可用性 和分区容错性这三项中的两项。
- C(一致性): 所有节点在同一时间看到的数据是相同的。
- A(可用性): 每个请求都能得到响应(不保证是最新数据)。
- P(分区容错性): 系统在遇到网络分区(节点间无法通信)时仍能继续运行。
2.3 CAP原理是否适用于单机环境?
不适用 。CAP理论的前提是分布式系统。单机系统不存在网络分区(P)的问题,因此可以同时保证强一致性(C)和高可用性(A)。
2.4 试述BASE的具体含义。
BASE是对CAP中一致性和可用性权衡的结果,其核心思想是最终一致性。
- BA(基本可用): 系统在出现故障时,保证核心功能仍然可用,允许损失部分非核心功能或性能(如响应时间变长)。
- S(软状态): 允许系统中的数据存在中间状态,并且该中间状态不会影响系统整体可用性。
- E(最终一致性): 经过一段时间后,所有数据副本最终会达到一致的状态。
2.5 在数据一致性问题上,ACID和BASE的差别是什么?
- ACID : 强调强一致性,是关系型数据库的核心。事务是原子的、隔离的,数据在事务结束后立即处于一致状态。
- BASE : 强调高可用性,是NoSQL数据库的哲学。数据一致性是"最终"的,允许存在短暂的不一致窗口。
2.6 列举NoSQL的数据模型,描述其基本特点和适用场景,并为每种模式举出1种常见数据库。
- 键值模型 : 数据是键值对集合,简单高效。适用:会话存储、缓存。数据库:Redis。
- 文档模型 : 数据是类似JSON的文档,schema灵活。适用:内容管理、用户档案。数据库:MongoDB。
- 列族模型 : 数据按列族存储,适合大规模数据分析。适用:日志系统、推荐系统。数据库:HBase。
- 图模型 : 数据以节点和边的关系存储,擅长处理复杂关系。适用:社交网络、欺诈检测、推荐引擎。数据库:Neo4j。
2.7 布隆过滤器的优缺点是什么?如何降低布隆过滤器的误报率?
- 优点: 空间效率和查询时间都远超一般算法。
- 缺点 :
- 存在误报率(False Positive):可能将不属于集合的元素误判为存在。
- 不支持删除操作。
- 降低误报率的方法 :
- 增加二进制向量(位数组)的长度。
- 增加哈希函数的数量。
3. MongoDB原理和使用
3.1 描述MongoDB数据库的主要特点
- 文档模型: 以BSON(二进制JSON)格式存储文档,schema灵活。
- 高性能: 支持嵌入式数据模型,减少了数据库的I/O操作。
- 高可用性: 提供副本集,实现自动故障转移。
- 水平扩展: 提供分片集群,支持海量数据存储和高并发。
- 丰富的查询语言: 支持丰富的查询、聚合操作和索引(包括地理空间索引)。
4. MongoDB的管理与集群部署
4.1 描述MongoDB集群的数据多副本策略。
通过副本集实现。一个副本集包含多个MongoDB服务器节点:
- 一个主节点: 负责处理所有写操作和读操作(默认)。
- 一个或多个从节点: 复制主节点的数据,可用于读操作或作为备份。
- 一个仲裁节点(可选): 不存储数据,仅用于投票选举。当主节点故障时,剩余节点会自动选举出新的主节点,实现高可用。
4.2 描述MongoDB的分片机制,支持几种分片策略?
MongoDB通过分片集群 实现水平扩展,将数据分布到多个分片(服务器)上。
支持两种分片策略:
- 范围分片: 基于分片键的值范围将数据划分为不同的块。适合范围查询。
- 哈希分片: 对分片键的值计算哈希值,根据哈希值分布数据。保证数据均匀分布,但不适合范围查询。
4.3 描述MongoDB的分片集群架构(包含的角色和每个角色的作用)。
- 分片: 存储实际数据子集的MongoDB实例(通常是副本集)。每个分片是集群中的一个数据子集。
- 配置服务器: 存储集群的元数据和配置信息(如数据块与分片的映射关系)。本质上是特殊的MongoDB副本集。
- 查询路由 : 即
mongos实例,是应用程序的访问入口。它缓存配置服务器的元数据,将客户端请求路由到正确的分片上。
5. 图数据库Neo4J
5.1 什么是Neo4j?并对其数据模型进行详细描述。
Neo4j是一个高性能的原生图数据库 。
其数据模型由以下核心部分组成:
- 节点 : 表示实体,例如一个人、一个产品。节点可以有标签 (如
Person)和属性 (如name: "Alice")。 - 关系 : 表示节点之间的连接,关系是有方向 的。关系必须有类型 (如
FOLLOWS)和也可以有属性 (如since: 2023)。 - 属性: 是键值对,用于描述节点或关系的特征。
5.2 简要描述Neo4j的使用场景(至少4个)。
- 社交网络: 分析用户之间的关系,寻找好友推荐或影响力人物。
- 欺诈检测: 通过分析交易、设备、IP地址之间的复杂关系网络,识别欺诈团伙。
- 实时推荐引擎: "购买了该商品的人也购买了..."这类基于关系的推荐。
- 知识图谱: 构建和查询实体间的复杂知识网络。
5.3 Neo4j作为一种图数据库,在构建知识图谱方面有哪些优势?
- 白描式存储: 直观地以节点和边存储知识,与人的思维方式一致。
- 高效关系查询: 专门为遍历关系优化,查询深度关系的性能远高于关系型数据库。
- 灵活性强: 易于添加新的实体类型、关系类型和属性,无需复杂的表结构变更。
- 支持Cypher查询语言: 声明式的、强大的图查询语言,能直观地表达复杂的图模式匹配。
6. 键值对数据库Redis
6.1 Redis应用场景的特点,并举例说明。
特点: 数据存储在内存中,读写速度极快,支持丰富的数据结构。
- 举例 :
- 缓存: 缓存数据库查询结果,减轻后端压力。(场景:网页内容缓存)
- 会话存储: 存储用户登录会话信息。(场景:电商购物车)
- 排行榜: 利用有序集合实现实时排行榜。(场景:游戏积分榜)
- 消息队列: 使用列表的推送和弹出操作实现简单的消息队列。
6.2 描述Redis的数据类型。
- String: 最简单的键值类型。
- List: 字符串列表,按插入顺序排序。
- Set: 无序的字符串集合,元素不重复。
- Sorted Set: 有序的字符串集合,每个元素关联一个分数用于排序。
- Hash: 键值对集合,适合存储对象。
- Bitmaps 和 HyperLogLogs: 用于特定场景如统计活跃用户。
6.3 Redis数据库的集群架构(多副本机制和分片机制)。
- 多副本机制(主从复制): 一个主节点负责写,多个从节点复制主节点数据负责读,实现读写分离和数据备份。
- 分片机制(Redis Cluster): 采用无中心架构,数据被分到16384个槽中,每个节点负责一部分槽。客户端可以直接连接到任意节点,如果数据不在该节点,节点会返回重定向信息。
6.4 Redis的事务机制是什么?它和传统的MySQL数据库事务有什么不同。
- Redis事务 : 使用
MULTI,EXEC等命令实现。它本质上是将一组命令打包、顺序执行,但不支持回滚。在执行过程中,即使某条命令失败,后面的命令仍会继续执行。 - 与MySQL的不同 :
- 原子性: MySQL支持回滚(Atomicity),Redis不支持。
- 隔离性: Redis是单线程执行事务,因此总是具有隔离性。MySQL有不同的事务隔离级别。
- 一致性: 两者都致力于保证一致性。
6.5 Redis的持久化方式有哪些?各自的优缺点是什么?
- RDB(快照) :
- 优点: 文件紧凑,适合灾难恢复;最大化Redis性能;恢复大数据集时比AOF快。
- 缺点: 会丢失最后一次快照之后的数据;在数据集庞大时,fork子进程的过程可能很耗时。
- AOF(追加日志) :
- 优点: 数据耐久性更高,最多丢失一秒的数据;AOF文件易于理解和解析。
- 缺点: 文件通常比RDB大;恢复速度慢;写负载高时可能影响性能。
7. Cassandra的原理和使用
7.1 HBase和Cassandra在架构上有什么不同?
- HBase: 主从架构。依赖于HDFS进行存储,依赖ZooKeeper进行协调,RegionServer负责数据读写,HMaster负责管理。
- Cassandra: 无中心节点的P2P架构。所有节点完全对等,数据分布式存储在每个节点上。
7.2 各自的架构有什么优缺点?
- HBase :
- 优点: 与Hadoop生态集成紧密,适合做大数据分析。
- 缺点: 架构复杂,组件多,存在单点故障风险(HMaster)。
- Cassandra :
- 优点: 无单点故障,高可用性和可扩展性极佳,写入性能非常高。
- 缺点: 读取延迟可能因数据分布而产生波动,对分析查询的支持不如HBase。
7.3 Cassandra系统架构中,种子节点的作用是什么?
种子节点用于节点发现。当一个新节点加入集群时,它会联系种子节点来获取集群的拓扑信息(其他节点的网络地址),从而加入到正确的环中。
7.4 Cassandra表中的主键分为哪几种类型?如何区分它们?
- 分区键: 主键的第一个部分(或复合部分)。用于决定数据在集群中存储在哪个节点上。
- 聚簇列: 主键中分区键之后的部分。用于决定数据在分区内的排序顺序。
- 区分 : 主键定义中,第一部分是分区键,后面的部分是聚簇列。例如:
PRIMARY KEY ((part_key1, part_key2), cluster_key1, cluster_key2),括号内的是复合分区键。
7.5 Cassandra如何支持数据一致性?
Cassandra通过可调一致性来实现。客户端可以为每次读写操作指定一致性级别:
- 写一致性级别 : 如
ONE、QUORUM、ALL。表示写操作需要成功写入多少个副本才算成功。 - 读一致性级别 : 如
ONE、QUORUM、ALL。表示读操作需要从多少个副本读取数据后才返回。
通过设置写一致性级别 + 读一致性级别 > 副本因子,可以实现强一致性。
8. Hadoop和Hbase
8.1 HDFS是否属于NoSQL数据库?
不属于 。HDFS是一个分布式文件系统,它提供的是底层的文件存储服务,不具备NoSQL数据库所拥有的数据模型、灵活的API和高效的数据检索能力。
8.2 请说明用HDFS进行数据管理存在的问题。
- 高延迟访问: 不适合低延迟的随机读写。
- 不支持小文件存储: 大量小文件会耗尽NameNode内存。
- 只能批量写入: 不支持文件的随机修改。
- 缺少结构化/半结构化数据的管理能力。
8.3 HBase采用了什么样的数据结构?
HBase内部使用LSM-Tree作为其核心存储结构。它将随机写转换为顺序写,先写入内存中的MemStore,再刷写到磁盘形成不可变的HFile,非常适合高写入吞吐量的场景。
8.4 HBase的拓扑结构是什么?每个角色起什么作用?
- HMaster: 管理节点,负责RegionServer的负载均衡、分配Region、管理表的DDL操作。
- RegionServer: 数据节点,负责处理对其上Region的读写请求。
- Region: 表的分片,当表变大时会被自动分割。
- ZooKeeper: 协调者,负责维护集群状态,协助HMaster进行故障发现和选举。
8.5 描述meta表的结构。
hbase:meta 表存储了所有用户Region的位置信息。
- 行键: 表名,起始行键,时间戳
- 列 :
info:regioninfo(包含该Region的序列化信息),info:server(存储该Region所在的RegionServer地址)。
8.6 预写日志(WAL)的作用。
WAL的核心作用是数据持久化和故障恢复。当数据写入MemStore之前,会先被追加写入WAL。如果RegionServer崩溃,MemStore中未持久化的数据可以通过重放WAL来恢复,防止数据丢失。
9. 其他NoSQL数据库简介
9.1 时序数据库可以用在哪些场景?(4个)
- 物联网监控: 存储传感器上报的温度、湿度等数据。
- 系统监控: 存储服务器CPU、内存、网络指标。
- 金融行业: 存储股票、加密货币的实时价格。
- 应用性能监控: 存储应用的请求量、响应时间等指标。
9.2 时序数据库是否需要具备灵活的数据更新能力?为什么?
不需要 。时序数据通常是只追加的,数据点一旦产生就很少需要更新(如一个传感器在特定时间戳的温度值)。将资源优化用于高速写入和按时间范围查询,比支持灵活更新更重要。
9.3 搜索引擎的工作原理是什么?
- 爬取: 遍历互联网,发现和下载网页内容。
- 解析: 提取网页中的文本、链接和其他元数据。
- 建立索引: 对解析后的内容进行分析(分词等),构建一个类似于书籍末尾"索引"的倒排索引,实现从词到文档的快速映射。
- 搜索与排序: 根据用户查询,从索引中找出相关文档,并按相关性等进行排序后返回给用户。
9.4 搜索引擎中如何对搜索结果排序的?
使用复杂的排序算法,综合考虑数百个因素,核心包括:
- TF-IDF: 评估一个词在文档中的重要程度。
- PageRank: 评估网页本身的权威性。
- BM25: 一种比TF-IDF更先进的评分函数。
- 用户行为与个性化: 点击率、用户历史搜索记录等。
- 内容质量与新鲜度: 内容原创性、发布时间等。