LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性
lvs的三种模式:DR模式,NAT模式和TUN模式
三种 IP 负载均衡技术的优缺点:
* | VS/NAT | VS/Tun | VS/DR |
---|---|---|---|
server | any | Tunneling | Non-arp device |
server network | Private | Lan/wan | Lan |
server number | Low(10~20) | High(100) | High(100) |
server gateway | Load balancer | Own router | Own router |
注:以上三种方法所能支持最大服务器数目的估计是假设调度器使用 100M 网卡,调度器的硬件配置与后端服务器的硬件配置相同,而且是对一般 Web 服务。使用更高的硬件配置(如千兆网卡和更快的处理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应地改变。所 以,以上数据估计主要是为三种方法的伸缩性进行量化比较。
只能在同一VLAN中使用
Client-->VS-->RS-->client 速率最高
VS/DR 利用大多数 Internet 服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB 相连。VIP 地址为调度器和服务器组共享,调度器配置的 VIP 地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把 VIP 地址配置在各自的 NonARP 网络设备上,它对外面是不可见的,只是用于处 理目标地址为 VIP 的网络请求
VS/DR的配置:
虚拟服务器VS:172.25.25.4----->server4
真实服务器VS:172.25.25.1----->server1
172.25.25.3----->server3
在虚拟服务器VS上的配置:
# 开启httpd
[root@server4 ~]# /etc/init.d/httpd start
# 配置yum源
[root@server4 ~]# vim /etc/yum.repos.d/rhel-source.repo
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.25.250/rhel6.5/HighAvailability
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.25.250/rhel6.5/LoadBalancer
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.25.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.25.250/rhel6.5/ScalableFileSystem
gpgcheck=0
# 安装ipvsadm
[root@server4 ~]# yum install ipvsadm -y
# 加载rule
[root@server4 ~]# ipvsadm -A -t 172.25.25.100:80 -s rr
[root@server4 ~]# ipvsadm -a -t 172.25.25.100:80 -r 172.25.25.1:80 -g
[root@server4 ~]# ipvsadm -a -t 172.25.25.100:80 -r 172.25.25.3:80 -g
# 绑定虚拟ip
[root@server4 ~]# ip addr add 172.25.25.100/24 dev eth0
# 查看
[root@server4 ~]# ipvsadm -ln
/etc/yum.repos.d/rhel-source.repo内容:
在真实服务器RS上的配置:
Server1上:
# 绑定虚拟ip
[root@server1 ~]# ip addr add 172.25.25.100/24 dev eth0
[root@server1 ~]# ip addr
# 安装arptables_jf
[root@server1 ~]# yum install arptables_jf -y
# arp抑制
[root@server1 ~]# arptables -A IN -d 172.25.25.100 -j DROP
[root@server1 ~]# arptables -A OUT -s 172.25.25.100 -j mangle --mangle-ip-s 172.25.25.1
[root@server1 ~]# /etc/init.d/arptables_jf save
[root@server1 ~]# arptables -nL
Server3和server2进行相同的配置:
[root@server3 ~]# ip addr add 172.25.25.100/24 dev eth0
[root@server3 ~]# ip addr
[root@server3 ~]# yum install arptables_jf -y
[root@server3 ~]# arptables -A IN -d 172.25.25.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.25.100 -j mangle --mangle-ip-s 172.25.25.3
[root@server3 ~]# /etc/init.d/arptables_jf save
[root@server3 ~]# arptables -nL
server1:
server3:
在物理主机测试:
2.健康检查
如果其中一个RS的http关闭,仍然可以用curl 172.25.25.100监测到另一个后端服务器
如果两个都关闭,将监测到的是虚拟主机
[root@server4 ~]# cd /mnt
[root@server4 mnt]# ls
[root@server4 mnt]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server4 mnt]# cd /etc/ha.d/
[root@server4 ha.d]# ls
ldirectord.cf resource.d shellfuncs
[root@server4 ha.d]# vim ldirectord.cf
[root@server4 ha.d]# ipvsadm -C
[root@server4 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@server4 ha.d]# /etc/init.d/ldirectord start
Starting ldirectord... success
[root@server4 ha.d]# ipvsadm -ln
[root@server4 ha.d]# vim /var/www/html/index.html
[root@server4 ha.d]# /etc/init.d/httpd start
Starting httpd:
测试:
关闭server1上的httpd
在真机测试
再关闭server3上的httpd
在真机测试
keepalived简介
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器
VRRP协议
VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。 一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。是一种LAN接入设备备份协议。一个局域网络内的所有主机都设置缺省网关,这样主机发出的目的地址不在本网段的报文将被通过缺省网关发往三层交换机,从而实现了主机和外部网络的通信。
实验环境配置
打开新的虚拟机server2作为备用HA高可用,server4为主用HA高可用,server1和server3为后端服务器
在Server4的配置:
# 解决软件的依赖性
[root@server4 keepalived-2.0.6]# yum install gcc openssl-devel iptables-devel
# 安装
[root@server4 mnt]# yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
# 编译三部曲
[root@server4 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
[root@server4 keepalived-2.0.6]# make
[root@server4 keepalived-2.0.6]# make install
# 做软连接
[root@server4 sbin]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 sbin]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server4 sbin]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 sbin]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
# 加可执行权限
[root@server4 sbin]# chmod +x /etc/init.d/keepalived
# 开启,不报错则配置成功
[root@server4 sbin]# /etc/init.d/keepalived start
# 将目录拷贝到server2上
[root@server4 local]# scp -r keepalived/ [email protected]:/usr/local/
Server2的配置:
[root@server2 local]# cd keepalived/
[root@server2 keepalived]# ls
bin etc sbin share
# 做软连接
[root@server2 keepalived]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server2 keepalived]# ln -s /usr/local/keepalived/etc/keepalived /etc/
[root@server2 keepalived]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server2 keepalived]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server2 keepalived]# chmod +x /etc/init.d/keepalived
[root@server2 keepalived]# /etc/init.d/keepalived start
Server4上的配置:
# 安装mailx
[root@server4 local]# yum install -y mailx
[root@server4 local]# cd /etc/keepalived/
# 删除原来的虚拟ip
[root@server4 keepalived]# ip addr del 172.25.25.100/24 dev eth0
[root@server4 keepalived]# vim keepalived.conf #修改配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 25
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.25.100
}
}
virtual_server 172.25.25.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.25.1 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.25.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
[root@server4 keepalived]# /etc/init.d/keepalived start
[root@server4 keepalived]# scp keepalived.conf server2:/etc/keepalived/
在server2上配置:
[root@server4 keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
state BACKUP #修改state
interface eth0
virtual_router_id 25
priority 50 #修改优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.25.100
}
}
make
make install
server2:
server4:
/etc/keepalived/keepalived.conf的内容:
server2:
/etc/keepalived/keepalived.conf的内容:
只更改state和priority,其余和server4一样
测试:
当server4 down掉
在物理主机测试:
server2从backup变为master
查看server2 的日志
当server4开启:
server2又变为backup
查看server2日志
VS/NAT 的优点是服务器可以运行任何支持 TCP/IP 的操作系统,它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。缺点是它的伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身有可能成为系统的新瓶颈,因为在 VS/NAT 中请求和响应报文都需要通过负载调度器。
Load Balance:eth0:172.25.25.4
eth1: 172.25.254.1
gateway: 172.25.25.4
Realserver: 172.25.25.1
Realserver: 172.25.25.3
Virtual_server设置:
在虚拟服务器上配置双网卡eth0:172.25.25.4 ,eth1:172.25.254.1
#开启路由机制
[root@server4 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
#加载nat 模块
[root@server4 ~]# modprobe iptable_nat
#加载 rule
[root@server4 ~]# ipvsadm -A -t 172.25.254.1:80 -s rr
[root@server4 ~]# ipvsadm -a -t 172.25.254.1:80 -r 172.25.25.1:80 -m
[root@server4 ~]# ipvsadm -a -t 172.25.254.1:80 -r 172.25.25.3:80 -m
[root@server4 ~]# service ipvsadm save
Realserver上的设置:
server1配置网关:
开启httpd服务
server3配置网关:
开启httpd服务
测试:
在物理主机上测试:
VS/TUN 技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP
Encapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。
在 VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有 100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN 可以极大地增加负载调度器调度的服务器数量。VS/TUN 调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以 用来构建高性能的超级服务器。
Load Balance:172.25.155.1
Virtual IP: 172.25.155.100
Realserver1: 172.25.155.2
Realserver1: 172.25.155.3
在Virtual server上的配置
[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 加载rule
[root@server1 ~]# ipvsadm -A -t 172.25.151.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.155.100:80 -r 172.25.155.3:80 -i
[root@server1 ~]# ipvsadm -a -t 172.25.155.100:80 -r 172.25.155.3:80 -i
# 保存
[root@server4 ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
# 绑定虚拟ip
[root@server1 ~]# ip addr add 172.25.155.100 dev eth0
[root@server1 ~]# ipvsadm -ln
[root@server2 ~]# ifconfig tunl0 172.25.155.100 netmask 255.255.255.255 up
[root@server2 ~]# echo '1' > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@server2 ~]# echo '2' > /proc/sys/net/ipv4/conf/tunl0/arp_announce
[root@server2 ~]# echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server2 ~]# echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server2 ~]# echo '0' > /proc/sys/net/ipv4/conf/tunl0/rp_filter
[root@server2 ~]# echo '0' > /proc/sys/net/ipv4/conf/all/rp_filter
[root@server3 ~]# ifconfig tunl0 172.25.155.100 netmask 255.255.255.255 up
[root@server3 ~]# echo '2' > /proc/sys/net/ipv4/conf/tunl0/arp_announce
[root@server3 ~]# echo '1' > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@server3 ~]# echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server3 ~]# echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server3 ~]# echo '0' > /proc/sys/net/ipv4/conf/tunl0/rp_filter
[root@server3 ~]# echo '0' > /proc/sys/net/ipv4/conf/all/rp_filter