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

[经验分享] keepalived的简单配置

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-4-11 10:01:54 | 显示全部楼层 |阅读模式
主要内容:
1. keepalived介绍
2. 主备模型
3. 配置ipvs
4. 对nginx做高可用

一. keepalived介绍

Keepalived: 它的诞生最初是为ipvs(一些 服务,内核中的一些规则)提供高可用性的,最初最主要目的是能够自主调用ipvsadm来生成规则,并且能够自动实现将用户访问的地址转移到其他节点上进行实现的 。
Keepalived: 核心包含两个ckeckers和VRRP 协议。
ckeckers:检查服务,检查reserved的健康状况的,基于脚本也可检查服务本身的健康状况。这里是实现ipvs后端 健康状况的检测的。
VRRP:是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。VRRP中每个节点之间都有优先级的一般为0-255(0,255有特殊用法)数字越大优先级越高。
wKioL1NGG7rRAfnBAAFsWCApSRk239.jpg

相关术语解析:
虚拟路由器:由一个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状态。

下图为keepalived与LVS结合的例子
wKiom1NGCmGATi7NAAFAZqk49V8727.jpg
在DR上配置keepalived提供高可用,以避免Director Server的单点故障,下文中会提到

二. 主备模型

当使用两个节点构建keepalived高可用集群时,采用的是master,backup模式,至于哪个节点作为master则有节点的优先级决定,优先级范围0-255,数字越大,优先级越高。
节点系统
优先级
192.168.0.22(master)CentOS 6.4100
192.168.0.23(backup)CentOS 6.490

1. 在两个节点上安装keepalived
可以使用yum安装,CentOS 6.4提供的是keepalived1.2.7版本的,也可以去下载源码包安装,也是很简单的。这里使用yum安装
# yum install keepalived

2. 编辑配置文件/etc/keepalived/keepalived.conf
首先是全局段global_defs


global_defs {                          #全局配置
   notification_email {                #收件人信息
   }
   notification_email_from Alexandre.Cassen@firewall.loc   #发件人信息(可以随意伪装)
   smtp_server 192.168.200.1        #发邮件的服务器(一定不可为外部地址)
   smtp_connect_timeout 30          #连接超时时间
   router_id LVS_DEVEL              #路由器的标识(可以随便改动)
}
将上面的收件人改为root@localhost,smtp_server改为本机127.0.0.1
则变为如下


global_defs {                          #全局配置
   notification_email {                #收件人信息
     root@localhost
   }
   notification_email_from keepalived@localhost   #发件人信息(可以随意伪装)
   smtp_server 127.0.0.1            #发邮件的服务器(一定不可为外部地址)
   smtp_connect_timeout 30          #连接超时时间
   router_id LVS_DEVEL              #路由器的标识(可以随便改动)
}

然后是虚拟路由配置段vrrp_instance


vrrp_instance VI_1 {            #配置虚拟路由器的(VI_1是实例名称)
    state MASTER               #初始状态,master|backup,当state指定的instance的初始化状态,在两台服务器都启动以后,马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER
    interface eth0              #通告选举所用端口
    virtual_router_id 51        #虚拟路由的ID号(一般不可大于255)
    priority 100                #优先级信息
    advert_int 1                #初始化通告几个
    authentication {            #认证
        auth_type PASS          #认证机制
        auth_pass 1111          #密码(尽量使用随机)
    }
    virtual_ipaddress {         #虚拟地址(VIP地址)
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
将配置改为如下


vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100
    }
}
再将之后的virtual server段注释,下面会有解释

2. 将配置文件复制到另一个节点,并修改虚拟路由段
[iyunv@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/keepalived.conf


vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100
    }
}

3. 两个节点上启动keepalived,并查看日志
# service keepalived start


# 查看日志
[iyunv@node1 ~]# tail /var/log/messages
Apr  9 16:15:19 node1 kernel: IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP)
Apr  9 16:15:19 node1 kernel: IPVS: Connection hash table configured (size=4096, memory=32Kbytes)
Apr  9 16:15:19 node1 kernel: IPVS: ipvs loaded.
Apr  9 16:15:19 node1 Keepalived_vrrp[4277]: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr  9 16:15:19 node1 Keepalived_healthcheckers[4276]: Using LinkWatch kernel netlink reflector...
Apr  9 16:15:20 node1 Keepalived_vrrp[4277]: VRRP_Instance(VI_1) Entering MASTER STATE
Apr  9 16:15:20 node1 Keepalived_vrrp[4277]: VRRP_Instance(VI_1) setting protocol VIPs.
Apr  9 16:15:20 node1 Keepalived_vrrp[4277]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.0.100
Apr  9 16:15:20 node1 Keepalived_healthcheckers[4276]: Netlink reflector reports IP 192.168.0.100 added
Apr  9 16:15:25 node1 Keepalived_vrrp[4277]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.0.100

其中node1已变为master,查看其IP地址


[iyunv@node1 ~]# ip add show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4e:63:c2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.22/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.100/32 scope global eth0
    inet6 fe80::20c:29ff:fe4e:63c2/64 scope link
       valid_lft forever preferred_lft forever
VIP地址已经生效。

4. 添加检测脚本
可以添加一个检测脚本,当检测到/etc/keepalived/down文件存在时,该节点优先级下降20


#首先在配置文件中添加一个字段
vrrp_script chk_down {
     script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
     interval 2
     weight -20
}

#然后在vrrp_instance字段中增加一个字段
track_script {
    chk_down
}
keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

5. 测试检测脚本


#在master上建立/etc/keepalived/down
[iyunv@node1 ~]# touch /etc/keepalived/down

#然后查看ip地址,VIP已经消失
[iyunv@node1 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4e:63:c2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.22/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fe4e:63c2/64 scope link
       valid_lft forever preferred_lft forever

#在node2上查看,VIP出现
[iyunv@node2 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:30:50:75 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.23/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.100/32 scope global eth0
    inet6 fe80::20c:29ff:fe30:5075/64 scope link
       valid_lft forever preferred_lft forever

三. 配置ipvs

为了简单起见,这里这里并不搭建完整的LVS,只是将node1和node2做成DR的高可用

1. 在两个节点上都安装ipvsadm
1
#yum install ipvsadm -y

2. 修改两个节点上的配置文件,添加如下字段


virtual_server 192.168.0.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 192.168.0.24 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
这里只是将192.168.0.24作为real server,也可以添加多个。在192.168.0.24上启动httpd服务。
然后在节点上进行检测


[iyunv@node1 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:80 rr persistent 50
  -> 192.168.0.24:80              Route   1      0          0

四. 对nginx做高可用

这里将nginx与VIP绑定,当master的nginx或者其本身出现问题,则将VIP迁移到backup上,并将backup上的nginx服务启动起来。这里要借助检测脚本和状态转移脚本。

1. 首先在两个节点上安装nginx
1
# yum install nginx -y

2. 修改两个节点的配置文件,下面以master的例,backup的修改一下state和priority即可
global_defs {
  notification_email {
       root@localhost
  }
  notification_email_from keepalived@localhost
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}

vrrp_script srv_down {
       script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
       interval 2
       weight -20

}

vrrp_script chk_nginx {
   scrip "killall -0 nginx"
   interval 2
   weight -20
}

vrrp_instance VI_1 {
   state BACKUP
   interface eth0
   virtual_router_id 51
   priority 90
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       192.168.0.100
   }

   track_script {
       srv_down
       chk_nginx
   }

   notify_master "/etc/keepalived/to_master.sh"
   notify_backup "/etc/keepalived/to_backup.sh"

}
与上文的相比较,只是多了一个检测脚本和两个状态转移脚本


[iyunv@node2 ~]# vim /etc/keepalived/to_master.sh

#/bin/bash
#
/etc/init.d/nginx start

[iyunv@node2 ~]# vim /etc/keepalived/to_backup.sh

#/bin/bash
#
/etc/init.d/nginx stop

测试一下重启两个节点的keepalived服务,则会发现master的VIP和nginx服务都已启动


[iyunv@node1 keepalived]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4e:63:c2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.22/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.100/32 scope global eth0
    inet6 fe80::20c:29ff:fe4e:63c2/64 scope link
       valid_lft forever preferred_lft forever
[iyunv@node1 keepalived]# ss -tunl
Netid  State      Recv-Q Send-Q                 Local Address:Port                   Peer Address:Port
tcp    LISTEN     0      128                                *:80                                *:*   
tcp    LISTEN     0      128                               :::22                               :::*   
tcp    LISTEN     0      128                                *:22                                *:*   
tcp    LISTEN     0      128                        127.0.0.1:6010                              *:*   
tcp    LISTEN     0      128                              ::1:6010                             :::*   
tcp    LISTEN     0      128                               :::3260                             :::*   
tcp    LISTEN     0      128                                *:3260                              *:*

然后将该节点的nginx服务强制杀死
[iyunv@node1 keepalived]# killall -9 nginx

此时,VIP和nginx服务都迁移到backup节点上了,80端口已启用


[iyunv@node2 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:30:50:75 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.23/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.100/32 scope global eth0
    inet6 fe80::20c:29ff:fe30:5075/64 scope link
       valid_lft forever preferred_lft forever
[iyunv@node2 ~]# ss -tanl
State      Recv-Q Send-Q                    Local Address:Port                      Peer Address:Port
LISTEN     0      128                                  :::111                                 :::*   
LISTEN     0      128                                   *:111                                  *:*   
LISTEN     0      128                                   *:80                                   *:*   
LISTEN     0      128                                  :::58516                               :::*   
LISTEN     0      128                                  :::22                                  :::*   
LISTEN     0      128                                   *:22                                   *:*   
LISTEN     0      100                                 ::1:25                                  :::*   
LISTEN     0      100                           127.0.0.1:25                                   *:*   
LISTEN     0      128                           127.0.0.1:6010                                 *:*   
LISTEN     0      128                                 ::1:6010                                :::*   
LISTEN     0      128                           127.0.0.1:6011                                 *:*   
LISTEN     0      128                                 ::1:6011                                :::*   
LISTEN     0      128                                   *:34018                                *:*



运维网声明 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-17101-1-1.html 上篇帖子: nginx+keepalived 下篇帖子: Keepalived 配置文件详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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