大规模网站架构
以下并非所有都经过本人实践,部分为根据资料的假想所得,切勿贯彻本本主义。 网站架构目标 高可用性(High Availability) 可伸缩性(Scalability) 高性能(High Performance) 原则 尽量避免分布式,此为分布式第一原则 避免分布式事务 系统异构 架构与语言无关 系统可以多个平台并存(分层,模块化) 数据库 数据库读写分离 直接在程序中实现,或封装为ORM MySQL Proxy 数据库纵横切分 水平切分 根据自定义策略,如hash(N)%n(按hash分),查找表 在水平分库时,应优先考虑从属关系,以降低查询的复杂度。如用户A和用户A所发表的文章应分在同一数据库中。 如有用到user_id,则应该在公共库中创建一个路由表,表字段主要有:user_id,user_name,DB_Name。如没有用到user_id,而是根据user_name判断及查询用户的关系,则可省略路由表,根据某种算法进行DB定位,此时应考虑以后增加节点时,DB定位是否会发生变化的情况。 为避免分表时自增id发生重复的情况,可选择以下的几个方法: 1.在公共库创建一个空表,专门用于id分发。 2.利用递增值,如DB1的递增值为2,DB2的递增值为3,DB3的递增值为5… 3.利用初始值,id长度一般为11位,每个DB取9位(最多100个DB),如DB1的起始值为100000000,DB2的起始值为200000000,DB3的起始值为300000000… – 在系统设计时就考虑数据库切分的话,应先在一台服务器创建多个数据库节点,当负载达到一定程度时,再将节点迁移至其他服务器上,这样可以减少数据迁移的工作量。每次增加数据库节点,原则上应为已有节点的倍数,而不是一台台的增加。 垂直切分 按功能分(论坛,博客) 表分区 非关系数据库(NoSQL) 高性能 Redis Memcached 海量存储 MongoDB 负载均衡 DNS负载均衡 反向代理负载均衡 负载均衡软件 nginx HAProxy apache httpd LVS(网络第四层工作) F5(硬件,四层/七层) 高可用性 使用双机热备 故障时切换至备份机 工具(Linux-HA) heartbeat 缓存 按功能分 数据缓存 页面缓存 页面片段缓存 静态化 浏览器缓存 按存储介质分 本地缓存 分布式缓存 memcached 反向代理缓存 squid 巨无霸 Varnish 静态资源分离 img,js,css使用单独的服务器处理请求 图片服务器的域名不同 多台机器保存相同的图片(img3,img2子域名) 同一页面不同图片随机生成不同的子域名进行负载均衡 FAQ A.一些大网站,图片服务器为什么都用另外一个域名? 比如yahoo.com 图片服务器用了yimg.com 的域名? ...