我的任务是弄清楚如何大规模部署高可用性、高流量、动态、基于闪存的 Web 应用程序。该应用程序很有可能发展到 200 万用户,甚至更多。
当然,当真正需要做这件事时,我可能会请一位专家来帮我。目前,这一切都只是理论上的,我只是想弄清楚如何去做。
这是我目前的想法:
- 获得 1 或 2 千兆位的互联网连接。
- 2x HA 代理/负载均衡器。
- 12 台物理服务器(2 台四核处理器,32GB 内存)运行 25 台虚拟机 Apache Web 服务器 - 总共 300 台虚拟机。
- 2 个 memcached 服务器 (2 个四核,32GB RAM)
- 2 个主 Mysql DB 服务器,3 个只读从属 mysql BD 服务器
- 2 个 6TB SAN RAID
- 所有 10GbE 或光纤连接...
我的工作主要是研究硬件以及如何部署和维护它。
至于维护这个怪物,我正在研究 Slack、Rightscale、Landscape 和 VMware。
我也正在考虑将其部署在 Amazon EC2 上,但我更愿意自己将其架起来,因为从长远来看,这看起来要便宜得多。我可能会从这个机架开始,如果需要更多,再添加 EC2 实例。
您觉得呢?这是否有点过度?还不够?我是否已经搞清楚了?我是否遗漏了什么?
感谢所有阅读并回复的人!
答案1
在 EC2 上开发。如果/当你想将其转移到内部时,请设置自己的桉树集群并将其移动到那里,这将很容易,因为 Eucalyptus 是一个开源 EC2 基础设施克隆。
答案2
从我读过的有关高可扩展性的文章来看,最好的策略就是解决当前的瓶颈,然后开始规划下一个瓶颈。除非你使用的软件和硬件与别人已经使用的完全相同,并且除非在扩展时使用模式相同,否则你现在无法规划整个增长。你需要规划当前阶段和下一个阶段,而不是 200 万用户的目标。
答案3
我认为您严重高估了您的要求。作为参考,在运行 nginx+tornado 的双四核 xeon 前面的 2 个 ipvs 主/主处理 2.86 亿个 ~2400 字节 iframe 广告拦截 + iframe 内 7 个元素的完整广告流日志记录。每个元素的利用率都小于 40%(允许单个节点发生故障而不会“过载”)
您提到的第二个问题是动态的“基于闪存”,这意味着您的大部分带宽将用于服务初始闪存应用程序 - CDN 或缓存的候选者。
您的动态闪存应用程序可能会使用 gevent 或类似技术来回发送小消息。这些消息可能很小。您的应用程序智能可能需要解析、记录和响应这些消息,但是,每天有 200 万用户,每次 80 次交互就是 1.6 亿次交互。在高峰时段,您可能需要处理 3600tps。如果您需要 300 台服务器来处理,则需要重写代码。
如上所述,虚拟化 Web 服务器可能是一种性能浪费。即使是最轻量的虚拟化,运行速度也不会像裸机那样快。
但是,如果不了解您的架构或系统设计,那么根据定义不明确的要求,所给出的任何意见都只是猜测。
答案4
我可以回答 haproxy 服务器的大小问题。使用最新的 Linux 内核(>= 2.6.27)可从 TCP 拼接功能中受益,该功能将为您节省大量高带宽 CPU。使用您能找到的最高 CPU 频率。不需要很多核心,最好找到 3.6 GHz 双核而不是 2 GHz 8 核。对于 RAM,每 20k 个并发连接计算 1GB。为 keepalived 守护程序管理的 LB(主动/主动)使用两个 VIP,并在您的 DNS 中宣布它们。这样,您的两个 LB 将同时工作,如果其中一个失败,另一个将接管其 IP。我知道的一个非常大的站点仅在两个经过适当调整的 LB 上运行超过 300k 个并发连接,并且有相当大的余量。
不要低估网卡。与其他解决方案(1 或 10 GbE)相比,某些 NIC(例如 Myricom 的 Myri10GE NIC)的延迟较低,可以大大节省数据包处理成本和服务器上的并发连接数。
对于 Apache 服务器,haproxy 可以将传入连接集中到较少的传出连接中,从而减少服务器数量并保护它们免受流量激增的影响。但是,这仅适用于短连接。不要将其用于长轮询请求、聊天或大文件上传/下载。