一、lvs
1.名词解释
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
2.lvs的技术简介
以下引用自百度百科
【1】技术简介
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
【2】集群采用三层结构
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区。
3.三种 IP 负载均衡技术
在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
二、keepalived
1.作用
主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
**三、LVS(IP负载均衡)+Keepalived的部署**
这里我们采用VS/DR
实验环境: rhel6
server1: 172.25.70.1
server2: 172.25.70.2
server3: 172.25.70.3
server4: 172.25.70.4
server1为调度服务器(vs),server2和server3为rs(真实的后端服务器),server4为keepalived备机
1.利用ipvsadm
利用ipvsadm内核功能,(不需要开启,用户层面需要控制这个服务,调用脚本来保存)策略)
- 所需软件:ipvsadm-1.26-2.el6.x86_64 (配置yum源) 添加如下:
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.70.250/rhel6.5/HighAvailability
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.70.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.70.250/rhel6.5/ScalableFileSystem
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.70.250/rhel6.5/LoadBalancer
gpgcheck=0
- 安装
[root@server1 ~]# yum install ipvsadm -y
- 调度服务器(vs)做如下配置(server1)
[root@server1 ~]# ip addr add 172.25.70.100/24 dev eth0 #添加一个vip
[root@server1 ~]# ipvsadm -A -t 172.25.70.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.3:80 -g
添加一个vip(调度服务器的虚拟ip)以及为该vip绑定两个rs(真实的后端服务器)的ip,他们的监听端口都为80
- 在rs上做下面配置(server2&&server3)
我们在真实的服务器上自然也需要添加vip,但是需要安装arptables_jf插件,然后在该插件上做一些策略,使得ip地址为vip的数据包,在进入rs的时候被丢弃,并且rs的数据包在出去的时候广播的是自己真实的ip而不是vip
[root@server2 ~]# yum install arptables_jf -y
[root@server2 ~]# arptables -A IN -d 172.25.70.100 -j DROP
[root@server2 ~]# arptables -A OUT -s 172.25.70.100 -j mangle --mangle-ip-s 172.25.70.2
[root@server2 ~]# ip addr add 172.25.70.100/24 dev eth0
server3同理
- 在server2&&serer3的apache的默认发布目录下分别编辑这样的页面
[root@server2 ~]# vim /var/www/html/index.html
<h1>the page from server2</h1>
[root@server3 ~]# vim /var/www/html/index.html
<h1>the page from server3</h1>
- 测试,通过访问vip看是否能在rs键实现轮循
[root@foundation70 kiosk]# curl 172.25.70.100
<h1>the page from server3</h1>
[root@foundation70 kiosk]# curl 172.25.70.100
<h1>the page from server2</h1>
测试成功,同时我们可以查看该vip的访问对应哪一台服务器的mac地址
[root@foundation70 kiosk]# arp -an | grep 100
? (172.25.70.100) at 52:54:00:ff:a3:61 [ether] on br0
You have new mail in /var/spool/mail/kiosk
如你所料,对应的是vs的mac地址,具体原理可以参见这篇博客(我感觉不可能有人家写的具体详细~~)
2.keepalived的安装和部署
- 安装keepalived
需要的材料:keepalived-1.3.6.tar.gz libnfnetlink-devel-1.0.0-1.el6.x86_64.rp
[root@server1 ~]# tar -zxf keepalived-1.3.6.tar.gz
[root@server1 ~]# yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm openssl-devel libnl-devel iptables-devel -y
[root@server1 ~]# cd keepalived-1.3.6
[root@server1 keepalived-1.3.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV #编译检查
[root@server1 keepalived-1.3.6]# make
[root@server1 keepalived-1.3.6]# make install
- 做4个软连接,方便后续操作
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 keepalived-1.3.6]# chmod +x /etc/init.d/keepalived #为启动脚本加上可执行权限
- 由于我们接下来修改的keepalived的配置文件,会给我们自动添上vip,所以我们先把之前做实验的vip删除
[root@server1 keepalived-1.3.6]# ip addr del 172.25.70.100/24 dev eth0
- 检查一下server1的iptables的策略,如果出现下图策略,则删除
- 更改keepalived的配置文件
[root@server1 keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
2721671190@qq.com #接收警报的 email 地址,可以添加多个
}
notification_email_from keepalived@server1.example.com #设置邮件的发送地址
smtp_server 127.0.0.1 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_DEVEL #load balancer 的标识 ID,用于 email 警报
}
vrrp_instance VI_1 {
state MASTER #该服务器的状态为master
interface eth0 #高可用监测的网络接口
virtual_router_id 51 #主、备机的 virtual_router_id 必须相同,取值 0-255
priority 100 #主机的优先级,备份机改为 50,主机优先级一定要大于备机
advert_int 1 #主备之间的通告间隔秒数
authentication { #主备切换时的验证
auth_type PASS #设置验证类型,主要有 PASS 和 AH 两种
auth_pass 1111 #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
172.25.70.100
}
}
virtual_server 172.25.70.100 80 { #定义虚拟服务器
delay_loop 6 #每隔 6 秒查询 realserver 状态
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 172.25.70.2 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 172.25.70.3 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
}
注意:persistence_timeout 表示会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在 50 秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受 50 秒的时间限制。
[root@server1 keepalived]# /etc/init.d/keepalived restart #重启服务
我们说keepalived可以自动添加vip,并具有安全检查的功能,即后端的服务器挂掉,可以检测出来,来测试一下
成功添加上vip
自动安全检查
[root@server2 ~]# /etc/init.d/httpd stop #down掉后端一台服务器
[root@server1 keepalived]# ipvsadm -Ln #在活跃的rs中没有server2的ip
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.100:80 rr
-> 172.25.70.3:80 Route 1 0 0
这样我们在测试机上就只能访问到server3的apache网页信息
[root@foundation70 keepalived]# curl 172.25.70.100
<h1>the page from server3</h1>
[root@foundation70 keepalived]# curl 172.25.70.100
<h1>the page from server3</h1>
而如果没有keepalived,后端一台服务器挂掉结果
[root@server1 keepalived]# /etc/init.d/keepalived stop
[root@server2 ~]# /etc/init.d/httpd stop
[root@foundation70 keepalived]# curl 172.25.70.100 #结果是都不能访问
curl: (7) Failed connect to 172.25.70.100:80; No route to host
You have new mail in /var/spool/mail/kiosk
3.高可用
我们假设这么一种情况,如果部署keepalived的服务器(即本实验的server1挂掉)那么很显然,我们后端的服务器将都不能访问,为了解决这种问题,下面实验我们要做主备模式的keepalived,实现高可用。
- 在server4上安装keepalived,直接拷贝server1上的keepalived
[root@server1 local]# scp -r keepalived/ server4:/usr/local/
- 为server4做四个软连接并加上启动脚本的执行权限
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# chmod +x /etc/init.d/keepalived
- 更改配置文件,只需要更改state和priorit
[root@server4 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
2721671190@qq.com #接收警报的 email 地址,可以添加多个
}
notification_email_from keepalived@server1.example.com #设置邮件的发送地址
smtp_server 127.0.0.1 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_DEVEL #load balancer 的标识 ID,用于 email 警报
}
vrrp_instance VI_1 {
state ABCKUP #该服务器的状态为master
interface eth0 #高可用监测的网络接口
virtual_router_id 51 #主、备机的 virtual_router_id 必须相同,取值 0-255
priority 50 #主机的优先级,备份机改为 50,主机优先级一定要大于备机
advert_int 1 #主备之间的通告间隔秒数
authentication { #主备切换时的验证
auth_type PASS #设置验证类型,主要有 PASS 和 AH 两种
auth_pass 1111 #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
172.25.70.100
}
}
virtual_server 172.25.70.100 80 { #定义虚拟服务器
delay_loop 6 #每隔 6 秒查询 realserver 状态
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 172.25.70.2 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 172.25.70.3 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
}
[root@server4 ~]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
- 为servre4上安装ipvsadm,同server1
[root@server4 ~]# yum install ipvsadm -y
- 测试
[root@server4 ~]# ipvsadm -Ln #策略因为配置文件自动添加
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.100:80 rr
-> 172.25.70.2:80 Route 1 0 0
-> 172.25.70.3:80 Route 1 0 0
[root@server1 local]# /etc/init.d/keepalived stop #挂掉server1的keepalived
[root@foundation70 keepalived]# curl 172.25.70.100 #成功访问server2&&server3,并且是轮叫模式
<h1>the page from server3</h1>
[root@foundation70 keepalived]# curl 172.25.70.100
<h1>the page from server2</h1>
[root@foundation70 keepalived]# arp -an | grep 100 #查看该vip处于的mac地址
? (172.25.70.100) at 52:54:00:5f:de:54 [ether] on br0
You have new mail in /var/spool/mail/kiosk
和server4的mac地址一致。证明server4的keepalived生效
打开master的keepalived服务
[root@server1 local]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
再次访问server2&&server3,并查看mac地址,发现mac地址改变
来验证一下是否为serevr1的mac地址
证明主备模式的作用,当master恢复的时候,由于权值比较大的关系,所以是通过master的作用将数据包传递给后端的rs。