双机热备+负载均衡线上方案(Heartbeat+DRBD+NFS+Keepalived+Lnmp)gotop对于网站服务器来说,可靠性之重要不用我多说,但要想做到可靠性一般需要昂贵的设备,这里最主要是就是数据同步用的共享磁盘了,磁盘柜+磁盘一共下来是20多万,这对于追求最高性价比的双机负载热备方案来说是极其不靠谱的,尤其是中小型企业,私有企业,一般经理是不会考虑这么高的成本的。
我们通常做都是四台服务器+一个磁盘柜子+千兆交换机,那么这个成本下来将近30万了,而且这个方案有个弊端就是存储依然存在单点故障,除非使用双控制+双电源+双主板设计的磁盘柜,但这种成本实在太高。
那是否有更为廉价的双机方案呢,很明显开源软件帮我们解决了成本问题!!!用Heartbeat+DRBD+NFS+Keepalived+Lnmp等开源软件实现双机负载热备架构只需要两台服务器+一台全千兆交换机,这个成本是极其低廉的,我们做运维了就是要用技术来压榨硬件性能,用最低的成本实现最高的效能,不然天天谈论的性能优化有何用?堆叠硬件不是更好?那不是我们的目的,下面我们来看看这两台服务器的双机热备+负载均衡是如何实现并且稳定运行的。
这个方案是我给一个论坛做的,论坛15分钟在线8000人,以前放在IIS里面,并发连接6000-7000左右,我给设计的双机热备方案如下图:图一注意:第三台服务器可要可不要,我这里他由于成本问题,并没有采用第三台服务器,而是一共只有两台系统环境配置一,硬件配置:节点一(centosa):做主负载点,和主数据库压力负载点,必须高性能高稳定高I/O配置如下:CPU:双CPU( 4核+4核) 5405级别内存:8G 组三通道DDR3 ECC内存硬盘:1块1TB普通硬盘+2块300G SAS15K(15000转)硬盘网卡:2块千兆网卡节点二(centosb):做分担负载和备服务器,稳定第一CPU:双CPU( 4核+4核) 5405内存:8G 组三通道DDR3 ECC内存硬盘:1块1TB普通硬盘+3块300G SAS15K(15000转)硬盘网卡:2块千兆网卡注意:网卡极力建议用四块,这个架构对网络I/O要求极高,我这里只有两块,没办法,机房做不到,如果你是百兆交换机,拜托,你一定要用四块网卡二,操作系统配置1),所有服务器的操作系统版本:操作系统版本:CentOS5.7 64位操作系统官方下载地址:/centos/5/isos/x86_64/ 2),每台服务器的安装要求:节点一:分区:一共三块硬盘,不用组RAID第一块硬盘:系统占用一块,分区情况如下:/boot 200MB/ 40GBswap交换分区 8GB/data 第一块硬盘的所有剩余空间第二块硬盘:不要分区,留给我自己分区第三块硬盘:不要分区,留给我自己分区系统安装安装规范最小化安装,字符界面安装去掉所有组件,只需要一个内核节点二:分区:一共三块硬盘,不用组RAID 第一块硬盘:系统占用一块,分区情况如下:/boot 500MB/ 40GBswap交换分区 16GB/data 第一块硬盘的所有剩余空间第二块硬盘:不要分区,留给我自己分区第三块硬盘:不要分区,留给我自己分区系统安装要求最小化安装,字符界面安装去掉所有组件,只需要一个内核三,交换机配置:注意:有条件最好用两台交换机,内网一台,外网一台如果只有一台交换机,划分两个VLAN,一个外网使用,一个内网使用四,目录规划用途/usr/local/src/lnmp:用来存放源码工具等等/data:用来存放所有数据和NFS以及DRBD的挂载/data/shell:用来存放所有管理脚本/data/mysql:用来挂载DRBD的mysql资源,以供mysql存放数据库/data/wwwnfs:用来挂载DRBD生成的www资源,以供两个节点挂载到各个节点的/data/www目录,以供论坛等程序数据使用/data/www:用来挂载NFS资源,用来存放论坛(网站)等程序数据双机热备+负载均衡具体配置一,先建立用户和目录吧:useradd -s /sbin/nologin wwwuseradd -s /sbin/nologin mysqlmkdir -p /data/mysqlmkdir -p /data/wwwmkdir -p /data/wwwnfsmkdir -p /data/shell二,架构详解如果用LVS做均衡器拓扑图如下:图二如果用Nginx做均衡器拓扑图如下:图三我们这里用NGINX做均衡器,因此我用图三来拓扑,来讲讲这个拓扑的工作原理内网:1,DRBD网络存储创建出两个资源,一个mysql给mysql数据库同步用,一个www给web(论坛)数据NFS共享挂载用,虚拟出两个虚拟IP,一个是192.168.1.100,用来连接数据库,一个是192.168.1.200,用来给节点挂载NFS注意:NFS底下挂载了三次:DRBD挂载一次,文件系统挂载一次,客户端挂载一次2,Heartbeat来实现DRBD的HA,同时虚拟出两个内网IP,并管理NFS,MySQL的启动和关闭外网:1,两个节点都用Nginx做均衡器,通过内网调度负载两个节点,实现内部均衡2,DNS配置双IP对应一个域名的方式来实现DNS轮询,实现外网均衡3,Keepalived使用双主(master)配置虚拟出两个虚拟IP:节点一12.12.12.100和节点二12.12.12.200,同时共外网访问,两个节点互为主从关系,当某个节点挂掉的时候,另外一个节点将同时是两个资源的master,同时拥有两个虚拟IP,实现资源转移我们知道DNS的缺点就是生效慢,分配资源不合理,理论上有可能把所有的请求都发送给同一节点,导致均衡不合理导致所有资源不可用,这里我们由于有了NGINX内部负载,就不怕DNS轮询不均衡了,因为NGINX内部有严谨的调度方式,不管那台请求有多少,在内部都能实现理想的调度,这样就能把DNS负载均衡和NGINX完美结合,是硬件资源得到合理的利用,然后利用keepalive保证了每个节点的可靠性,几乎完美!三,LNMP架构配置两台服务器的一样配置这个我请看我发的这个帖子:/thread-2-1-1.html注意一:这里MYSQL都不要初始化,不要启动!后面有专门的配置的注意二:nginx所有端口都改成8080,因为一会还要安装nginx来做均衡器并对外提供服务,所以不要用默认的80四,安装配置NFS兵马未动粮草先行,NFS是网站存放数据实现数据同步的基础,我们先安装上吧1,安装:服务器端要安装:nfs-utils:NFS主程序portmap:RPC主程序客户端要安装:nfs-utils:NFS主程序portmap:RPC主程序由于我们这里一共只用了两台服务器,所以,这里客户端和服务器段是同一台机器,这点要注意了两个节点同时安装:1.yum -y install portmap nfs-utils复制代码2,配置:生存共享目录vi /etc/exports输入:1./data/wwwnfs 192.168.1.0/24(rw,sync,anonuid=501,anongid=501)复制代码注意:/data/wwwnfs:就是给两个节点挂载的目录,所有网站程序都放在这里,实现论坛程序等数据的共享(同步)anonuid=501,anongid=501:这个表示客户端上任何用户进入到挂载目录都以uid=501和gid=501身份,我这里这个代表的是www用户3,启动:service portmap startservice nfs start切忌,必须先启动portmapchkconfig --level 0123456 nfs offchkconfig --level 0123456 portmap on注意:portmap服务器必须常驻,且不收heartbeat管理;而nfs这必须要用heartbeat来管理他的启动和关闭,所以这里要关闭nfs开机自动启动同时要启动锁机制,因为同时有两个节点要使用同一份数据,所以需要有总裁,这个尤其是在NFS给mysql用的时候是必须要用的,对于论坛或网站,要看情况,如果存在对同一文件同时修改的时候必须要启动NFS锁机制,如果没有这种情况,那么建议不要启动,启动了会降低NFS的性能:/sbin/rpc.lockdecho "/sbin/rpc.lockd" /etc/rc.local4,建立NFS的管理脚本有人奇怪了,nfs用RPM安装的,应该直接用service nfs start/stop即可啊,维护还要建立脚本呢,这里由于NFS的启动关闭权要交给heartbeat处理,而默认/etc/init.d/nfs这个启动脚本在heartbeat处理的时候有问题,所以这里自己建立了一个vi nfs输入:1.#!/bin/bash2.3.NFSD=/etc/rc.d/init.d/nfs4.NFSDPID=`/sbin/pidof nfsd`5.case $1 in6.start)7.$NFSD start;8.;;9.stop)10.$NFSD stop;11. if [ "$NFSDPID" != " " ];then12.for NFSPID in $NFSDPID13.do /bin/kill -9 $NFSPID;14.done15. fi16.;;17.*)18.echo "Syntax incorrect. You need one of {start|stop }"19.;;20.esac复制代码wq保存退出chmod +x nfsOK,NFS服务器端配置完毕。
注意如果你用的是四台服务器或者更多,把均衡器和节点分开的,那么还需要在节点也就是NFS的客户端安装:1.yum -y install portmap nfs-utils复制代码并且启动portmapservice portmap startchkconfig --level 35 portmap on注意,客户端必须要启动portmap,且要安装nfs-utils,但不需要启动NFS我们这里均衡器和节点都在同一台服务器上,所以就免去了这些过程了,不过他同时是客户端,所以要建立挂载脚本vi /data/shell/mountnfs.sh输入:1./bin/mount -t nfs -onosuid,noexec,nodev,rw,nouser,noauto,bg,hard,nointr,rsize=32k,wsize=32k,tcp 192.168.10.200:/data/wwwnfs /data/www复制代码chmod +x /data/shell/mountnfs.shecho "/data/shell/mountnfs.sh" /etc/rc.local在另外一台节点centosb上也这样安装五,安装配置DRBD1,分区DRBD可用设备有如下:(1)一个磁盘,或者是磁盘的某一个分区(2)一个soft raid 设备(3)一个LVM的逻辑卷(4)一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷(5)其他任何的块设备这里我是建立在一个分区上的查看磁盘信息:1.fdisk -l复制代码Disk /dev/sda: 1000.2 GB, 1000204886016 bytes255 heads, 63 sectors/track, 121601 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/sda1 * 1 64 514048+ 83 Linux/dev/sda2 65 5163 40957717+ 83 Linux/dev/sda3 5164 7203 16386300 82 Linux swap / Solaris /dev/sda4 7204 121601 918901935 5 Extended/dev/sda5 7204 121601 918901903+ 83 LinuxDisk /dev/sdb: 300.0 GB, 300069052416 bytes255 heads, 63 sectors/track, 36481 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id SystemDisk /dev/sdc: 300.0 GB, 300069052416 bytes255 heads, 63 sectors/track, 36481 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System三块磁盘:一块1TB已经分区,安装了操作系统和存放数据另外两块没有分区,特用来给DRBD用下面分区:fdisk /dev/sdb......fdisk /dev/sdc......分区好后我们得到两个未挂载的分区/dev/sdb1 1 36481 293033601 83 Linux /dev/sdc1 1 36481 293033601 83 Linux/dev/sdb1用于数据库/dev/sdc1用于NFS注意:先不要挂载2,安装DRBD1),下载DRBD官方网站:/DRBD源码下载地址: /drbd2),安装DRBD有三种安装模式:RPM包安装,直接编译进内核或作为一个可加载的内核模块编译。