下面介绍的是如何利用keepalived+LVS来搭建集群均衡负载
上图是我搭建的LVS集群,集群上面有两个负载均衡器,一个是主,一个是备;下面是两个server服务器,都在同一个网段之中
,而且共用一个虚拟地址210.72.3.238,我的系统版本是Centos 6.5,下面开始详细讲解:
1在主备Director上面安装LSV软件
LVS是通过IPVS模块来的,主要是用来管理集群
这里首先要安装用于编译IPVS的安装包
yum -y groupinstall Desktop
yum -y install "X Window System"
modprobe -l | grep ipvs检测系统是否支持IPVS模块
有上述输出证明是支持的。
yum install ipvsadm
ipvsadm --help
如果看到安装提示,表明IPVS已经成功安装
查看ipvs有没有加载进去系统内核
不管有没有加载,我这里建议都是把加载内核命令写进/etc/rc.local之中,如下图
这样子已经开机就可以自动加载IPVS模块进去内核之中
2在主备Director上面安装keepalived,在http://www.keepalived.org 上面下载对应版本的keepalived,我这里下载的是keepalived-1.1.19.tar.gz;
tar zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
./configure --sysconf=/etc \ (指定配置文件的路径在啊/etc下)
>--with-kernel-dir=/usr/src/kernels/2.6.32-696.6.3.el6.x86_64(指定使用内核源码中的头文件)
如果Linux系统是最小化安装,那么会提示OpenSSL IS NOT properly install 和popt libraries is required
解决方法:
yum -y install openssl -devel
yum -y install popt-devel
make && make install
ln -s /usr/local/sbin/keepalived /sbin/(在/sbin/下创建keepalive的启动快捷方式)
keepalived --help
出现参数的话表明keepalived已经成功安装了
3搭建基于LVS DR模式集群
LVS DR模式:负载均衡器和后端服务器共同组成的局域网会虚拟出一个地址,客户端(例如192.168.10.43)访问的是这个虚拟地址(210.72.3.238),当客户端访问这个虚拟地址时,请求会首先发送到主均衡负载器Director1(210.72.3.230),这时候源mac地址是客户端mac地址,目的mac地址是Director的mac地址,然后均衡负载器根据后端server1或者server2情况选择其中一个服务器,这时候源IP和目标IP以及端口是不会变的,也就是源IP是客户端,目标IP是虚拟地址,均衡负载器只会把源mac地址修改为Director的mac地址,目的mac地址修改为后端服务器(如server2)mac地址,然后把ARP请求转发给server2上面,当后端服务器收到ARP请求时,会检查自身设备的mac地址是否与目的mac地址匹配,如果匹配,则会直接响应客户端,这个时候,源mac地址是后端服务器的Mac地址,目的mac地址是客户端的Mac地址,也就是说,DR模式是通过ARP请求来完成的。如下图:
主备Director配置keepalived,vi /etc/keepalived/keepalived.conf
这里的virtual_server是210.72.3.238,因为我后面会在server中搭建Httpd服务器,所以监听的端口是80,有两个server,分别是231和232,lb_kind是LVS模式,有DR,TUN,NAT,这里是DR模式,state,主Director为MASTER,备Director为BACKUP,这里是备Director,所以设为BACKUP;priority优先级,主为100,这里备为80,weight权重,根据后端服务器权重设置,性能高的服务器权重比较大
主备Director配置的唯一区别是state和priority的区别。
/etc/init.d/keepalived start 启动keepalived服务
输入命令ipvsadm
这里出现了两台服务器的信息,表明keepalived已经配置成功
4安装httpd服务
在后端服务器server1和server2安装httpd服务,yum -y install httpd
分别在两台服务器上面打开httpd服务的根目录vi /var/www/html/index.html
在server1的index.html里面输入
<h1>server1</h1>
在server2的Index.html里面输入
</h1>server2</h1>
启动httpd服务
service httpd start
5配置服务器启动脚本,vi /etc/init.d/lsvDR_node创建,
VIP是虚拟地址210.72.3.238,用于接收Director的数据包
ifconfig lo:0是在回环口设置虚拟地址,arp_ignore和arp_announce在回环口lo和其他能收到ARP广播的接口要分别设置为1和2,下面给出我的理解:
这两个参数是Linux 2.6内核的ARP参数,用于限制ARP请求,在客户端发送请求到集群中的时候,整个集群都能收到ARP广播,因为集群中的主机都绑定了VIP地址,通过限制后端服务器的ARP请求,让请求先到Director均衡负载器。
arp_ignore设置为1时,只回答目标IP地址是来访网络接口本地地址的ARP查询请求。现在server1有eth0(210.72.3.231),lo0(210.72.3.238),那么客户端发起对eth0的ARP请求时,会先到达物理端口eth0,eth0会响应,但是,eth0收到发起对lo0的ARP请求时,eth0不会响应。这里的结果是eth0不会响应,因为客户端请求的是lo0的IP地址,但当Director把目的mac地址修改为server1设备的mac地址时,server1才会响应。
arp_announce设置为2,对查询目标使用最恰当的本地地址。当210这个局域网要发送ARP数据包响应客户端时,Linux默认情况下从哪个接口出去就作为源地址,这里会从server1的eth0出去,所以当arp_announce为0的时候源地址是210.72.3.231;在客户端收到arp请求的时候会更新arp缓存,从而导致一些问题出现。如果arp_announce设置为2,那么请求的源地址就会使用210.72.3.238,即为虚拟地址。
VIP的广播地址设为自己地址,目的是防止局域网各个Vip主机之间进行广播,导致无法通信。
启动脚本:chmod 755 /etc/init.d/lsvDR_node
/etc/init.d/lsvDR_node
6测试
在浏览器中输入vip,http://210.72.3.238
故障测试:在server2上面关掉httpd服务
service httpd stop
在浏览器中输入vip,http://210.72.3.238
在主Director中查看日志
tail -20 /var/log/messages
看到210.72.3.232server2的链接断开了
主备Director故障测试
在主Director上面停止keepalived服务模拟故障
service keepalived stop
在备Director上面查看系统日志
tail -20 /var/log/messages
可以看到,备Director状态切换成master了