LVS原理初探、配置以及keepalived配合LVS实现高可用
LVS的全称是Linux Virtual Server,它的主要作用是实现负载均衡。LVS有三种模式:
第一种是LVS NAT(Network Address Transform 网络地址转换)
这种模式和传统的集群一样,还是由前端服务器转发后端服务器的处理结果给客户端
第二种是LVS DR(Direct Routing 直接路由)
这种方式就是前端服务器和后端服务器位于同一个内部网络中,后端服务器直接把处理结果转发给客户端
第三种方式是LVS TUN(IP Tunnling IP隧道)
这种方式就是前端服务器和后端服务器不在同一个网络中,可以位于网络的任何位置,只要能互相连通即可,前端服务器将用户的请求通过IP隧道转发给后端服务器,可实现跨网络、跨地域的数据转发,后端服务器直接把处理结果转发给客户端。
在没有使用LVS的集群中,前端服务器接收客户端请求,并将其转发给后端web服务器,后端web服务器将处理结果返回给前端服务器,再由前端服务器转发给客户端浏览器。由于客户端请求的仅仅是url,而前端服务器给客户端返回的却是网站的大量静态和动态资源,这样就会导致前端服务器的上行带宽和下行带宽速率不匹配(上行较小 下行过大),也会带来IO吞吐量的问题。而LVS就可以解决这个问题,使用了LVS的集群,后端服务器的处理结果不再转发给前端服务器,而是直接转发给客户端,但是由于前端服务器和后端服务器的ip地址不同,客户端只会接收目标ip地址返回的http响应(也就是说客户端是向前端服务器发起请求的,那么它只会接收前端服务器的响应,它不会去接收没有与之建立连接的后端服务器发送过来的响应数据),解决这个问题就要通过ip地址欺骗。具体做法是前端服务器设置虚拟ip,后端服务器也设置虚拟ip,但是后端服务器的虚拟ip是隐藏的,它不对转发给该虚拟ip的请求做出响应,也不会广播它的虚拟ip,仅仅在给客户端转发处理结果时,冒充前端服务器的ip地址,以达到欺骗客户端的目的。(虚拟ip地址与其他ip地址的区别在于 它不会与本地mac地址进行匹配)nginx可以对后端服务器进行健康检查,而LVS则不会对Real Server进行健康检查,因此需要配合keepalived判断Real Server是否宕机。但是keepalived不会对nginx进行健康检查,可能会存在这样的情况,某台服务器中nginx已经挂了,但是keepalived还能正常服务,这样客户端的请求还是有可能交给这台nginx挂掉的服务器,从而产生异常,因此需要另外写脚本进行检查,如果某台服务器中nginx已经挂了,就关闭它的keepalived。可以用两台服务器配合keepalived做主备LVS,它不需要开发者写脚本对LVS进行健康检查,它会自动进行检查,如果某一台LVS宕机,会通过邮件发出通知。keepalived最开始就是用来给LVS做高可用和健康检查的,后来发展了,也可以为普通服务器做高可用,但是需要舍弃健康检查,此时就需要自己写脚本检查,并且删除keepalived.conf中的virtual_server模块,在vrrp_instance VI_1中调用检查脚本
配置如下:
以master(192.168.222.3)作为Linux Director
slave1(192.168.222.101)和slave2(192.168.222.102)分别作为Real Server1 和Real Server2
其中master的虚拟ip对外通信 而slave1和salve2的虚拟ip不对外通信
第一步:给master配置虚拟ip(192,.168.222.100) ifconfig ens33:1 192.168.222.100/24
通过命令的方式配置虚拟ip 重启网卡或者重启系统后就会失效
在window下ping 192.168.222.100 查看是否配置成功
查看mac地址是否对应(windows cmd下使用arp命令)
第二步:给slave1和slave2配置隐藏虚拟ip再绑定虚拟ip(注意此处一定要先配置再绑定,因为如果先绑定虚拟ip,那么在绑定后的一瞬间,它就会给路由器交换机广播自己绑定的ip和对应的mac地址,这样就无法达到隐藏虚拟ip的效果)
修改内核参数中收到ARP请求的响应级别和将自己地址向外通告时的通告级别
arp_ignore(默认为0 需要修改为1): 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标(MAC)地址配置请求到达的接口上的时候,才给予响应;
echo "1" > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
arp_announce(默认为0 需要修改为2):定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上(MAC)地址匹配的网络进行通告;
echo "2" > /proc/sys/net/ipv4/conf/ens33/arp_announce
给slave1和slave2分别绑定虚拟ip 192.168.222.100(Real Server的虚拟ip不需要对外通信 因此虚拟ip绑定的网卡是lo)
ifconfig lo:1 192.168.222.100 netmask 255.255.255.255 broadcast 192.168.222.100(此处故意设置错误的子网掩码 确保它不会对外通信 Real Server的虚拟ip要与Linux Director相同)(使用命令的方式绑定的虚拟ip在重启网卡后就会失效)
给slave1和slave2分别添加路由
route add -host 192.168.222.100 dev lo:1
第三步:在master上安装ipvsadm(yum install ipvsadm)
第四步:每台机器上在hosts文件中加入ip和主机名的映射 互相ping看是否能通
通过浏览器访问
第五步:在master上通过ipvsadm搭建LVS集群服务
ipvsadm -A -t 192.168.222.100:80 -s wlc(-A表示添加服务 -t表示tcp协议 这个地址是虚拟ip 端口一定要写上 -s表示调度算法是wlc)
在集群中添加Real Server
ipvsadm -a -t 192.168.222.100:80 -r 192.168.222.101 -g -w 1
ipvsadm -a -t 192.168.222.100:80 -r 192.168.222.102 -g -w 1
(-a表示添加Real Server -t表示tcp协议 这个地址是虚拟ip 端口一定要写上 -r是Real Server的ip地址 -g表示使用的模式是DR -w表示权重是1)
查看集群信息:ipvsadm -Ln(-L表示以列表形式展示 -n表示以数字形式显示主机地址和端口)
第六步:重启三台机器的nginx 通过浏览器访问虚拟ip
不断刷新 可以看到轮转访问两个Real Server的首页。说明客户端的响应消息是由两个Real Server发送的,而不是由 Linux Director发送的。这样就实现了ip地址欺骗,达到了负载均衡的效果。
为了做主备LVS,需要进一步配置。从master克隆一台新的虚拟机,修改hostname为slave3,修改ip地址为192.168.222.103
在master和slave3上都配置好keepalived(master和slave3作为主备LVS slave1和slave2作为Real Server)
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
配置如下:
! Configuration File for keepalived
#全局配置
global_defs {
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
[email protected]
}
notification_email_from [email protected] #指定发件人
smtp_server 127.0.0.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的一个标识
}
vrrp_instance VI_1 {
state MASTER #标示状态为MASTER 备份机为BACKUP
interface ens33 #设置实例绑定的网卡
virtual_router_id 51 #同一实例下virtual_router_id必须相同
priority 110 #MASTER权重要高于BACKUP 比如BACKUP为99
advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置认证
auth_type PASS #主从服务器验证方式
auth_pass 8888
}
virtual_ipaddress { #设置vip
192.168.222.100/24 dev ens33 label ens33:1 #可以配置多个虚拟IP,换行即可
}
}
virtual_server{
delay_loop 6
lb_algo wlc #设置调度算法为wlc
lb_kind DR #设置模式为直接路由
nat_mask 255.255.255.0
persistence_timeout 50 #设置会话保持时间为50秒 在访问的50秒内会转发给同一个Real Server
protocol TCP
real_server 192.168.222.101 80{ # 配置Real Server的ip和端口
weight 1 # 权重为1
#配置健康检查
HTTP_GET{ #此处通过发出http请求检查Real Server的健康状态
url {
path / #表示检查Real Server的根目录
status_code 200 #通过状态码判断检查结果 返回200则表示Real Server运行正常
}
connect_timeout 3 #表示检查时连接的超时时间为3秒
nb_get_retry 3 #表示检查重试的次数为3
delay_before_retry 3 #表示每次检查前停止3秒
}
}
real_server 192.168.222.102 80{ # 配置Real Server的ip和端口
weight 1 # 权重为1
#配置健康检查
HTTP_GET{ #此处通过发出http请求检查Real Server的健康状态url {
path / #表示检查Real Server的根目录
status_code 200 #通过状态码判断检查结果 返回200则表示Real Server运行正常
}
connect_timeout 3 #表示检查时连接的超时时间为3秒
nb_get_retry 3 #表示检查重试的次数为3
delay_before_retry 3 #表示每次检查前停止3秒
}
}
}
在hosts文件中好加入slave3与其ip的映射关系
将这个配置文件拷贝到slave3的/etc目录下
scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived
修改slave3的keepalivedconf文件 标识状态为BACKUP表示备份机 优先级改为50 其他地方不变
如果master的虚拟ip还存在 则需要将其删除掉(ifconfig ens33:1 down)
关闭master和slave3的防火墙
如果master和slave3之前配置的ipvsadm还存在 需要将其删除
正常情况下 从master克隆出slave3的过程 需要将master关机 而重启之后 master和slave3的虚拟ip和添加的ipvsadm服务都会自动失效
在master和slave3上都启动keepalived(systemctl start keepalived)
启动之后会发现keepalived会自动给master绑定虚拟ip 但是暂时不会给slave3绑定虚拟ip(只有当master宕机之后 虚拟ip才会被keepalived自动分配给slave3)
正常情况下 启动keepalived之后会lvs会自动添加虚拟ip和Real Server 可以通过ipvsadm -Ln查看(如果没有 则需要手动添加)
通过浏览器访问虚拟ip 可以看到slave1的首页面 说明配置成功
下面证明master宕机之后 slave3会自动接替
将master关机 再查看slave3的网卡 发现已经自动配置虚拟ip
再次通过浏览器访问虚拟ip 发现页面显示正常 说明slave3替代了master将客户端请求成功转发给了Real Server(slave1)
再此启动master之后 发现master上又重新配置了虚拟ip 而slave3上则没有 因为master是主LVS slave3是备份LVS 主LVS在宕机又修复重启后会再次抢占虚拟ip
关闭slave1 再通过浏览器访问虚拟ip
说明LVS会自动对Real Server进行健康检查 在其中一台Real Server宕机后 客户端发来的请求会被LVS转发给其他的Real Server 而不会再把请求转发给这台宕机的服务器 可以通过ipvs -Ln命令可以看到slave1对应的Real Server已经被自动删除
安装邮件客户端yum install -y mail
使用mail命令 再输入邮件标识如1 即可看到邮件的详细信息(显示Realserver [192.168.222.101]:80 - DOWN 即slave1宕机了)
再次启动slave1之后查看邮件显示Realserver [192.168.222.101]:80 - UP 即slave1 表示slave1又恢复正常了 并且通过ipvs -Ln命令可以看到slave1对应的Real Server已经被自动添加