、性能要求:
Ø 支持同时在线用户量(访问网站页面):10000人以上;
Ø 支持并发量:5000;
Ø 高峰负载时的平均响应时间(指每秒并发访问在4000以上):
u 页面访问时间(用户实测):1-5秒;
u 运行操作类响应时间(用户实测,50000个用户量):1秒-10秒。
Ø 日常运行时的平均响应时间:
u 页面访问时间(用户实测):1-3秒;
u 运行操作类响应时间(用户实测,100000个用户量):1秒-6秒。
Ø 有效运行时间:
u 7x24小时:99%;
u 每年因系统本身问题导致的宕机次数:≤4;
u 因系统本身问题出现故障时的恢复时间:≤24小时。
这种要求有人能做得到吗?
和老外聊天,会发现How do u do的搭讪out了。分享我常听到的:
借助情境What do u think of that book?/Looks like a great drink.What is it?
赞美I like ur posture.It makes u stand out nicely./Nice dress.Where did u get it?
天气It's so cold today./It's freezing!Do u know the temperature? (Pic)
1、Web层
主体架构可以基于 Struts 1.X/2.X,当然有很多更好的控制层框架供选择,以快速敏捷为准则吧。
抽象出核心库封装 控制器和中间层的操作。
在大规模集群环境下,session复制会引起严重的性能问题。考虑用 集群缓存 + cookie验证 代替session实现权限控制吧。
2、Cache层
配置 Memcache 组成集群缓存
对 Memcache 客户端进行封装
Memcached 节点组成池,调用示意:opList (BizName, 策略 ...)
3、中间层
“中间层”可以理解为基于应用和数据之间的层次。它被设计用来为Web应用提供:数据缓存 和 对应用透明的数据访问——即应用不需要考虑数据表拆分的问题。以服务的方式提供对存储层的高性能调用以及分布式计算。可供选择的框架:ICE 、Hadoop 直接基于Memcache开发(减少复杂度,推荐)
4、存储
推荐MySQL,理由:免费,经过实践检验,有大量成熟的案例、解决方案、技术支持。
小规模:一个 data table 维护存储服务器阵列,内容 -> mount ……
大规模:Master-Slave模式+MySQL Proxy,实现数据库读写分离。在中间层的包装下,可做如下扩展,以支持更大规模的数据存取:
数据库/表水平拆分,例 User -> User33% + User33% + User34%
数据库/表垂直拆分,例 User -> UserBaseInfo + UserAddrInfo
也可考虑使用 LongStore (龙存) 解决方案,由龙存管理存储阵列……
5、部署
划分子域名,每个子域名一个Web应用包,互不干扰
静态资源(css, js, image ...)使用专门的静态服务器
6、负载均衡
小规模:DNS轮询。
大规模:F5, 2*X 台F5服务器,F5是L4/L7层交换机,每台至少可处理200万连接(与服务器内存有关)。
Ngnix是L7层交换,LVS负载均衡也是一种方案
7、Web中间件选择
Tomcat - 最高400并发
Apache - 最高2000并发
Ngnix - 优于Apache
采用方案:Ngnix + Resin ,理由:
Resin提供更为快速的servlet引擎 - 选择Resin。
gzip问题 - Resin在单独处理gzip时存在内存溢出的隐患,因此要加一层 Ngnix。
Ngnix 能减少单独使用Resin时的内存占用 - Resin建立1000个连接使用1000个线程;加Ngnix后,透过其“异步连接”、“建立长连接”机制使Resin内存压力大大减小。
Ngnix 针对Linux系统有性能优化措施 - 0 Copy, send file ...
因此采用:1 Ngnix + 1 Resin,一对一。
静态服务器采用:Squid + Apache, why? because Squid has cache ability ...
新变化 - Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持 404/301/302 这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。
Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。
最新的Nginx 0.8.31版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。有的网站已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。
在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为"负载均衡服务器"与"Web缓存服务器"来使用。以下是配置片段供参考:
view plaincopy to clipboardprint?
http
{
...
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
...
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /data0/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天清理一次缓存,硬盘缓存空间大小为30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
}
server
{
...
location /
{
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1h;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
expires 1d;
}
#用于清除缓存,假设一个URL为http://192.168.1.44/test.txt,通过访问http://192.168.4.44/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*)
{
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
location ~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
}
}
同时,对于影响页面展现的静态资源,例如:css, js 等可以放在具有优质带宽的IDC(IDC=互联网数据中心,优质/高速的带宽也比较贵,正所谓一份价钱一分货);其他的静态资源,如图片等可以放在价格相对低廉的IDC中,以域名区分两种静态资源,节省每一分钱。
8、网络拓扑图
/ Ngnix - 1:1 - Resin
F5 --
\ Squid - 1:n - Apache
9、监控统计平台
业务统计 - 用户访问统计
软件性能 - 应用系统监控,例如:请求响应时间……
硬件/网络性能 - Ganglia监控
10、其它要点
IE浏览器对同一域名(包括子域名)只能建立2个连接,连接多了只能排队……
双F5架构,两台职能划分不同,镜像,心跳接管……
Raid存储阵列……
Linux操作系统及其优化……
案例
项目里有个LEADER, 我跟这个LEARDER 做了1年了,合作还算愉快。
----------------------------------
两边都不得罪,其实就是得罪两边。
--------------------------------
后来最近半年新来了个PM。这时有个新项目,LEADER建议在现有的项目上改,新PM打算重新设计。两人各执己见,一时无法决定。而我是这个新项目的重要CODER,自然我成了拉拢的对象。很难抉择该怎么站队。
LEADER算地头蛇,PM则是新官上任三把火。我是个新来的程序员,如何在这场权利的争夺中站对啊?怕误伤,误杀啊。
坚定的支持leader啊 搞走PM leader升PM
你升leader
慢慢来吧,小伙,与人斗其乐无穷
-------------------------------
这种方法一般程序员也干不了。
两不靠需要很好的掌握平衡,否则后患不少,不过反正你新来,可以走,也可以调。
选边的话,需要你花心思了,琢磨人的心思,还要设局。个人觉得对你难度太高。选边的另外一种办法是选定一个,无原则支持,但是你是新来的,有这么深厚的默契吗?
还有一个角度:你有没有能力去协调双方?
---------------------------------
改善非功能需求的最佳实践冗余负载均衡
方式有网络切换、集群管理、基于DNS配置的切换
算法有随机算法、选择响应时间最快的算法、选择负载最轻的算法、重型算法
失败转移
集群
将服务器组成一组,来统一进行管理,检测软、硬件的失败,处理系统的失败转移,自动因失败事件而重启
集群配置方式
两节点集群、集群对、Ring、N+1、N to N
改善性能性能有两个关键点:
处理时间,从计算、数据调度、缓存和网络传输
阻塞时间,来源于资源竞争和另一流程的依赖
处理措施使用好的算法或适用的技术
引入并行计算、限制并发请求以避免系统过度使用、TIME OUT措施
高可用可用是指随时才能访问,不能访问的原因是硬件、网络、服务器软件、和应用组件的失败;
如果一个应用组件不能提供足够快的响应时间也是指不可用了,这是指系统正常运行情况下,由于正在同时处理很多任务而导致的延时。
改善措施集群中的复制,有活跃式的复制:发给所有节点,节点都同时进行运算,但只采用其中一个作为响应;被动式的复制,只有主节点响应请求,其他节点与主节点同步。
扩展性改善扩展的原因通常是因为需求的变更。最重要的目标是改善系统开发以适应快速的变化。
可采取的方法有:定义清晰的范围、预知可能的变更(如果界面技术,隔离这一区域使其不能波及到其他地方)、使用高质量的对象模型(使用MVC模式来解耦界面组件和业务组件)
伸缩性的改善垂直伸缩:增加处理器或内存等,对系统是透明的;
水平伸缩:增加服务器,必须避免对服务器物理位置的依赖。
架构中的层
两层结构的系统指C/S架构的程序。通常指包含了展示和业务逻辑的客户端和服务器上的数据库。展示和业务逻辑紧密结合。
优点安全是一点,由于这些系统是位于防火墙后面,员工不能使用不安全的的PC。性能通常比较好,如果公司不使用比较老的很少内存的电脑的话。
缺点可用性是一个缺点,因为如果一个元件不能工作的时候,整个系统就变得不可用。
伸缩性是一个问题,由于维一能够增加的元件是数据库。
为了能增加新功能,你很明显会影响到其他元件,扩展性不行。
可管理性也是一个问题,监控所有正在运行客户端的PC是不可能的。
可维护性和可扩展性一样。
可靠性不是一个优点或缺点,由于请求增加时,所有的这些请求来到数据库,所有的数据库能处理增长的交易吞吐量。
三或多层架构的系统三层架构由WEB,业务逻辑和资源层组成。多层架构的系统有WEB,业务逻辑,整合和资源层。在非功能需求方面,三层和多层架构的系统拥有相同的优点和缺点。
优点当将展示层逻辑从PC客户端移到服务器端,而能被集群时,伸缩性被改善了。
由于集群层能够提供失败转移机制,可用性也有所改善。
由于功能被分解到不同的层中,扩展性也有所改善。你可以更改表现层又能使得对业务逻辑影响最小。
对于可维护性也是这样。
由于各层是部署在服务器上,使得监控各个元件变得更容易,这样可管理性也提高了。
分层对于安全性可以做得更多,但必须小心对性能造成影响。
性能可能是优点或缺点。主要还是优点,当分割线程到各服务器上时,如果你要在服务器间传送大数据时,这时可能会变成缺点了。
缺点多层系统原生是比较复杂,多层架构的系统其实是没有所谓的缺点。虽然这样说,并不会由于你有了多层设计,你就有了很好的架构。必须记得不要过度使用层数。
小结
架构是一系列的使得系统能够由一组具有自己的上下文的简单的子系统组成的结构规则。
性能是指系统的响应时间,如必须在3秒内响应。
伸缩性是指当访问量增加时可以增加冗余的组件,部署到增加的服务器上时,原系统无须作更改。C/S结构的系统,由于系统安装在客户端,就不能作这种伸缩。
扩展性,是指增加或修改功能时对现有的系统不会构成影响。如MODEL1的情形,系统没有分层,所有代码混在一起,更改时会互相影响。
可靠性,是指访问量增加的时候,事务有保证。通常数据库对增加的请求,事务的保证方面已经是有所处理了。
可用性,是指系统中的某个元件失败时,系统还能访问。如果是C/S架构的系统,无法分层,某个元件出现问题时,系统就不可用了。
可维护性,是指调整现有的系统流程,不会影响到其他元件。
可管理性,是指能监控系统伸缩能力,可靠性,可用性,性能和安全。
安全性,是指系统能够阻挡非法访问。
| 云计算技术简介 |
云计算技术概述,大数据时代来临,Google云计算技术,Amazon云计算技术,微软云计算技术等。 |
| 初始Hadoop |
Hadoop的起源、解决的问题、
以及它的特点、应用场景和发展趋势,企业应用情况,为什么使用,及其生态系统介绍。 |
Hadoop
单节点伪分布式安装 |
Hadoop
1.0 版本 安装环境搭建 |
Hadoop
架构 |
Hadoop
整体架构设计及重要的概念 |
Hadoop
HDFS 体系结构 |
1:HDFS
架构设计目标,设计思想,
2:特点,基本概念,容错性。
3:HDFS
界面介绍
4:HDFS
服务 |
Hadoop
HDFS 命令行 |
Hadoop
HDFS Shell 基本操作 |
HDFS
Java API 使用 |
1:基于Eclipse开发环境搭建
2:Java
API示范 :比如建立文件,删除,移动复制等 |
Hadoop
MapReduce 架构 原理 |
1:MapReduce 架构详解
2:MapReduce
流程
3:MapReduce
特点
4:MapReduce
容错性
5:MapReduce
服务 |
Hadoop
MapReduce api |
1:Mapper
2:Reducer
3:Driver |
Hadoop
MapReduce 编程实践 wordcount |
1:WordCount
程序编写,演示
2:运行MR
Job 示例 |
高级MR
编程 |
1:RecordReader
2:Partitioner
3:Combiner |
Hadoop
MapReduce IO |
1:数据完整性校验
2:压缩,包括:LZO、GZIP、Snappy
3:序列化
4:基于文件的数据结构,包括:SequenceFile、MapFile |
| 调优 |
调优经验分享 |
课程中的HBase部分:
掌握HBase基本原理,应用场景,掌握基本的编程技巧
| 章节课程 |
内容描述 |
| 初始HBase |
1:NoSql
数据库简介.
2:HBase
简介及与传统关系数据库的对比。
3:HBase
应用场景,企业应用情况,为什么使用。
4:HBase
特点 |
HBase
环境搭建 |
HBase
环境搭建 |
HBase
体系结构 |
1:HBase架构
2:HMaster、RegionServer、 Regoin 等概念 |
HBase
数据模型 |
1:表
2:Rowkey
3:Column
Families |
HBase
Shell 命令行 |
1:启动HBase
Shell
2:建立表
3:访问数据(添加,删除,查询)
4:练习 |
HBase
api 简单编程介绍 |
1:基于Eclipse开发环境搭建
2:基本操作(建表,查询数据,删除)
3:高级操作
(使用过滤器)
4:练习 |
HBase
row-key 设计及Scheme 设计 |
经验分享,设计原则 |
HBase
coprocessor等高级特性介绍 |
1:coprocessor特性分析,使用场景;
2:HBase
优化简单原则 |
课程中的Hive部分:
掌握Hive基本原理,应用场景,掌握基本的编程技巧
| 章节课程 |
内容描述 |
| 初始Hive |
1:Hive简介
2:为什么使用Hive
3:Hive
应用场景,企业应用情况 |
Hive
环境搭建 |
Hive
伪分布式环境搭建 |
Hive
体系结构 |
1:Hive主要的组件
2:用户接口
3:概念 |
Hive
QL |
1:Hive
类Sql
2:DDL
3:DML
4:Select
与连接查询 |
Hive
Java API |
1:搭建
Hive JDBC 开发环境
2:Hive
JDBC 开发流程 |
Hive
用户自定义函数简单介绍 |
UDF和UADF |
课程中的分布式协调系统Zookeeper部分:
掌握Zookeeper基本原理,应用场景,掌握基本的编程技巧
| 章节课程 |
内容描述 |
| 初始Zookeeper |
1:什么是ZooKeeper
2:ZooKeeper特性 |
Zookeeper
体系结构 |
1:ZooKeeper体系结构
2:ZooKeeper存储结构 |
Zookeeper
选举与锁机制 |
1:Zookeeper
选举机制
2:Zookeeper
选举算法
3:Zookeeper
锁机制 |
ZooKeeper
CRUD API |
1:Create
2:Read
3:Update
4:Delete |
| Zookeeper
应用场景 |
Zookeeper
应用场景 |