原理
当客户端向服务器请求服务时,前端负载均衡服务器接受请求,此时先是根据lvs的调度算法来决定将请求发送给哪个服务器节点,然后根据自己的工作模式(3种)来决定如何将请求发送给节点服务器,节点服务器又如何将处理结果发送给客户端。
由于lvs/DR模式使用最广,故此处只介绍lvs的DR模式:
客户端向服务器请求服务,此时源IP为CIP,目的IP为VIP,请求到达负载端时,根据lvs的调度算法(10种)决定将请求发送给哪个RS,再根据lvs的DR工作模式(DR模式下,不修改IP地址,不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址)将数据帧发送给RS,RS响应完毕之后直接将响应发送给客户端,不需要经过LB。
keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
其中的专业术语
LB: 负载均衡器
DS:Director Server。 指的是前端负载均衡器。
RS:Real Server。 后端真实的工作服务器。
VIP: 向外部直接面向用户请求,作为用户请求的目标的IP地址。
DIP:Director Server IP, 主要用于和内部主机通讯的IP地址。
RIP:Real Server IP, 后端服务器的IP地址。
CIP:Client IP, 客户端的IP地址。
实现步骤:
- 1、四台虚拟机,两台做前端负载(一台主,一台备),两台做后台真实服务器,IP地址分配如下:
- DR1:192.168.64.21
- DR2:192.168.64.22
- RS1:192.168.64.61
- RS2:192.168.64.62
- VIP:192.168.64.23
- 2、虚拟机启动后看是否安装有ipvsadm,keepalived,httpd,否则自行利用yum安装。(ipvsadm是用作规则配置与查看的,keepalived用作检查服务器是否健康,http用作测试)。注意要关闭selinux和防火墙,否则可能出现问题。
- 3、在DR1上配置/etc/keepalived/keepalived.conf(配置了此文件,不再需要配置ipvsadm)
global_defs {
router_id LVS_Server 指定标识该机器的route_id
}
vrrp_instance VI_1 {
state MASTER #指定该keepalived节点的初始状态
interface eth0 # 实例绑定的VIP接口,用于发送VRRP包
virtual_router_id 51 # 指定VRRP实例ID
priority 100 #指定优先级,优先级高的将成为MASTER
# nopreempt #设置为不抢占。默认是抢占的
advert_int 1
authentication {
auth_type PASS #指定认证方式
auth_pass password #指定认证所使用的密码。
}
virtual_ipaddress {
192.168.64.23 #指定VIP地址
}
}
virtual_server 192.168.64.23 80 {
delay_loop 3
lvs_sched rr #LVS的调度算法
lvs_method #LVS 模式
nat_mask 255.255.255.0
persistence_timeout 50 #在50秒内会被连接到同一台真实服务器
protocol TCP #4层协议
real_server 192.168.64.61 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3 #get尝试次数
delay_before_retry 10 #在尝试之前延迟多长时间
}
}
real_server 192.168.64.23 80 { #注:在真实服务器设置的端口必须与虚拟机设置的端口一致
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 10
}
}
}
- 直接将DR1的keepalived的配置文件拷贝至DR2的/etc/keepalived/keepalived.conf,并做以下修改:
vrrp_instaance的state由MASTER改为BACKUP
priority 的值由100 改为90 - 在DR1和DR2上 sysctl –w net.ipv4.ip_forward=1 (cat /proc/sys/net/ipv4/ip_forward 查看确认为1则不需要),RS则不需要
- 手动在rs端绑定虚拟IP(也可以使用脚本)
ip addr add 192.168.64.23 dev lo label lo:0
手动在rs端抑制arp响应
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announec=2
EOF
sysctl -p
- 分别在几台虚拟机设置hosts文件,并保持一致。
- 4、开启服务:
- 在两台DR上分别开启keepalived,network和httpd服务,(http也可不开),在两台RS上开启httpd,network服务,在客户端开启httpd服务用作测试。
- 在RS1上执行
echo "192.168.64.61" >> /var/www/html/index.html
- 在RS2上执行
echo "192.168.64.62" >> /var/www/html/index.html
5、测试
在客户端浏览器上输入http://192.168.64.23,不断进行刷新,可以看到交替显示192.168.64.61和192.168.64.62(可能会长时间登录一台服务器,这与keepalived.conf里面persistence_timeout 50 的设置有关,还可能是浏览器缓存的问题。)在DR1上查看“ipvsadm -L -n” ,如果各个服务器都正常则可以看到两个连接成功的服务器,使用”ip a”可以看到虚拟IP192.168.64.23在DR1上,在DR2上查看则不显示虚拟IP,此时,模拟DR1断网,则只能在DR2上看到虚拟IP了,若恢复DR1的网络,则只能在DR1上看到虚拟IP,这样就利用keepalived实现了高可用。
- 6、出现的问题及解决方案:
如果所有设置没问题却只能在DR1或DR2上看到一个连接的服务器,则注意查看keepalived.conf的TCP_CHECK {},此处应有空格。
每次对DR上的规则做修改之后一定要重新启动keepalived的服务,可以使用“ipvsadm -C”清除规则