分享
设计一个支持数亿用户的系统
输入“/”快速插入内容
设计一个支持数亿用户的系统
本文将从以下几个方面设计
•
最初的设计
•
可扩展性的艺术:纵向扩展,横向扩展
•
扩展关系型数据库:主从复制、主-主复制、联合、分片、非规范化和SQL调优
•
使用哪种数据库:NoSQL还是SQL
•
先进概念:缓存、CDN、geoDNS等
•
其他:容错、可靠性、高可用性等讨论,可参考
高性能
、
高可用
1.
最初的设计
先设计一个用户的基本应用,最容易的方式是在一台服务器上部署整个应用
•
一个网站(包括API)在Apache(或Tomcat)等网络服务器上运行
•
一个MySQL(或NoSQL)之类的数据库
我们在同一台物理机上同时拥有Web 服务器和数据库服务,当前架构存在如下缺陷
•
若数据库出现故障,系统将失效
•
一旦网络服务器出现故障,则会导致整个系统的瘫痪
1.1
使用DNS服务器来解析主机名和IP地址
客户端连接到DNS系统,以获得我们系统所在服务器的互联网协议地址,一旦获得IP地址,请求就会直接发送到我们的系统,每次访问网站,计算机都会执行DNS查询
通常情况下,域名系统(DNS)服务器是作为托管公司提供的付费服务使用,不在自己服务器上运行
2.
可扩展的艺术
当数据量、工作量、用户量增加时,我们需要对系统进行扩展,添加更多的资源以处理更多的用户、数据、事务或请求,而不影响用户体验
有两种类型的扩展:
•
纵向扩展:
在现有服务器上增加更多的内存、CPU
•
横向扩展:
添加任意数量的硬件和软件实体
2.1
纵向扩展
也被称为"垂直扩展",为了提高系统处理日益增长的负载能力而使系统能够最大限度利用资源,如增加内存和CPU来增加服务器的能力
有很多方法可以进行纵向扩展
•
通过在 RAID 阵列中增加更多的硬盘来增加 I/O 容量
•
通过切换到固态硬盘(SSD)来改善 I/O 访问时间