Apr 24

2012-4-24 11:25:37 org.apache.catalina.core.ApplicationDispatcher invoke
严重: Allocate exception for servlet probe
java.lang.SecurityException: Servlet of class org.jstripe.tomcat.probe.ProbeServlet is privileged and cannot be loaded by this web application
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1134)



在tomcat/conf/server.xml:


<Context privileged="true" otherparameters.... />    

Apr 23
这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发、高容错的系统并能应用在实践上。今天在网上找架构相关的资料时,看到一个被和谐的视频网站YouTube的架构分析,看了以后觉得自己又向架构走近了一步,于是赶快拿出来与大家一起分享。 

YouTube发展迅速,每天超过1亿的视频点击量,但只有很少人在维护站点和确保伸缩性。这点和PlentyOfFish类似,少数人维护庞大系统。是什么原因呢?放心绝对不是靠人品,也不是靠寂寞,下面就来看看YouTube的整体技术架构吧。 

平台 
     
Apache 
Python 
Linux(SuSe) 
MySQL 
psyco,一个动态的Python到C的编译器 
lighttpd代替Apache做视频查看

状态 

支持每天超过1亿的视频点击量 
成立于2005年2月 
于2006年3月达到每天3千万的视频点击量 
于2006年7月达到每天1亿的视频点击量 
2个系统管理员,2个伸缩性软件架构师 
2个软件开发工程师,2个网络工程师,1个DBA

Web服务器 

1,NetScaler用于负载均衡和静态内容缓存 
2,使用mod_fast_cgi运行Apache 
3,使用一个Python应用服务器来处理请求的路由 
4,应用服务器与多个数据库和其他信息源交互来获取数据和格式化html页面 
5,一般可以通过添加更多的机器来在Web层提高伸缩性 
6,Python的Web层代码通常不是性能瓶颈,大部分时间阻塞在RPC 
7,Python允许快速而灵活的开发和部署 
8,通常每个页面服务少于100毫秒的时间 
9,使用psyco(一个类似于JIT编译器的动态的Python到C的编译器)来优化内部循环 
10,对于像加密等密集型CPU活动,使用C扩展 
11,对于一些开销昂贵的块使用预先生成并缓存的html 
12,数据库里使用行级缓存 
13,缓存完整的Python对象 
14,有些数据被计算出来并发送给各个程序,所以这些值缓存在本地内存中。这是个使用不当的策略。
应用服务器里最快的缓存将预先计算的值发送给所有服务器也花不了多少时间。只需弄一个代理来监听更改,预计算,然后发送。
视频服务 

1,花费包括带宽,硬件和能源消耗 
2,每个视频由一个迷你集群来host,每个视频被超过一台机器持有 
3,使用一个集群意味着: 
   -更多的硬盘来持有内容意味着更快的速度 
   -failover。如果一台机器出故障了,另外的机器可以继续服务 
   -在线备份 
4,使用lighttpd作为Web服务器来提供视频服务: 
   -Apache开销太大 
   -使用epoll来等待多个fds 
   -从单进程配置转变为多进程配置来处理更多的连接 
5,大部分流行的内容移到CDN: 
  -CDN在多个地方备份内容,这样内容离用户更近的机会就会更高 
  -CDN机器经常内存不足,因为内容太流行以致很少有内容进出内存的颠簸 
6,不太流行的内容(每天1-20浏览次数)在许多colo站点使用YouTube服务器 
  -长尾效应。一个视频可以有多个播放,但是许多视频正在播放。随机硬盘块被访问 
  -在这种情况下缓存不会很好,所以花钱在更多的缓存上可能没太大意义。 
  -调节RAID控制并注意其他低级问题 
  -调节每台机器上的内存,不要太多也不要太少  

视频服务关键点 
     
1,保持简单和廉价 
2,保持简单网络路径,在内容和用户间不要有太多设备 
3,使用常用硬件,昂贵的硬件很难找到帮助文档 
4,使用简单而常见的工具,使用构建在Linux里或之上的大部分工具 
5,很好的处理随机查找(SATA,tweaks)
缩略图服务
1,做到高效令人惊奇的难 
2,每个视频大概4张缩略图,所以缩略图比视频多很多 
3,缩略图仅仅host在几个机器上 
4,持有一些小东西所遇到的问题: 
   -OS级别的大量的硬盘查找和inode和页面缓存问题 
   -单目录文件限制,特别是Ext3,后来移到多分层的结构。内核2.6的最近改进可能让 Ext3允许大目录,但在一个文件系统里存储大量文件不是个好主意 
   -每秒大量的请求,因为Web页面可能在页面上显示60个缩略图 
   -在这种高负载下Apache表现的非常糟糕 
   -在Apache前端使用squid,这种方式工作了一段时间,但是由于负载继续增加而以失败告终。它让每秒300个请求变为20个 
   -尝试使用lighttpd但是由于使用单线程它陷于困境。遇到多进程的问题,因为它们各自保持自己单独的缓存 
   -如此多的图片以致一台新机器只能接管24小时 
   -重启机器需要6-10小时来缓存 
5,为了解决所有这些问题YouTube开始使用Google的BigTable,一个分布式数据存储: 
   -避免小文件问题,因为它将文件收集到一起 
   -快,错误容忍 
   -更低的延迟,因为它使用分布式多级缓存,该缓存与多个不同collocation站点工作 
   -更多信息参考Google Architecture,GoogleTalk Architecture和BigTable 

数据库 
     
1,早期 
   -使用MySQL来存储元数据,如用户,tags和描述 
   -使用一整个10硬盘的RAID 10来存储数据 
   -依赖于信用卡所以YouTube租用硬件 
   -YouTube经过一个常见的革命:单服务器,然后单master和多read slaves,然后数据库分区,然后sharding方式 
   -痛苦与备份延迟。master数据库是多线程的并且运行在一个大机器上所以它可以处理许多工作,slaves是单线程的并且通常运行在小一些的服务器上并且备份是异步的,所以slaves会远远落后于master 
   -更新引起缓存失效,硬盘的慢I/O导致慢备份 
   -使用备份架构需要花费大量的money来获得增加的写性能 
   -YouTube的一个解决方案是通过把数据分成两个集群来将传输分出优先次序:一个视频查看池和一个一般的集群 
2,后期 
   -数据库分区 
   -分成shards,不同的用户指定到不同的shards 
   -扩散读写 
   -更好的缓存位置意味着更少的IO 
   -导致硬件减少30% 
   -备份延迟降低到0 
   -现在可以任意提升数据库的伸缩性

数据中心策略
1,依赖于信用卡,所以最初只能使用受管主机提供商 
2,受管主机提供商不能提供伸缩性,不能控制硬件或使用良好的网络协议 
3,YouTube改为使用colocation arrangement。现在YouTube可以自定义所有东西并且协定自己的契约 
4,使用5到6个数据中心加CDN 
5,视频来自任意的数据中心,不是最近的匹配或其他什么。如果一个视频足够流行则移到CDN 
6,依赖于视频带宽而不是真正的延迟。可以来自任何colo 
7,图片延迟很严重,特别是当一个页面有60张图片时 
8,使用BigTable将图片备份到不同的数据中心,代码查看谁是最近的

学到的东西
1,Stall for time。创造性和风险性的技巧让你在短期内解决问题而同时你会发现长期的解决方案 
2,Proioritize。找出你的服务中核心的东西并对你的资源分出优先级别 
3,Pick your battles。别怕将你的核心服务分出去。YouTube使用CDN来分布它们最流行的内容。创建自己的网络将花费太多时间和太多money 
4,Keep it simple!简单允许你更快的重新架构来回应问题 
5,Shard。Sharding帮助隔离存储,CPU,内存和IO,不仅仅是获得更多的写性能 
6,Constant iteration on bottlenecks: 
   -软件:DB,缓存 
   -OS:硬盘I/O 
   -硬件:内存,RAID 
7,You succeed as a team。拥有一个跨越条律的了解整个系统并知道系统内部是什么样的团队,如安装打印机,安装机器,安装网络等等的人。 
   With a good team all things are possible。
文章出处:http://www.itivy.com/ivy/archive/2011/3/6/634350416046298451.html
Apr 17

来源:http://www.oschina.net/question/12_32460

记得以前给大家介绍过视频网站龙头老大YouTube的技术架构, 相信大家看了都会有不少的感触,互联网就是这么一个神奇的东西。今天我突然想到,优酷网在国内也算是视频网站的老大了,不知道他的架构相对于 YouTube是怎么样的,于是带着这个好奇心去网上找了优酷网架构的各方面资料,虽然谈得没有YouTube那么详细,但多少还是挖掘了一点,现在总结 一下,希望对喜欢架构的朋友有所帮助。

一、网站基本数据概览

  • 据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最高的厂商。
  • 硬件方面,优酷网引进的戴尔服务器主要以 PowerEdge 1950与PowerEdge 860为主,存储阵列以戴尔MD1000为主,2007的数据表明,优酷网已有1000多台服务器遍布在全国各大省市,现在应该更多了吧。

二、网站前端框架

从一开始,优酷网就自建了一套CMS来解决前端的页面显示,各个模块之间分离得比较恰当,前端可扩展性很好,UI的分离,让开发与维护变得十分简单和灵活,下图是优酷前端的模块调用关系:

这样,就根据module、method及params来确定调用相对独立的模块,显得非常简洁。下面附一张优酷的前端局部架构图:

三、数据库架构

应该说优酷的数据库架构也是经历了许多波折,从一开始的单台MySQL服务器(Just Running)到简单的MySQL主从复制、SSD优化、垂直分库、水平sharding分库,这一系列过程只有经历过才会有更深的体会吧,就像MySpace的架构经历一样,架构也是一步步慢慢成长和成熟的。

1、简单的MySQL主从复制:

MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其原来图如下:

其主从复制的过程如下图所示:

但是,主从复制也带来其他一系列性能瓶颈问题:

  1. 写入无法扩展
  2. 写入无法缓存
  3. 复制延时
  4. 锁表率上升
  5. 表变大,缓存率下降

那问题产生总得解决的,这就产生下面的优化方案,一起来看看。

2、MySQL垂直分区

如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力。经过垂直分区后的数据库架构图如下:

然而,尽管业务之间已经足够独立了,但是有些业务之间或多或少总会有点联系,如用户,基本上都会和每个业务相关联,况且这种分区方式,也不能解决单张表数据量暴涨的问题,因此为何不试试水平sharding呢?

3、MySQL水平分片(Sharding)

这是一个非常好的思路,将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下:

如何来确定某个用户所在的shard呢,可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据,如下图所示:

但是,优酷是如何解决跨shard的查询呢,这个是个难点,据介绍优酷是尽量不跨shard查询,实在不行通过多维分片索引、分布式搜索引擎,下策是分布式数据库查询(这个非常麻烦而且耗性能)

四、缓存策略

貌似大的系统都对“缓存”情有独钟,从http缓存到memcached内存数据缓存,但优酷表示没有用内存缓存,理由如下:

  1. 避免内存拷贝,避免内存锁
  2. 如接到老大哥通知要把某个视频撤下来,如果在缓存里是比较麻烦的

而且Squid 的 write() 用户进程空间有消耗,Lighttpd 1.5 的 AIO(异步I/O) 读取文件到用户内存导致效率也比较低下。

但为何我们访问优酷会如此流畅,与土豆相比优酷的视频加载速度略胜一筹?这个要归功于优酷建立的比较完善的内容分发网络(CDN),它 通过多种方式保证分布在全国各地的用户进行就近访问——用户点击视频请求后,优酷网将根据用户所处地区位置,将离用户最近、服务状况最好的视频服务器地址 传送给用户,从而保证用户可以得到快速的视频体验。这就是CDN带来的优势,就近访问,有关CDN的更多内容,请大家Google一下。

Apr 14
oracle升级后exp出现oracle 942错误

SQL> select comp_id,version from dba_registry;

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.7.0 - Production on 星期五 9月 29 12:34:11 2006 Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn sys/password@orcl as sysdba
已连接。
SQL> shutdow immediate

数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。 SQL> startup migrate
ORACLE 例程已经启动。 Total System Global Area 1687760036 bytes
Fixed Size                   457892 bytes
Variable Size             486539264 bytes
Database Buffers         1199570944 bytes
Redo Buffers                1191936 bytes
数据库装载完毕。
数据库已经打开。
SQL> spool d:\catpatch.log
SQL> @d:\oracle\ora92\rdbms\admin\catpatch.sql
SQL> spool off
注:在catpatch中会调用catexp来修改exp 至此成功修改exp
使用exp导出成功DD 打完patch后,
SQL>shutdown immediate
SQL>startup 正常打开,
  
Mar 29
首先,我们需要使用linux下另外一个ps命令查找与进程相关的PID号:ps aux | grep program_filter_word

ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
ps -e 此参数的效果和指定"A"参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
ps s 采用程序信号的格式显示程序状况。
ps S 列出程序时,包括已中断的子程序资料。
ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
ps u 以用户为主的格式来显示程序状况。
ps x 显示所有程序,不以终端机来区分。
最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作。

其次,使用kill命令结束进程:kill xxx

1)作用

kill命令用来中止一个进程。

2)格式

kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]

3)参数

-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要中止进程的ID号。
Signal:表示信号。

4)说明

进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。

Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)是Linux系统启动时启动的进程,并在后台运行。例如,httpd 是著名的Apache服务器的监控进程。

kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。

5)应用实例

(1)强行中止(经常使用杀掉)一个进程标识号为324的进程:

#kill -9 324

(2)解除Linux系统的死锁

在 Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用ps命令查找该程序的 PID,然后使用kill命令停止这个程序:

#kill -SIGKILL XXX

其中,XXX是包含有Mozolla浏览器的程序的进程标识号。

(3)使用命令回收内存

我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些"越轨"的程序或很长时间没有相应的程序。例如,使用top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令:

#kill -9 XXX

其中,XXX是无用的进程标识号。

然后使用下面命令:

#free

此时会发现可用内存容量增加了。

(4)killall命令

Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:

# killall -HUP inetd

Pages: 5/60 First page Previous page 1 2 3 4 5 6 7 8 9 10 Next page Final page [ View by Articles | List ]