设为首页 收藏本站
查看: 1399|回复: 0

[经验分享] keepalived构建LVS_DR和Nginx的高可用集群

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-28 08:39:17 | 显示全部楼层 |阅读模式
keepalived原理、keepalived+LVS_DR及keepalived+Nginx的实现
一.keepalived和其工作原理:
keepalived是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。
keepalived的工作原理:
keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下VRRP协议。
VRRP协议:Virtual Route Redundancy Protocol虚拟路由冗余协议。是一种容错协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。在介绍VRRP之前先介绍一些关于VRRP的相关术语:
虚拟路由器:由一个 Master 路由器和多个 Backup 路由器组成。主机将虚拟路由器当作默认网关。
VRID:虚拟路由器的标识。有相同 VRID 的一组路由器构成一个虚拟路由器。
Master 路由器:虚拟路由器中承担报文转发任务的路由器。
Backup 路由器: Master 路由器出现故障时,能够代替 Master 路由器工作的路由器。
虚拟 IP 地址:虚拟路由器的 IP 地址。一个虚拟路由器可以拥有一个或多个IP 地址。
IP 地址拥有者:接口 IP 地址与虚拟 IP 地址相同的路由器被称为 IP 地址拥有者。
虚拟 MAC 地址:一个虚拟路由器拥有一个虚拟 MAC 地址。虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应 ARP 请求使用的是虚拟 MAC 地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实 MAC 地址。
优先级: VRRP 根据优先级来确定虚拟路由器中每台路由器的地位。
非抢占方式:如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障, Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器。
抢占方式:如果 Backup 路由器工作在抢占方式下,当它收到 VRRP 报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的 Master 路由器的优先级高,就会主动抢占成为 Master 路由器;否则,将保持 Backup 状态。
虚拟路由示例示意图:
wKiom1Yvcm6TLWz8AAEOfFyE9Rs687.jpg
VRRP将局域网内的一组路由器划分在一起,形成一个VRRP备份组,它在功能上相当于一台路由器的功能,使用虚拟路由器号进行标识。虚拟路由器有自己的虚拟IP地址和虚拟MAC地址,它的外在变现形式和实际的物理路由完全一样。局域网内的主机将虚拟路由器的IP地址设置为默认网关,通过虚拟路由器与外部网络进行通信。
虚拟路由器是工作在实际的物理路由器之上的。它由多个实际的路由器组成,包括一个Master路由器和多个Backup路由器。 Master路由器正常工作时,局域网内的主机通过Master与外界通信。当Master路由器出现故障时, Backup路由器中的一台设备将成为新的Master路由器,接替转发报文的工作。
VRRP的工作工程:
(1) 虚拟路由器中的路由器根据优先级选举出 Master。 Master 路由器通过发送免
费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从
而承担报文转发任务;
(2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工
作状况;
(3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级
重新选举新的 Master;
(4) 虚拟路由器状态切换时, Master 路由器由一台设备切换为另外一台设备,新
的 Master 路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP
地址信息的ARP 报文,这样就可以更新与它连接的主机或设备中的
ARP 相关信息。网络中的主机感知不到 Master 路由器已经切换为另外一台
设备。
(5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方
式(抢占方式和非抢占方式)决定是否重新选举 Master。
VRRP优先级的取值范围为0到255(数值越大表明优先级越高)
keepalived的工作原理就是基于VRRP实现的,keepalived的体系结构图如下:
wKioL1YvcrPCGlZqAAJmPFXrK7Q619.jpg

在这个机构图中,处于内核的IPVS和NETLINK,其中NETLINK是提供高级路由及其他相关的网络功能,如果在负载均衡器上启用iptables/netfilter,将会直接影响它的性能。对于图中不同模块功能的介绍如下:
VRRP Stack负责负载均衡器之间的失败切换FailOver;
Checkers负责检查调度器后端的Real server 或者 Upstream Server的健康状况;
WatchDog 负责监控checkers和VRRP进程的状况;
IPVS wrapper 用来发送设定的规则到内核IPVS;
Netlink Reflector 用来设定VRRP的vip地址。
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
core:负责主进程的启动,维护和全局配置文件的加载;
check:负责健康检查
vrrp:用来实现vrrp协议
keepalived配置文件的介绍:
在yum安装好keepalived之后,keepalived会产生一个配置文件/etc/keepalived/keepalived.conf ,配置文件包含了三个段:全局定义段,VRRP实例定义段和虚拟服务器定义段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
global_defs {
   notification_email { #指定keepalived在发生切换时需要发送email到的对象。
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc#指定发件人
   smtp_server 192.168.200.1 #指定smtp服务器地址
   smtp_connect_timeout30  #指定smtp连接超时时间
   router_id LVS_DEVEL  #运行keepalived的一个标识
}
vrrp_sync_group VG_1{ #监控多个网段的实例              
    group{              
        inside_network#实例名              
        outside_network              }
        notify_master /path/xx.sh #指定当切换到master时,执行的脚本      
        netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本      
        notify_fault "path/xx.shVG_1" #故障时执行的脚本      
        notify /path/xx.sh  #脚本所在目录      
        smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知}
vrrp_instance VI_1 {
    state MASTER #指定哪个为master,哪个为backup
    interface eth0  #设置实例绑定的网卡
    virtual_router_id 51 #VPID标记
    priority 100 #优先级,高优先级的会抢占为master (默认为抢占模式)
    advert_int 1 #检查间隔,1秒
    authentication { #设置认证
        auth_type PASS #认证方式
        auth_pass 1111  #认证字符串(使用 openssl rand -hex 6生成随机字符串)
    }
    virtual_ipaddress {  #设置VIP
<IPADDR>/<MASK> brd <IPADDR> dev <STRING>scope <SCOPE> label <LABEL>
        192.168.200.17/24 deveth1
        192.168.200.18/24 deveth2 label eth2:1
    }
    notify_master<STRING>|<QUOTED-STRING>
    notify_backup<STRING>|<QUOTED-STRING>
    notify_fault<STRING>|<QUOTED-STRING>
    notify<STRING>|<QUOTED-STRING>
    smtp_alert
}

virtual_server 192.168.200.100 443 {
    delay_loop 6  #健康检查时间间隔,单位秒
    lb_algo rr              #负载调度算法,支持的算法:rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR  #LVS的类型:有NAT|DR|TUN
    nat_mask255.255.255.0  #子网掩码
    persistence_timeout50   #会话保持时间,单位秒(可以适当延长时间以保持session)
    protocol TCP  #转发协议类型,有TCP和UDP两种
sorry_server 127.0.0.1 80 #web服务器全部失败,可以指定Sorry web
    real_server 192.168.201.100443 {   #定义RS 服务
    weight 1#权重
inhibit_on_failure #当服务器健康检查失效时,将weight设置为0不是直接从ipvs中删除
notify_up <STRING>|<QUOTED-STRING>#Server启动时执行的脚本
notify_down <STRING>|<QUOTED-STRING>#Server down时执行的脚本

#后端RS服务器的检查 (HTTP_GET 和SSL_GET):
    SSL_GET {
       url {  #检查url,可以指定多个,status_codeand digest
         path /
          digest ff20ad   #或者status_code 200 ....
         }
        connect_timeout 3 #连接超时时间
        nb_get_retry 3  #重连次数
        delay_before_retry 3 #重连间隔时间
    }
#也可以通过TCP_CHECK判断RealServer的健康状况:
    }
}



二.keepalived+LVS_DR模型负载均衡实现集群高可用:
1.    单主模型(master/backup)
实验环境:
wKioL1YvgWuh5T2_AAF1iwiNXIQ626.jpg
环境搭建:
1.分别在两台Director上安装keepalived和相关的配置:
安装前注意事项:
本机的主机名,要与hostname(uname -n)获得的名称保持一致;各节点要能相互解析主机名,一般建议通过hosts文件进行解析;各节点要进行时间同步(使用ntp时间服务器同步),确保iptables及selinux不会成为服务阻塞。
(1)在Master上配置时间服务器并进行同步:
yum 安装ntp服务器:yum install ntp -y
配置成本地时间服务器:编辑配置文件~]# vim/etc/ntp.conf添加如下内容:
1
2
3
4
5
6
7
        restrict 172.16.0.0 netmask 255.255.0.0 nomodify notrap        
        server 127.127.1.0
        fudge 127.127.1.0 stratum 8
        #server 0.centos.pool.ntp.org iburst
        #server 1.centos.pool.ntp.org iburst
        #server 2.centos.pool.ntp.org iburst
        #server 3.centos.pool.ntp.org iburst




启动服务即可。其他节点可以通过命令ntpdate netserverIP来进行时间同步如:ntpdate172.16.99.3
(2)安装keepalived和相关配置:
a.分别在172.16.99.3和172.16.99.5上安装keepalived;此处可以yum安装或者源码安装。此处使用yum安装:yum install keepalived -y
b.配置:在172.16.99.3上的配置信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
        global_defs {        
           notification_email {
             admin@zkchang.com
           }
           notification_email_fromkanotify@zkchang.com
           smtp_server 127.0.0.1
           smtp_connect_timeout 3
           router_id LVS_DEVEL
        #   vrrp_mcast_group4224.99.99.18
        }
        vrrp_script chk_down {   #为测试使用
            script "[[ -f/etc/keepalived/down ]] && exit 1 || exit 0"
            interval 1
            weight -2
        }
        vrrp_instance VI_1 {
            state MASTER
            interface eth0
            virtual_router_id 77
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass b17bfcfebf52
            }
            virtual_ipaddress {
                172.16.99.200/32 deveth0 label eth0:0
            }
            sorry_server 172.16.99.380
            track_script {
                chk_down
            }
        }
        virtual_server 172.16.99.200 80 {
            delay_loop 6
            lb_algo rr
            lb_kind DR
            persistence_timeout 50
            protocol TCP
            real_server 172.16.99.1180 {
                weight 1
                HTTP_GET {
                    url {
                      path /
                      status_code 200
                    }
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry3
                }
            }
            real_server 172.16.99.1280 {
               weight 1
               HTTP_GET {
                   url {
                       path /
                       status_code 200
                   }
                   connect_timeout 3
                   nb_get_retry 3
                   dalay_before_retry3
               }
            }
        }



在备用节点Backup172.16.99.5上的配置,只需要修改state BACKUP、virtual_router_id 77、priority 99即可,其他的配置和Master上的配置完全相同。
2.分别在两台RS上进行相关的配置:
通过编写脚本进行相应的配置:
在其中一台的RS172.16.99.11上的配置
1
2
3
4
5
6
7
8
9
10
        #!/bin/bash        
        echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
        echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
        sleep 3
        ifconfig lo:0172.16.99.200 netmask 255.255.255.255 broadcast 172.16.99.200 up
        route add -host172.16.99.200 dev lo:0



另一台RS脚本信息和172.16.99.11上的相同;
两台RS开启web服务器。为了演示实验效果,让网页内容不同:
RS1网页内容为:
<h1>The web is 99.11 </h1>
RS2网页内容为:
<h1>The web is 99.12</h1>
关闭两台的iptables防火墙,关闭selinux.
3.启动keepalived进行测试

wKiom1Yvg1rxGmsPAAFb1uY3WRs921.jpg
查看一下ipvsadm 规则是否已经自动生成:
wKioL1Yvg42RTeu7AAE6Hz-MxOg379.jpg
在目录/etc/keepalived/下创建一个文件down,进行测试,当创建文件后,MASTER主机weight将会减2,最终导致VIP被BACKUP抢占,keepalived默认工作在抢占模式。
1.在172.16.99.3/etc/keepalived/目录下创建down文件,查看VIP地址是否还存在:
日志文件
wKioL1YvhFCyUvO2AANhYtJtKXY595.jpg
wKiom1YvhB3gHO6WAAJF6RPrKmI038.jpg
2.在172.16.99.5上查看VIP是否存在
日志文件:   

wKiom1YvhJCwuz9QAANYdv1iCWY793.jpg
wKioL1YvhMSSLpDEAAJ1dnn0F1g830.jpg
2.双主模型(MASTER/MASTER)
实验结构:
wKiom1YvhPSAIHLWAAJm2nvTnuY076.jpg
双主模型的实现主要是让主Director和备用Director都能接受客户端的访问,设置两个VIP,通过DNS服务器轮询解析这两个VIP来完成。
双主模型的实现只需在单主模型的配置下,在配置文件中再加一个vrrp_instanceVI_2。只需做一下相应的修改,如下:
1.其中一台Director(172.16.99.3)
当vrrp_instance VI_1为state MASTER时:
vrrp_instance VI_2 {
   stateBACKUP
   interface eth0
   virtual_router_id 177
   priority 99
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass d7a9dfb86ec4
   }
   virtual_ipaddress {
       172.16.99.100/32 dev eth0 label eth0:1
   }
   track_script {
        chk_down
   }
其他的virtual_server 区域的配置和vrrp_instance VI_1的相同
2.在另一台Director(172.16.99.5)上的配置:只需将上述的配置文件复制过去,然后修改以下几项:
在vrrp_instance VI_2中,state MASTER、priority 100、
重新启动keepalived:
99.3的日志文件和IP:
wKioL1YvhYCjnnAQAAOOyADMoUs389.jpg
wKioL1YvhbuiWJLyAAKiJtpCIk4474.jpg
99.5的日志文件和IP:
wKioL1YvhevjUh-4AAR9RuYzl30412.jpg
             wKiom1YvhgDAYC55AAL1PgnCTqs456.jpg
2.在两台RS进行相关配置:
通过脚本进行修改:
1
2
3
4
5
6
7
8
9
10
11
12
        #!/bin/bash        
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        sleep 3
        ifconfig lo:0 172.16.99.200 netmask 255.255.255.255  broadcast 172.16.99.200 up
        route add -host 172.16.99.200 dev lo:0
        ifconfig lo:1 172.16.99.100 netmask 255.255.255.255  broadcast 172.16.99.100 up
        route add -host 172.16.99.100 dev lo:1



wKioL1YvhprSf-l6AAH2TGUPdKg695.jpg
两台RS配置相同:
4.测试:
wKioL1YvhunCxW6mAAHF6QMqkHE472.jpg
在一台Director的/etc/keepalived/目录下创建文件down,会发现两个VIP会集中到另一台上:
wKiom1Yvhu3BvxJ6AAPPDhvtF1o158.jpg

三.keepalived+Nginx负载均衡实现集群高可用:
实现双主模型:(MASTER/MASTER)
实验结构图:
wKioL1Yvh2aSZi0RAAIciNGeF3A976.jpg
实验步骤:
1.在两台Nginx负载均衡器上进行配置keepalived和实现Nginx的负载均衡:
a.实现Nginx的负载均衡
编辑nginx的配置文件/etc/nginx/nginx.conf添加如下内容:
在http{}内添加:
    upstream Rserver {
        server 172.16.99.11:80 weight=1;
        server 172.16.99.12:80 weight=1;
        server 172.16.99.10:80 backup;  
        #当两台Upstream server宕机了,就会               
      # 显示此web服务器的界面消息
    }
再编辑/etc/nginx/conf.d/default.com文件,在server{}内添加:
    location / {
        proxy_pass http://Rserver/;
        root   /web/nginx/;
        index index.html index.htm;
    }
两台Nginx的负载均衡器配置相同。
进行测试,判断nginx是否实现了负载均衡
b.编辑keepalived的配置文件(双主模型)来实现Nginx负载均衡器的高可用:
配置内容如下:(先在172.16.99.3上配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        global_defs {        
           notification_email {
             admin@zkchang.com
           }
           notification_email_fromkanotify@zkchang.com
           smtp_server 127.0.0.1
           smtp_connect_timeout 3
           router_id LVS_DEVEL
        #   vrrp_mcast_group4224.99.99.18
        }
        vrrp_script chk_nginx {  #检查Nginx的运行状态
            script "killall -0nginx &> /dev/null"
            interval 1
            weight -2
        }
        vrrp_instance VI_1 {
            state MASTER
            interface eth0
            virtual_router_id 77
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass b17bfcfebf52
            }
            virtual_ipaddress {
                172.16.99.200/32 deveth0 label eth0:0
            }
           track_script {
                chk_nginx  
           }
        }
        vrrp_instance VI_2 {
          state BACKUP
          interface eth0
          virtual_router_id 100
          priority 99
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass d7a9dfb86ec4
          }
          virtual_ipaddress {
              172.16.99.100/32 deveth0 label eth0:1
          }
          track_script {
                chk_down
                chk_nginx
          }
        }



在172.16.99.5上的配置,只需将此配置文件复制过去,然后修改以下几项:
在vrrp_instance VI_1中:
state BACKUP
priority 99
在vrrp_instance VI_2中:
state MASTER
priority 100
2.启动keepalived进行测试:
wKiom1YviBHiHkRSAAMe86HmI-c194.jpg
wKioL1YviEXiNkpvAAMf7jVpOG8118.jpg
进行访问:
wKiom1YviGjDBJ5NAAJZrvYNJaU483.jpg
将172.16.99.5的Nginx服务关闭:VIP(172.16.99.100)将转移到另一台的eth0:1上如下图:访问服务器能正常显示网页内容。
wKiom1YviMaCW76LAALouCHNYA4647.jpg
wKioL1YviPnhP2ovAAMXtRD1_OQ978.jpg
如果后端Upstream server 服务器都宕机了,客户端在此访问时,将会显示server172.16.99.10:80 backup; 此web服务器的界面消息。如:
wKiom1YviPWhnV7gAAHbwYE62B8646.jpg








运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-131619-1-1.html 上篇帖子: keepalived原理及keepalived+nginx的高可用、keepalived+lvs_DR负载均衡、keepalived高可用双主模型实例 下篇帖子: 使用KeepAlive实现将lvs进行高可用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表