3.4 计算存储分离模式
计算和存储是计算机最核心的组件,那么将计算和存储分离的原因是什么?其实,这就是无状态(Stateless)和有状态(Stateful)应用架构的区别。无状态应用架构是指服务请求和所在的服务器完全无关,即便请求涉及数据相关的逻辑,也是从外部获取(比如说数据库),服务器本身不存储任何信息。而有状态应用架构中请求和对应的服务器是相关的,如请求涉及的数据就保存在服务器上、用户的会话数据就保存在服务器的内存中,或者多个请求相互关联时就将中间状态保存在服务器的内存或持久化存储中。
有状态应用架构非常复杂,如对于典型的KV存储系统,在处理分布式存储时,通常会基于Key进行路由,转发到指定的服务器上,完成对应Key的存储和读取。为了保证不丢失数据,我们需要设计对应的高可用方案,如Master/Slave架构等;在系统扩容时,我们还需要考虑数据在不同服务器之间的重新拓扑和数据迁移等工作,并保证在此过程中服务可用且读写数据一致。
正是因为有状态应用架构的复杂性,越来越多的应用考虑基于无状态的架构方案,尤其是在云环境下,如完全无状态的函数计算、Web应用后端采用集中式会话存储等。当然,KV和数据库产品等存储系统也会采取同样的计算和存储分离的架构,通过分布式文件系统和块服务等,让存储产品设计更加简单,其中最典型的例子就是HBase的存储是基于Hadoop的HDFS分布式文件系统,这样HBase主要负责数据结构和计算部分,而存储则是由HDFS来负责。
针对计算存储分离模式,云厂商提供了完备的存储方案。简单的存储方案如KV、分布式缓存、文件存储等,复杂的存储方案如文件系统挂载、块服务,这些存储方案同时解决了海量存储、数据备份等问题,可以很好地帮助我们实现计算和存储分离,实现无状态的架构设计。
在云原生架构中,应用可以将有状态部分委托给云,应用本身聚焦在计算部分,以解决分布式复杂性问题。常见的有状态部分包括会话数据、信息、各类文件、业务基础数据(如产品、地址库等)、业务配置参数、计算中间状态等。
无状态应用架构的好处不仅是设计简单,更提高了应用的可用性。在容器调度中,一旦检测到失败,容器马上根据一定的规则将请求流量调度到新的容器中。而且,无状态应用架构具备失败后快速迁移的特点。无状态应用架构不用做长时间的应用初始化。新启动的无状态应用架构可以快速投入生产,减少容器调度过程中的不可用时间。