zoukankan      html  css  js  c++  java
  • 高可用服务之Keepalived高可用LVS集群

      前文我们聊了下keepalived的邮件通知相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13645163.html;今天我们来说说keepalived高可用LVS集群;

      我们知道一个服务通常是以一个套接字形式对外提供服务,所谓套接字就是ip+端口;前面的博客中我们主要聊到了keepalived对ip地址的高可用,但通常对ip地址高可用没有多大实质的作用,重要的是我们高可用的ip地址后端对应的服务才是根本,这一篇博客主要讲怎么利用keepalived高可用LVS集群,生成ipvs规则,以及对LVS集群的rs做健康状态检测;

      环境说明

    名称 ip地址 端口
    keepalived-node01(master) 192.168.0.41
    keepalived-node02(backup) 192.168.0.42
    LVS-RS1 192.168.0.43 80
    LVS-RS2 192.168.0.44 80
    VIP 192.168.0.111 80

      准备LVS集群RS1和RS2

      1、安装webserver

     yum install nginx -y
    

      提示:rs1和rs2上都要安装nginx服务,用于后端rs提供的服务;

      2、提供测试页

      3、启动rs1和rs2上的nginx服务

      4、编写修改内核参数,并配置vip给RS1和RS2的脚本

    #/bin/bash
    #
    vip='192.168.0.111'
    mask='255.255.255.255'
    interface='lo:0'
     
    case $1 in
    start)
            echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
            echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
            echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
            echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
            ifconfig $interface  $vip netmask $mask broadcast $vip up
            route add -host $vip dev $interface
            ;;
    stop)
            ifconfig $interface down
            echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
            echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
            echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
            echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
            ;;
    *)
            echo "Usage:bash $0 start|stop"
            exit 1
            ;;
    esac
    View Code

      提示:以上脚本主要实现了两个参数,给定start参数就把对应的内核参数修改以后,并把vip配置到指定的接口;给stop参数就把vip从指定的端口上删除,并还原内核参数的设定;

      在rs1和rs2上执行设置内核参数的脚本

      提示:到此后端两个RS的环境就准备好了;

      配置keepalived,生成lvs规则

      完整的配置

    [root@node01 ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
            root@localhost
       }
       notification_email_from node01_keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node01
       vrrp_skip_check_adv_addr
       vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
       vrrp_mcast_group4 224.0.12.132
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345678
        }
        virtual_ipaddress {
            192.168.0.111/24 brd 192.168.0.255 dev ens33 label ens33:1
        }
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault  "/etc/keepalived/notify.sh fault"
    }
    
    virtual_server 192.168.0.111 80 {
            delay_loop 3
            lb_algo wrr
            lb_kind DR
            protocol TCP
            sorry_server 127.0.0.1 80
    
            real_server 192.168.0.43 80 {
                    weight 1
                    nb_get_retry 2
                    delay_before_retry 2
                    connect_timeout 30
                    HTTP_GET {
                        url {
                        path /index.html
                        status_code 200
                        }
                    }
            }
            real_server 192.168.0.44 80 {
                    weight 1
                    nb_get_retry 2
                    delay_before_retry 2
                    connect_timeout 30
                    HTTP_GET {
                        url {
                        path /index.html
                        status_code 200
                        }
                    }
            }
    }
    
    [root@node01 ~]# 
    View Code

      提示:virtual_server用于定义LVS对外集群ip地址和端口(vip),用大括号括起来,其中delay_loop用于指定对后端rs做健康状态检查的时间间隔;lb_algo/lvs_sched用于指定lvs的调度算法,常用的算法有rr,wrr,lc,wlc,lblc,sh,dh;lb_kind/lvs_method用于指定lvs集群的类型,常用的类型有DR,NAT,TUN,需注意这里的类型的值必须大写,否则服务有异常;有关LVS集群类型的相关说明请参考https://www.cnblogs.com/qiuhom-1874/p/12327506.html;protocol用于指定4层协议,常用的4层协议有TCP ,UDP,SCTP,需注意这里的值必须大写;sorry_server用于指定,当后端RS都宕机情况下,临时对用户说sorry的服务器地址和端口;real_server:用来定义后端RS的相关配置,其中weight用于指定当前rs的权重,nb_get_retry用指定对rs检测的重试次数,如果在指定的次数上都监测失败就标记该RS为下线状态,并从当前集群中下线;delay_before_retry用于指定重试之前延迟的时间;connect_timeout用于指定对rs检测的超时时长;HTTP_GET 用于配置对rs的检查方法,HTTP_GET表示应用层http检测,其中path用于指定检测到uri,status_code用于指定对指定URI检测到状态码,通常为200;以上virtual_server的配置在node02上也是相同的配置;

      安装sorryserver,并配置测试页面

      启动keepalived

      提示:到此基于keepalived高可用LVS集群就配置完成了;

      验证:用浏览器对VIP访问,看看是否能够访问到后端RS提供的页面?

      提示:我们用浏览器访问VIP并没有访问到后端的rs提供的页面;其中的原因是我们在配置keepalived时,开启了严格遵守vrrp协议,所以启动keepalived它默认会自动生成iptables规则,禁止任何地址访问VIP;

      提示:解决办法用iptables -F清空iptables规则;这种清空iptables规则的方式只是临时的方式,重启以后,或者vip飘逸后,对应的规则又会生成,永久解决办法是在keepalived的配置文件,禁用它自动生成iptabels规则;

      提示:在/etc/keepalived/keepalived.conf的global_defs中加上vrrp_iptables这个配置,这个配置表示禁用自动生成iptables规则;当然我们也可配置不严格遵守vrrp协议,把vrrp_strict去掉也行;选择其中一种方式即可;

      验证:重启keepalived,看看对应iptables规则是否还会生成?

      提示:可以看到现在vip所在节点的iptables规则就没有在自动生成了,对于node02也是相同的配置,重启keepalived即可解决自动生成iptables规则的问题;

      现在在用浏览器访问vip,看看是否能够访问到后端RS提供的页面?

      提示:可以看到我们在浏览器上访问VIP是可以正常访问到后端rs提供的页面;

      验证:把node01上的keepalived停掉,看看node02是否会自动将vip配置上对应的接口?用浏览器是否还会访问到rs提供的页面呢?

      提示:可以看到当node01的keepalived宕机以后,对应vip会自动飘逸到node02上去,并且在客户端访问VIP几乎不受影响;

      验证:在node01上查看ipvs规则,看看是否都生成了ipvs规则呢?

      提示:可以看到node01上并没有生成ipvs规则,原因是keepalived停掉了,对应的ipvs规则也就删除了;node02上的keepalived是活跃状态,所以对应ipvs规则也是有keepalived自动生成;

      验证:把rs1的web服务停掉,看看keepalived是否会检测到rs1不再线,从而把rs1自动从集群踢出去呢?

      提示:可以看到当rs1故障以后,keepalived会检测到rs1故障,然后把rs1从集群中提出去,所以我们在ipvs规则表中就没有rs1;

      验证:把rs2停掉,看看对应的sorryserver是否会被激活?

      提示:可以看到把rs2停掉以后,对应ipvs规则表中就没有RS2,并且它会把我们之前配置的sorryserver 的地址和端口配置上;

      验证:用浏览器访问VIP看看对应相应的内容是否是vip所在节点的sorryserver提供的页面呢?

      提示:可以看到当rs都宕机以后,再次访问VIP就会响应我们之前在配置文件中提供的sorryserver的页面;

      验证:启动rs1或rs2看看对应sorryserver是否会下线呢?

      提示:可以看到当rs2恢复以后,对应的sorryserver就从集群下线;

      到此基于keepalived高可用LVS集群的配置,测试就结束了;

  • 相关阅读:
    spark系列-6、对Application,Driver,Job,Task,Stage的理解
    spark系列-5、RDD、DataFrame、Dataset的区别和各自的优势
    spark系列-4、spark序列化方案、GC对spark性能的影响
    spark系列-2、Spark 核心数据结构:弹性分布式数据集 RDD
    nginx学习(九):跨域配置和防盗链配置
    nginx学习(八):nginx配置gzip
    nginx学习(七):nginx提供静态资源服务
    nginx学习(六):日志切割
    nginx学习(五):nginx.conf 核心配置文件详解
    nginx学习(四):nginx处理web请求机制
  • 原文地址:https://www.cnblogs.com/qiuhom-1874/p/13659428.html
Copyright © 2011-2022 走看看