keepalived

keepalived

1      简介

Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),VRRP是为了解决静态路由的高可用。

VRRP的基本架构
虚拟路由器由多个路由器组成,每个路由器都有各自的IP和共同的VRID(0-255),其中一个VRRP路由器通过竞选成为MASTER,占有VIP,对外提供路由服务,其他成为BACKUP,MASTER以IP组播(组播地址:224.0.0.18)形式发送VRRP协议包,与BACKUP保持心跳连接,若MASTER不可用(或BACKUP接收不到VRRP协议包),则BACKUP通过竞选产生新的MASTER并继续对外提供路由服务,从而实现高可用。

2      VRRP相关知识

2.1  vrrp协议的相关术语

虚拟路由器:Virtual Router

    虚拟路由器标识:VRID(0-255)

    物理路由器:

        master  :主设备

        backup  :备用设备

        priority:优先级

    VIP:Virtual IP

    VMAC:Virutal MAC (00-00-5e-00-01-VRID)

    GraciousARP

 

2.2     安全认证:

简单字符认证、HMAC机制,只对信息做认证

MD5(leepalived不支持)

2.3     工作模式:

主/备:单虚拟路径器;

主/主:主/备(虚拟路径器),备/主(虚拟路径器)

2.4     工作类型:

抢占式:当出现比现有主服务器优先级高的服务器时,会发送通告抢占角色成为主服务器

非抢占式:

3      keepalived

3.1     工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

 

大致如下:

1.利用VRRP协议进行主备通信。组播224.0.0.18

2.利用VRRP协议进行主备竞选,产生VIP

3.利用VRRP协议主向备发送组播包,发送明文信息。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源

4.当主恢复时,根据配置决定是否抢占备服务器资源

 

3.2     核心组件

vrrp stack:vrrp协议的实现

ipvs wrapper:为集群内的所有节点生成IPVS规则

checkers:对IPVS集群的各RS做健康状态检测

控制组件:配置文件分析器,用来实现配置文件的分析和加载

IO复用器

内存管理组件,用来管理keepalived高可用是的内存管理

 

注意:

1.各节点时间必须同步

2.确保各节点的用于集群服务的接口支持MULTICAST通信(组播);

3.3     安装

从CentOS 6.4开始keepalived随系统base仓库提供,可以使用yun -y install keepalived安装。

3.4     配置文件

主配置文件:/etc/keepalived/keepalived.conf

主程序文件:/usr/sbin/keepalived

提供校验码:/usr/bin/genhash

Unit File:keepalived.service

Unit File的环境配置文件:/etc/sysconfig/keepalived

 

3.5     配置文件详解

keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

3.5.1     global_defs区域

主要是配置故障发生时的通知对象以及机器标识

global_defs {

#故障发生时给谁发邮件通知

    notification_email {

        a@abc.com

        b@abc.com

        ...

}

#通知邮件从哪个地址发出。

notification_email_from alert@abc.com

#通知邮件的smtp地址

smtp_server smtp.abc.com

#连接smtp服务器的超时时间

smtp_connect_timeout 30

#开启SNMP陷阱

enable_traps

#标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到

    router_id host163

}

 

3.5.2     static_ipaddress和static_routes区域

static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置

static_ipaddress {

   # /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0

   # /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0

    10.210.214.163/24 brd 10.210.214.255 dev eth0

    ...

}

static_routes {

# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0

# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0

    10.0.0.0/8 via 10.210.214.1 dev eth0

    ...

}

注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由

3.5.3     vrrp_script区域

用来做健康检查的,当时检查失败时会将vrrp_instancepriority减少相应的值。

vrrp_script chk_http_port {

    script "</dev/tcp/127.0.0.1/80"

    interval 1

    weight -10

}

以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。

3.5.4     vrrp_instance和vrrp_sync_group区域

vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。

vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:

两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

vrrp_sync_group VG_1 {

    group {

        inside_network   # name of vrrp_instance (below)

        outside_network  # One for each moveable IP.

        ...

}

#切换为主执行的脚本

notify_master /path/to_master.sh

#切换为备执行的脚本

notify_backup /path/to_backup.sh

#出错时执行的脚本

notify_fault "/path/fault.sh VG_1"

#任何状态切换都会调用的脚本

notify /path/notify.sh

#表示是否开启邮件通知(用全局区域的邮件设置来发通知)。

    smtp_alert

}

vrrp_instance VI_1 {

   #可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。

state MASTER

#节点固有IP(非VIP)的网卡,用来发VRRP包。

interface eth0

#是否使用VRRP的虚拟MAC地址。

use_vmac <VMAC_INTERFACE>

#忽略VRRP网卡错误。(默认未设置)

dont_track_primary

#监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)

    track_interface {

        eth0

        eth1

}

#修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)

mcast_src_ip <IPADDR>

#绑定lvs syncd的网卡

lvs_sync_daemon_interface eth1

#当切为主状态后多久更新ARP缓存,默认5秒。

garp_master_delay 10

#取值在0-255之间,用来区分多个instance的VRRP组播。可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8

virtual_router_id 1

#用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。

priority 100

#发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。

advert_int 1

# 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。

    authentication {

        auth_type PASS

        auth_pass 12345678

}

#vip

    virtual_ipaddress {

        10.210.214.253/24 brd 10.210.214.255 dev eth0

        192.168.1.11/24 brd 192.168.1.255 dev eth1

}

#虚拟路由,当IP漂过来之后需要添加的路由信息。

    virtual_routes {

        172.16.0.0/12 via 10.210.214.1

        192.168.1.0/24 via 192.168.1.1 dev eth1

        default via 202.102.152.1

}

 

    track_script {

        chk_http_port

}

#允许一个priority比较低的节点作为master,即使有priority更高的节点启动。首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。

当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。

nopreempt

#master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。

    preempt_delay 300

    debug

    notify_master <STRING>|<QUOTED-STRING>

    notify_backup <STRING>|<QUOTED-STRING>

    notify_fault <STRING>|<QUOTED-STRING>

    notify <STRING>|<QUOTED-STRING>

    smtp_alert

}

3.5.5     virtual_server_group和virtual_server区域

virtual_server IP Port {

    #延迟轮询时间(单位秒)。

delay_loop <INT>

    #后端调试算法(load balancing algorithm)。

lb_algo rr|wrr|lc|wlc|lblc|sh|dh

    # LVS调度类型NAT/DR/TUN

lb_kind NAT|DR|TUN

    persistence_timeout <INT>

    persistence_granularity <NETMASK>

    protocol TCP

ha_suspend

#用来给HTTP_GET和SSL_GET配置请求header的。

    virtualhost <STRING>

    alpha

    omega

    quorum <INT>

    hysteresis <INT>

    quorum_up <STRING>|<QUOTED-STRING>

quorum_down <STRING>|<QUOTED-STRING>

#当所有real server宕掉时,sorry server顶替。

sorry_server <IPADDR> <PORT>

#真正提供服务的服务器。

real_server <IPADDR> <PORT> {

        #权重

        weight <INT>

        inhibit_on_failure

        #当real server宕掉或启动时执行的脚本

        notify_up <STRING>|<QUOTED-STRING>

        notify_down <STRING>|<QUOTED-STRING>

        # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK#健康检查的方式

        HTTP_GET|SSL_GET {

            url {

            #请求real serserver上的路径

                path <STRING>

                # Digest computed with genhash分别表示用genhash算出的结果和http状态码

                digest <STRING>

                status_code <INT>

            }

        #健康检查,如果端口通则认为服务器正常。

            connect_port <PORT>

        #分别表示超时时长、重试次数,下次重试的时间延迟。

            connect_timeout <INT>

            nb_get_retry <INT>

            delay_before_retry <INT>

        }

    }

}

3.6     配置

3.6.1     主配置文件详解

! 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      #smtp的超时时间

   router_id LVS_DEVEL          #物理服务器的主机名

   vrrp_mcast_group4            #定义一个组播地址

   static_ipaddress

        {

        192.168.1.1/24 dev eth0 scope global

        }

        static_routes

        {

        192.168.2.0/24 via 192.168.1.100 dev eth0

        }

 

}

    vrrp_sync_group VG_1 {              #定义一个故障组,组内有一个虚拟路由出现故障另一个也会一起跟着转移,适用于LVS的NAT模型。

        group {

            VI1     # name of vrrp_instance (below)        

            VI2     # One for each moveable IP

 

             }

    }

 

 

vrrp_instance VI_1 {        #定义一个虚拟路由

    state MASTER|BACKUP     #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;

    interface eth0          #绑定为当前虚拟路由器使用的物理接口;

    virtual_router_id 51    #当前虚拟路由器的惟一标识,范围是0-255;

    priority 100            #当前主机在此虚拟路径器中的优先级;范围1-254;

    advert_int 1            #通告发送间隔,包含主机优先级、心跳等。

    authentication {        #认证配置  

        auth_type PASS      #认证类型,PASS表示简单字符串认证

        auth_pass 1111      #密码,PASS密码最长为8位

 

   virtual_ipaddress {

    192.168.200.16          #虚拟路由IP地址,以辅助地址方式设置

    192.168.200.18/24 dev eth2 label eth2:1 #以别名的方式设置

    }

 

track_interface {

        eth0

        eth1

 

}                           #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

nopreempt                   #定义工作模式为非抢占模式;

preempt_delay 300           #抢占式模式下,节点上线后触发新选举操作的延迟时长;

   virtual_routes {         #配置路由信息,可选项

               #  src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope

       <SCOPE> tab

               src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1

               192.168.112.0/24 via 192.168.100.254       192.168.113.0/24  via  192.168.200.254  or 192.168.100.254 dev eth1      blackhole 192.168.114.0/24

           }

 

 

    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 {    #LVS配置段 ,设置LVS的VIP地址和端口

    delay_loop                          #服务轮询的时间间隔;检测RS服务器的状态。

    lb_algo rr                          #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh。

    lb_kind NAT                         #集群类型。

    nat_mask 255.255.255.0              #子网掩码,可选项。

    persistence_timeout 50              #是否启用持久连接,连接保存时长

    protocol TCP                        #协议,只支持TCP

    sorry_server <IPADDR> <PORT>        #备用服务器地址,可选项。

 

    real_server 192.168.201.100 443 {   #配置RS服务器的地址和端口

        weight 1                        #权重

     SSL_GET {                          #检测RS服务器的状态,发送请求报文

            url {

              path /                    #请求的URL

              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #对请求的页面进行hash运算,然后和这个hash码进行比对,如果hash码一样就表示状态正常

              status_code <INT>         #判断上述检测机制为健康状态的响应码,和digest二选一即可。

 

            }                           #这个hash码可以使用genhash命令请求这个页面生成

            connect_timeout 3           #连接超时时间

            nb_get_retry 3              #超时重试次数

            delay_before_retry 3        #每次超时过后多久再进行连接

            connect_ip <IP ADDRESS>     #向当前RS的哪个IP地址发起健康状态检测请求

            connect_port <PORT>         #向当前RS的哪个PORT发起健康状态检测请求

            bindto <IP ADDRESS>         #发出健康状态检测请求时使用的源地址;

            bind_port <PORT>            #发出健康状态检测请求时使用的源端口;

        }

    }

}

3.6.2     健康状态检测机制

HTTP_GET

SSL_GET

TCP_CHECK

SMTP_CHECK

MISS_CHECK #调用自定义脚本进行检测

4      实现LVS高可用集群

4.1     实验简介

虚拟IP:192.168.166.100

CentOS 7.3   主服务器,  IP:192.168.166.130

CentOS 7.3-1 备份服务器,IP:192.168.166.132

CentOS 6.9  IP:192.168.166.129

CentOS6.9-1 IP:192.168.166.131

4.2     主调度器配置

[root@CentOS7.3 ~]#yum -y install keepalived ipvsadm        #安装keepalived和LVS管理软件ipvsadm

[root@CentOS7.3 ~]#vim /etc/keepalived/keepalived.conf  #配置keepalived

! Configuration File for keepalived

global_defs {

   notification_email {

   root@localhost

   }

   notification_email_from keepalived@localhost

   smtp_server 127.0.0.1                    #邮件服务器的地址

   smtp_connect_timeout 30

   router_id CentOS7.3                      #主调度器的主机名

   vrrp_mcast_group4 224.26.1.1             #发送心跳信息的组播地址

   

}

 

vrrp_instance VI_1 {

    state MASTER                            #主调度器的初始角色

    interface eth0                          #虚拟IP工作的网卡接口

    virtual_router_id 66                    #虚拟路由的ID

    priority 100                            #主调度器的选举优先级

    advert_int 1

    authentication {

        auth_type PASS                      #集群主机的认证方式

        auth_pass 123456                    #密钥,最长8位

    }

    virtual_ipaddress {

        192.168.166.100                     #虚拟IP

    }

}

 

virtual_server 192.168.166.100 80 {         #LVS配置段,VIP

    delay_loop 6

    lb_algo rr                              #调度算法轮询

    lb_kind DR                              #工作模式DR

    nat_mask 255.255.255.0

#    persistence_timeout 50                  #持久连接,在测试时需要注释,否则会在设置的时间内把请求都调度到一台RS服务器上面

    protocol TCP

    sorry_server 127.0.0.1 80               #Sorry server的服务器地址及端口

#Sorry server就是在后端的服务器全部宕机的情况下紧急提供服务。

    real_server 192.168.166.129 80 {        #RS服务器地址和端口

        weight 1                            #RS的权重

        HTTP_GET {                          #健康状态检测方法

            url {

              path /

              status_code 200               #状态判定规则

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

 

    real_server 192.168.166.131 80 {

        weight 1

        HTTP_GET {

            url {

              path /

                status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

}

 

[root@CentOS7.3 keepalived]#systemctl start keepalived          #启动keepalived

[root@CentOS7.3 keepalived]#ip a l eth0                         #查看虚拟路由绑定的网卡   

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:b9:7d:cb brd ff:ff:ff:ff:ff:ff

    inet 192.168.166.130/24 brd 192.168.166.255 scope global eth0

       valid_lft forever preferred_lft forever

    inet 192.168.166.100/32 scope global eth0                   #虚拟IP已经绑定在了eth网卡上

       valid_lft forever preferred_lft forever

    inet6 fe80::50fe:a3f3:83a0:d38a/64 scope link

       valid_lft forever preferred_lft forever

4.3     备份调度器的配置

[root@centos7.3-1 ~]#yum -y install keepalived ipvsadm

[root@centos7.3-1 ~]#vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   notification_email {

   root@localhost

   }

   notification_email_from keepalived@localhost

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id CentOS7.3-1                #备份调度器的主机名

   vrrp_mcast_group4 224.26.1.1         #这个组播地址需与集群内的其他主机相同

 

}

 

vrrp_instance VI_1 {

    state BACKUP                        #初始角色,备份服务器需设置为BACKUP

    interface eth0

    virtual_router_id 66                #虚拟路由的ID一定要和集群内的其他主机相同

    priority 90                         #选举优先级,要比主调度器地一些

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 123456                #密钥需要和集群内的主服务器相同

    }

    virtual_ipaddress {

        192.168.166.100

    }

}

                #余下配置和主服务器相同

virtual_server 192.168.166.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    nat_mask 255.255.255.0

#    persistence_timeout 50             

    protocol TCP

    sorry_server 127.0.0.1 80

 

    real_server 192.168.166.129 80 {

        weight 1

        HTTP_GET {

            url {

              path /

              status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

 

    real_server 192.168.166.131 80 {

        weight 1

        HTTP_GET {

            url {

              path /

                status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

}

[root@centos7.3-1 ~]#systemctl start keepalived         #启动备份keepalived

[root@centos7.3-1 ~]#ip a l eth0                        #查看虚拟路由绑定的网卡接口

[root@centos7.3-1 ~]#ip a l eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:7e:ec:ef brd ff:ff:ff:ff:ff:ff

    inet 192.168.166.132/24 brd 192.168.166.255 scope global eth0

       valid_lft forever preferred_lft forever

    inet6 fe80::9aab:52b3:cc1e:fbef/64 scope link

       valid_lft forever preferred_lft forever

4.4     RS1、RS2配置

[root@CentOS6.9 ~]#yum -y install httpd                 #安装httpd服务

[root@CentOS6.9 ~]#vim lvs.sh                           #创建一个配置脚本

#!/bin/bash

vip=192.168.166.100                                     #VIP地址

mask=255.255.255.255                   

dev=eth0:1

case $1 in

start)

        echo 1 > /proc/sys/net/ipv4/conf/all/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/lo/arp_announce

        ifconfig $dev $vip netmask $mask broadcast $vip up

        route add -host $vip dev $dev

;;

stop)

        ifconfig $dev down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

;;

*)

        echo "Usage: $(basename $0) start|stop"

        exit 1

;;

esac

 

[root@CentOS6.9 ~]#bash lvs.sh start

[root@CentOS6.9 ~]#ip a l eth0:0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:23:38:c9 brd ff:ff:ff:ff:ff:ff

    inet 192.168.166.129/24 brd 192.168.166.255 scope global eth0

    inet 192.168.166.100/32 brd 192.168.166.100 scope global eth0:1

    inet6 fe80::20c:29ff:fe23:38c9/64 scope link

       valid_lft forever preferred_lft forever

[root@CentOS6.9 ~]#echo WebServer1 > /var/www/html/index.html

[root@CentOS6.9 ~]#cat /var/www/html/index.html

WebServer1

[root@CentOS6.9 ~]#service httpd start

5      双主LVS高可用集群

5.1     主调度器配置

! Configuration File for keepalived

global_defs {

   notification_email {

   root@localhost

   }

   notification_email_from keepalived@localhost

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id CentOS7.3

   vrrp_mcast_group4 224.26.1.1

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 66

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 123456

    }

    virtual_ipaddress {

        192.168.166.100

    }

}

 

virtual_server 192.168.166.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    nat_mask 255.255.255.0

#   persistence_timeout 50

    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 192.168.166.129 80 {

        weight 1

        HTTP_GET {

            url {

              path /

              status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

 

    real_server 192.168.166.131 80 {

        weight 1

        HTTP_GET {

            url {

              path /

                status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

}

#第二套虚拟路由

vrrp_instance VI_2 {

    state BACKUP

    interface eth0

    virtual_router_id 88            #ID不要和第一套虚拟路由相同

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 12345678

    }

   virtual_ipaddress {

        192.168.166.200        

    }

}

 

virtual_server 192.168.166.200 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    nat_mask 255.255.255.0

#   persistence_timeout 50

    protocol TCP

    sorry_server 127.0.0.1 80

 

    real_server 192.168.166.129 80 {

        weight 1

        HTTP_GET {

            url {

              path /

              status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

 

    real_server 192.168.166.131 80 {

        weight 1

        HTTP_GET {

            url {

              path /

                status_code 200

            }

            connect_timeout 1

            nb_get_retry 3

            delay_before_retry 1

        }

    }

}

5.2     RS配置

#!/bin/bash

vip=192.168.166.100

mask=255.255.255.255

dev=eth0:1                     

vip2=192.168.166.200        #添加一个VIP2

mask2=255.255.255.255

dev2=eth0:2                 #再添加一个eth0:2别名

case $1 in

start)

        echo 1 > /proc/sys/net/ipv4/conf/all/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/lo/arp_announce

        ifconfig $dev $vip netmask $mask broadcast $vip up

        ifconfig $dev2 $vip2 netmask $mask2 broadcast $vip2 up      #设置地址

        route add -host $vip dev $dev

        route add -host $vip2 dev $dev2

 

;;

stop)

        ifconfig $dev down

        ifconfig $dev2 down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

;;

*)

        echo "Usage: $(basename $0) start|stop"

        exit 1

;;

esac

 

6      另一个简单配置

###########lb03###########

global_defs {

   router_id LVS_03

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

     10.0.0.13/24

    }

}

virtual_server 10.0.0.13 80 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.0

    persistence_timeout 50

    protocol TCP

 

    real_server 10.0.0.17 80 {

        weight 1

        TCP_CHECK {

        connect_timeout 8        

        nb_get_retry 3 

        delay_before_retry 3 

        connect_port 80 

        } 

    }

 

    real_server 10.0.0.18 80 {

        weight 1

        TCP_CHECK {

        connect_timeout 8        

        nb_get_retry 3 

        delay_before_retry 3 

        connect_port 80 

        } 

    }

}

 

###########lb04###########

global_defs {

   router_id LVS_04

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

     10.0.0.13/24

    }

}

virtual_server 10.0.0.13 80 {

    delay_loop 6

    lb_algo wrr

    lb_kind DR

    nat_mask 255.255.255.0

    persistence_timeout 50

    protocol TCP

 

    real_server 10.0.0.17 80 {

        weight 1

        TCP_CHECK {

        connect_timeout 8        

        nb_get_retry 3 

        delay_before_retry 3 

        connect_port 80 

        } 

    }

 

    real_server 10.0.0.18 80 {

        weight 1

        TCP_CHECK {

        connect_timeout 8        

        nb_get_retry 3 

        delay_before_retry 3 

        connect_port 80 

        } 

    }

}

 

在web03/web04同时操作下面步骤

步骤1:在lo网卡绑定VIP地址(ip)

步骤2:修改内核参数抑制ARP响应

ip addr add 10.0.0.13/32 dev lo

cat >>/etc/sysctl.conf<<EOF

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

EOF

sysctl -p

 

7      其他

实现监听本地网卡上没有的IP地址

    echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf

    sysctl -p

posted @ 2019-02-12 20:57  狂奔__蜗牛  阅读(540)  评论(0编辑  收藏  举报
levels of contents