我们的多数客户拥有多个web和应用程序服务器来运行自己的系统。他们这样做出于多种原因,包括高可用性、可扩展性,以及切分不同的功能和服务。

这么做带来的问题是,在不同的web服务器之间如何共享各种资源 – 如图像、代码、多媒体文件,等等。方法很多,但其中的某些方法显得更有用,或者说比其他的方法更安全,当然,每种方法在不同的情况或数据大小的情况下,有着各自不同的优点。

面 对这样的系统,首要原则是永远不要把应用程序代码放在一个像NFS这样的共享资源上面。因为这会在很多地方产生性能问题和其他严重的可靠性问题,所以不要 这么做。您可以使用rsync方法或者从NFS上复制的办法来产生一份本地拷贝,但是切记,始终要有一份本地拷贝,始终。

如非代码,而是网站图像、用户图片、音乐、静态内容等资源,那么如果可能,应该使用共享。

要 共享,第一件要考虑的事情是这些文件是从哪里来、谁更新它们。在大多数系统中,所有的web服务器都需要读取和写入文件,例如用户上传图像。但在其他的, 如静态网站图像这样的系统中,一台服务器(如 web1)可能负责写入,而其他服务器则只需从它上面同步,这样会更加方便。

最简单的系统 只需要共享静态文件,web1负责写入,web2、web3等负责从web1读取。最简单的方法是通过cron运行rsync,这样做很简单、很容易,对 于任何大小的系统,哪怕即使有成千上万的文件,速度依然非常快。为此,rsync虽然需要设置一些重要的选项,但只要遵循一些基本规则,它依然 是一种良好和可靠的方式。

也有更复杂的远程同步程序,通常用于快速变化的文件,如用户上传。用户上传自己的形象后想要立刻看到效果,这很难用rsync实现,但为此有一些特殊工具,如ionotify就可以实现几乎实时的同步,但是使用起来很复杂。

另 一种常见的方法是使用NFS共享文件。我们一般不喜欢这种方法,因为NFS难以管理,有安全隐患,而且最重要的是会成为您系统中的一个单点故障。如果 NFS服务器有问题,所有的web服务器都会关闭。此外,NFS有一些内核问题,会在某些情况下引起系统崩溃、迫使系统重启。NFS本身是有用的,也很强 大,但是除非真的有必要,我们都会尝试避免用到它 — — 我们只是不喜欢实时从NFS加载的web服务器。

规模更大、更复杂的系统则可 以使用分布式文件系统,如我们已开始使用的GlusterFS。它们允许类似NFS的文件读和写操作,使用用户空间工具或者比 NFS更容易使用的FUSE文件系统,但是安装起来很复杂。但是它们很容易扩展,在很多情况下也可以避免单点故障,因为数据分布在很多服务器上,所以任何 一台服务器的崩溃都不会影响到整个系统的运行。

最后,很多网站根本都不再使用任何的传统存储系统; 取而代之的是,他们正将其所有的资源转移到一个云存储系统中去,譬如亚马逊的S3,或者阿里云的OSS。这么做,将不再有大容量磁盘存储或同步的需求。他 们只需上传图像等资料到云存储里,然后就在那儿直接提供服务 – 这么做,简单、容易,而且通常也更经济实惠。

当然还有其他的方法,但上面是我们所知道的最常见的几种,希望可以用来解决您的文件共享需求。