2009年5月

软件架构师成长之路(ZZ)

        对于任何一个软件开发人员来说,架构师都是一个令人向往的角色。就连世界首富比尔盖茨在2000年卸任公司CEO的同时,也担任了微软公司的荣誉角色“首席软件架构师”,可见“架构师”这一称谓的吸引力。架构师是公司的“金领”,有着非常高的收入,很少需要考虑生存的问题,从而有更多的精力思考关键技术问题,形成“强者愈强”的良性循环。部分优秀的开发人员在工作了一定时间后,就要开始考虑自己的未来到底向哪个方向发展。如果开发人员的沟通能力强过技术能力,在补充一定的项目管理知识后,可以向技术管理的方向转型。如果其对技术一直很感兴趣,而沟通能力也不弱,则可以试着进一步加强技术修养,以期向架构师的方向发展,最终“修成正果”。

        那么,到底什么是架构师呢?所谓的架构师,应该是一个技术企业的最高技术决策者。他主要负责公司软件产品或软件项目的技术路线与技术框架的制订。好的架构师都是善良的独裁者,具有很强的技术、良好的写作能力、良好的口头表达能力,能够在各个层次进行沟通。从开发人员到架构师的成长应该是阶梯式的,一般来讲开发人员在刚刚开始工作时只能开发简单的独立软件模块,慢慢的随着经验的增长,他开始接触一些相互之间有信息传递的模块,而后来,他会发现自己接到的开发任务已经不是一个独立的单体,这些任务由一些专门的软件部分组成,可能包含数据库,工作流引擎,消息服务等等各种功能模块,可能分布在不同的服务器上,所有的部分协同起来,完成软件功能。而这时候,体系结构的好坏将直接决定了系统的性能和可扩展性,而就在这时候,这名优秀的开发人员也开始思考架构师应该思考的问题了,或者说,他向成长为架构师的道路迈出了一大步。

        什么是架构师最具价值的技能呢?就是要了解不同的知识,做一个“杂家”或者说“博学家”。当然,如果你的数据库技术非常棒,或者你在工作流引擎方面具有不可超越的专家知识,那也是很不错的。好的架构师有好多都是从专家成长过来的。但是,这不是架构师应该做的事情,架构师应该做的是了解所有的东西,既了解技术的宏观面,又了解技术的细节。真正的架构师不仅仅要了解软件,也要了解硬件,在关键的部位使用合适的硬件来取代软件,可以成倍甚至成百倍的提高整个系统的效率。下面我将会以互联网行业对的架构师的要求为例,向大家讲解作为架构师应该具备的知识。

        互联网行业是当前最激动人心的行业之一,很多的创新都来自于这个行业,而每一个大型的网站如Google,Yahoo,Myspace等都需要解决一个非常复杂的问题,就是网站的分布式向外扩展(Scale Out)的问题。解决这个问题,需要最优秀的架构师对业务进行剖析,利用软硬件将网站进行重构,甚至根据业务研发相应的分布式技术,解决网站复杂的分布式计算的问题。如果你想在这个行业中成为一名架构师的话,需要至少掌握网络知识,硬件,软件,网站优化等方方面面的知识:

网络知识。

        当前的软件已经绝对不是那种仅仅跑在一台单机上的孤立应用了。不仅仅是在互联网行业,任何一个行业的软件,都要求其具有网络功能。因此,网络知识是架构师必备的知识。我们所说的网络知识,不仅仅包括TCP/IP,http等互联网行业常用的软件协议,也包括网络规划,甚至更具体的说,根据网站应用所处的地理环境进行网络规划。比如人们常说:“这世界上最远的距离不是生与死的距离,而是电信到网通的距离”(笑)如果应用是建立在中国的,就要考虑电信用户和网通用户访问网站的速度应该都比较快才可以。这时候的解决方案可能有多种,比如采用CDN(Content Delivery Network内容分发网络)使得网站的内容发布到离用户最近的服务器,又可以采用把服务器放在一些所谓的双线机房中,甚至将几种方案结合起来使用。这些都统统归到网络知识中。做为公司的架构师,要对这些知识都有所了解,才有助于在遇到问题时找到最佳答案。

硬件知识。

        了解硬件的极限,是架构师的基本功。我见过一些人,他们的眼中软件硬件都是没有极限的,需要资源就申请,系统性能下降了就买更高级的设备。然而,硬件的性能有很大一部分取决于I/O设备。而这些I/O设备依靠的都是机械物理运动,这种运动是有极限的。因此当资源访问量增大到一定的程度时,这种物理运动将成为瓶颈。比如说,在开发网站的过程中,记录访客的状态是一件很重要的事情,一般来说可以使用HttpSession来记录。而 HttpSession的存储问题将是一个很大的挑战,尤其是多机共享Session时,将HttpSession存成文件并通过多机共享或网络备份的方式来解决分布式的问题是常用的方案,然而,架构师必须考虑到这种方案是有I/O极限限制的,很难扩展到超过一定规模的大型网络。同时,架构师应该了解目前最近的硬件发展是否对软件系统会造成一定的影响,比如在多核的条件下是否对软件编程有新的要求,是否会对运行在虚拟机和非虚拟机上的程序有影响等等。

软件知识。

        软件知识所包含的范围就更加广泛了。对于互联网行业来讲,架构师要了解操作系统,数据库,应用服务器等各方面的知识。比如说,如果网站使用的操作系统是Linux,就要了解这个Linux版本的性能与局限性,比如说最多可以存放的单个文件为多大。有的数据库的数据是以单个文件来存放的,虽然我们很少见到数据库中的数据多到不能再放入一条记录的情况,但是作为架构师,请时刻注意,这种可能性是有的。而且如果你有幸在一家高速成长的互联网企业中,而你所负责的应用又没有经过优化的话,可能你会很快见到这种现象。这种现象的发生可能是由于操作系统不支持大文件的原因,也可能是数据库不支持大文件。不论如何,架构师应该在这种现象发生之前就把一切都准备好。对数据库中表的拆分是架构师应该遇到的另外一个困难。一般来说增加应用服务器比较简单而增加数据库服务器则是比较复杂的问题,如果一个站点由多个数据库支持,架构师需要考虑如何在保证数据一致的情况下,让多个数据库分担压力。有些解决方案是将数据库的读写分开,使得大多数的查询sql不经过核心数据库,而只是访问数据库的副本,但事实上,这种方式也只能维护规模不大的网站。对于大型的网站来说,把业务分散到不同的数据库中,只共享必要的数据,才是合理的提高网站扩展性的解决方案。

其他知识。

        作为系统架构师,可能还需要对分布式系统,负载均衡,网络安全,数据监控等等各方面都有所了解。不仅仅是了解理论知识,也要对相关的产品和业界进展有一定的认识。比如说

根据Apache的status Info来定位问题

上周积分数据库进行了升级
相应的加减积分的程序也进行了修改
升级过程相对顺利,很快就完成
但自从升级后
积分的服务器就不断的报警重启
几乎每小时都会重启一次

开始怀疑是程序有问题,造成内存泄露
于是,查找resin的log
但也没有发现里面有out of memory的错误
在resin的jvm和stderr的日志里几乎看不到任何有用的信息
只有不断的重启的log

于是,想看看resin的status
在服务器上打开了ResinStatusServlet,配置了一个url
结果,看到的一切似乎都正常
Threads和Total Memory都没有异常
resin的status看不出问题

然后,又把Apache的info status给打开
在extra/httpd-info中打开server-status
配置一个url(要注意Allow权限的问题,不能让外部的用户看到这个页面)
访问后,发现了里面有很多的W
而且随着时间的推移,W越来越多
而W代表是Sending Reply
说明是程序在某个地方堵塞了
然后看到W的url都是某个Action
呵呵,到此基本就找到了问题所在的Class了

然后,再查找该Action对应的Log
发现在减积分的地方没有任何输出
再查看减积分的服务,果然发现很多的Exception
到此,就定位到了真正的问题了

于是,查找减积分的Bug
修改后再上线
服务器就正常了

另:如果从resin的status中看出有内存泄露
那么可能就需要利用第三方的工具
如JConsole,JProfile来定位到底是哪个Class造成的内存泄露了

整个查找问题,发现问题,解决问题的过程
看似挺复杂的,但基本都是这样的一个套路
只要遵从一定的流程和方法
一般都能顺利解决的

关于paste命令

今天才发现linux上一个合并文件的命令,可以按行来进行合并:

,表明合并的分隔符
paste -d ',' b.txt m.txt >n.txt

-表明从标准输入获取文件
cat b.txt |paste -  m.txt > n.txt

如果要合并一个文件的所用行
paste -s b.txt > n.txt

使用Apache强制下载文件

一般情况下,txt文件对应的Content-Type是text/plain
这个对应文件通常位于apache2/conf下的mime.types

在浏览器中输入一个可访问的txt文件,是会直接显示txt文件内容的
如果你想直接下载这个txt文件,则需要增加一个header:
Content-Disposition: attachment;filename="a.txt"
最好再修改一下它的Content-Type:
Content-type: application/octet-stream

在jsp或php或其它的脚本中,增加这样的header很简单的
但有时候为了提供一个简单的内网下载服务
就直接在apache中配置一个虚机,然后指定documentroot到要下载的目录
这样,就可以在虚机中使用apache的header指令,来为改虚机下的所有请求都增加这个header
修改httpd.conf文件:
中增加:
AddType application/octet-stream .log

修改extra/httpd-vhost.conf文件:


    ServerAdmin aaa@sohu.com
    DocumentRoot "/log"
    ServerName 10.1.71.32
    
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    

    Header set Content-Disposition "attachment"

Mysql的Union

使用Union,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT
使用Union all,则不会排重,返回所有的行

如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面:
(SELECT a FROM tbl_name WHERE a=10 AND B=1)  
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
麻烦一点也可以这么干:
select userid from (
select userid from testa union all select userid from testb) t
order by userid limit 0,1;


如果你还想group by,而且还有条件,那么:
select userid from (select userid from testa union all select userid from testb) t group by userid having count(userid) = 2;

注意:在union的括号后面必须有个别名,否则会报错


当然了,如果当union的几个表的数据量很大时,建议还是采用先导出文本,然后用脚本来执行
因为纯粹用sql,效率会比较低,而且它会写临时文件,如果你的磁盘空间不够大,就有可能会出错
Error writing file '/tmp/MYLsivgK' (Errcode: 28)


昕昕更换奶粉了

昕昕从出生到现在
一直喝的多美滋奶粉
我们感觉还是不错的
但前端时间
多美滋奶粉还是闹出了含有三聚氰胺的新闻
几十名宝宝的家长联名要起诉它
虽然最后还是不了了之了
质检总局也说“多美滋是合格的”
但心里还是有点不痛快
所以,等家里的多美滋都喝完后
就想给他换个别的奶粉试试

在同事的极力推荐下
又上网查了查资料
最后选定了“美素”
这个奶粉价格不菲
每桶183元(现在促销,每桶减15元,实际上是168元)
比多美滋还要贵不少
似乎在国内喝的人不多
但网上的评价似乎多说还不错
都说宝宝喝了不上火

于是,今天就在丽家订了2桶
家里还有一点多美滋
所以,这2天就一块掺着喝
昕昕的食欲一向是很好
冲兑着喝,仍旧是一气喝完
呵呵



Linux系统查看CPU信息

查看cpu
cat /proc/cpuinfo

其中:
flags 如果有ht,说明支持超线程技术。如果有lm,则表示支持64位,lm的意思是long mode
判断物理CPU的个数可以查看physical id 的值,相同则为同一个物理 CPU


或者:
uname -a
一般64的系统都会带有X86_64 ,而32位的都不带,一般是i386或者i686等。


查看内存
cat /proc/meminfo

MsnShell的分页聊天记录

一直在用MSNShell作为Msn的外挂插件
它的分页聊天记录显示做的挺漂亮的
但遗憾的是,它不能设置每页显示的数目
默认值好像是20

今天Google了一把
发现它其实是通过一个MessageLog.xsl文件来显示的
只需要修改里面的PageCount变量即可

现在我把它设置成了1000,这样查找起来方便一些

如果MSNShell能提供聊天记录的全文搜索就好了

rsync服务的搭建

rsync 是一个Unix系统下的文件同步和传输工具
rsync默认的配置文件在/etc/rsyncd.conf

一个实例文件:

 

motd file=/etc/motd

max connections = 10

syslog facility=local3

log file = /opt/log/rsync

 

[nginxlog]
        comment = nginxlog
        path = /opt/log/nginxlog
        read only = yes
        list = yes
        uid = nobody
        gid = nobody
[log]
    comment = log
    path = /maildata/uploadlog
    read only = no
    list = no
    auth users = loguser
    secrets file = /etc/rsyncd/rsyncd.secrets

编辑密钥文件:

vi /etc/rsyncd/rsyncd.secrets

ysz:password

修改密钥文件的权限

chmod 600 /etc/rsyncd/rsyncd.secrets

注意的是,如果uid是nobody,可能会遇到权限的错误

 
“failed: Permission denied (13)”


此时,需要把对应的path目录的权限给改成777

启动rsync服务
/usr/bin/rsync --daemon

rsync上传文件:
rsync -vp ysz.log 192.168.95.180::nginxlog
rsync取远端的文件:
rsync --progress 192.168.95.180::nginxlog/nginx_access_vipwap.log .


带密钥认证的访问:

/usr/bin/rsync -vzrtopg --progress --password-file=/opt/ysz/rsync.secrets ysz@1.1.1.110::blog/* .

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它