LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS的全称是Linux Virtual Server,它的主要作用是实现负载均衡。LVS有三种模式:

第一种是LVS NAT(Network Address Transform 网络地址转换)

LVS原理初探、配置以及keepalived配合LVS实现高可用

这种模式和传统的集群一样,还是由前端服务器转发后端服务器的处理结果给客户端

第二种是LVS DR(Direct Routing 直接路由)

LVS原理初探、配置以及keepalived配合LVS实现高可用

这种方式就是前端服务器和后端服务器位于同一个内部网络中,后端服务器直接把处理结果转发给客户端

第三种方式是LVS TUN(IP Tunnling IP隧道)

LVS原理初探、配置以及keepalived配合LVS实现高可用

这种方式就是前端服务器和后端服务器不在同一个网络中,可以位于网络的任何位置,只要能互相连通即可,前端服务器将用户的请求通过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 重启网卡或者重启系统后就会失效

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

在window下ping 192.168.222.100 查看是否配置成功

LVS原理初探、配置以及keepalived配合LVS实现高可用

查看mac地址是否对应(windows cmd下使用arp命令)

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

第二步:给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

LVS原理初探、配置以及keepalived配合LVS实现高可用

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

arp_announce(默认为0 需要修改为2):定义将自己地址向外通告时的通告级别;

0:将本地任何接口上的任何地址向外通告;

1:试图仅向目标网络通告与其网络匹配的地址;

2:仅向与本地接口上(MAC)地址匹配的网络进行通告;

echo "2" > /proc/sys/net/ipv4/conf/ens33/arp_announce

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

给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在重启网卡后就会失效)

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

给slave1和slave2分别添加路由

route add -host 192.168.222.100 dev lo:1

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

第三步:在master上安装ipvsadm(yum install ipvsadm)

第四步:每台机器上在hosts文件中加入ip和主机名的映射 互相ping看是否能通

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

通过浏览器访问

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

第五步:在master上通过ipvsadm搭建LVS集群服务

ipvsadm -A -t 192.168.222.100:80 -s wlc(-A表示添加服务 -t表示tcp协议 这个地址是虚拟ip 端口一定要写上 -s表示调度算法是wlc)

LVS原理初探、配置以及keepalived配合LVS实现高可用

在集群中添加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)

LVS原理初探、配置以及keepalived配合LVS实现高可用

查看集群信息:ipvsadm -Ln(-L表示以列表形式展示 -n表示以数字形式显示主机地址和端口)

LVS原理初探、配置以及keepalived配合LVS实现高可用

第六步:重启三台机器的nginx 通过浏览器访问虚拟ip

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

不断刷新 可以看到轮转访问两个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的映射关系

LVS原理初探、配置以及keepalived配合LVS实现高可用

将这个配置文件拷贝到slave3的/etc目录下

scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived

修改slave3的keepalivedconf文件 标识状态为BACKUP表示备份机 优先级改为50 其他地方不变

LVS原理初探、配置以及keepalived配合LVS实现高可用

如果master的虚拟ip还存在 则需要将其删除掉(ifconfig ens33:1 down)

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

关闭master和slave3的防火墙

如果master和slave3之前配置的ipvsadm还存在 需要将其删除

LVS原理初探、配置以及keepalived配合LVS实现高可用

正常情况下 从master克隆出slave3的过程 需要将master关机 而重启之后 master和slave3的虚拟ip和添加的ipvsadm服务都会自动失效

在master和slave3上都启动keepalived(systemctl start keepalived)

启动之后会发现keepalived会自动给master绑定虚拟ip 但是暂时不会给slave3绑定虚拟ip(只有当master宕机之后 虚拟ip才会被keepalived自动分配给slave3)

LVS原理初探、配置以及keepalived配合LVS实现高可用

正常情况下 启动keepalived之后会lvs会自动添加虚拟ip和Real Server 可以通过ipvsadm -Ln查看(如果没有 则需要手动添加)

LVS原理初探、配置以及keepalived配合LVS实现高可用

通过浏览器访问虚拟ip 可以看到slave1的首页面 说明配置成功

LVS原理初探、配置以及keepalived配合LVS实现高可用

下面证明master宕机之后 slave3会自动接替

将master关机 再查看slave3的网卡 发现已经自动配置虚拟ip

LVS原理初探、配置以及keepalived配合LVS实现高可用

再次通过浏览器访问虚拟ip 发现页面显示正常 说明slave3替代了master将客户端请求成功转发给了Real Server(slave1)

LVS原理初探、配置以及keepalived配合LVS实现高可用

再此启动master之后 发现master上又重新配置了虚拟ip 而slave3上则没有 因为master是主LVS slave3是备份LVS 主LVS在宕机又修复重启后会再次抢占虚拟ip

LVS原理初探、配置以及keepalived配合LVS实现高可用

LVS原理初探、配置以及keepalived配合LVS实现高可用

关闭slave1 再通过浏览器访问虚拟ip

LVS原理初探、配置以及keepalived配合LVS实现高可用

说明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已经被自动添加