LVS+Keepalived实现高可用性集群
一、lvs+keepalived集群基本架构
Lvs
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。
Keepalvied
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。
下面是在网上参考的典型的系统架构图
针对我们服务器放在IDC机房的特点,我参考上面的架构做了一些修改
这个方案中,负载均衡层采用两台服务器做DR,架构lvs+keepalived,其中master DR调度工作,把用户的请求分配到web服务器上,当master DR故障时,backup DR自动切换状态到master,完成负载均衡的工作,mater DR恢复后backup DR又自动切换状态到backup。如果出于经济考虑,可以暂时只用一台服务器做DR。
Web服务器层是真正处理用户请求的,这里初步计划两台real server,DR按照一定的规则把用户的请求分配到real server上,要保证不同的real server有着一致的数据库和web目录。数据库的一致常见的有集群和复制技术,综合考虑,在两台real server之间采用mysql的双主复制来现在real server 可以同时读取和写入数据库,并保证数据库的一致。
这里的共享存储区采用一台NFS服务器,建立共享输出目录,然后两台real server 挂载这个输出目录,实现web目录文件的一致。
这样,则需要5台服务器,再加上VIP地址,则需要6个公网IP地址,对于www.faxingw.cn,VIP是122.224.6.84,用户在浏览器上输入域名,经过DNS服务器解析成122.224.6.84,经过负载均衡调度器,将用户请求分配到real server上,这里计划采用基于直接路由的负载均衡(VS/DR,即Virtual Server via Direct Routing)技术,VS/DR通过改写请求报文的MAC地址,将请求发送到real server,而real server将响应直接返回给客户,是3种负载调度方式中性能最好的,但要求director server与real server必须由一块网卡连在同一物理网段上。
按照上面改过的架构方案在虚拟机上安装测试,给出下面的地址规划
Director server1:192.168.1.198
Director server2:192.168.1.196
Real server1:192.168.1.199
Real server2:192.168.1.197
NFS server1:192.168.1.201
NFS server2:192.168.1.202
VIP:192.168.1.200
二、安装LVS+keepalived软件
LVS是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,主要用于完成用户的请求到达负载调度器后,如何将请求发送到每个real server节点,real server节点如何返回数据给用户。这里我们的操作系统采用centos5.5,该版本内核默认支持LVS功能,也可以通过如下命令检查kernel是否已经支持LVS的IPVS模块:
#modprobe –l |grep ipvs
这里选择安装ipvsadm-1.24版本,我在虚拟机上安装时出错,OpenSSL is not properly installed on your system,系统缺少openssl-devel软件包,我通过配置yum本地源安装,然后yum install openssl-devel,问题解决了,装好了可以通过ipvsadm –help检查安装是否成功,两台director server 都要安装。详细的安装步骤这里就不详细说明了。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据layer3,4,5交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或工作出现故障,keepalived将检测到,并将出现故障的服务节点从集群系统中剔除,而当故障节点恢复正常后,Keepalived又可以自动将此服务器节点重新加入到服务器集群中。这些工作全部自动完成。
这里选择安装的是keepalived- 1.1.17 .tar.gz,安装过程没有遇到问题,就不介绍了。
同样,安装完成后,可以执行命令:keepalived –help 检查是否安装成功。
三、ipvsadm和keepalived的配置
在direct server上,这里用shell脚本来实现ipvsadm命令行配置
# vi lvsdr.sh
#!/bin/bash
VIP=192.168.1.200
RIP1=192.168.1.199
RIP2=192.168.1.197
/etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of DirectorServer"
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -m -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -m -w 1
/sbin/ipvsadm
;;
stop)
echo "Close LVS Directorserver"
/sbin/ifconfig eth0:1 down
/sbin/ipvsadm -C
;;
*)
echo "Usage0{start|stop}"
exit 1
esac
在两台Director server上,这个脚本是一样的,给脚本添加开机启动
下面在Director server上配置keepalived,根据安装路径,keepalived的配置文件是/etc/keepalived/keepalived.conf,
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200
}
}
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.199 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.197 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
}
这是director server 1 的配置,在director server2 上我们只有把master 改为 backup,priority改为80就可以了
下面介绍real server上的配置,两台real server 执行下面的脚本
# vi lvsrs.sh
#!/bin/bash
VIP=192.168.1.200
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
#end
配置好了之后,配置这些脚本开机启动 例如echo “./root/lvsrs.sh” >>/etc/rc.local
这样配置基本完成。
四、搭建和配置NFS服务器
NFS是Network File System的简写,即网络文件系统,NFS允许一个系统在网络上与他人共享目录和文件,通过NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
在CentOS系统中,默认情况下已经安装NFS文件系统,只要用chkconfig配置开机启动即可。
NFS服务器服务器端配置
登陆到NFS服务器,在虚拟机上我设的IP地址是192.168.1.201,修改NFS系统配置文件。
# vi /etc/exports
在文件里添加如下内容
/home/www 192.168.1.*(rw,sync,no_root_squash)
然后保存提出,添加的内容表示:允许IP地址范围在192.168.1.*的计算机以读写的权限来访问/home/www 目录。
接着执行如下命令,启动端口映射:
# /etc/rc.d/init.d/portmap start
最后执行如下命令启动NFS服务,此时NFS会激活守护进程,然后开始监听client端的请求。配置好了之后,先在NFS服务器上回环测试
# mount –t NFS 192.168.1.201:/home/www /mnt
如果正常,在/mnt目录下应该可以看到/home/www共享目录中的内容。
NFS客户端配置
这里两台real server作为客户端,只需做些简单配置即可
#mkdir /mnt/www 建立共享目录挂载点
#mount -t nfs 192.168.1.201:/home/www /mnt/nfs -o nolock 挂载共享目录到本地
两台real server的配置都一样,这里的共享目录作为web主目录,两台real server可以同时读写该目录和文件,并保持目录和文件一致。在nginx配置文件里修改web主目录的路径,修改fastcgi_param SCRIPT_FILENAME 路径。
下面配置开机自动挂载,可以配置/etc/fstab来实现,也可以设置开机自动运行脚本来实现,如用脚本
#vi /root/mntnfs.sh
mount -t nfs 192.168.1.201:/home/www /mnt/www -o nolock
保存退出,然后添加开机启动
#echo “./root/mntnfs.sh ” >>/etc/rc.local
NFS配置就完成了。
注:存储区的的两台NFS Server间用inotify+rsync来实现实时备份
五、配置MySQL双主复制
在两台real server间设置mysql双主复制,这里先设置主从复制。
主机:192.168.1.199
从机:192.168.1.197
主机设置
在主机中登陆mysql
#/usr/local/mysql/bin/mysql –u root
赋予从机权限
mysql>grant replication slave on *.* to ‘backup’@’192.168.1.197’ identified by ‘573514’
打开主机/etc/my.cnf文件
#vi /etc/my.cnf
在[mysqld]中输入
binlog-do-db=test #需要备份的数据,多个写多行
binlog-ignore-de=mysql #不需要备份的数据库,多个写多行
从机配置
配置从机的/etc/my.cnf,
#vi /etc/my.cnf
server-id的值改为2
在[mysqld]下输入
master-host=192.168.1.199
master-user=backup
master-pass=573514
master-port=3306
replicate-do-db=test #只复制某个库
replicate-ignore-db=mysql #不复制某个库
重启数据库,验证配置
在主机中,mysql>show master status;
在从机中,mysql>show slave status;
可以在主机上建立数据库测试,这样主从复制配置好了,接着继续配置双主复制。
配置当前从服务器
为原始服务器建立一个slave 账号
mysql>grant replication slave on *.* to ‘backup2’@’192.168.1.199’ identified by ‘123456’;
重启mysql服务,查看状态
mysql>show master status;
配置原始主服务器,编辑my.cnf并在[mysqld]下面输入
master-host=192.168.1.197
master-user=backup2
master-pass=123456
master-port=3306
然后重启mysql,登录mysql配置master文件设置
mysql>stop slave;
mysql>change master to master_log_file=’[file written down]’,master_log_pos=[position];
mysql>start slave;
mysql>show slave status;
最后创建或修改数据库测试配置是否成功。
注:这里只是在服务器池有两台机器时有效,只是权宜之计,如果可以,建议给数据库服务也建个集群。
到这里配置基本结束了,以上配置均在虚拟机下实验并通过。
2012-9-7