一、LVS简介
一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检 测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。
二、LVS的分类
LVS-DR: 直接路由
LVS-DR模式:
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的mac地址改为后端真实服务器的mac地址;
3.后端真实服务器得到访问报文后进行ip查看,再确认自己有vip之后进行请求处理;
4.后端真实服务器在处理完数据请求后,直接响应客户端。
要求:
1.LVS服务器和后端真实的服务器要处在同一vlan中。
2.LVS和后端服务器上都要有vip,并且后端真实服务器上的vip不能对外进行广播。
优点:
1.LVS服务器只是修改了mac地址,所以非常快速,并且LVS不会成为瓶颈。
缺点:
1.要求较高,LVS服务器必须和后端真实服务器处于同一vlan中;
2.后端真实服务器直接响应客户端,对于后端真实服务器来说,并不安全。
LVS-TUN:隧道
LVS-TUNNEL模式:
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文重新封装,发送给后端真实服务器;
3.后端真实服务器将请求报文解封,在确认自身有vip之后进行请求处理;
4.后端真实服务器在处理完数据请求后,直接响应客户端。
要求:
1.lvs和后端真实服务器上都要有vip。
2.不会成为瓶颈。
3.请求的报文不能太大。
优点:
1.快速
2.不安全,不能抵抗DOS攻击
LVS-NAT:地址转换
LVS-NAT模式:
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的目的地址修改为后端真实服务器(DNAT),发送给后端真实服务器;
3.后端服务器在处理完之后要将响应的报文返回给客户端,但是却不在同一网段;
4.LVS根据自己的追踪技术将后端真实服务响应客户端的报文原地址改为自己的ip地址(SNAT),发送给客户端。
要求:
1.LVS服务器需要有不同的网段。
2.真实服务器的网关必须设置为LVS的ip地址。
优点:
1.安全
2.可以实现不同网段的数据请求。
缺点:
因为在 VS/NAT 中请求和响应报文都需要通过负载调度器,伸缩能力有限, 当服务器结点数目升到 20 时,调度器本身
有可能成为系统的新瓶颈。
LVS-FULLNAT模式:
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文的目的地址修改为后端真实服务器(DNAT),源地址改为自己的ip地址(SNAT),发送给后端真实服务器;
3.后端服务器在处理完之后要将响应的报文返回给lvs;
4.LVS将返回的数据包源地址改为自己(SNAT),目的地址改为客户端(DNAT),发送给客户端。
。
三.LVS-DR模式下的负载均衡
实验环境:
物理机:172.25.254.68
vip:172.25.254.100
server2(VS):172.25.254.2
server5(VS):172.25.254.5
server3(RS):172.25.254.3
server4(RS):172.25.254.4
server2:
1.配置yum库,安装【Load Balancer】组包:
vim /etc/yum.repos.d/rhel-source.repo
yum cLean all
yum repolist
2、配置虚拟VIP
yum install ipvsadm -y
ip addr add 172.25.254.100/24 dev eth0 #添加虚拟ip为172.25.2.100
ip addr
ipvsadm -A -t 172.25.254.100:80 -s rr #使用的调度算法,算法为rr(Round Robin)
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g #给vip添加rip,-g指定LVS 的工作模式为直接路由模式(默认模式)
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.4:80 -g
ipvsadm -ln
-m #--masquerading 指定LVS 的工作模式为NAT 模式
-t #--tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
server3:
ip:172.25.254.3
/etc/init.d/httpd start #开启http服务
ip addr add 172.25.254.100/32 dev eth0
yum install arptables_jf -y
##安装arp防火墙 arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip
arptables -L
arptables -A IN -d 172.25.254.100 -j DROP
##拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.3
##由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输给客户端的就是realserver,mangle参数就是这个功能
/etc/init.d/arptables_jf save #保存策略
server4:
ip:172.25.254.4
/etc/init.d/httpd start
ip addr add 172.25.254.100/32 dev eth0
yum install arptables_jf -y
arptables -L
arptables -A IN -d 172.25.254.100 -j DROP
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.4
/etc/init.d/arptables_jf save #保存arp火墙配置信息
真机里测试:
curl 172.25.254.100
arp -an |grep 100 #查看vip的vmac
arp -d 172.25.9.100 #清除vip的vmac
假设client的ip为cip,mac地址为m1,调度器vs的ip为vip,mac地址为m2,后端服务器的ip为rip,mac地 址为m3,由于DR模式工作在数据链路层,没有经过路由器,所以vs和rs必须在同一个网段,当client访问vip时,在DR模式下,vs通过它本身 的一些算法m2改为m3,这样就可以实现直接将数据包丢给rs(这里rs上必须有vip,因为客户端访问的是vip),rs通过解封,得到了vip,通过 与自己vip匹配判断数据包确实是给自己的,rs在通过封装,直接将数据发给client,数据包不用原路返回)。由于vs和rs上都有vip,会有冲 突,因此这里我们应用arptables协议,在rs上添加arp策略,控制数据传输
四.健康检查
ldirectord介绍
我们需要使用ldirectord程序,这个程序在启动时自动建立IPVS表,然后监视集群节点的健康情况,在发现失效节点时将其自动从IPVS表中移除。
server2:
ip:172.25.2.2
cd /mnt
需要修改/etc/yum.repos.d/rhel-source.repo
vim /etc/yum.repos.d/rhel-source.repo
加入
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.2.250/rhel6.5/HighAvailability
gpgcheck=0
yum repolist
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
rpm -ql ldirectord #查看配置文件
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
cd /etc/ha.d/
ls
vim ldirectord.cf
24 # Sample for an http virtual service
25 virtual=172.25.2.100:80 #vip虚拟ip
26 real=172.25.2.3:80 gate #rs ip
27 real=172.25.2.4:80 gate #rs ip
29 fallback=127.0.0.1:80 gate #如果两个rs都坏了,启用调度器
30 service=http
31 scheduler=rr
32 #persistent=600
33 #netmask=255.255.255.255
34 protocol=tcp
35 checktype=negotiate
36 checkport=80
37 request="index.html"
38 #receive="Test Page" #这两行注释掉
39 #virtualhost=www.x.y.z #这两行注释掉
vim /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80 #修改端口为80
/etc/init.d/httpd restart
cd /var/www/html/
ls
rm -fr *
vim index.html
<h1>网站维护中......</h1>
/etc/init.d/ldirectord start #开启这个
ipvsadm -ln #自动生成ipvsadm列表
/etc/init.d/httpd stop
关闭server3的httpd后,真机测试:
关闭server3和server4的httpd后,再次测试:
五.Keepalived高可用服务
Keepalived主要通过VRRP协议(虚拟路由器冗余协议)实现高可用。VRRP出现的目的
1.主备
编译三部曲
./configure -> make -> make install
server2:
/etc/init.d/ldirectord stop #关闭ldirectord
chkconfig ldirectord off
cd /mnt
tar zxf keepalived-2.0.6.tar.gz
cd keepalived-2.0.6
yum install -y openssl-devel mailx ##安装依赖包和邮件
./configure --with-init=SYSV --prefix=/usr/local/keepalived
yum install gcc -y #安装gcc否则编译不了
make #编译keepalived源码
make install #安装
创建软连接
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
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/etc/keepalived /etc/
赋予脚本可执行权限
chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
cd /usr/local/
scp -r keepalived/ server5:/usr/local/ #给server5传过去
server5:
yum install openssh-clients mailx -y #安装scp
cd /usr/local/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/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
server2里面:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #全局配置标识
notification_email {
[email protected] #接收警报的 mail 地址,可以添加多个,每行一个
}
notification_email_from [email protected] #设置邮件的发送地址
smtp_server 127.0.0.1 #设置 smtp server 地址
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict #注释掉,不然iptables显示DROP ALL
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 2
priority 100
advert_int 1 #检查间隔,默认1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100
}
}
virtual_server 172.25.254.2 80 {
delay_loop 6 #service polling 的delay时间
lb_algo rr #lvs 调度算法
lb_kind DR #lvs 是用 DR 模式
#persistence_timeout 50 #注释掉,不然会有时延
protocol TCP
real_server 172.25.254.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.4 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
#剩下的全部删掉
ip addr del 172.25.254.100/24 dev eth0
/etc/init.d/keepalived start
scp keepalived.conf server5:/etc/keepalived/ #把配置文件传给server5
server5:
cd /etc/yum.repos.d/
vim rhel-source.repo
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.254.68/rhel6.5/LoadBalancer
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.254.68/rhel6.5/HighAvailability
gpgcheck=0
yum install -y ipvsadm
/etc/init.d/keepalived start
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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 BACKUP #状态BACKUP
interface eth0
virtual_router_id 2 #主、备机的 virtual_router_id 必须相同,取值 1-254
priority 50 #比MASTER小,主机的优先级,主机优先级一定要大于备机
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100
}
}
virtual_server 172.25.254.2 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.4 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
测试:
停止 master 上的 keepalived 服务,看 BACKUP是否接管。
/etc/init.d/keepalived stop
for i in {1..10};do curl 172.25.254.100;done
发现原本在MASTER上的VIP已经转到了BACKUP上
关闭RS 上的 http 服务,Keepalived 监控模块是否能及时发现
关闭server3上的http服务
/etc/init.d/httpd stop
server2和server5上的都接受到了邮件
2.双组
server3:
yum install vsftpd -y
/etc/init.d/vsftpd start
cd /var/ftp/
touch server3
ip addr add 172.25.254.200/32 dev eth0
vim /etc/sysconfig/arptables
[0:0] -A IN -d 172.25.2.100 -j DROP
[0:0] -A IN -d 172.25.2.200 -j DROP
[0:0] -A OUT -s 172.25.2.100 -j mangle --mangle-ip-s 172.25.2.3
[0:0] -A OUT -s 172.25.2.200 -j mangle --mangle-ip-s 172.25.2.3
/etc/init.d/arptables_jf restart
arptables -L
server4:
yum install vsftpd -y
/etc/init.d/vsftpd start
cd /var/ftp/
touch server4
ip addr add 172.25.254.200/32 dev eth0
vim /etc/sysconfig/arptables
[0:0] -A IN -d 172.25.254.100 -j DROP
[0:0] -A IN -d 172.25.254.200 -j DROP
[0:0] -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.4
[0:0] -A OUT -s 172.25.254.200 -j mangle --mangle-ip-s 172.25.254.4
/etc/init.d/arptables_jf restart
arptables -L
server2:
ftp端口21 server2作为lftp的备份,http的主
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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 2
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100
172.25.254.200
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 102
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100
172.25.254.200
}
}
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.4 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
virtual_server 172.25.254.200 21 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.25.254.3 21 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.4 21 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
/etc/init.d/keepalived restart
ipvsadm -ln
server5:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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_2 {
state BACKUP
interface eth0
virtual_router_id 2
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100
172.25.254.200
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 102
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100
172.25.254.200
}
}
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.4 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
virtual_server 172.25.254.200 21 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.25.254.3 21 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.4 21 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
/etc/init.d/keepalived restart
ipvsadm -ln
主机测试:
curl 172.25.254.100
[[email protected] ~]# lftp 172.25.254.200
[[email protected] ~]# lftp 172.25.254.200
[[email protected] ~]# curl 172.25.254.100
<h1>www.westos.org-server3</h1>
[[email protected] ~]# curl 172.25.254.100
<h1>bbs.westos.org-server4</h1>