我想获得一些建议/最佳实践,了解如何制定扩展 Web 应用程序的策略。我在这里说了些废话,展示了我有限的知识,但想填补我的知识空白。我试图尽可能多地学习这些知识,但我意识到我需要寻求一些外部帮助,因此作为一个一般性问题,最好知道最容易外包的东西是什么。
我的背景 - 我是一名开发人员,主要从事用户界面开发,并一直使用 Flash 和 PHP 开发应用程序的功能,让用户上传图像和视频进行在线共享。
系统架构如下:
- 一台同时充当数据库服务器 (MySQL) 的 Web 服务器。该服务器位于一家值得信赖且可靠的托管公司的托管包中。Web 服务器提供 PHP 页面和 Flash SWF,它们是主要的 UI 组件
- Amazon S3 存储桶用于存储用户的图像、视频和音频文件。
- 用户界面组件要么是 PHP 页面,要么是 Flash SWF,例如,图像和视频通过 Flash swfs 查看,Flash swfs 通过 AMFPHP 服务查询数据库以获取要加载的图像和视频文件的 URL。然后从 Amazon S3 存储桶接收这些 URL。另一个 FLash SWF 处理上传并将文件发布到在 Amazon Cloud 上的 EC2 实例上运行的 PHP 脚本。
- 用于管理图像、视频和音频上传的上传服务器。这是一个 Amazon EC2 实例,运行在 Elastic Load Balancer 后面,当 CPU 容量达到 80% 时,它会添加更多实例。
- 我们还使用在 Amazon EC2 上运行的第三方服务来转码视频文件。
因此,我认为在很大程度上一切都已设置好,可以进行扩展。但我没有扩展或管理高流量 Web 应用程序的经验,因此将依赖我们的 Web 服务器托管公司来管理 Web/应用服务器和数据库服务器的可扩展配置的设置。
硬件/架构扩展-
据我了解,第一步是将 Web 服务器和数据库分开,让数据库服务器独立运行,将 Web 服务器置于负载平衡器后面,最终为数据库服务器配置主/从配置。我应该要求我的 Web 托管公司做什么?这样做有什么问题,对我的 AMFPHP 服务、不同类型的查询(写入和读取)有什么影响?我有一个单独的脚本,其中包含数据库连接详细信息,该脚本包含在 globals.php 脚本中,因此我可以轻松地在一个步骤中更新连接详细信息。在主/从配置中,所有写入通常都转到主服务器,而读取来自从服务器,我说得对吗?这是否意味着我需要查看我的所有数据库查询,并确保如果是“UPDATE”或“DELETE”查询,它会转到主数据库服务器?在我的 PHP 代码中,数据库查询分布在整个脚本中,并根据需要从函数中调用。我读过一些关于数据库抽象的内容,但并不完全理解这种方法的重要性。
代码优化以实现扩展-
我需要考虑更改代码中的哪些部分以使其更具可扩展性?PHP 中哪些部分会受到扩展的影响?
安全-
当考虑处理大量数据时,我需要注意哪些与安全相关的常见事项。
数据库优化、备份和恢复程序-
对于大型数据库,为 MySQL 数据库实施自动数据库备份和恢复策略的最佳方法是什么?我是否应该考虑拆分我的数据库 - 我将所有数据保存在一台服务器上,尽管有多个数据库,例如用户成员资格信息的数据库、用于保存有关用户上传的数据的数据库、包含有关网站运行的数据的数据库(例如与管理功能更相关的数据)。我希望能够分析数据库,以便能够了解事情的运作方式,并了解 Web 应用程序的使用方式和开发方式,因此假设最好定期对数据库进行快照并存储这些快照,这样我就可以了解事情随时间的发展时间表,并使用某种数据库分析工具查询这些快照以跟踪事情的变化情况。关于如何做到这一点,有什么好的建议吗?有什么工具可以让我和其他非技术人员分析数据并生成报告。
这大概涵盖了我对制定扩大规模战略时需要解决的领域的理解。人们认为我需要做什么才能成功管理上述问题?我的假设正确吗?我错过了什么?我还应该考虑什么?有没有好的资源可以处理这个问题?如果我要招聘一个人来帮助解决这些问题,我应该期望完美的候选人拥有哪些技能/经验?
非常感谢所有建议/经验/意见
干杯!
答案1
这只是一些指示,希望在我投票结束之后能有所帮助。考虑阅读:
这两本都是关于如何构建可扩展 Web 应用程序的好书,涵盖了所使用的技术和思维方式/设计过程。
答案2
这个问题太宽泛了,无法在这里回答 - 我建议阅读highscalability.com