raid-strategy
RAID 主要使用分割(Striping)、镜像(Mirroring)和奇偶校验(Parity)三大策略管理磁盘中的数据,我们这里举几个简单的例子:
-
RAID 0 使用了数据分割技术,但是没有镜像和奇偶校验。它对磁盘上的数据几乎不进行任何的保护,任意一块磁盘磁盘损坏都意味着其中的数据无法恢复,但是因为不存在冗余,所以它也会提供较好的性能;
-
RAID 1 使用了数据镜像的功能,但是没有奇偶校验和数据分割。所有的数据都会写入两个相同的磁盘,两个磁盘都能对外提供数据读取的服务。这种方式降低了磁盘的使用率,但是能够提高读取性能并提供备份;
-
…
RAID 使用的分割和镜像策略与分布式数据库中的分片(Partition)和副本(Replication)比较相似,分割和分片将数据切分后分配到不同的磁盘或者机器,而镜像和副本的作用都是复制数据。
很多现代的操作系统都会提供基于软件的 RAID 实现,一些云服务厂商也会使用自研的文件系统或者冗余备份机制:
-
Google 使用 Google 文件系统管理文件,它以块的方式存储文件并且通过主服务管理所有的文件块[^8];
-
Microsoft 在 Azure 中使用擦除编码的方式计算冗余数据[^9];
硬件错误在生产环境中很常见,我们只有通过数据冗余和校验才能降低数据丢失的可能性,但是增加冗余的方式也只能不断降低数据丢失的概率,不能 100% 的避免。
实现复杂
数据库管理系统最终会将数据存储在磁盘上,对于很多数据库来说,数据落到磁盘上就意味着持久化完成了。磁盘作为数据库系统的下层,磁盘能够稳定存储数据是数据库能够持久化数据的基础。
database-and-disk
很多人都误认为使用 write
就能将数据写入到磁盘上,然而这是错误的。函数 write
不仅不能保证数据写入磁盘,有的实现甚至都不能保证目标空间保留给了写入的数据[^10]。
一般情况下,对文件的 write
只会更新内存中的页缓存,这些页缓存不会立刻刷入磁盘,操作系统的 flusher 内核线程会在满足以下条件时将数据落盘[^11]:
-
空闲内存下降到了特定的阈值,需要释放脏页占用的内存空间;
-
脏数据持续了一定时间,最老的数据就会被写入磁盘;
-
用户进程执行
sync
或者fsync
系统调用;
如果我们想要将数据立刻刷入磁盘,就需要在执行 write
后立刻调用 fsync
等函数[^12],当 fsync
等函数返回后,数据库才会通知调用方数据已经成功写入。
write-and-fsyn
write
和 fsync
在数据库管理系统中非常重要,它们是提供持久性保证的核心方法,一些开发者对 write
的理解错误写出错误的代码就会导致数据丢失。
除了持久化的特性之外,数据库可能还需要提供 ACID(Atomicity, Consistency, Isolation, Durability)或者 BASE(Basically Available, Soft state, Eventual consistency)的保证,有些数据库还会提供分片、副本以及分布式事务等复杂功能,这些功能的引入也增加了数据库系统的复杂性,而随着程序复杂性的增加,出现问题的可能性也随之增长。
总结
数据库管理系统是软件工程中最复杂、最重要的系统之一,几乎所有服务的正常运行都建立在数据库不会丢失数据的假设上。
然而因为如下所示的原因,数据库不能完全保证数据的安全:
-
运维人员在配置和运维时极有可能因为操作失误导致数据丢失;
-
数据库依赖的底层磁盘发生硬件错误,导致数据无法恢复;
-
数据库系统支持的功能非常多而且复杂,数据没有及时落盘就可能造成数据丢失;
一旦发生数据丢失的事故,造成的影响就会非常大,我们在使用数据库存储核心业务数据时也不能完全信任数据库的稳定性,可以考虑使用热备以及快照等方式容灾。
到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:
-
除了文中列出的数据丢失事故,还有哪些数据库或者云服务商丢失过数据?
-
Redis 的 RDB 和 AOF 机制什么时候会将数据落盘?
-
数据成功写入数据库究竟应该如何定义?
来源:https://mp.weixin.qq.com/s/Wo5GkfE8VtXTiyL9Kn4LlQ
其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)
《前端开发四大模块核心知识笔记》
最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。