问题描述
在一个拥有众多服务器(5000+)的 php 服务项目中,将代码托管在 Git(Bitbucket)上,希望知道如何最佳地保持服务器的更新。用户已经考虑了一些方法,如使用 post-commit 钩子或每分钟使用 cron 进行 Git 拉取。用户倾向于使用 cron 方式,因为这样可以避免因服务器离线(关机或断网)而导致更新失败,因为服务器重新上线后可以自动恢复更新。
用户的当前做法是每分钟进行一次 Git 拉取,然后比较差异以确定是否需要拉取并运行迁移代码。用户关心的问题是关于请求速率限制,因为他们使用的是 Bitbucket,其速率限制为每小时 60000 次请求(即每分钟 1000 次请求)。这可能会在最多 1000 台服务器时出现问题。
此外,用户发现,如果将仓库设为公共仓库,可以进行未经身份验证的调用,其限制将基于 IP 而不是用户,这样无论有多少服务器,都不会受到限制。但这种做法需要对仓库进行加密,然后在拉取时进行解密并复制解密后的文件。
用户想知道是否这是处理这个问题的最佳方式,因为这种方法似乎相当非传统。他们还想了解在这种规模下处理类似问题的标准或推荐方式。
最佳回答
回复中提到的计划似乎不太合理。有一些免费且旨在进行良好集中管理和记录的工具可以解决这个问题,例如 Ansible。
以下是一个建议的解决方案步骤:
1. 将代码托管在 BitBucket 中。
2. 创建一个 Jenkins 服务器(开源/免费/资源消耗较低/文档齐全且易于使用)。
3. 在 BitBucket 中配置钩子,使其在代码变更时调用 Jenkins。你也可以选择让 Jenkins 定时轮询 BitBucket,但这种方法效率较低。
4. 在 Jenkins 的流水线中调用 Ansible(同样是开源/免费/资源消耗较低/文档齐全且易于使用)。
5. Ansible 可以使用基于数据库/文件/API 等查询的动态清单来针对所有 5000 台服务器执行操作。
使用上述方案,BitBucket 几乎没有负载,而 Ansible 则可以从一个位置执行所有操作,动态清单可以轻松地针对更多主机进行操作。
这种方法在行业内是标准的工具链,你还可以在此基础上使用 Ansible 来进行服务器补丁更新等操作,因此这是一个可复用的解决方案。
请注意,这种方案将避免 API 速率限制,并且可以轻松地扩展到更多主机,动态清单会为你自动解决目标主机的问题。
替代意见
回复中还提到,在 5000 台服务器的规模下,存在基础设施问题。可能有一些服务器因为过时而被替换,大约 3% 的服务器可能存在内存、磁盘、控制器或网络等硬件问题。在这种规模下,关键是错误修复和库存管理,可以逐渐将服务器带到当前状态,以便它们重新加入系统。
此外,虽然 Ansible 的代码听起来很简单,但在实际应用中可能会遇到一些挑战。用户也提到了关于维护规模为 5000 的服务器集群时可能面临的一些问题和挑战。
总的来说,回复中提到的方案是在规模较大的数据中心环境中使用的标准工具链。对于你的情况,你可以根据实际情况选择最合适的解决方案。
请注意,以上解决方案和替代意见仅供参考,具体方案应根据你的项目需求和环境来确定。