不同的系统,它的业务不一样,有做社交的,有做电商的,还有做内容的。系统的规模也不一样,有很小规模的系统,也有像 BAT 这样的巨无霸系统。在构建这些系统时,都会面临五花八门的问题。但总结下来发现一个“神奇”的规律:
凡是那些特别难解决的、让你付出巨大代价的,或者是损失惨重的技术问题,几乎都可以归为存储系统的问题。
只要这个数据是正确的,剩下的都是小问题。数据错了、丢了,甚至数据处理不及时,这些都是损失惨重的大问题。
存储是系统中最核心、最重要、最关键的组成部分,没有之一。
我们常用的存储系统有很多,有单机的也有分布式的,有数据库、文件系统,还有一些介于二者之间的,种类非常多。无论是什么样的存储,比如 MySQL、Redis、ElasticSearch 等等,它们都有几个共同的特点。
第一个特点:难用
对于应用程序来说,存储无非就是帮我们安全可靠地保存数据,在我需要的时候能快速读出来也就可以了。很遗憾,几乎没有存储系统能满足这么简单的要求。
拿 MySQL 举例,我要存取对象,必须把对象转换成 MySQL 表中的行,还得写 SQL 语句才能存取。是不是很难用?难用你还不得不用,并且还得把它给用好了,这里面有很多的方法、技巧和实践经验需要学习掌握。
第二个特点:慢
最近几年的技术圈,分布式存储这块儿非常繁荣,你可以看到过一段时间就有一个新的数据库诞生了,不管它们功能怎么样,无一例外,都说自己的有多快,性能多好,顺便把像 MySQL 这样的老家伙拉出来,做个性能对比测试,吊打一遍。
一个经过良好优化过的业务系统,它的性能瓶颈一定是存储。从性能角度上来说,存储系统就是整个系统中最短的那块儿板子,存储系统有多慢,你的整个系统就多慢。如何优化存储性能,从而让整个系统运转如飞,这里面同样有很多的方法、技巧和经验需要掌握。
第三个特点:杂
存储这块儿不像其他的成熟的技术领域,基本上都是一两种方案包打天下,比如 Java 开发,基本上就被 Spring 统治了,再比如 Web 容器,静态用 Nginx,动态 Tomcat。但存储这块儿却不是这样的,就拿真正广泛应用在生产系统中的存储来说,你看有多少种?
MySQL、Redis、ElasticSearch、HBase、Hive、MongoDB、RocksDB、CockroachDB 等等,这些存储还真就是谁都替代不了谁,每一种都有它擅长的地方,有它适用的场景,当然也有很突出的短板。如何根据业务系统的特点,选择合适的存储来构建我们的系统,这也是需要学习和掌握的。
**小型系统:**重点解决从 0 到 1 的问题;比如:如何低成本高质量地快速构建一个小规模的订单存储系统。
**中型系统:**重点关注在高速变化的过程中,你的系统一定会遇到的一些共通问题,以及该如何应对这些问题。比如说,如何从单机的存储系统逐步演进为分布式存储系统;如何在线平滑的扩容我们的存储系统。
**大型系统:**重点解决高并发、海量数据情况下的存储系统该如何设计的问题。比如,海量的埋点数据该怎么存储;如何在各种数据库之前实时迁移和同步海量数据,等等。