Skip to content

IT 运维面试问题总结-数据库(NoSQL、MongoDB、MySQL)

运维

1、简述 NoSQL 是什么?

NoSQL,指的是非关系型的数据库。NoSQL 有时也称作 Not Only SQL(意即 " 不仅仅是 SQL") 的缩写,其显著特点是不使用 SQL 作为查询语言,数据存储不需要特定的表格模式。

2、简述 NoSQL(非关系型)数据库和 SQL(关系型)数据库的区别?

NoSQL 和 SQL 的主要区别有如下区别:

存储方式

  • 关系型数据库是表格式的,因此存储在表的行和列中。他们之间很容易关联协作存储,提取数据很方便。
  • NoSQL 数据库则与其相反,它是大块的组合在一起。通常存储在数据集中,就像文档、键值对或者图结构。

存储结构

  • 关系型数据库对应的是结构化数据,数据表都预先定义了结构(列的定义),结构描述了数据的形式和内容。预定义结构带来了可靠性和稳定性,但是修改这些数据比较困难。
  • NoSQL 数据库基于动态结构,使用与非结构化数据。由于 NoSQL 数据库是动态结构,可以很容易适应数据类型和结构的变化。

存储规范

  • 关系型数据库的数据存储为了更高的规范性,把数据分割为最小的关系表以避免重复,获得精简的空间利用。
  • NoSQL 数据存储在平面数据集中,数据经常可能会重复。单个数据库很少被分隔开,而是存储成了一个整体,这样整块数据更加便于读写。

存储扩展

  • 关系型数据库数据存储在关系表中,操作的性能瓶颈可能涉及到多个表,需要通过提升计算机性能来克服,因此更多是采用纵向扩展
  • NoSQL 数据库是横向扩展的,它的存储天然就是分布式的,可以通过给资源池添加更多的普通数据库服务器来分担负载。

查询方式

  • 关系型数据库通过结构化查询语言来操作数据库(即通常说的 SQL)。SQL 支持数据库 CURD 操作的功能非常强大,是业界的标准用法。
  • NoSQL 查询以块为单元操作数据,使用的是非结构化查询语言(UnQl),它是没有标准的。
  • 关系型数据库表中主键的概念对应 NoSQL 中存储文档的 ID。
  • 关系型数据库使用预定义优化方式(比如索引)来加快查询操作,而 NoSQL 更简单更精确的数据访问模式。

事务

  • 关系型数据库遵循 ACID 规则(原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性 (Durability))。
  • NoSQL 数据库遵循 BASE 原则(基本可用(Basically Availble)、软/柔性事务(Soft-state )、最终一致性(Eventual Consistency))。
  • 由于关系型数据库的数据强一致性,所以对事务的支持很好。关系型数据库支持对事务原子性细粒度控制,并且易于回滚事务。
  • NoSQL 数据库是在 CAP(一致性、可用性、分区容忍度)中任选两项,因为基于节点的分布式系统中,不可能同时全部满足,所以对事务的支持不是很好。

3、简述 NoSQL(非关系型)数据库和 SQL(关系型)数据库的各自主要代表?

SQL:MariaDB、MySQL、SQLite、SQLServer、Oracle、PostgreSQL。

NoSQL 代表:Redis、MongoDB、Memcache、HBASE。

4、简述 MongoDB 及其特点?

MongoDB 是一个开源的、基于分布式的、面向文档存储的非关系型数据库。是非关系型数据库当中功能最丰富、最像关系数据库的。其主要特点如下:

查询丰富:MongoDB 最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

面向文档:文档就是存储在 MongoDB 中的一条记录,是一个由键值对组成的数据结构。

模式自由:MongoDB 每一个 Document 都包含了元数据信息,每个文档之间不强迫要求使用相同的格式,同时他们也支持各种索引。

高可用性:MongoDB 支持在复制集 (Replica Set) 通过异步复制达到故障转移,自动恢复,集群中主服务器崩溃停止服务和丢失数据,备份服务器通过选举获得大多数投票成为主节点,以此来实现高可用。

水平拓展:MongoDB 支持分片技术,它能够支持并行处理和水平扩展。

支持丰富:MongoDB 另外还提供了丰富的 BSON 数据类型,还有 MongoDB 的官方不同语言的 driver 支持 (C/C++、C#、Java、Node.js、Perl、PHP、Python、Ruby、Scala)。

简述 MongoDB 的优势有哪些?

5、简述 MongoDB 的优势有哪些?

  • 面向文档的存储:以 JSON 格式的文档保存数据。
  • 任何属性都可以建立索引。
  • 复制以及高可扩展性。
  • 自动分片。
  • 丰富的查询功能。
  • 快速的即时更新。

6、简述 MongoDB 适应的场景和不适用的场景?

MongoDB 属于典型的非关系型数据库。

主要适应场景

  • 网站实时数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 数据缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载。
  • 高伸缩性场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。
  • 对象或 JSON 数据存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询。

不适应场景

  • 高度事务性系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
  • 传统的商业智能应用:针对特定问题的 BI 数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
  • 需要复杂 SQL 查询的场景。

7、简述 MongoDB 中的库、集合、文档?

  • 库:MongoDB 可以建立多个数据库,MongoDB 默认数据库为 "db"。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
  • 集合:MongoDB 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库中的表格)。集合存在于数据库中,集合没有固定的结构。
  • 文档:MongoDB 的 Document 是一组键值 (key-value) 对 (即 BSON),相当于关系型数据库的行。且不需要设置相同的字段,并且相同的字段不需要相同的数据类型。

8、简述 MongoDB 支持的常见数据类型?

MongoDB 支持丰富的数据类型,常见的有:

  • String:字符串。存储数据常用的数据类型。
  • Integer:整型数值。用于存储数值。
  • Boolean:布尔值。用于存储布尔值(真/假)。
  • Array:用于将数组或列表或多个值存储为一个键。
  • Date:日期时间。用 UNIX 时间格式来存储当前日期或时间。
  • Binary Data:二进制数据。用于存储二进制数据。
  • Code:代码类型。用于在文档中存储 JavaScript 代码。
  • Regular expression:正则表达式类型。用于存储正则表达式。

9、简述 MongoDB 索引及其作用?

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB 在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

10、简述 MongoDB 常见的索引有哪些?

MongoDB 常见的索引有:

  • 单字段索引(Single Field Indexes)
  • 符合索引(Compound Indexes)
  • 多键索引(Multikey Indexes)
  • 全文索引(Text Indexes)
  • Hash 索引(Hash Indexes)
  • 通配符索引(Wildcard Indexes)

11、简述 MongoDB 复制(本)集原理?

mongodb 的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb 各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作 oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

12、简述 MongoDB 的复制过程?

Primary 节点写入数据,Secondary 通过读取 Primary 的 oplog(即 Primary 的 oplog.rs 表)得到复制信息,开始复制数据并且将复制信息写入到自己的 oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从 oplog 的最后一个操作开始同步。同步完成后,将信息写入自己的 oplog,由于复制操作是先复制数据,复制完成后再写入 oplog,有可能相同的操作会同步两份,MongoDB 设定将 oplog 的同一个操作执行多次,与执行一次的效果是一样的。

当 Primary 节点完成数据操作后,Secondary 的数据同步过程如下:

1、检查自己 local 库的 oplog.rs 集合找出最近的时间戳。

2、检查 Primary 节点 local 库 oplog.rs 集合,找出大于此时间戳的记录。

3、将找到的记录插入到自己的 oplog.rs 集合中,并执行这些操作。

13、简述 MongoDB 副本集及其特点?

MongoDB 副本集是一组 Mongod 维护相同数据集的实例,副本集可以包含多个数据承载点和多个仲裁点。在承载数据的节点中,仅有一个节点被视为主节点,其他节点称为次节点。

主要特点:

  • N 个节点的集群,任何节点可作为主节点,由选举产生;
  • 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
  • 所有写入操作都在主节点上,同时具有自动故障转移,自动恢复;
  • 成员数应该为奇数,如果为偶数的情况下添加 arbiter,arbiter 不保存数据,只投票。

14、简述 MongoDB 有哪些特殊成员?

MongoDB 中 Secondary 角色存在一些特殊的成员类型:

  • Priority 0(优先级 0 型):不能升为主,可以用于多数据中心场景;
  • Hidden(隐藏型):对客户端来说是不可见的,一般用作备份或统计报告用;
  • Delayed(延迟型):数据比副集晚,一般用作 rolling backup 或历史快照。
  • Vote(投票型):仅参与投票。

15、简述 MongoDB 分片集群?

MongoDB 分片集群(Sharded Cluster):主要利用分片技术,使数据分散存储到多个分片(Shard)上,来实现高可扩展性。

分片是将数据水平切分到不同的物理节点。当数据量越来越大时,单台机器有可能无法存储数据或读取写入吞吐量有所降低,利用分片技术可以添加更多的机器来应对数据量增加以及读写操作的要求。

16、简述 MongoDB 分片集群相对副本集的优势?

MongoDB 分片集群主要可以解决副本集如下的不足:

  • 副本集所有的写入操作都位于主节点;
  • 延迟的敏感数据会在主节点查询;
  • 单个副本集限制在 12 个节点;
  • 当请求量巨大时会出现内存不足;
  • 本地磁盘不足;
  • 垂直扩展价格昂贵。

17、简述 MongoDB 分片集群的优势?

MongoDB 分片集群主要有如下优势:

  • 使用分片减少了每个分片需要处理的请求数:通过水平扩展,群集可以提高自己的存储容量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
  • 使用分片减少了每个分片存储的数据:分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当 MongoDB 单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或需要部署大型应用以充分利用内存时,可以使用分片技术。

18、简述 MongoDB 分片集群的架构组件?

MongoDB 架构组件主要有:

  • Shard:用于存储实际的数据块,实际生产环境中一个 shard server 角色可由几台机器组成一个 replica set 承担,防止主机单点故障。
  • Config Server:mongod 实例,存储了整个 ClusterMetadata,其中包括 chunk 信息。
  • Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

19、简述 MongoDB 分片集群和副本集群的区别?

副本集不是为了提高读性能存在的,在进行 oplog 的时候,读操作是被阻塞的;

提高读取性能应该使用分片和索引,它的存在更多是作为数据冗余,备份。

20、简述 MongoDB 的几种分片策略及其相互之间的差异?

MongoDB 的数据划分是基于集合级别为标准,通过 shard key 来划分集合数据。主要分片策略有如下三种:

  • 范围划分:通过 shard key 值将数据集划分到不同的范围就称为基于范围划分。对于数值型的 shard key:可以虚构一条从负无穷到正无穷的直线(理解为 x 轴),每个 shard key 值都落在这条直线的某个点上,然后 MongoDB 把这条线划分为许多更小的没有重复的范围成为块(chunks),一个 chunk 就是某些最小值到最大值的范围。
  • 散列划分:MongoDB 计算每个字段的 hash 值,然后用这些 hash 值建立 chunks。基于散列值的数据分布有助于更均匀的数据分布,尤其是在 shard key 单调变化的数据集中。
  • 自定义标签划分:MongoDB 支持通过自定义标签标记分片的方式直接平衡数据分布策略,可以创建标签并且将它们与 shard key 值的范围进行关联,然后分配这些标签到各个分片上,最终平衡器转移带有标签标记的数据到对应的分片上,确保集群总是按标签描述的那样进行数据分布。标签是控制平衡器行为及集群中块分布的主要方法。
    差异:
  • 基于范围划分对于范围查询比较高效。假设在 shard key 上进行范围查询,查询路由很容易能够知道哪些块与这个范围重叠,然后把相关查询按照这个路线发送到仅仅包含这些 chunks 的分片。
  • 基于范围划分很容易导致数据不均匀分布,这样会削弱分片集群的功能。
  • 基于散列划分是以牺牲高效范围查询为代价,它能够均匀的分布数据,散列值能够保证数据随机分布到各个分片上。

21、简述 MongoDB 分片集群采取什么方式确保数据分布的平衡?

新加入的数据及服务器都会导致集群数据分布不平衡,MongoDB 采用两种方式确保数据分布的平衡:

拆分

拆分是一个后台进程,防止块变得太大。当一个块增长到指定块大小的时候,拆分进程就会块一分为二,整个拆分过程是高效的。不会涉及到数据的迁移等操作。

平衡

平衡器是一个后台进程,管理块的迁移。平衡器能够运行在集群任何的 mongd 实例上。当集群中数据分布不均匀时,平衡器就会将某个分片中比较多的块迁移到拥有块较少的分片中,直到数据分片平衡为止。

分片采用后台操作的方式管理着源分片和目标分片之间块的迁移。在迁移的过程中,源分片中的块会将所有文档发送到目标分片中,然后目标分片会获取并应用这些变化。最后,更新配置服务器上关于块位置元数据。

22、简述 MongoDB 备份及恢复方式?

mongodb 备份恢复方式通常有以下三种:

  • 文件快照方式:此方式相对简单,需要系统文件支持快照和 mongod 必须启用 journal。可以在任何时刻创建快照。恢复时,确保没有运行 mongod,执行快照恢复操作命令,然后启动 mongod 进程,mongod 将重放 journal 日志。
  • 复制数据文件方式:直接拷贝数据目录下的一切文件,但是在拷贝过程中必须阻止数据文件发生更改。因此需要对数据库加锁,以防止数据写入。恢复时,确保 mongod 没有运行,清空数据目录,将备份的数据拷贝到数据目录下,然后启动 mongod。
  • 使用 mongodump 和 mongorestore 方式:在 Mongodb 中我们使用 mongodump 命令来备份 MongoDB 数据。该命令可以导出所有数据到指定目录中。恢复时,使用 mongorestore 命令来恢复 MongoDB 数据。该命令可以从指定目录恢复相应数据。

23、简述 MongoDB 的聚合操作?

聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。对于 MongoDB 中的聚合操作,应该使用 aggregate() 方法。

24、简述 MongoDB 中的 GridFS 机制?

GridFS 是一种将大型文件存储在 MongoDB 中的文件规范。使用 GridFS 可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了 BSON 对象有限制的问题。

25、简述 MongoDB 针对查询优化的措施?

MongoDB 查询优化大致可能从如下步骤着手:

第一步:找出慢速查询

如下方式开启内置的查询分析器,记录读写操作效率:

db.setProfilingLevel(n,{m}),n 的取值可选 0,1,2;

  • 0:默认值,表示不记录;
  • 1:表示记录慢速操作,如果值为 1,m 必须赋值单位为 ms,用于定义慢速查询时间的阈值;
  • 2:表示记录所有的读写操作。

查询监控结果:监控结果保存在一个特殊的集合 system.profile 里。

第二步:分析慢速查询

找出慢速查询的原因,通常可能的原因有:应用程序设计不合理、不正确的数据模型、硬件配置问题、缺少索引等

第三步:根据不同的分析结果进行优化,如建立索引。

26、简述 MongoDB 的更新操作是否会立刻 fsync 到磁盘?

不会,磁盘写操作默认是延时执行的,写操作可能在两三秒(默认在 60 秒内)后到达磁盘,可通过 syncPeriodSecs 参数进行配置。

27、简述 MySQL 索引及其作用?

是数据库管理系统中一个排序的数据结构,根据不同的存储引擎索引分为 Hash 索引、B+ 树索引等。常见的 InnoDB 存储引擎的默认索引实现为:B+ 树索引。索引可以协助快速查询、更新数据库表中数据。

28、简述 MySQL 中什么是事务?

事务是一系列的操作,需要要符合 ACID 特性,即:事务中的操作要么全部成功,要么全部失败。

29、简述 MySQL 事务之间的隔离?

MySQL 事务支持如下四种隔离:

  • 未提交读 (Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据。
  • 提交读 (Read Committed):只能读取到已经提交的数据。Oracle 等多数数据库默认都是该级别 (不重复读)。
  • 可重复读 (Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。
  • 串行读 (Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

30、简述 MySQL 锁及其作用?

锁机制是为了避免,在数据库有并发事务的时候,可能会产生数据的不一致而诞生的的一个机制。锁从类别上分为:

  • 共享锁:又叫做读锁,当用户要进行数据的读取时,对数据加上共享锁,共享锁可以同时加上多个。
  • 排他锁:又叫做写锁,当用户要进行数据的写入时,对数据加上排他锁,排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。

31、简述 MySQL 表中为什么建议添加主键?

主键是数据库确保数据行在整张表唯一性的保障,即使数据库中表没有主键,也建议添加一个自增长的 ID 列作为主键,设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全。

32、简述 MySQL 所支持的存储引擎?

MySQL 支持多种存储引擎,常见的有 InnoDB、MyISAM、Memory、Archive 等。通常使用 InnoDB 引擎都是最合适的,InnoDB 也是 MySQL 的默认存储引擎。

33、简述 MySQL InnoDB 引擎和 MyISAM 引擎的差异?

  • InnoDB 支持事物,而 MyISAM 不支持事物。
  • InnoDB 支持行级锁,而 MyISAM 支持表级锁。
  • InnoDB 支持 MVCC, 而 MyISAM 不支持。
  • InnoDB 支持外键,而 MyISAM 不支持。
  • InnoDB 不支持全文索引,而 MyISAM 支持。

34、简述 MySQL 主从复制过程?

1、Slave 上面的 IO 线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2、Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端 binary log 文件的名称以及在 Binary log 中的位置;

3、Slave 的 IO 线程收到信息后,将接收到的日志内容依次写入到 Slave 端的 RelayLog 文件(mysql-relay-lin.xxxxx)的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够明确知道从什么位置开始读取日志;

4、Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的查询或操作语句,并在自身执行那些查询或操作语句,这样,实际上就是在 master 端和 Slave 端执行了同样的查询或操作语句,所以两端的数据是完全一样的。

35、简述 MySQL 常见的读写分离方案?

MySQL+Amoeba 读写分离方案:Amoeba(变形虫) 项目,这个工具致力于 MySQL 的分布式数据库前端代理层,它主要在应用层访问 MySQL 的时候充当 SQL 路由功能。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过 Amoeba 你能够完成多数据源的高可用、负载均衡、数据切片、读写分离的功能。

MySQL+MMM 读写分离方案:MMM 即 Multi-Master Replication Manager for MySQL,mysql 多主复制管理器是关于 mysql 主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件 (在任何时候只有一个节点可以被写入)。MMM 也能对从服务器进行读负载均衡,通过 MMM 方案能实现服务器的故障转移,从而实现 mysql 的高可用。MMM 不仅能提供浮动 IP 的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。

36、简述 MySQL 常见的高可用方案?

  • MySQL 主从复制:Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据分布在多个节点(slaves)之上,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。
  • MySQL 双主:参考 MySQL 主从复制。
  • MySQL 双主多从:参考 MySQL 主从复制。
  • MySQL 复制 +Keepalived 高可用:MySQL 自身的复制,对外基于 Keepalived 技术,暴露一个 VIP,从而实现高可用。
  • Heartbeat + MySQL 实现 MySQL 的高可用:通过 Heartbeat 的心跳检测和资源接管、集群中服务的监测、失效切换等功能,结合 MySQL 来实现高可用性。

37、简述 MySQL 常见的优化措施?

MySQL 可通过如下方式优化:

1、开启查询缓存,优化查询。

2、使用 explain 判断 select 查询,从而分析查询语句或是表结构的性能瓶颈,然后有针对性的进行优化。

3、为搜索字段建索引

4、对于有限定范围取值的字段,推荐使用 ENUM 而不是 VARCHAR。

5、垂直分表。

6、选择正确的存储引擎。

38、简述 MySQL 常见备份方式和工具?

MySQL 自带

mysqldump:mysqldump 支持基于 innodb 的热备份,使用 mysqldump 完全备份 + 二进制日志可以实现基于时间点的恢复,通常适合备份数据比较小的场景。

系统层面

  • tar 备份:可以使用 tar 之类的系统命令对整个数据库目录进行打包备份。
  • lvm 快照备份:可基于文件系统的 LVM 制作快照,进行对整个数据库目录所在的逻辑卷备份。

第三方备份工具

可使用其他第三方工具进行备份,如 xtrabackup 工具,该工具支持 innodb 的物理热备份,支持完全备份、增量备份,而且速度非常快,支持 innodb 存储引起的数据在不同数据库之间迁移,支持复制模式下的从机备份恢复备份恢复。

更新: 2020-10-11 11:47:54
原文: <https://www.yuque.com/fcant/notes/tqr0zd&gt;

最近更新