**Centos7搭建lvs+keepalive负载均衡集群**
keepalived简介
keepalived是分布式部署解决系统高可用的软件,结合lvs(LinuxVirtual Server)使用,解决单机宕机的问题。
keepalived是一个基于VRRP协议来实现IPVS的高可用的解决方案。对于LVS负载均衡来说,如果前端的调度器direct发生故障,则后端的realserver是无法接受请求并响应的。因此,保证前端direct的高可用性是非常关键的,否则后端的服务器是无法进行服务的。而我们的keepalived就可以用来解决单点故障(如LVS的前端direct故障)问题。keepalived的主要工作原理是:运行keepalived的两台服务器,其中一台为MASTER,另一台为BACKUP,正常情况下,所有的数据转换功能和ARP请求响应都是由MASTER完成的,一旦MASTER发生故障,则BACKUP会马上接管MASTER的工作,这种切换时非常迅速的。
LVS简介
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,LVS工作在ISO模型中的第四层,由于其工作在第四层,因此与iptables类似,必须工作在内核空间上。因此lvs与iptables一样,是直接工作在内核中的,叫ipvs,主流的linux发行版默认都已经集成了ipvs,因此用户只需安装一个管理工具ipvsadm即可。
IPVS中实现了三种负载均衡技术:
1、VS/NAT — Virtual Server via Network Address Translation
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端真实服务器;真实服务器的响应报文通过调度器时,报文源地址被重写再返回给客户,完成整个负载调度过程。但通常在流量比较大的情况下会造成调度器的瓶颈。因为服务数据的返回必须通过调度器出去。
2、VS/TUN — Virtual Server via IP Tunneling
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器 把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。但是目前支持TUN 只有Linux系统
3、VS/DR — Virtual Server via Direct Routing
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术 可极大地提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。也就是说,在这种结构中,数据从外部到内部真实服务器的访问会通过调度器进来,但是真实服务器对其的应答不是通过调度器出去。 即在大多数情况下,真实服务器可以通过各自的网关或者专用的网关对数据进行外发,从而降低调度器负载。
LVS优点:
1、抗负载能力强
因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的 lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和 cpu方面基本无消耗。
2、配置性低
这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。
3、工作稳定
因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定的。
4、无流量
上面已经有所提及了。lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。
5、基本上能支持所有应用
因为lvs工作在4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等等。
注:LVS需要手工动态增加命令,所以需要Keepalived来实现自动配合。
系统版本:centos7x4.10.0-514.el7.x86_64
Keepalived版本:keepalived.x86_64 0:1.3.5-6.el7(yum)
Lvs版本:ipvsadm-1.27-7.el7(yum)
安装前操作
关闭防火墙并禁止开机自启
systemctl stop firewalld.service
systemctl disable firewalld
关闭selinux
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g‘ /etc/sysconfig/selinux
重启 reboot
第一步:安装Keepalived+Lvs的master主机
IP:10.10.10.50
主要组件: keepalived lvs(ipvsadm)
主要依赖包: gcc openssl openssl-devel
1、安装keepalived lvs(ipvsadm) 组件和依赖包
modprobe ip_vs #加载ip_vs模块
yum -y install keepalived ipvsadm gcc openssl openssl-devel
2、备份keepalived配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
3、编辑keepalived配置文件
[root@stand keepalived]# more keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_01
}
vrrp_instance VI_1 {
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
interface ens160 #改成对应的网卡
virtual_router_id 51 #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的 vitrual_router_id 是一致的。
priority 150 #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
advert_int 1 #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
authentication {
auth_type PASS #验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种。
auth_pass 6666 #同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。
}
virtual_ipaddress { #虚拟ip地址,这个ip 必须与我们在lvs 客户端设定的vip 相一致!
10.10.10.105
}
}
virtual_server 10.10.10.105 80 { #虚拟IP,来源与上面的虚拟IP地址,后面加空格加端口号
delay_loop 6 #健康检查间隔,单位为秒
lb_algo rr #负载均衡调度算法,一般用wrr、rr、wlc
lb_kind DR #负载均衡转发规则。一般包括DR,NAT,TUN 3种。
persistence_timeout 60 #会话保持时间
protocol TCP #转发协议,有TCP和UDP两种,一般用TCP。
real_server 10.10.10.50 80 { #真实服务器,包括IP和端口号
weight 1 #权重,数值越大,权重越高
TCP_CHECK { #通过tcpcheck判断RealServer的健康状态
connect_port 80 #检测端口
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连时间间隔
}
}
real_server 10.10.10.51 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
其实配置文件中主要要修改的选项没有很多,有三个参数要注意
route_id XXX #MASTER和BACKUP不同
virtual_router_id 51 #同一个实例下,MASTER和BACKUP相同
priority 100 #优先级,同一个实例下,MASTER高于BACKUP
开启路由转发
1)修改配置文件
$ vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
或
echo “net.ipv4.ip_forward = 1” >>/etc/sysctl.conf
2)刷新配置
sysctl -p
重启keepalived服务并设置开机自启
1)重启keepalived
systemctl restart keepalived
2)开机自启keepalived
systemctl enable keepalived
[root@dr1 ~]# ip addr show dev ens33 #验证绑定了的虚拟地址
[root@stand keepalived]# ip addr show dev ens33
[root@dr1 ~]# ipvsadm -L #查看LVS虚拟服务器
tail -f /var/log/messages
第二步:配置从调度器 back
IP:10.10.10.51
主要组件: keepalived lvs(ipvsadm)
主要依赖包: gcc openssl openssl-devel
modprobe ip_vs #加载ip_vs模块
1、安装keepalived lvs(ipvsadm) 组件和依赖包
yum -y install keepalived ipvsadm gcc openssl openssl-devel
2、备份keepalived配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
4、编辑keepalived配置文件
[root@wms keepalived]# more keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 105
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.10.10.105
}
}
virtual_server 10.10.10.105 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 10.10.10.50 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.10.10.51 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
开启路由转发
2)修改配置文件
$ vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
或
echo “net.ipv4.ip_forward = 1” >>/etc/sysctl.conf
2)刷新配置
sysctl -p
重启keepalived服务并设置开机自启
1)重启keepalived
systemctl restart keepalived
2)开机自启keepalived
systemctl enable keepalived
[root@dr1 ~]# ip addr show dev ens160 #验证绑定了的虚拟地址
[root@stand keepalived]# ip addr show dev ens160
测试:停掉主节点的keepalived服务vip就漂移到了备用节点上,再次启动主节点VIP再次回到主节点上
第三步:配置真实服务器(主要是自动完成ARP抑制的设置)
说明:一般真实互联网应用都配置为lb_kind = dr 模式,因为这种模式效率是最高的,缺点就是配置稍微复杂一点,需要配置客户端。
DR模式原理请参考:http://atong.blog.51cto.com/2393905/1348602
简单说一下: 假设A为前端负载均衡服务器, B,C为后端真实服务器。 A接收到数据包以后,会把数据包的MAC地址改成B的(根据调度算法,假设发给B服务器),然后把数据包重新发出去,交换机收到数据包根据MAC地址找到B,把数据包交给B。 这时B会收到数据包,同时验证请求IP地址,由于数据包里的IP地址是给A的,所以正常情况下B会丢弃数据包,为了防止这种情况,需要在B机器的回环网卡上配置A的IP地址。并设置ARP压制。
在web服务器配置脚本
vim /etc/init.d/realserver
#!/bin/bash
SNS_VIP=10.10.10.105
#/etc/rc.d/init.d/functions
case “$1” in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_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 >/dev/null 2>&1
echo “RealServer Start OK”
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce
echo “RealServer Stoped”
;;
*)
echo “Usage: $0 {start|stop}”
exit 1
esac
exit 0
第四步:测试访问系统