搭建LVS+Keepalived高可用负载集群
最近,本屌接到公司的任务,公司新上20台服务器,需要搭建一整套架构来运行公司的业务,其中有应用服务器,认证服务器,数据库服务器等。服务器基础架构中的应用服务器集群要有高可用性,且需要负载均衡。当我接到这个任务的时候,脑子里第一个想法就是LVS+Keepalived。
由于公司资金有限,直接上硬件的负载均衡设备是不可能的了,所以只好使用软件来实现,LVS在负载均衡集群中无疑是一种很好的方案,使用LVS可以同时分发10台以下的设备,用在我们这个项目中是再合适不过的,而为了干掉LVS负载均衡集群中分发服务器这个单点故障,我又引入了Keepalived高可用技术。
LVS(Linux Virtual Server,Linux虚拟服务器)技术,由现任职淘宝的章文嵩博士创始,是一套开源的负载均衡软件,是中国国内最早出现的自由软件项目之一。
LVS架构由前端分发服务器,中间应用服务器,后端共享存储共同组成,分发服务器根绝其分发策略将用户请求分发到中间的应用服务器上,应用服务器根据LVS的模式来响应用户请求。LVS相关术语如下:
1、Director Server:调度服务器,将负载分发到Real Server的服务器
2、Real Server:真实服务器,真正提供应用服务的服务器
3、VIP:虚拟IP地址,公布给用户访问的IP地址
4、RIP:真实IP地址,集群节点上使用的IP地址
5、DIP:Director连到Real Server的IP地址
LVS负载均衡方式:
NAT:通过网络地址转换实现的虚拟服务器,Director server将用户请求报文的目的地址改成选定的Real Server地址后,转发给Real Server。
NAT模式下,所有请求全部要经过Director server的处理,所以,在并发量较大的时候,Director server就会成为系统的瓶颈。
DR:直接使用路由技术实现虚拟服务器,通过改写请求报文的MAC地址,将请求发至Real Server,Real Server直接响应客户端。
TUN:通过隧道方式实现虚拟服务器,Director采用隧道技术将请求发至Real Server后,Real Server直接响应客户端。
为了避免系统瓶颈,所以采用DR方式来实现请求转发。
LVS提供了10种调度算法,这些算法决定了以什么方式来转发请求,常用的调度算法有4种:
轮询(Round Robin):将客户端请求平均分发到Real Server。
加权轮询(Weighted Round Robin):根据Real Server的性能设置权重,再进行轮询调度。
最少连接(Least Connections):根据Real Server的性能设置权重,再进行轮询调度。
加权最少连接( Weighted Least Connections ):根据Real Server的性能设置权重,再将网络请求调度到已建立的连接数最少的服务器上。
由于公司采购的服务器的配置完全相同,性能没有什么差异,所以在调度算法上采用RR轮询的方式。
为了避免负载均衡分发器单点故障,所以再多加一台备用分发器,一旦当前的分发服务器发生故障,则启用备用服务器,保证业务不中断。
使用keepalived技术,实现对分发器以及应用服务器的高可用,自动剔除故障服务器,自动转移lvs负载均衡分发服务器。当故障服务器回复后,keepalived服务会自动将恢复的服务器重新加入集群继续提供服务。
以下为服务器配置过程:
一、IP地址划分
LVS-Master:10.60.77.150
LVS-Backup:10.60.77.151
VIP:10.60.77.152(此为对外提供服务的地址,本文中以私有IP代替)
web1:10.60.77.153
web2:10.60.77.154(web服务器即为应用服务器,本文以两台为例)
二、在LVS分发服务器上安装软件(两台服务器上都要安装)
[root@10-60-77-150-LVS1~]# yum -y install epel-release
[root@10-60-77-150-LVS1~]# yum -y install ipvsadm keepalived
三、配置LVS-Master服务器
修改keepalived配置文件
[root@10-60-77-150-LVS1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { //设置报警邮件
}
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS1 //设置router_id,此值在该网络中需要具有唯一性
}
vrrp_instance VI_1 {
state MASTER //当前服务器设置为主服务器
interface eth0
virtual_router_id 51
priority 100 //优先级,主服务器应该在网络中最高
advert_int 1
authentication {
auth_type PASS //设置认证方式
auth_pass password //设置认证密码
}
virtual_ipaddress { //设置VIP,掩码需要我们自己设置
10.60.77.152/24
}
}
virtual_server 10.60.77.152 80 { //VIP监听的端口
delay_loop 6
lb_algo rr //调度算法,此处为轮询方式
lb_kind DR //LVS负载均衡方式,此处为DR模式
persistence_timeout 50
protocol TCP
real_server 10.60.77.15380 { //指定real-server
weight 1 //指定该服务器的权重
TCP_CHECK {
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.60.77.15480 {
weight 1
TCP_CHECK {
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
}
}
准备虚拟网卡配置文件
[root@10-60-77-150-LVS1 ~]# cd /etc/sysconfig/network-scripts/
[root@10-60-77-150-LVS1 ~]# cp ifcfg-eth0 ifcfg-eth0:0
[root@10-60-77-150-LVS1 ~]# vim ifcfg-eth0:0
DEVICE=eth0:0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.60.77.152
PREFIX=24
四、配置LVS-Backup服务器
修改keepalived配置文件,只需修改以下几条即可:
[root@10-60-77-151-LVS2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS2 //修改router_id
}
vrrp_instance VI_1 {
state BACKUP //修改状态为BACKUP,该项配置必须为大写
interface eth0
virtual_router_id 51
priority 90 //修改优先级低于LVS-Master服务器
advert_int 1
authentication {
auth_type PASS //此处配置必须与LVS-Master完全相同
auth_pass password
}
其余配置与LVS-Master完全相同
分别启动LVS-master和LVS-backup的keepalived服务
[root@10-60-77-150-LVS1 ~]# service keepalived start
[root@10-60-77-150-LVS1 ~]# chkconfig keepalived on
[root@10-60-77-151-LVS2 ~]# service keepalived start
[root@10-60-77-151-LVS2 ~]# chkconfig keepalived on
五、配置realserver(所有web服务器配置全部相同)
1、拒绝ARP响应
[root@10-60-77-153-web1 ~]# vim /etc/sysctl.conf
在该文件末尾添加如下四行配置:
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
[root@10-60-77-153-web1 ~]# sysctl -p
2、准备虚拟回环接口配置文件
[root@10-60-77-153-web1 ~]# cd /etc/sysconfig/network-scripts/
[root@10-60-77-153-web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@10-60-77-153-web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.60.77.152
NETMASK=255.255.255.255
BROADCAST=10.60.77.152
ONBOOT=yes
[root@10-60-77-153-web1 network-scripts]# service network restart
六、测试