我们曾经在标准的LAMP配置上运行社交网站。我们有一个实时服务器,测试服务器和开发服务器,以及本地开发人员计算机。全部使用GIT进行管理。
在每台计算机上,我们都有PHP文件,还有MySQL服务,以及一个包含用户可以上传的图片的文件夹。Live服务器增长为拥有约100K(!)的经常用户,转储约为2GB(!),Image文件夹约为50GB(!)。到我离开时,我们的服务器已达到其CPU,Ram的极限,并且最重要的是达到了并发网络连接的极限(我们甚至编译了自己的网卡驱动程序版本,以最大限度地提高服务器的“笑声”)。我们不能(也不应该在您的网站上假设)将2GB的数据和50GB的图像放入GIT。
为了在GIT下轻松地管理所有这些,我们可以通过将这些文件夹路径插入.gitignore来忽略二进制文件夹(包含图像的文件夹)。在Apache documentroot路径之外,我们还有一个名为SQL的文件夹。在该SQL文件夹中,我们会将来自开发人员的SQL文件放入递增编号(001.florianm.sql,001.johns.sql,002.florianm.sql等)中。这些SQL文件也由GIT管理。实际上,第一个sql文件将包含大量数据库模式。我们不在GIT中添加用户数据(例如,用户表或注释表的记录),但是诸如config或拓扑或其他特定于站点的数据之类的数据已保存在sql文件中(因此由GIT保存)。通常,由开发人员(最了解代码的人员)来确定关于SQL模式和数据,GIT不维护哪些内容。
当发布时,管理员登录到开发服务器,将实时分支与所有开发人员以及开发机器上所需的分支合并到更新分支,然后将其推送到测试服务器。在测试服务器上,他检查Live服务器的更新过程是否仍然有效,并迅速将Apache中的所有流量都指向一个占位符站点,创建一个数据库转储,将工作目录从“ live”指向“ update”。 ',将所有新的sql文件执行到mysql中,并将流量重新指向正确的站点。当所有利益相关者在检查测试服务器后都同意时,管理员从测试服务器到实时服务器都执行相同的操作。之后,他将生产服务器上的实时分支合并到所有服务器的主分支中,并重新建立所有实时分支的基础。
如果测试服务器上有问题,例如。合并有太多冲突,然后恢复了代码(将工作分支指向“实时”)并且从未执行过sql文件。在执行sql文件的那一刻,这在当时被认为是不可逆的操作。如果SQL文件不能正常工作,则使用转储恢复数据库(开发人员告知,由于提供了未经测试的SQL文件)。
今天,我们维护一个sql-up和sql-down文件夹,并使用相同的文件名,开发人员必须在其中测试是否可以同时降级两个升级的sql文件。最终可以使用bash脚本执行此操作,但是如果人的眼睛一直在监视升级过程,则是个好主意。
它不是很好,但是很容易管理。希望这能为您提供一个真实,实用,相对高可用性的站点的信息。有点过时了,但仍然遵循。