还是很多很多年前,做过一个小系统,是一个和支付相关的小系统。因为是一个小系统,所以一切都那么简单。一台应用服务器,一台数据库服务器;文件、图片都放在应用服务器上,一切都是那么的平淡,一切都是那么的理所当然。
突然有一天,支付成为一个时髦的话题;突然有一天,这个平台居然要孕育成为一个新的支付公司的核心系统;于是,系统的访问就要暴涨了。这一切都很突然……
2、调整后的系统简易架构
前端使用负载均衡设备统一进行调度,中端对应于服务器进行横向扩展,后端把数据库升级。后端文件存储用了多层NFS架构,但是还是不够,分布式文件系统成为了必然的选择。采用分布式文件系统后,服务器之间的数据访问不再是一对多的关系,而是多对多的关系,这样一来,性能大幅提升毫无问题。
3、分布式文件系统介绍
使用分布式文件系统可以轻松定位和管理网络中的共享资源、使用统一的命名路径完成对所需资源院的访问、提供可靠的负载平衡、与FRS(文件复制服务)联合在多台服务器之间提供冗余、与系统权限集成以保证安全。
在分布式环境中,有太多的意外,数据随时传输错误,服务器时刻准备牺牲,很多平常称为异常的现象,在这里都需要按照平常事来对待。因此,对于分布式文件系统而言,仅仅是满足了正常状况下文件系统各项服务还不够,还需要保证分布式各种意外场景下健康持续的服务,否则,将一无是处。
1、服务器的错误恢复
在分布式环境中,哪台服务器牺牲都是常见的事情,牺牲不可怕,可怕的是你都没有时刻准备好它们会牺牲。作为一个合格的分布式系统,应用服务器当然时刻准备好了前赴后继奋勇向前。每一台应用服务器出错了,都要有相应的应急策略和处理方法;
客户端
在分布式文件系统中,最不重要的应用服务器,应该就是客户端了。毕竟,做为一个文件系统的使用者,在整个文件系统中的地位,难免不高。而作为客户端,大部分时候,牺牲了就牺牲了,没人哀悼,无人同情,只有在在辛勤写入的时候,不幸辞世(机器挂了,或者网络断了,诸如此类...),才会引起些恐慌。因为,此时此刻,在主控服务器上对应的文件,正作为可能被构造的节点活着,仅仅为占有它的那个客户端服务者,做为一个专一的文件,它不允许别的客户端染指。这样的话,一旦占有它的客户端服务者牺牲了,此客户端会依然占着资源不释放。这种事情,必须要有办法解决这个问题,这就是:租约。。。
租约,顾名思义,就是当客户端需要占用某文件的时候,与主控服务器签订的一个短期合同。这个合同有一个期限,在这个期限内,客户端可以延长合同期限,一旦超过期限,主控服务器会强行终止此租约,将这个文件的享用权,分配给他人。。。
在打开或创建一个文件,准备追加写之前,与主控服务器在指定的路径下与此客户端签订一份租约。客户端会定时轮询续签租约。在主控服务器一端,始终在轮询检查所有租约,查看是否有到期未续的租约。如果一切正常,该客户端完成写操作,会关闭文件,停止租约,一旦有所意外,比如文件被删除了,客户端牺牲了,主控服务器都会剥夺此租约,如此,来避免由于客户端停机带来的资源被长期霸占的问题。。。
文件服务器
海量的文件服务器是一个更不稳定的因素。一旦某文件服务器挂掉,并且主控服务器还不知道,主控服务器就会变相的欺骗客户端,给它们无法连接的读写服务器列表,导致它们处处碰壁无法工作。因此,为了整个系统的稳定,数据服务器必须时刻向主控服务器汇报,保持主控服务器对其的完全了解,这个机制就是心跳消息。文件服务器必须要不断向主控服务器汇报自身的状况。比如:有多少可用空间、用了多大的空间,等等之类。主控服务器会将文件服务器汇报的状况,作为新的数据块分配或是负载均衡的依据。
主控服务器
主控服务器是整个分布式文件系统的核心,作为整个系统的核心和单点,主控服务器一旦当机,整个分布式文件服务集群将彻底瘫痪罢工。如何在主控服务器牺牲后,提拔新的主控服务器并迅速使其进入工作角色,就成了系统必须考虑的问题。解决策略是事物日志。
熟悉数据库的同学一看就知道是从数据库那里山寨来的。在主控服务器上,所有对文件目录操作的关键步骤(具体文件内容所处的数据服务器,是不会被写入日志的,因为这些内容是动态建立的...),都会被写入日志。另外,主控服务器会在某些时刻,将当下的文件目录完整的序列化到本地,这称为镜像。一旦存有镜像,镜像前期所写的日志和其他镜像,都纯属冗余,其历史使命已经完成,可以报废删除了。在主控服务器不幸牺牲,或者是战略性的停机修整结束,并重新启动后,主控服务器会根据最近的镜像 + 镜像之后的所有日志,重建整个文件目录,迅速将服务能力恢复到牺牲前的水准。。。
2、数据的正确性保证