“12306”的架构到底有多牛逼?

在网上看到一篇讲12306抢票的文章 , 我看完后 , 觉得文章写很完整 。
不仅给出了模拟场景的代码 , 而且也用压测工具测试了并发情况 , 是一个很好的学习案例 , 分享给大家共读 。
“12306”的架构到底有多牛逼?
文章图片
提纲
作者:绘你一世倾城12306抢票 , 极限并发带来的思考
虽然现在大多数情况下都能订到票 , 但是放票瞬间即无票的场景 , 相信大家都深有体会 。
尤其是春节期间 , 大家不仅使用12306 , 还会考虑“智行”和其他的抢票软件 , 全国上下几亿人在这段时间都在抢票 。
“12306服务”承受着这个世界上任何秒杀系统都无法超越的QPS , 上百万的并发再正常不过了!
笔者专门研究了一下“12306”的服务端架构 , 学习到了其系统设计上很多亮点 , 在这里和大家分享一下并模拟一个例子:如何在100万人同时抢1万张火车票时 , 系统提供正常、稳定的服务 。
大型高并发系统架构
高并发的系统架构都会采用分布式集群部署 , 服务上层有着层层负载均衡 , 并提供各种容灾手段(双火机房、节点容错、服务器灾备等)保证系统的高可用 , 流量也会根据不同的负载能力和配置策略均衡到不同的服务器上 。
下边是一个简单的示意图:
“12306”的架构到底有多牛逼?
文章图片
负载均衡简介
上图中描述了用户请求到服务器经历了三层的负载均衡 , 下边分别简单介绍一下这三种负载均衡 。
①OSPF(开放式最短链路优先)是一个内部网关协议(InteriorGatewayProtocol , 简称IGP)
OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库 , 生成最短路径树 , OSPF会自动计算路由接口上的Cost值 , 但也可以通过手工指定该接口的Cost值 , 手工指定的优先于自动计算的值 。
OSPF计算的Cost , 同样是和接口带宽成反比 , 带宽越高 , Cost值越小 。 到达目标相同Cost值的路径 , 可以执行负载均衡 , 最多6条链路同时执行负载均衡 。
②LVS(LinuxVirtualServer)
它是一种集群(Cluster)技术 , 采用IP负载均衡技术和基于内容请求分发技术 。
调度器具有很好的吞吐率 , 将请求均衡地转移到不同的服务器上执行 , 且调度器自动屏蔽掉服务器的故障 , 从而将一组服务器构成一个高性能的、高可用的虚拟服务器 。
③Nginx
想必大家都很熟悉了 , 是一款非常高性能的HTTP代理/反向代理服务器 , 服务开发中也经常使用它来做负载均衡 。
Nginx实现负载均衡的方式主要有三种:
轮询
加权轮询
IPHash轮询
下面我们就针对Nginx的加权轮询做专门的配置和测试 。
Nginx加权轮询的演示
Nginx实现负载均衡通过Upstream模块实现 , 其中加权轮询的配置是可以给相关的服务加上一个权重值 , 配置的时候可能根据服务器的性能、负载能力设置相应的负载 。
#配置负载均衡
upstreamload_rule{
server127.0.0.1:3001weight=1;
server127.0.0.1:3002weight=2;
server127.0.0.1:3003weight=3;
server127.0.0.1:3004weight=4;
}
...
server{
listen80;
server_nameload_balance.comwww.load_balance.com;
location/{
proxy_passhttp://load_rule;
}
我在本地/etc/hosts目录下配置了www.load_balance.com的虚拟域名地址 。
接下来使用Go语言开启四个HTTP端口监听服务 , 下面是监听在3001端口的Go程序 , 其他几个只需要修改端口即可:
“12306”的架构到底有多牛逼?