第十五章 互联网架构演进
互联网的浪潮下,各种技术层出不穷,是跟上时代的步伐,还是固守坚固的城池....
技术选型的问题决定软件项目的大方向,新旧技术之争是永恒的焦点。
“不识庐山真面目,只缘身在此山中”,跳出技术的范畴,用业务发展的角度去审视技术,答案就会非常清晰。
1000以内的加减乘除用计算器就足够了,不必使用曙光超级计算机。
技术的权衡本质是在业务和成本之间寻求一个平衡点。
淘宝
- 个人网站,2003年4月,淘宝秘密起始于湖畔花园,购买了一个LAMP(Linux+Apache+MySQL+PHP)架构的网站。
2003年底,MySQL换成Oracle,同时使用一个开源的连接池代理服务SQL Relay。Oracle容量大、稳定、安全、性能高,Oracle的性能和并发访问能力之所以如此强大,有一个关键性设计——连接池,连接池中放的是长连接,任何一个请求只需要从连接池中取得一个链接即可,用完后释放,不需要频繁的创建和断开连接。
2004年,为解决SQL Relay死锁问题,开发语言从PHP换成Jave。原因是当时(04年)Jave是最成熟的网站开发语言,有比较良好的企业开发框架,被世界上主流的大规模网站普遍采用。另外市场上Jave开发人才比较多,后期维护成本较低。
2004-2005(大概是这个时间段),引入IBM小型机、使用EMC存储。
2005年工作:
1、Oracle数据库分库,商品信息和用户信息分库存放,由数据库路由的框架DBRoute统一处理数据的合并、排序、分页等操作;
2、控制层用Spring框架替换EJB;
3、研发基于Berkeley DB的缓存系统,把很多不太变动的只读信息放了进去;
4、加入CDN内容分发网络。
目的:围绕提高容量、提高性能和节约成本。2007年,参照GFS(Google File System),研发了淘宝图片存储系统TFS(TaoBao File System)。
特点:文件比较小;并发量高;读操作远大于写操作;访问随机;没有文件修改的操作;存储成本低;能容灾、能备份。
TFS已开源:code.taobao.org2007年,开发分布式缓存系统Tair(TaoBao Pair),由一个中心控制节点和一系列的服务节点组成。
Tair已开源:code.taobao.org2008年后:
打散树状节点,把品牌、款式、材质等做成类似于标签的概念(属性),建立离散、灵活的数据结构。
拆分底层业务,例如建订单、减库存、修改订单状态等原子级操作,由原子级操作组成模块,大量模块可以复用,每个系统可以单独部署。开发了高性能服务框架HSF,解决分布式情况下的服务调用问题。
推出消息中间件Notify:把要发出的通知存放在数据库中,如果实时发送失败,再用一个时间程序来周期性地发送这些通知,系统记录下消息的中间状态和时间戳,保证消息一定能发出,也一定能通知到,且通知带有时间顺序,通知甚至可以实现事务性的操作。
数据库分库数量增多后,研发出数据查询的中间件TDDL(分布式数据访问层)
三个主要特性:
1、将针对数据的读写请求发送到最合适的地方;
2、数据的多向非对称复制——一次写入,多点读取;
互联网业务发展
- 业务复杂性
- 初创期(创新,快)0-1w
- 发展期(堆功能,优化期)1w-10w
- 架构期(拆功能,拆数据库,拆服务器)10w到100w
- 竞争期(平台化,避免重复造轮子;服务化,解决系统交互问题)1000w+
- 成熟期(优化)1亿+
- 用户规模增大
- 性能
- 可用性
第十六章 互联网架构模板
存储层技术
SQL
当业务发展到一定程度时,独立成中间件,例如百度的DBProxy,淘宝的TDDL。(适合大规模公司)
中小公司适合使用开源方案:MySQL Router,Atlas
NoSQL
性能强,存储结构丰富。
小文件存储
海量存储,海量访问。(图片)
HBase,Hadoop,Hypertable,FastDFS。
大文件存储
视频。Hadoop,HBase,Storm,Hive
开发层技术
开发框架
选择成熟的框架
Web服务器
Tomca,JBoss,Resin,Apache
容器
docker
网络层技术
负载均衡
DNS,Nginx,LVS,F5
CDN
多机房
用户层技术
用户管理
sso,CAS
消息推送
平台技术
运维平台
配置
部署
监控
应急
- 标准化
- 平台化
- 自动化
- 可视化
数据平台
- 数据管理
- 采集,存储,访问,安全
- 数据分析
- 统计
- 挖掘
- 机器学习
- 深度学习
- 数据管理
第十七章 开源系统
如何选择一个开源项目
- 是否满足业务
- 是否成熟(版本号1.x以上,使用公司数量,社区活跃度)
- 运维功能是否具备(日志,命令行,管理控制台,故障检测)
如何使用开源方案
- 深入研究,仔细测试
- 通读文档,了解设计原理
- 核对每个配置项的作用,识别关键配置项
- 进行多种场景的性能测试
- 进行压力测试
- 进行故障测试
- 灰度发布
- 做好应急(选用成熟的方案备份)
如何基于开源项目做二次开发
- 包装,做辅助系统
- 自己发明轮子