LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。
LVS可分为三部分:
1.Load Balancer:这是LVS的核心部分,它好比我们网站MVC模型的Controller。它负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server组成。
2.Server Array:该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。
3.Shared Storage:主要是提高上一层数据和为上一层保持数据一致。
其实要理解LVS的工作内容,首先就需要了解他的工作方式及原理,掌握了工作原理之后就可以很简单的理解这个服务的内容。
首先介绍LVS的核心内容,LoadBalancer 的工作模式: DR,NAT,TUNNEL,Full-NAT
首先DR模式,这个模式的性能是最好的
环境
三台虚拟机一台物理机
首先定义一些词语
调度器IP:因为使用的是虚拟IP,所以为vip
后端服务器:realserver,因此IP为rip
客户IP:sip
DR模式
虚拟机的ip必须在同一网段,一台调度器,两台后端服务器(这也是DR模式的缺陷)
系统:RHEL6
server1:调度器
server2,server3:后端服务器
调度器需要安装的服务:ipvsadm(RHEL5,6系统自带),http
后端服务器安装的服务:http(物理机通过http服务访问需要的内容)
首先配置yum源
因为在镜像里默认的yum源有一些特别的服务不会检查
因此我们需要添加一个yum源让他去访问,不然无法安装LVS服务(LVS服务所在的目录为LoadBalancer)
首先简介一下工作原理
调度器和后端服务器在同一网段,需要设置一个虚拟IP(VIP),以便客户进行访问,这三台虚拟机的VIP必须相同。
首先当客户访问这个IP的时候,调度器和后端服务器都会收到发来的数据包,这时需要在后端服务器上设置一条防火墙策略,就是如果有数据包访问VIP的时候,查看数据包发来的主机的MAC地址,只接受调度器的MAC地址发来的数据包,其他MAC地址的数据包丢弃。
所以调度器也需要设置一条策略的内容是当接收到的数据包以VIP为目标IP时,将这个数据包进行转发,转发至后端服务器,但是不会改变这个数据包的源IP和目的IP,只进行转发。
后端服务器如果发现目的IP为VIP,MAC地址为调度器地址的数据包,则会提供相应的服务,因为转发的数据包的源IP没有改变,所以后端服务器会直接将这个服务的数据包发送至客户主机,这样就减轻了后端服务器的压力。
这种工作模式的优点是性能强,缺点是调度器和后端服务器必须在同一个VLAN中,这就限制了这种工作方式的上限,因为服务器同一个网段的IP只能从1到254
现在配置调度器
yum install -y ipvsadm httpd
ipvsadm -C ##清空ipvs转发表
ipvsadm -A -t 172.25.54.100:80 -s rr ##-A:填加一个虚拟服务,-t:TCP服务,-s:工作模式rr轮叫
ipvsadm -a -t 172.25.54.100:80 -r 172.25.54.2:80 -g ##设置端口转发
ipvsadm -a -t 172.25.54.100:80 -r 172.25.54.3:80 -g
service ipvsadm save ##保存规则
绑定VIP
ifconfig eth0:0 172.25.54.100 netmask 255.255.255.0 up
ipaddr查看
配置后端服务器
vim /etc/sysctl.conf ##系统配置文件
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p ##刷新配置文件
ifconfig lo:0 172.25.54.100 netmask 255.255.255.255 up 同样添加VIP
编写http服务的访问页面
之后物理机访问
则为完成
NET工作模式
因为这种工作模式设计到了两个网段,所以我们需要开启这个调度器的路由功能
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
工作原理
需要调度器有两块网卡,一块负责对外接收数据包,一块负责对内发送数据包,当客户要访问服务时会发送数据包至对外的网卡上面(sip->vip),这时调度器通过DNAT(目的地址转换)并使用对内的网卡将这个数据包的目的IP转换rip为并发送(vip->rip),后端服务器接收到数据包之后提供服务发送至调度器(rip->vip),调度器再通过SNAT(源地址转换)将源地址转换为sip,发送至客户端。(vip->sip)
这种工作模式的优点是简单,易于实现,但是缺点是负载能力太差,一旦客户请求增多,调度器就无法承担这种工作量,而且调度器和后端服务器同样必须在一个VLAN中
FULL-NAT工作模式
工作原理
于NAT工作模式类似,同样是通过DNAT和SNAT进行数据包转发,不过需要在调度器上填加一个lip(localip),每需要一个后端的服务就添加一个lip,工作内容是当客户发来请求的时候(sip->vip),通过SNAT将客户的IP转换为调度器IP,通过DNAT将目的IP转换为后端服务器的IP(lip->rip),发送至后端服务器,后端服务器提供服务后发送数据包至调度器(rip->lip),这时调度器再通过SNAT和DNAT将数据包发送至客户(vip-sip)。
这种工作模式的优点是不需要调度器和后端服务器在一个VLAN中,因此可提供的上限就会高很多,但是缺点是这个模式一共做了四次地址转换,所以性能不是很好,而且后端服务器不知道客户的ip,一旦调度器出了问题,服务就很难再维持。
TUNNEL
也叫隧道工作模式
原理是将客户发送进来的数据包做一次封装之后直接发送至后端服务器,封装为源地址为vip,目的地址为rip的数据包
优点是工作简便,便于实现,但缺点是客户发送来的数据包不能接近限制,如果接近限制再进行一次封装就有可能超过数据包的大小限制,导致无法发送
系统自带的ipvsadm安装包功能不够自动化,无法对后端服务器进行健康检查,而且也无法自动添加和移除后端服务器
因此我们需要使用另一种开源软件来实现健康检查的功能
Ldirectord
这款软件可以在主LVS负载均衡调度器发生故障时自动切换至备用的LVS调度器,可以对后端服务器进行健康检查,并且自动删除出现故障的后端服务器。
这款软件在运行的时候会自动建立一个IPVS表,当发现无法提供服务的后端服务器时可以自动将这个服务器移出集群
首先安装这个软件,需要去网上下载,系统中并没有集成这个软件
下载完成后yum安装,因为这个有很多的依赖性,全都是系统自带的,所以直接yum即可
安装完成之后查看安装后的文件及目录
rpm -ql ldirectord-3.9.5-3.1.x86_64
默认配置文件目录为/etc/ha.d
配置文件为/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
因此
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
并修改其中的内容
其中fallback为后端的服务器全部发生故障之后服务就会转到本机的回环接口上
接下来关闭ipvsadm后再开启ldirector就可以看到IPVS从有到无再到有了
这个时候我们可以将一个后端服务器的http服务关闭,之后再查看IPVS表
测试成功
ldirector可以进行对后端的健康检查
虽然ld拥有对后端服务器进行健康检查的功能,但是它并不支持高可用性
因此我们将LVS与Keepalived进行捆绑以便实现高可用性,同时Keepalived也支持对后端服务器的健康检查
首先配置的时候需要将ld关闭,并且在IPVS表中添加LVS的策略,不过并不需要手动添加VIP,Keepalived会自动帮你添加,并且当高可用性实现的时候自动漂移至备用调度器
添加一台虚拟机当作备用调度器
首先是主调度器
首先对Keepalived进行编译
./configure --prefix=/usr/local/keepalived --with-init=SYSV
make && makeinstall
编译完成之后做软链接,将需要的文件放置在默认的目录下
chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
修改配置文件/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
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 eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.54.100/24
}
}
virtual_server 172.25.54.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.54.2 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.54.3 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
启动服务之前确保MASTER上面没有VIP
之后启动服务,就可以看到VIP自动出现
之后配置备用调度器
备用调度器的所有内容都要和主调度器相同
除了配置文件中有一些需要进行修改
17 vrrp_instance VI_1 {
18 state BACKUP
19 interface eth1
20 virtual_router_id 51
21 priority 50
22 advert_int 1
23 authentication {
24 auth_type PASS
25 auth_pass 1111
26 }
27 virtual_ipaddress {
28 172.25.54.100
29 }
30 }
剩下都相同。
配置完成就可以进行测试了,关闭主调度器的keepalive程序,
之后就会看到VIP自动漂移至备用调度器,这时服务依然可以正常提供