一个完整的网站上线流程

一个完整的网站上线流程
上线的流程
1. 上线流程包含下列几个方面:
1.1. 网络规划
1.2. 系统规划
1.3. 数据迁移
2. 网络规划包含的内容
2.1. 挑选机房
2.2. 是否需要划分多个网段
2.3. 出口是否需要VSRP
2.4. 交换机之间如何进行备份
2.5. 各个交换机之间的连接速度大小
3. 系统规划包含的内容
3.1. 挑选服务器
3.2. 选择存储
3.3. 选择操作系统
3.4. 网站如何进行分层
3.5. 各个应用如何良好分配到不同的服务器上
3.6. 系统的监控
3.7. 系统的备份
4. 数据迁移
4.1. 静态存储的迁移
4.2. 数据库的迁移

选择机房
选择机房在中国是一个非常头疼的事情,你必须考虑到你网站所服务的对象是属于网通还是电信,以及其它小的运营商。不过在国外基本没有这样的问题。只要选择路由好点的基本就可以了。从国内到国外服务器之间如果能够在保持在20跳以内就算可以的了。要是你还是不放心,要进行世界各地的测试,那可以找类似的测速网站来进行测试。比如Banreee, Networkbench, gamez都是比较好的测试网站。

网段规划
在机房选择好以后,就要进行网段规划了,特别是当你内部服务器之间交互非常频繁的情况下,那就更要很好的进行规划了,不同需求的服务器必须放在不同的VLAN之中,特别嫉划分非常大的网段,那样广播风暴就会比较严重。分网段有2种情况我个人认为,有人是把整套的服务器放在同一网段中,这一整套服务器包含了所有的前端,中间层和后端以及数据库,这个感觉是游戏类的会进行这样的规划。还有一种是所有前端一个单独的VLAN,中间层一个单独网段,后端存储一个网段,数据库单独一个网段。这种当你网站规模比较小的情况下就不能进行这样的划分,毕竟交换机没那么多,以后如果要把服务器换做其它用途,还必须更改交换机某个端口的VLAN号,一旦改的多了连自己都记不清了。

VSRP
VSRP是一种交换机的高级协议,用来2个交换机之间进行互相冗余的协议。如果你2个交换机之间要做VSRP,那一般是需要6个公网IP,3个是指向机房网关,另外3个是做本地服务器的网关。其中有2个是作为虚拟IP来进行使用的。所有内网服务器都要指向那个内部的虚拟IP。这样2个交换机之间就算有一个down了,那也不会造成网站无法访问。但是这种需要比较高端的交换机,比如H3C的S5500 EI系列。而且还要2个交换机起码要互联4个光纤,这样保证2个交换机互相数据的交互。而下面的交换机也要各连2根或者1根光纤到2个交换机,比较占用交换机端口。所以一般都是要买48口的才比较保险。如果只是小型网站,那这些也就没有必要了。

交换机备份
交换机备份有2种,一种是热备,一种是冷备。
先说冷备,冷备就是把一个交换机配置成跟线上运行的交换机一样,一旦线上的出现问题后,通知机房更换交换机,并且重新连线跟服务器之间的和上层交换机之间的。
热备就是一旦一个交换机出现问题后自动切换到另外一个交换机上,而不需要通知机房重新接线,服务器也不需要重新连线。但是这种方案需要服务器起码要有4个网卡,然后交换机直接也要做好冗余设置,这样比较耗费钱,当然你如果不缺钱完全可以使用这种方案。

交换机之间的连接速度
这个看具体的业务,核心交换机之间最好要有4G的上行和下行带宽,而核心有下层的交换机也起码要有2G的带宽,不然你数据内部交互非常频繁就会出现瓶颈。而挑选交换机也要着重考虑交换机的背板带宽。如果背板带宽都不高,那交换机之间连接速度再高也没啥用啊。

挑选服务器
挑选服务器是个复杂的过程,首先要确定你的需求,比如你的网站数据库是属于read多,update和insert比较少,那你硬盘只需要raid1或者raid5就可以了。那就只需要3块硬盘就可以。而如果你的数据库属于Update和insert比较多的话,那硬盘最好是raid0+1,这样就更好的发挥硬盘性能。而对于CPU和内存的选择,看你的需求是需要大量的CPU还是内存,如果你只做squid这样耗内存的程序,那CPU只需要比较低的,而内存就要选要多的,具体看你需求,有些公司直接上到128G内存这样的。而有些程序只是耗CPU,而对于内存需求比较低,这个就是你要选择一个平衡,这样好以后可以更换成其它用途。而选择好CPU,内存和硬盘之后就要选择服务器厂商了,现在几乎主流的服务器厂商都有各种型号的服务器,也可以进行自定义,特别是当你需求量特别大的。选择服务器的时候还得测试下耗电的情况,就好比以前测试过H品牌的服务器和L品牌的服务器在配置同等情况下耗电量差别有30%。这样同样一个机柜就可以增加几台机器。

选择存储
存储有专业的也有非专业的,专业有NETAPP,EMC这样的公司。而没钱而又数据不是增长特别快的只是需要NFS就可以了,也有公司会自己配机器进行存储,现在2T的SATA硬盘也很便宜的。而一些需求更高的互联网公司,有些用户上传的数据每天就2TB以上,那用NFS肯定是不合适的,在不使用专业存储的前提下,那只能选择GFS这样的分布式文件系统来进行存储了。这个现在有比较多的解决方案,有YAHOO的HADOOP,redhat 的GFS, 还有其它的如Fastfs等等,但是每种GFS都有自己适应的需求,有的是针对大文件例如视频文件这样的存储,而有的是针对小文件如各种日志的存储。

选择操作系统
操作系统作当然是linux的为主了,看各种需求也有一些适合其它操作系统,比如做个网关服务器,那使用Freebsd就合适的。而作为web网站需求还是用Linux好了,操作系统有gentoo, ubuntu, centos, opensusu,这些现在还都是开源免费的。选择操作系统不光要看操作系统本身,还有所带的驱动,要是装上了服务器,运行后发现操作系统自带的网卡驱动出问题了,那就麻烦了。像这次装的DELL R710的服务器上,装了centos居然网卡驱动有问题,还好测试的时候发现了问题,用补丁给解决了。不然要是在线上跑了再出问题就麻烦了。所以买服务器的时候还得去官方网站查它做支持的操作系统。选择好操作系统就要看选择什么内核了,2.6.30和2.6.31在有些应用程序跑起来还是差别很大的。特别是对于多线程程序的支持。选择好文件系统,这个现在我只是选择ext3,毕竟非常成熟,而JFS, EXT4还是不敢在线上直接使用。

网站分层
网站分层,对于大型网站这个是必须的,负载均衡器(LVS, nginx, F5,Netscaler),前端web服务器(Tomcat, apache, resin, lighttpd, nginx等等),中间层(如memcached,ice)等,数据库(Oracle, postgresql, mysql等等)。这个还是需要程序开发之前就应该计划好的。而数据库的分区也是很重要的,可以把不同的数据库分布到不同机器上,同时做好master-slave,实现读写分离。

系统的监控
在系统正式上线开放之前可必须是搭建好的,有些公司会有自己的一套监控系统,也有很多自定义的监控内容。但是更多的是使用开源的监控产品nagios, cacti, munin等等。而nagios我个人觉得非常不错,特别是结合nrpe作为客户端,可以自定义很多监控需求,你自己可以编写监控内容,比如监控内存啊,监控Memcached等等。而nagios更是提供了很多监控脚本。而nagios现在不光能进行发报警邮件,还能发短信,发msn。而对于系统历史的展示,用cacti和munin就是非常不错的。Cacti是基于snmp的,易于监控,但是一旦跨网络,比如跨个电信网通啥的,那你用cacti就会发生经常发生取不到数据的情况发生。而且对于服务器太多的情况下就会发生5分钟一个轮询都来不及,这个就需要对cacti本身进行优化,这个直接参考zys.3322.org上面的提示一步步的进行优化,主要是cacti默认的那个数据库居然所有表都没有索引。而munin也是基于客户端,是走tcp协议,这样就相比snmp的稳定的多。而且也不需要数据库支持。

系统的备份
系统的备份也是需要上线之前做好。备份有简单的tar和比较企业级的开源产品bacula等等。Bacula之前也在内部使用过,对于大型的备份确实是比较好的,备份方式也有增量,全体备份等等各种方式。它有中心服务器,备份服务器,客户端,也支持磁带备份等等。也许我不怎么会用,因为它备份完成了也是单个文件,这样对我来说不够可视化,虽然bacula也支持很好的恢复,但是不够直接,万一处理不好就实在没法恢复了。所以我还是选用了直接的tar来进行备份。首先要选择好哪些东西是需要备份的,在我这里主要是数据库和用户上传的数据,而程序性文件本来就是分布在多台机器上,只需要简单的备份就可以了。用户上传的数据现在是基本5分就同步到其它文件服务器上,并且进行一次增量备份。同时每天都会一次进行一次完整的备份。
而对于数据库,首先是必须要有slave,同时还必须每30分钟备份一次,myisam数据引擎的还是比较容易备份的,可以直接备份数据文件,也可以进行mysqldump,也有mysql默认提供的Hotcopy。而Innodb的可以用mysqldump直接导出sql文件和直接进行xcopy导出数据文件。但是个人觉得xcopy性能上也并不是特别优越,速度上也不是特别快,而且以后需要恢复备份的时候还必须安装一下xcopy才可以。每30分钟备份一次,同时每天凌晨就保留当天唯一一份,而不是全部保留。

静态数据迁移
这个完全可以实现通过rsync来进行,而一旦真的开始迁移,还是使用rsync来进行同步,而最好不要进行tar来进行迁移,这样首先是传输的文件太大,其次未必能完全同步。

数据库迁移
这个有2种方式,一种是本身就有slave,这样直接切换的时候把这个slave专成master就可以了,但是如果你是临时搭建的slave,那很有可能会造成数据库不同步,毕竟你在搭建slave的时候master肯定是在进行更新,而你就算slave指定了从哪个position开始,你也会发生同步出错的情况。
所以另外一种方式还是停机进行mysqldump,这个还是最保险的方式,但是当你数据量特别大或者索引特别多的情况下会比较花时间,几乎都是以小时来进行的,但是其实mysqldump也是可以进行增量式的备份,其实就是根据mysql bin log的position来进行增量式备份。

完整的网站上线过程
首先确定需要新的网站支持多少在线人数,根据这个来确定网站的带宽和服务器数量,然后根据这个服务器的数量和带宽来确定交换机的数量和型号。
确定服务器的配置和相关品牌。
然后根据这些你必须画出网站的架构图,网络图,网络接线图,服务器接线图。
架构图是网站的整体的逻辑架构,是一个整体的逻辑概览
网络图是展示网络交换机的逻辑架构,比如VSRP,VLAN的配置就在这里展示。
网络接线图这里展示的网络交换机直接如何连线,连多少线,要标明到连接哪个端口。
服务器接线图,这里展示了服务器的哪些端口接哪个网络交换机的哪个端口。
后面2个图对于操作人员是最重要的,如果画的不清楚,很可能会耽误很多时间在沟通上。
接上线后就需要安装操作系统,这个现在基本都是网络来进行安装了,不会一台台通过光驱来进行安装,这样不光买机器的时候多付不必要的钱,而且安装比较慢,同时光驱有时候还会有使用寿命,有时候时间长了就没办法进行安装了。Redhat系统的都可以选择kickstart来进行远程安装,kickstart在安装过程中还能安装时候执行自己的系统初始化脚本。比如指定hostname, 修改相关的tcp/ip设置,设置好Iptables等等。而对于网络环境特别复杂的服务器必须要在网络配置文件中指定好去各个vlan之间的网关,这个以前我都是放到rc.local中,而这种虽然能在系统启动的时候会自动进行加载,而如果手动启动网卡会丢失这些网络信息。
安装完操作系统后,就要进行各自程序文件的部署。
相关程序文件部署完毕后就可以进行线上测试,这个不光是应用程序的测试,更要进行压力测试,测试新的系统到底能够承受多大的负载。这个当中可能出现各种各样的瓶颈,这个一般是由于web服务器的问题,特别是resin,tomcat这些出现问题的情况比较大,而Php网站由于fast-cgi现在往往可以承受更大的并发。另外一个可能的瓶颈会是数据库。比如Mysql就需要根据你选择的数据引擎来调整buffer的大小,这个是数据库整体性能的调整,个别的调整就需要根据你的slow log来进行相应的调整。