You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
10 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词 | 从今天起,换种方式学存储
你好,我是李玥,《[消息队列高手课](https://time.geekbang.org/column/intro/212?utm_term=zeusI4EZD&utm_source=geektime&utm_medium=cunchu)》专栏的作者,目前在京东任职架构师。这是我在极客时间上的第二门课程,很高兴在这里遇见你。
在十多年的开发者职业生涯中我的从业经历应该算是比较丰富的。在传统IT行业做过非常多的企业级ToB的系统转战互联网后我又曾经带领创业团队体会过从0到1创业的艰辛见证过互联网高速增长的高光时刻也经历过京东数年大促的洗礼。
在工作过程中我接触过很多系统。不同的系统它的业务不一样有做社交的有做电商的还有做内容的。系统的规模也不一样有很小规模的系统也有像BAT这样的巨无霸系统。在构建这些系统时都会面临五花八门的问题。但总结下来我发现一个“神奇”的规律
> **凡是那些特别难解决的、让你付出巨大代价的,或者是损失惨重的技术问题,几乎都可以归为存储系统的问题。**
这个规律其实并不神奇,它是有原因的。
你可以想一下我们开发的各种业务系统几乎都是MIS系统中文叫“管理信息系统”有的大学还有这个专业。管理信息系统这个词的含义就是字面的意思管理信息的系统。这里面的信息是什么其实就是数据。不管你的系统业务是什么样的最终都要落到对信息的管理或者通俗点儿说你系统的业务功能最终的结果就是数据。
只要这个数据是正确的,剩下的都是小问题。数据错了、丢了,甚至数据处理不及时,这些都是损失惨重的大问题。
所以用于承载数据的存储系统就显得非常重要,如果说,你能构建一个安全可靠、快速稳定的存储系统,基于这个基础之上构建的业务系统,显然就让人放心多了。
所以说,**存储是系统中最核心、最重要、最关键的组成部分,没有之一。**
## 你要关注存储的哪些特点?
我们常用的存储系统有很多有单机的也有分布式的有数据库、文件系统还有一些介于二者之间的种类非常多。无论是什么样的存储比如MySQL、Redis、ElasticSearch等等它们都有几个共同的特点。
**第一个特点是难用****。**怎么难用呢?对于应用程序来说,存储无非就是帮我们安全可靠地保存数据,在我需要的时候能快速读出来也就可以了。很遗憾,几乎没有存储系统能满足这么简单的要求。
有一个非常形象的比喻:我开着车去商场购物,到了停车场发现这个停车场不能存车,只能存零件。我必须自己把车拆了,然后把这些零件分门别类打上标签,存放到停车场货架上,走的时候自己再把零件取出来把车组装起来。
听起来很可笑是吧,你想想咱们用的这些存储系统,不就是这样吗?我们应用程序里管理的数据都是对象是吧?你告诉我哪个存储系统能存对象?没有吧?
拿MySQL举例我要存取对象必须把对象转换成MySQL表中的行还得写SQL语句才能存取。是不是很难用难用你还不得不用并且还得把它给用好了这里面有很多的方法、技巧和实践经验需要学习掌握。
**第二个特点是慢。**最近几年的技术圈分布式存储这块儿非常繁荣你可以看到过一段时间就有一个新的数据库诞生了不管它们功能怎么样无一例外都说自己的有多快性能多好顺便把像MySQL这样的老家伙拉出来做个性能对比测试吊打一遍。
“一个人炫耀什么,说明内心缺少什么”,这个道理放到技术圈同样适用,不断有新的存储刷新性能记录,恰恰说明了存储系统性能不能让人满意。
一个经过良好优化过的业务系统,它的性能瓶颈一定是存储。从性能角度上来说,存储系统就是整个系统中最短的那块儿板子,存储系统有多慢,你的整个系统就多慢。如何优化存储性能,从而让整个系统运转如飞,这里面同样有很多的方法、技巧和经验需要掌握。
**第三个特点是杂。**存储这块儿不像其他的成熟的技术领域基本上都是一两种方案包打天下比如Java开发基本上就被Spring统治了再比如Web容器静态用Nginx动态Tomcat。但存储这块儿却不是这样的就拿真正广泛应用在生产系统中的存储来说你看有多少种
MySQL、Redis、ElasticSearch、HBase、Hive、MongoDB、RocksDB、CockroachDB等等这些存储还真就是谁都替代不了谁每一种都有它擅长的地方有它适用的场景当然也有很突出的短板。如何根据业务系统的特点选择合适的存储来构建我们的系统这也是需要学习和掌握的。
## 学习存储的最佳姿势是什么样的?
既然存储有“难用、慢、杂”这几大特点,学习起来就更需要注意方法。如何来学最高效呢?我认为是实战,从问题入手。
存储涉及到很多理论知识和概念,比如各种数据结构、哈希、树以及它们的时间复杂度等等,这些内容往往都是偏数学范畴的一些知识,学起来不容易理解和记忆。并且,理论和实践之间往往存在着非常大的鸿沟,往往是“懂了一堆道理,却还是写不好代码”。
所以,我在极客时间上开了第二个专栏讲存储,我们只讲实践中大家都会遇到的问题,讲这些问题的解决方法,同时在这里面贯穿一些知识和原理。通过这样的学习方式,既可以快速地帮你解决实际问题,同时还能提升你的技术能力。
在接下来的课程中,我会带你一起,**从0到1从小到大以电商作为场景讲解不同规模的存储系统应该如何构建**。
每一节课我们一起解决一两个实战的问题比如为什么明明数据量和访问量不大MySQL还是很慢数据库宕机了怎么办
为什么选择电商系统来讲呢?因为我熟啊!开个玩笑,当然不只是因为我做过几年电商系统。其实,很多培训学校、各种技术论坛都特别喜欢讲电商系统。因为电商这个系统,特别有代表性,特别适合作为案例来研究和学习。
**首先,电商系统覆盖面足够广泛****。**特别是是在互联网行业,你会发现几乎所有的互联网公司都在做两个事情:电商和社交。
**其次,****用电商系统作为案例,直接就能学以致用**。即使你面对的业务和电商关系不大,因为电商的系统足够复杂,你在其他业务中可能遇到的技术问题,大多数在电商系统中基本都会遇到,一样有借鉴的意义。另外,电商这个业务领域对所有人来说都很熟悉,拿它作为案例基本上不需要再讲解业务知识,我们可以快速地专注于技术问题本身。
即使是同样一个电商系统,不同的规模,它需要解决的问题也不一样。不少做技术的同学崇尚于海量数据和高并发,认为只有大厂那些高并发、海量数据的核心或者是底层存储系统,才是真正“有技术含量”的系统,能胜任这样系统的开发者,才是真正的技术大牛。这其实是一个技术认知误区。为什么这么说?
因为,并不是规模小的系统就简单,只有大规模的系统才有难度。
创业团队需要快速低成本把系统完整地实现出来,好快速验证它的商业模式;处于高速增长期的团队,它面临的问题是业务高速增长和不断变化,相应的,也要对系统不停地进行升级改造来适应变化,并且要在变化的过程中确保稳定;业务规模足够大的一些大厂,它需要解决的是如何应对高并发、海量数据这些问题。
所以说,不同规模的系统,在技术上没有高低贵贱之分,它们的建设目标不一样,面临的挑战不一样,需要解决的问题也不一样,对于存储系统的选择、架构设计也是不一样的。
所以,我们的课程设计就是按照系统的发展过程,分成了创业篇、高速增长篇和海量数据篇这三个部分。
* 在创业篇我们重点解决从0到1的问题比如如何低成本高质量地快速构建一个小规模的订单存储系统。
* 在高速增长篇,我们关注在高速变化的过程中,你的系统一定会遇到的一些共通问题,以及该如何应对这些问题。比如说,如何从单机的存储系统逐步演进为分布式存储系统;如何在线平滑的扩容我们的存储系统。
* 在海量数据篇,我们重点解决高并发、海量数据情况下的存储系统该如何设计的问题。比如,海量的埋点数据该怎么存储;如何在各种数据库之间实时迁移和同步海量数据,等等。
通过学习这门课程,你将收获的不仅是案例中那些解决具体问题的方法,在电商系统架构、对存储系统的认知以及存储系统的设计能力这几个方面,都会有所提升。
更重要的是,通过案例来学习常用的数据库和存储系统的使用和实现,可以总结出存储系统最通用、本质的技术原理。掌握了存储系统的本质之后,不仅会让你在面试时更加从容,而且会让你对存储的理解上升一个层次,从“知道怎么用”,升级为“知道为什么这么用”,最终做到活学活用。
在极客时间的一段新旅程即将开始,在开始正式学习之前,我还想再说一些我的想法。技术的发展让使用技术变得越来越简单,但是作为有理想有情怀开发者,不能让技术把我们的变得越来越“简单”。我很开心又能同各位同学一起持续地丰富自己,也希望你能不负时光,认真对待这段学习之旅。
在学习过程中你都可以在留言区提问我看到会第一时间给你回复。另外像《消息队列高手课》专栏一样我也希望你可以在学习之初立一个Flag。有了目标指引持之以恒地探索成功必不会偏航。
好,开始学习吧!