我正计划复制一个Web服务器以实现高可用性。 服务器在Hyper-V中作为Ubuntu 15.04虚拟机运行,并安装了MariaDB 10.0,Apache 2.4和PHP-FPM 5.6。
第二台虚拟机将作为该虚拟机的直接副本启动,但将位于美国。 第一台虚拟机位于欧洲。 (延迟时间大约是80-120毫秒)
我想保持服务器同步,以便他们都可以为我的客户端提供相同的内容,因此客户端将使用最近的服务器(为此,我将使用Route 53)
服务器之间的数据交换是安全的,以保护数据库中的联系人详细信息和其他信息,并防止更改/ var / www目录中的文件,这一点很重要。
我已经考虑使用以下选项:
SSL(TLS)
我已经考虑使用SSH,用于数据库和文件复制。 但是我不确定哪个应用程序用于文件复制部分。
SSL可以用于数据库复制,但是它需要生成需要随时更换的证书,这可能会花费金钱。
我最后的select是使用openvpn,但我不确定是否可以将其设置为额外的networking,而不是将所有stream量都路由到该networking。 这种方法似乎也需要生成证书文件。
您不需要为自己的私人通信付费的TLS证书。 您可以设置您自己的CA(持久证书,如果妥协,您只需丢弃整个CA),并让您的服务器信任它,那么您可以根据需要为不同的服务颁发尽可能多的证书。 只有当您无法可靠地让远程主机信任您的CA时才需要付费证书,例如您的网站访问者。
如果你只需要使用一个服务,而且它支持TLS(就像MySQL一样),那么只需要在服务器的防火墙级别允许服务器的IP连接,再增加一层安全性。
如果您需要多个服务,最好使用VPN解决scheme。 不要浪费你的时间与OpenVPN,你的内核有内置的IPSec支持,你可以使用它。 另外,它在Windows上开箱即用,所以如果你部署了这样的服务器,它将很容易设置。
这是很容易的部分。 真正困难的部分是让你的应用程序的文件保持同步,如果你的应用程序只使用数据库很容易,但是如果它是一个通用的CMS,那么很可能会出于某种原因修改它自己的文件(插件更新例如)或创build新的(用户上传的内容等),我不知道有任何可靠的方法来保持他们的同步。 唯一想到的解决scheme是NFS(只有一台服务器托pipe这些文件,但这不符合您的高可用性要求)或GlusterFS,这两种方法在这种延迟方面performance都很差。
rsync是保持文件同步的好工具。 我将它与SSH(和公共密钥)结合使用,如下所示:
rsync -az -e ssh --delete /var/www otherserver:/var/www
对于多台服务器,多次使用rsync可能是最好的select。 另一个选项是pdcp -r ,但是这需要每次都复制所有文件,而不是进行delta传输。 换句话说,对于less量的数据和许多服务器来说更好。
如何最好地做数据库复制很大程度上取决于你的应用程序。 MariaDB文档中有很多好的build议和其他的问题。
你没有提到,但我认为你是在多主设置后。 这就排除了主从数据库的设置。
我相信哪种技术用于安全将是您最担心的问题。
1.数据库
保持多主数据库设置同步是棘手的。 您可以使用像MariaDB w / Galera Cluster这样的多主(主动/主动)数据库设置,但是我不确定考虑到地理距离这是否是一个好主意。 所有写操作将与所有数据库节点同步。 延迟将极大地影响数据库性能。 数据库集群(如Galera)通常被描述为单个局域网内的良好候选者。 但从性能angular度来看,多主数据库集群通常被描述为在数据库节点分布在WAN中的多个物理位置的“真正的”高可用性设置方面变得更糟糕。 在跳转到多主数据库设置之前,请先阅读该主题。 首先看看横向扩展博客 。
您也可以采取另一种方法,并考虑使您可以保持数据库同步的SymmetricDS。 它使用触发器来捕获数据库CRUD操作。 它不会复制模式更改,用户或其他任何比纯数据更多的内容。 但是,这将是asynchronous复制,它不会处理像MariaDB Galera集群那样的自动递增主键。
2.文件
你可以使用一个中央的NFS服务器,但是这将会打败多个主服务器的目的(并且没有单点故障)。 我已经使用csync2(与lsyncd)保持web节点与succes同步(rsync下)。
一般build议
你是否为了性能或高可用性而这样做? 如果你这样做是为了提高性能,在前面的一个位置和一个清漆服务器将带你远离。 我知道你仍然有延迟,但你可以通过caching“削减”服务器开销。 您甚至可以在其他位置添加清漆服务器。 复杂性将大大降低(不要低估这一点;简单点)。 最重要的是拥有资产CDN(CSS,JS,图像等),而且您很可能能够为欧洲用户提供与欧洲用户一样好的用户体验(如果您的服务基于欧洲)。
如果你这样做是为了获得高可用性,那么你将不得不通过引入复制来增加复杂性。