Conan 是一个免费且开源 (FOSS) 项目,它实现了 C 和 C++ 包管理器,由用户端应用程序和服务器组成,可以在任何地方运行,因为系统是分散的。我们在 **conan.io** 运行一个服务器实例作为便利的存储库,用户可以在其中读取和写入自己的包,而无需运行自己的服务器。

Conan 的使用量在过去几个月里大幅增加,我们开始遇到 conan.io 服务器内存和处理器的某些问题。我们当时使用一台机器,conan-server、conan.io 网页和 web-api 应用程序都在上面运行。我们已经通过增加服务器资源来扩展服务器。

真正的问题是,每当我们需要重启或对服务器进行维护时,我们都必须切断所有用户的服务。这绝对需要解决。

我们做了什么?我们已经使用 Docker 部署我们的应用程序,并且已经隔离了运行的应用程序,所以很多工作都已经完成了。

横向扩展

因此,这就是我们逐步推出新基础设施的方式

  • 在云提供商(我们的例子是 DigitalOcean)中准备了一个包含最小安装应用程序的服务器镜像(快照)。
  • 启动了 3 个新的 Droplet(DigitalOcean 中的服务器):两个用于应用程序(负载均衡服务器)和一个用于负载均衡器。我们保留了旧实例直到整个过程完成,以避免 conan.io 停机。
  • 在新服务器之间创建了一个私有网络,以便服务器和负载均衡器可以通信,无需加密或用户/密码安全。
  • 安装 Nginx 作为负载均衡器 https://nginx.ac.cn/en/docs/http/load_balancing.html。此服务器处理 SSL 证书并将流量均衡到新服务器。
  • 我们已经在服务器中使用了 Nginx 来将不同的域名(server.conan.io、webapi.conan.io 和 conan.io)路由到正确的应用程序 Docker 容器。 - 我们只是保留了相同的配置,但去除了 SSL 管理,现在由负载均衡器处理。
  • 测试一切正常,使用本地机器的 /etc/hosts 文件模拟 DNS 更改指向负载均衡器,而无需更改真实的 DNS。
  • 更改 DNS 并将域名指向新的负载均衡器。

现在我们准备好了,只需创建一个新的 Droplet 并将其私有 IP 添加到负载均衡器配置中,即可轻松扩展 conan.io。负载均衡器将自动分发请求,如果服务器宕机,它将把请求传递到其他可用的服务器。它还将更易于执行维护任务,而不会中断服务。

为什么我们一开始只使用一台服务器

好的,关于 DevOps 的不错的帖子…… 等等!所以,你只使用一台服务器来运行整个 conan.io?是的,我们确实是这样。我们有几个原因

  • 我们没有获得资金,因此降低成本是一个重要原因。我们已经获得了一些收入,这是用户希望获得咨询和帮助的结果。因此,我们更有信心 conan.io 将找到可持续发展之路。
  • 同时性系数。并非每个用户都同时连接并从 conan.io 安装包。事实上,本地 Conan 缓存已被证明对离线工作非常有用,并且只需要最少的服务器连接。因此,它更多地与内存使用有关,而不是服务器无法处理每秒如此多的请求。实际上,最重要的原因是提供持续可靠的服务,而不是处理大量并发请求。
  • 一开始非常简单,可以快速启动并获得关于该工具的反馈。你知道,保持精简,避免过早优化。现在,Conan API 调用在过去几个月里有所增加,因此我们更有信心在提供一些价值,并且意识到不中断服务变得越来越重要。
  • 我们能够在一台服务器上运行,因为大部分下载和上传都外包给了 Amazon Web Services S3 服务。显然,如果我们的服务器不得不处理所有这些下载和上传,我们早就遇到问题了。
  • 中央 conan.io 服务器对于可靠操作不是必需的,因为服务器已经作为开源提供,并且可以轻松启动,以运行内部服务器实例。我们从经验中知道,希望使用这项技术的公司确实需要这个服务器,因此我们在 Conan 设计中考虑了这一点,并且这个假设似乎得到了证实。

结论

这篇博文可能对许多 C 和 C++ 开发人员或 Conan 用户没有太大的兴趣,他们可能更感兴趣的是新功能、库等。但这是必要的,并且由于我们知道一些用户已经在运行自己的服务器,我们认为这些信息对他们也很有用。请记住,如果您需要帮助使用您的内部 Conan 服务器,我们随时为您提供帮助,请给我们发送电子邮件。