LVS+KeepAlived+Nginx高可用实现方案

LVS

KeepAlived

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。

高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)

Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

  • Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

  • Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

  • Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。

  • 下面开始 搭建 LVS+KeepAlived+Nginx 
  • 试验环境:
  • keepalived 服务器 2台 (master + backup)
  • nginx WEB 服务器 2台
  • VIP 192.168.1.168
  • keepalived master    192.168.1.2  CentOS 7.5   
  • keepalived backup   192.168.1.3   CentOS 7.5
  • nginx 1                     192.168.1.10  CentOS 6.5
  • nginx 2                     192.168.1.11  CentOS 7.5

  • 首先在 192.168.1.2  端安装、配置 keepalived  Master

  • 前提要配置好 LVS 详细设置请参阅拙作: LVS 负载均衡 https://blog.csdn.net/gaofei0428/article/details/104438533

  • sudo yum -y install keepalived ipvsadm libnl libnl-devel openssl-devel libnfnetlink-devel net-tools
  • 备份 keepalived 主配置文件
  • mv /etc/keepalived/keepalived.conf /bak/keepalived.conf.bak
    vim /etc/keepalived/keepalived.conf
  • 编辑 /etc/keepalived/keepalived.conf 添加以下内容
  • global_defs {                 #全局配置
    #   notification_email {  #指定keepalived在发生切换时是否发送email警告
    #   }
    #   smtp_connect_timeout 30
            router_id LVS_DEVEL   #此处注意router_id为负载均衡标识,在局域网内应该是唯一的
    }
    vrrp_instance VI_1 {    #虚拟路由的标识符
            state MASTER    #指定状态,有MASTER和BACKUP两种要大写,MASTER为工作状态,BACKUP是备用状态
            interface eth0       #指定 VIP 虚拟IP 对应的 INTERFACE 接口

               lvs_sync_daemon_inteface eth0 #心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡,用来防止脑裂

        virtual_router_id 51    #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
        priority 100          #此节点的优先级,主节点的优先级需要比其他节点高  
        advert_int 1         #通告的间隔时间
        authentication {    #认证配置    
                auth_type PASS  #认证方式
                auth_pass 1111    #认证密码
        }
        virtual_ipaddress {   #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,必须与 lvs 客户端设定的 vip 一致
                192.168.1.168
        }
}
virtual_server 192.168.1.168 80 { #集群所使用的VIP和端口
        delay_loop 6         #健康检查间隔,单位为秒  
        lb_algo wrr            #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
        lb_kind DR            #负载均衡转发规则。一般包括DR,NAT,TUN 3种
        nat_mask 255.255.255.255   #VIP掩码
        persistence_timeout 50      #会话保持时间
        protocol TCP             #转发协议             
        real_server 192.168.1.10 80 { #真实服务器,包括IP和端口号
                weight 1   #默认为1,0为失效

               inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除

                TCP_CHECK {      #通过tcpcheck判断RealServer的健康状态              
                        connect_timeout 10    #连接超时时间
                        nb_get_retry 3    #重连次数
                        delay_before_retry 3   #重连间隔时间
                        connect_port 80   #健康检查端口的端口
                }
        }
        real_server 192.168.1.11 80 {
                weight 1

                inhibit_on_failure
                TCP_CHECK {
                        connect_timeout 10
                        nb_get_retry 3
                        delay_before_retry 3
                        connect_port 80
                }
        }
}

  • 确认无误保存退出,暂时不启动 keepalived

  • 接下来在 192.168.1.3 上安装、配置 keeepalived (前提要配置好 LVS)
  • sudo yum -y install keepalived ipvsadm libnl libnl-devel openssl-devel libnfnetlink-devel net-tools
  • 备份 keepalived 主配置文件
  • mv /etc/keepalived/keepalived.conf /bak/keepalived.conf.bak
    vim /etc/keepalived/keepalived.conf
  • 编辑 /etc/keepalived/keepalived.conf 添加以下内容
  • global_defs {                       
    #   notification_email {             
    #   }
    #   smtp_connect_timeout 30
            router_id LVS_DEVEL             
    }
    vrrp_instance VI_1 {            
            state BACKUP    #BACKUP是备用状态
            interface eth0
            lvs_sync_daemon_inteface eth0
            virtual_router_id 51        
            priority 99
            nopreempt    #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
            advert_int 1           
            authentication {        
                    auth_type PASS
                    auth_pass 1111
            }
            virtual_ipaddress {         
                    192.168.1.168
            }
    }
    virtual_server 192.168.1.168 80 {
            delay_loop 6           
            lb_algo wrr            
            lb_kind DR
            nat_mask 255.255.255.255   
            persistence_timeout 50    
            protocol TCP                          
            real_server 192.168.1.10 80 {
                    weight 1
            inhibit_on_failure
                    TCP_CHECK {                     
                            connect_timeout 10   
                            nb_get_retry 3
                            delay_before_retry 3
                            connect_port 80
                    }
            }
            real_server 192.168.1.11 80 {
                    weight 1
                   inhibit_on_failure
            TCP_CHECK {
                            connect_timeout 10
                            nb_get_retry 3
                            delay_before_retry 3
                            connect_port 80
                    }
            }
    }
  • 确认无误保存退出,分别在 Master 和 Backup 端启动 keepalived 和 lvs

  • 这里为了测试将 persistence_timeout 50 链接时间改为 0
  • 在另外一台虚拟机上测试

  • 模拟故障将 Master 停掉
  • 192.168.1.2 端 systemctl stop keepalived


  • 配置 keepalived + LVS + Nginx 实现互为主从 

  • 实验环境:
  • 192.168.2.6     CentOS 7.6   KeepAlived + LVS   VIP : 192.168.2.168
  • 192.168.2.10   CentOS 7.6   KeepAlived + LVS   VIP : 192.168.2.169
  • 192.168.2.4    CentOS 7.6   Nginx + PHP  VIP : 192.168.2.168  +  192.168.2.169
  • 192.168.2.7    CentOS 7.6   Nginx + PHP  VIP : 192.168.2.168  +  192.168.2.169
  • 部署思路:
  • 两台 KeepAlive 主机各绑定一个 VIP,同时两台主机都为主服务向外提供一组资源,同时也是互为备用服务。
  • 当 192.168.2.6 主服务出现宕机的情况,会把业务迁移到 192.168.2.10 主机上,此时 192.168.2.10 就会绑定两个 VIP,为两组服务提供资源
    当 192.168.2.10 主服务出现宕机的情况,会把业务迁移到 192.168.2.6 主机上,此时 192.168.2.6 就会绑定两个 VIP,为两组服务提供资源
  • 分别在2 台主机上安装 KeepAlive
  • yum -y install keepalived ipvsadm libnl libnl-devel openssl-devel libnfnetlink-devel net-tools
  • systemctl enable keepalived.service ipvsadm.service
  • 备份 keepalived 主配置文件
  • cp /etc/keepalived/keepalived.conf{,.bak}
  • 编辑 192.168.2.6 上的  /etc/keepalived/keepalived.conf  内容如下:
  • vim /etc/keepalived/keepalived.conf                                                                                                    
    ! Configuration File for keepalived

    global_defs {
       #notification_email {
        # acassen@firewall.loc
        # failover@firewall.loc
        # sysadmin@firewall.loc
       #}
       #notification_email_from Alexandre.Cassen@firewall.loc
       #smtp_server 192.168.200.1
       #smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr        #默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
       #vrrp_strict                                       #禁止 vrrp 协议强制检查
       vrrp_garp_interval 0.001        #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0.
       vrrp_gna_interval 0
    }

    vrrp_instance DR_1 {           #定义第一组虚拟 VIP 
        state MASTER                 #一定要大写
        interface ens33                #注意网卡的名称
        virtual_router_id 51          #设置组ID,同一组 vrrp_instance 必须一致
        lvs_sync_daemon_inteface ens33
        priority 100                      #设置优先级,MASTER 要比 BACKUP 的值大,互为主从时注意另一台的优先级,比如:192.168.2.10 的优先级就要比这个值小,90
        advert_int 1                      #检测时间
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {              #第一组 VIP 的地址
            192.168.2.168
        }
    }

    vrrp_instance DR_2 {    #定义第二组虚拟 VIP
        state BACKUP          #一定要大写,互为主从时,注意名称和优先级
        interface ens33
        virtual_router_id 53   #注意组 id
        lvs_sync_daemon_inteface ens33
        priority 100    #设置优先级,MASTER 要比 BACKUP 的值大,互为主从时注意另一台的优先级,比如:192.168.2.10 的优先级就要比这个值大,为110
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {    #第二组 VIP 的地址
            192.168.2.169
        }
    }

    #后端真实服务器 rs 设置
    virtual_server 192.168.2.168 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        #persistence_timeout 50
        protocol TCP

        real_server 192.168.2.4 80 {
            weight 1
        inhibit_on_failure
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            connect_port 80    
            }
        }    
        real_server 192.168.2.7 80 {
            weight 1
        inhibit_on_failure
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }

    virtual_server 192.168.2.169 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        #persistence_timeout 50
        protocol TCP

        real_server 192.168.2.4 80 {
            weight 1
        inhibit_on_failure
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }   
        real_server 192.168.2.7 80 {
            weight 1
        inhibit_on_failure
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }

  • 修改完暂时不启动 keepalive

  • 将 keepalive 配置文件 scp 到 192.168.2.10

  • 然后修改如下

  • /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived

    global_defs {
       #notification_email {
        # acassen@firewall.loc
        # failover@firewall.loc
        # sysadmin@firewall.loc
       #}
       #notification_email_from Alexandre.Cassen@firewall.loc
       #smtp_server 192.168.200.1
       #smtp_connect_timeout 30
       router_id LVS_DEVEL
       #vrrp_skip_check_adv_addr
       #vrrp_strict
       #vrrp_garp_interval 0.001
       #vrrp_gna_interval 0
    }

    vrrp_instance DR_1 {
        state BACKUP      #第一组 作为 备用

        interface ens33
        virtual_router_id 51
        lvs_sync_daemon_inteface ens33
        priority 90        #优先级比 MASTER 192.168.2.6 的小
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.2.168
        }
    }

    vrrp_instance DR_2 {
        state MASTER       #第二组 要作为 MASTER

        interface ens33
        virtual_router_id 53
        lvs_sync_daemon_inteface ens33
        priority 110             #优先级要比 192.168.2.6 的大
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.2.169
        }
    }

    #其他设置不用动
    virtual_server 192.168.2.168 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        #persistence_timeout 50
        protocol TCP

        real_server 192.168.2.4 80 {
            weight 1
        inhibit_on_failure
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            connect_port 80    
            }
        }    
        real_server 192.168.2.7 80 {
            weight 1
        inhibit_on_failure
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }

    virtual_server 192.168.2.169 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        #persistence_timeout 50
        protocol TCP

        real_server 192.168.2.4 80 {
            weight 1
        inhibit_on_failure
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }   
        real_server 192.168.2.7 80 {
            weight 1
        inhibit_on_failure
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }

  • 修改完在 RS 上添加 虚拟 VIP 

  • 依次重启 192.168.2.6 和 192.168.2.10 的  keepalive 服务
  • systemctl restart keepalived.service

  • 测试
  • 打开另外一台机器分别访问 192.168.2.168 和 2.169

  • 多访问几次观察 Conns 记录

  • 模拟故障
  • 首先停止 192.168.2.6 的 keepalive

  • 观察 192.168.2.10

  • 成功漂移
  • 下面停止 192.168.2.10  后 打开 192.168.2..6

  • 9
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值