• 高可用与负载均衡(7)之聊聊Lvs-DR+Keepalived的解决方案


    今天直接开门见山了,直接说配置吧。首先介绍下我这的环境
    如有问题,请联系我18500777133@sina.cn

    IP 安装软件
    192.168.1.7 lvs1+keepalived master角色
    192.168.1.8 lvs2+keepalived backup角色
    192.168.1.6 web1-Nginx
    192.168.1.4 web2-Nginx

    keepalived的vip是192.168.1.200,系统环境都是CentOs6.6 64位。
    需要注意的是:
    第一:确保client能够直接访问web服务器。因为在LVS-DR模式下web服务器回复client的时候,是直接回复给client的,不需要经过LVS,所以web服务器必须能够和client的网络互通。
    第二,lvs服务器和web-server他们必须在同一个网段内,因为LVS转发包的时候,是直接修改了包目标的MAC地址,直接扔给了rs,基于MAC地址的修改是活动在OSI二层数据链路层的,工作在数据链路层的网络设备就是交换机了,所以必须在一个交换机下面,也就是一个局域网内。
    第三为啥抑制real-server的ARP,是这样的,我们在DR模式要更改web-server的ARP的模式,arp_ignore为1是说只回答目标IP地址是来访网络接口本地地址的ARP查询请求,我们都在回环接口上配置了一个VIP,当arp模式更改以后,那么如果有谁在请求VIP的mac地址时,那么那些web-server就会回答arp广播报文了,只有lvs才会,如果没有更改arp模式,那么大家都喊我是VIP,这就乱套了。

    LVS+keepalived的调整

    我们首先在LVS1和LVS2上开启路由转发的功能

    [root@localhost ~]# vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1    #编辑这行
    [root@localhost ~]# sysctl -p   
    net.ipv4.ip_forward = 1
    

    接下来安装keepalived,我这里采用yum安装,命令yum install keepalived的,安装完系统自带的yum源即可,安装完之后配置keepalived。
    先看keepalived master的配置文件

    [root@localhost ~]# cat /etc/keepalived/keepalived.conf     
    ! Configuration File for keepalived
    
    global_defs {            # 全局设置
       notification_email {    # 设置报警邮件地址
        18500777133@sina.cn
       }
       notification_email_from Alexandre.Cassen@firewall.loc   # 设置邮件的发送地址
       router_id test-1         # 表示该台服务的ID
    }
    vrrp_sync_group vg_1 {               # vrryp 同步组,组成员是vrrp实例的名字。
        group {
            VI_1
        }
    }
    
    vrrp_instance VI_1 {               # vrrp 实例
        state MASTER                   #master状态
        interface eth0
        virtual_router_id 51           # master和backup的id一致
        priority 100
        advert_int 1                   # master和backup之间的检测时间
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.200/32 dev eth0          # 设置虚拟IP    
        }
    }
    
    virtual_server 192.168.1.200 80 {    # 设置虚拟服务器,ip端口以及花边号用逗号隔开
        delay_loop 5         # 设置运行情况检查时间,单位是秒
        lb_algo rr           # 负载算法,这里是rr表示轮询
        lb_kind DR           # LVS工作机制,这里是DR模式
        persistence_timeout 50    # 会话保持时间,单位是秒,这个选项对动态网页非常有帮助,为集群系统中的session共享提供了一个很好的解决方案,有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,知道超过这个会话的保持时间,需要注意的是,这个会话保持时间是最大无响应的超时时间,in other words,用户在动态页面50秒以内没有执行任何操作,那么接下来的操作会重新调度到另一个节点上。如果一直在操作则不会影响
        protocol TCP   # 有TCP,UDP,好像还有哦http。
    
        real_server 192.168.1.6 80  {     #设定真实服务器地址以及端口,
            weight 1         # 设置权重,数字越低,调度的比例越小。
            HTTP_GET {      #以http模式检查该服务器监控状态 
                url {    
                  path /      # 检测的网页路径
                  digest e3eb0a1df437f3f97a64aca5952c8ea0      # 采用genhash命令获取
                }
                connect_timeout 1   # 连接超时时间,
                connect_port 80      连接的端口,
                nb_get_retry 3        # 表示重试次数,
                delay_before_retry 1   # 表示重试间隔。
            }
        }
        
        real_server 192.168.1.4 80  {
            weight 1
            HTTP_GET {
                url {
                  path /test.html
                  digest 1181c1834012245d785120e3505ed169
                }
                connect_timeout 2
                connect_port 80
                nb_get_retry 3
                delay_before_retry 1
            }
        }
    }
    

    再看看keepalived的backup配置:

    [root@localhost ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
        18500777133@sina.cn
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       router_id test-2
    }
    
    vrrp_sync_group vg_1 {
        group {
            VI_1
        }
    }
    
    vrrp_instance VI_1 { 
        state BACKUP            # backup状态
        interface eth0         
        virtual_router_id 51      # master和backup的id一致
        priority 90              #优先级比master低些
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.200/32 dev eth0
        }
    }
    
    virtual_server 192.168.1.200 80 {
        delay_loop 5
        lb_algo rr
        lb_kind DR
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.1.6 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
                  digest e3eb0a1df437f3f97a64aca5952c8ea0
                }
                connect_timeout 1
                connect_port 80
                nb_get_retry 3
                delay_before_retry 1
            }
        }
        
        real_server 192.168.1.4 80  {
            weight 1
            HTTP_GET {
                url {
                  path /test.html
                  digest 1181c1834012245d785120e3505ed169
                }
                connect_timeout 2
                connect_port 80
                nb_get_retry 3
                delay_before_retry 1
            }
        }
    
    }
    
    

    我们这会用genhash来获取web服务 url的校验码:

    [root@localhost ~]# genhash -s 192.168.45.128 -p 80 -u /
    MD5SUM = e3eb0a1df437f3f97a64aca5952c8ea0         # 把这个校验码放在keepalived的配置文件即可。
    

    配置完后,暂且不着急启动keepalived的服务。我们先行配置web服务器。

    Web服务器的调整

    两台web服务器都做同样的操作
    首先更改sysctl.conf的配置文件。命令如下:

    root@leo-virtual-machine:~# cat /etc/sysctl.conf
    net.ipv4.conf.eth0.arp_ignore = 1
    net.ipv4.conf.eth0.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    root@leo-virtual-machine:~# sysctl -p   #使其刚才的配置立即生效
    

    添加虚拟IP以及路由,命令如下:

    root@leo-virtual-machine:~# ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200 up
    @root@leo-virtual-machine:~# route add -host 192.168.1.200 dev lo:0         #先不添加这路由,如果出现无法访问的时候再添加也不迟 
    

    个人建议不要忘记在rc.local里面写入增加VIP的添加命令,省去开机后人工配置的麻烦:

    @root@leo-virtual-machine:~# cat /etc/rc.local 
    ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200
    route add -host 192.168.1.200 dev lo:0
    

    完成之后,后端启动httpd服务

    启动keepalived的服务

    在master服务器上启动

    [root@localhost ~]# service  keepalived start
    [root@localhost ~]# tail /var/log/messages -f     # 查看keepalived的日志,确保服务启动正常
    '''
    Nov 19 17:09:28 localhost Keepalived_healthcheckers[14376]: Using LinkWatch kernel netlink reflector...
    Nov 19 17:09:28 localhost Keepalived_healthcheckers[14376]: Activating healthchecker for service [192.168.1.6]:80   # 后端real-server校验成功,可以提供服务
    Nov 19 17:09:28 localhost Keepalived_healthcheckers[14376]: Activating healthchecker for service [192.168.1.4]:80   # 后端real-server校验成功,可以提供服务
    Nov 19 17:09:28 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Transition to MASTER STATE        # 设置本机为master角色
    Nov 19 17:09:28 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
    Nov 19 17:09:28 localhost Keepalived_vrrp[14377]: VRRP_Group(vg_1) Syncing instances to MASTER state
    Nov 19 17:09:29 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Entering MASTER STATE
    Nov 19 17:09:29 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) setting protocol VIPs.    #设置VIP到本机上
    Nov 19 17:09:29 localhost Keepalived_vrrp[14377]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.200     
    
    [root@localhost ~]# ip a|grep 'inet '
        inet 127.0.0.1/8 scope host lo
        inet 192.168.1.7/24 brd 192.168.1.255 scope global eth0   
        inet 192.168.1.200/32 scope global eth0    # VIP已经在了。
    You have new mail in /var/spool/mail/root
    
    

    在backup以同样的命令启动keepalived的,测试负载功能和高可用功能。

    检测服务是否可以高可用以及负载均衡

    1 在keepalived的master上停止keepalived的服务,模拟服务器宕机啦。等2秒后,到keepalived的backup服务器上查看VIP是否漂移过去。此时用浏览器继续访问192.168.1.200,看web服务器能够正常响应。且注意网页,看是不是负载均的效果(根据权重,权重高的服务提供的网页次数多。)

    2 在第一步的基础上,我们在keepalived的master上重新启动keepalived的服务,等待3秒后,看VIP是否正常切回,切回后检测web服务器是否可用。

  • 相关阅读:
    [bzoj1089] 严格n元树
    [bzoj1097] 旅游景点atr
    [hdu3887] Counting Offspring
    [POJ3321] Apple Tree
    [POJ3635] Full Tank?
    git
    【MySQL】数据的导出导入
    Ubuntu python 开发环境配置
    测试markdown
    约瑟夫环问题-java实现
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6087276.html
Copyright © 2020-2023  润新知