如何为负载均衡准备你的代码

6

如同我们之前做的那样,我想整理有用的信息,为每个转向负载均衡的人收集有用信息,因为在这个过程中会涉及到一些问题,你的代码必须要意识到这些问题。

我们从一个 Apache 服务器移动到使用 Squid 作为反向代理/负载均衡器,并且后面有三个 Apache 服务器。

我们正在使用 PHP/MySQL,因此问题可能会有所不同。

我们需要解决的问题:

会话

我们从“默认”的php会话(文件)移动到了分布式 memcached 会话。这是一个简单的解决方案,必须完成。这样,您也不需要在负载均衡器上使用“粘性会话”。

缓存

对于每个 Web 服务器,我们都添加了另一个 memcached 层来进行分布式对象缓存,并将所有旧的/过时的文件缓存系统替换为它。

上传

上传到共享(nfs)文件夹。

我们优化速度的方法:

静态文件

我们的主要 NFS 运行着 lighttpd,并提供服务(用户上传)的图片。Squid 意识到这一点,并且永远不会查询我们的 Apache 节点以获取图像,这为性能提升带来了很大的好处。Squid 还配置了将这些文件缓存在内存中。

你们采取了哪些措施使项目/代码适应负载均衡,对于考虑进行此移动的人还有什么其他问题,您使用的是什么平台/语言?


NFS对此是否足够强大? - vartec
nfs主要用于写入或文件存在检查,读取(请参见我们的lighttpd解决方案)不经常使用nfs。 - Karsten
1个回答

1

在进行这个操作时:

对于http节点,我强烈推荐使用单一系统镜像(ocfs2很适合)并使用pound或crossroads作为负载均衡器,具体取决于情况。节点应该有一个小的本地磁盘用于交换和避免大多数(但不是全部)CDSL的问题。

然后我将Xen引入混合中。如果在Xenbus上放置少量临时信息(即Linux实际承诺为每个VM的进程提供的虚拟内存量,也称为Committed_AS),您可以快速检测到脑残的负载均衡器并进行调整。Oracle也注意到了这一点,并正在努力改进Linux中的balloon驱动程序。

之后,我会考虑将任何给定应用程序的数据库使用成本分割成sqlite3和应用程序想要的任何数据库,同时意识到我需要分割数据库,以便posix_fadvise()可以发挥其作用,而不会不必要地污染内核缓冲区。由于大多数DBMS服务都希望进行自己的缓冲,因此您还必须让它们进行自己的聚类。这真正决定了我使用的DB集群类型以及我对balloon驱动程序的操作。

然后,Memcache服务器从瘦initrd引导,同时特权域监视其内存和CPU使用情况,以便知道何时启动更多。

选择心跳/接管方案主要取决于给定的网络和集群的预期使用情况。很难一概而论。

最终结果通常是5或6个物理节点,具有相当多的内存,启动虚拟机监视器+客户端,同时连接到镜像存储。

存储也很难用一般性描述...有时我使用集群LVM,有时不使用。当LVM2最终远离其目前基于字符串的API时,这种情况会发生变化。

最后,所有这些协调产生类似于Augeas在飞行中更新配置的东西,根据通过Xenbus传输的事件。这包括ocfs2本身或任何其他服务,在其中配置无法驻留在单个系统映像上。

这真的是一个应用程序特定的问题...你能给出一个例子吗?我喜欢memcache,但并非每个人都能从中受益。我们正在审查你的配置还是讨论一般的最佳实践?

编辑:

抱歉我太关注Linux了...这通常是我设计集群时使用的。


谢谢你提供非常专业的答案,实际问题在我的帖子末尾 ;) "你为了负载均衡做了什么来准备你的代码/项目,对于考虑这一步骤的人还有其他需要注意的事项吗?" = 更多与代码相关的事情 - Karsten
“不应该有关系”不是一个好的回答,我需要知道你如何使用内存。 - Tim Post
还有,使用什么平台?这个问题非常好,但也非常泛泛。就像“耐力跑的最佳策略是什么?”一样。我会回答:“只有在被追赶时才跑。” - Tim Post
好的,我会为我们的设置添加更多具体信息,但我想收集其他所有网络语言的信息/报告;) - Karsten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接