以下并非所有都经过本人实践,部分为根据资料的假想所得,切勿贯彻本本主义。
网站架构目标
- 高可用性(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 的域名?
1.因为IE等浏览器对单一域名有并发限制
2.避免COOKIE 的影响,如taobao.com 域下的Cookie 信息不会被带到 taobaoimg.com 域下,提高了图片服务器解析 header 头的速度。
CDN
浏览器优化
- 节省带宽:js,css的静态gzip压缩
http header: Content-Encoding: gzip
- 浏览器缓存
http header: Etag,Last-Modified
- 小图片,css,js压缩,合并(JSA)
分布式Session
- 单点认证(SSO)
- session memcached
- db
分布式文件系统
- MogileFS
- FastDFS