根据几年的工作经验,在脑子里简单总结出来一些运维架构上的心得,写了下来,不当之处,欢迎指正,详略也不太适当,欢迎补充。
一、程序和数据库分离
这个想必是人之共识,也是网站迈向架构设计的第一步,但这的确是最基础的架构设计。
二、域名和程序分离
这个呢,说白了,就是程序能够独立于域名而存在。
这个问题在程序设计之初一般不会出现,主要是程序功能不断堆积过程中,不小心将域名纳入了业务逻辑而导致的。结果是web服务器必须放在最前端,影响负载均衡,缓存系统的设计。
三、动静分离
如果在可预期的未来,与程序相伴的还有数量可观且不断增长的静态文件,那么最好要设计动静分离,否则会严重影响程序的横向扩展。
动静分离应该彻底将程序和静态文件作为系统的两个独立模块来设计,避免NFS之类的挂载使用方式(静态文件只是在物理上独立,在逻辑上依然从属于程序下的某个文件夹);
四、保证配置文件的独立性
配置文件通常依附于程序,但也要保证一定的独立性,并且高度集中;
五、保证程序的扩展性和可维护性
程序在设计之初不光要考虑性能,还就要考虑如何扩展,如何排障,甚至提供监控接口;
六、负载均衡和web服务器分离
负载均衡应该是独立的功能实现,跟业务逻辑没有任何牵扯。
顺便唠叨一句,微软的NLB是个极其差劲的负载均衡方案,而LVS/nginx/haproxy都是优秀的。
七、高可用系统
给关键点(前端、数据库)设置必要的冗余和高可用(磁盘阵列,冗余电源,drbd,heartbeat,keepalived,pacemaker等);
八、缓存系统
缓存系统是提升网站的响应速度最直接的办法,不论是文件级的缓存还是数据库缓存。Nosql 是常规架构很好的补充,速度几乎都是内存级的,memcached、redis等;
九、独立的监控系统
作为业务的辅助功能,集中式的监控系统非常必要;
十、自动化系统
集中式的用户管理,主机名管理(DNS),配置管理,程序发布系统;
十一、架构分层
按照网络划分,一般有:外网,内网,管理网
按照功能划分,一般有:接入层,缓存层,业务层,中间层,数据层,存储层
十二、运维流程化和文档化
流程化指的是团队协作分工,文档化是指企业运维资产的积累和传承。