PHP开发负载均衡指南


Posted in PHP onJuly 17, 2010

今天,'大型服务器'模式已经过去,取而代之的是大量的小服务器,使用各种各样的负载均衡技术。这是一种更可行的方法,将使硬件成本降至最低。

'更多小服务器'的优势超过过去的'大型服务器'模式体现在两个方面:

1. 如果服务器宕机,那么负载均衡系统将停止请求到宕机的服务器,转而分发负载到其他正常运行的服务器上。
2. 扩展你的服务器更加容易。你要做的仅仅是加入新的服务器到负载均衡系统。不需要中断你的应用运行。

所以,把握住这个机会:). 当然,代价就是这要求你的应用开发时增加一点复杂度。这就是本文要覆盖的内容。

这时你可能对自己说: '但是我怎么知道我正在使用负载均衡呢?'。最诚实的回答是,如果你正在问这个问题,那么答案是你多半没有在使用负载均衡系统并且你的系统不需要考虑这个问题。大多数情况,当应用成长足够大的规模时,负载均衡就需要明确提出和设置了。然而,我也偶尔看见虚拟主机公司为客户的应用做这个负载均衡,或者像下面描述的那样要自己来做。

在继续下面的内容之前,我要指出本文主要描述PHP的负载均衡。将来我可能会写有关数据负载均衡的文字,但是现在你必须等待。

注意,我一直提“web应用”而不是website,这是想区分'web应用'是那些复杂的站点往往涉及服务器端编程和数据库,而不是website那样只显示简单的静态内容。

1. PHP文件

第一个问题是,如果你有大量的小型服务器,你怎么把你的php文件上传到所有的服务器上?有如下的方法供你参考:

1. 分别上传所有的文件到每一个服务器 , 这种方法带来的问题是:想像一下你有20个服务器,那么上传过程中这将很容易导致错误,并且更新时极有可能导致不同服务器上有不同版本的文件。
2. 使用 'rsync ' (或类似的软件) . 这样的工具能同步本地目录和多个远程主机目录上的文件。
3. 使用版本控制软件(如subversion ) . 这是我最喜欢的方法。用它可以很好地维护我得代码,当发布我的应用时,可以在每一个服务器上运行svn update命令同步。这种方法也使切换服务器得代码到过去的某一个版本更加容易。
4. 使用一个文件服务器(你可能发现NFS 非常适合做这件事情). 这种方式是使用一个文件服务器来存放你的web应用. 当然,如果你的文件服务器宕机,那么多所有你的站点将不能使用。这时,你就需要花费更多的开支来恢复它。

选择哪种方式依赖于你的需求和你掌握的技能。如果你使用版本控制系统,那么你可能得计划一个方法如果同时执行一个更新命令更新所有服务器上的代码。然而,如果使用文件服务器,你就要实现一些失败恢复机制,防止万一服务器宕机导致请求失败。

2. 文件上传

当只有一台服务器时,文件上传不是一个问题。但是当我们有多台服务器时,那么上传的文件应该怎么存放呢?上传文件的问题和跨服务器php文件存储是类似的。下面是几种可能的方案:

1. 把文件存储到数据库中 。大多数数据允许存储二进制数据。当你请求文件下载时,访问数据把二进制数据和相应的文件名和类型输出给用户。在使用这种方案前应该考虑数据库怎样存储你的文件。该方法的问题在于如果数据库服务器宕机将使文件不可用。
2. 在一个文件服务器上存储上传的文件 . 与前面的介绍一样,你要安装一个文件服务器让所有web服务器共享,把所有上传的文件上传到这里,上传后所有的web服务器就都可以使用它。但是,如果文件服务器宕机,那么可能发生图像文件下载中断。
3. 设计你自己的上传机制传输文件到服务器到每一个服务器 . 这个方法没有单个文件服务器或者数据库方案的缺陷,但是将增加你代码的复杂度。例如,如果上传到多个服务器过程中,服务器宕机,你要怎么处理?

用数据库存储上传文件但是设计一个文件缓存机制是一个不错的方案。当服务器接收一个文件下载请求时,首先检查缓存系统中是否有该文件,如果发现那么从缓存系统下载,否则从数据库读取并把它缓存到文件系统中。

3. 会话(Sessions)

如果你熟悉php的session 处理,你将可能知道默认情况下,它存储session数据在服务器的临时文件里。而且,这个文件仅仅在你请求处理的那个服务器上,但是接下来的请求可能被另外一个服务器处理,这将在另一个服务器上生成新的session。这导致session频繁地不被识别,如登录用户总是要求重新登录。

我推荐的方案是,要么重新php内建的session处理机制存储session数据到数据库,或者实现你自己的机制保证发送一个用户的请求到同一台服务器。

4. 配置(Configuration)

尽管这个话题不是和php特别相关,我感觉还是有必要提及。当运行集群服务器时,用某种方法保持服务器之间的配置文件同步是一个好主意。如果配置文件不一致,可能导致一些非常奇怪的断断续续的行为导致很难排查这些问题。

我推荐使用版本控制系统单独管理他们。这样你可以为不同的项目安装存储不同的php配置文件,也可以保持所有服务器配置文件同步。

5. 日志(Logging)

像配置问题一样,logging不是仅仅和php相关。但是对于保持服务器健康运行它仍然是非常重要的。没有正确的logging系统,你怎么知道如果PHP代码开始产生错误(在系统正式运行时,你总是关闭display_errors 设置,不是吗?)

有几种方法你可以实现logging:

1. 在每一个服务器上记录日志。 这是最简单的方法。每一个机器仅仅记录一个文件。好处是简单,可能只要很少的配置。但是,随着服务器数量的增多,监控每台服务器上的日志文件将变得非常困难。
2. 记录日志到一个共享 这种方法每一个服务器仍然有这个日志文件,但是他们通过共享机制被存储在一个中央文件服务器上,这将使监控日志变得更简单。该方案的问题在于,如果文件服务器不可用将导致一个简单的日志不能写入问题最终导致整个应用崩溃。
3. 记录日志到logging服务器 你可以使用一个logging软件,如syslog 来把所有的日志写到一个中央服务器。尽管这个方法要求更多的配置,但是他也提供了最健壮的方案。

PHP 相关文章推荐
一个PHP+MSSQL分页的例子
Oct 09 PHP
ob_start(),ob_start('ob_gzhandler')使用
Dec 25 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
PHP学习笔记之session
May 06 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
Jun 03 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
Jul 03 PHP
laravel model 两表联查示例
Oct 24 PHP
PHP无敌近乎加密方式!
Jul 17 #PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 #PHP
PHP实现多条件查询实例代码
Jul 17 #PHP
php程序效率优化的一些策略小结
Jul 17 #PHP
在PHP中养成7个面向对象的好习惯
Jul 17 #PHP
PHP面向对象分析设计的61条军规小结
Jul 17 #PHP
Windows下XDebug 手工配置与使用说明
Jul 11 #PHP
You might like
漂亮但不安全的CTB
2006/10/09 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
php自定文件保存session的方法
2014/12/10 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
windows下python连接oracle数据库
2017/06/07 Python
详解django.contirb.auth-认证
2018/07/16 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
Python selenium自动化测试模型图解
2020/04/15 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
奥地利网上书店:Weltbild
2017/07/14 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
品质主管的岗位职责
2013/12/04 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
关于美容院的活动方案
2014/08/14 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
八年级历史教学反思
2016/02/19 职场文书
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS
Android中View.post和Handler.post的关系
2022/06/05 Java/Android