keepalived 详解

前言:


        keepalived是vrrp协议的软件实现,原生设计目的为了提供高可用ipvs服务。现已成为为主流调度器提供冗余(双机热备),避免单点故障提高高可用性的一件利器。

索引:


1. 主要功能

2. HA Cluster 配置准备:

3. 程序组成

4. 主配置文件结构

5. 实现简单keepalive地址漂移配置(主从)

6. 实现负载分摊(双主)配置

7. keepalived 结合Ipvs

8. keepalived调用脚本进行资源监控

9.keepalived同步组



1.主要功能:


① vrrp协议完成地址流动(即为调度器做冗余,避免单点故障提高高可用性)

② 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

③ 为ipvs集群的各RS做健康状态检测

④ 基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持nginx、 haproxy等服务

Keepalived组成:

473da95330efb1b3c75b0f3f448512cd.png

2. HA Cluster 配置准备:


(1) 各节点时间必须同步   ntp(centos 6), chrony(centos 7)

vim  /etc/ntp.conf

server 同步服务器IP  ibrust  #t添加一条

(2) 确保iptables及selinux不会成为阻碍

(3) 各节点之间可通过主机名互相通信(对KA并非必须)

建议使用/etc/hosts文件实现

(4) 各节点之间的root用户可以基于密钥认证的ssh服务完

成互相通信(对KA并非必须)

方法:

ssh-keygen  

#生成秘钥。第一次提示存放秘钥路径,默认~/.ssh/id_rsa回车就好。后两次是否加密秘

钥,实验方便直接回车不加密,安全性考虑应加密。

cd .ssh

ssh-copy-id  目标主机名或IP  #默认发送公钥,到目标主机后改名为authorized_keys

3. 程序组成


keepalived安装配置:

CentOS 6.4+ Base源

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

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

    Unit File: /usr/lib/systemd/system/keepalived.service

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

    配置范例:/usr/share/doc/keeplived-1.2.13/samples

配置日志:

    vim /etc/sysconfig/keepalived

    KEEPALIVED_OPTIONS="-D -S 2"

    vim /etc/rsyslog.conf

    local2.*          /var/log/keepalived.log

4. 主配置文件结构(三大块)



cat /etc/keepalived/keepalived.conf


GLOBAL CONFIGURATION  #定义邮件通知相关,同组调度器间组播配置

        Global definitions

        Static routes/addresses

VRRPD CONFIGURATION

       VRRP synchronization group(s): vrrp同步组

       VRRP instance(s):即一个vrrp虚拟 路由器

LVS CONFIGURATION

       Virtual server group(s)

       Virtual server(s): ipvs集群的vs和rs

5. 实现简单keepalive地址漂移配置(主从)


5.1 实验拓扑

59f6a012dfa65f660e33e42b030ef6e6.png

5.2 配置6m1

cd /etc/keepalived

cp keepalived.conf{,.bak}

vim keepalived.conf

global_defs {

  notification_email {

    root@localhost    #发生故障给哪些邮箱发邮件通知

  }

  notification_email_from 6m1@localhost  #从哪个邮箱发出

  smtp_server 127.0.0.1  #邮件服务器

  smtp_connect_timeout 30

  router_id 6m1  #当前调度器主机名(可自定义)

  vrrp_mcast_group4 224.100.100.43  #自定义同组调度器直接组播地址

}


vrrp_instance VI_1 {

   state MASTER

   interface eth0

   virtual_router_id 51 #虚拟路由组id自定义,同组内调度器id应相同

   priority 100         #优先级

   advert_int 2         #发送间隔

   authentication {

       auth_type PASS

       auth_pass centos  #认证密码

    }

   virtual_ipaddress {

       172.18.43.77/24  #vip

   }


   track_interface {  #当eth0出现故障时,eth1接替eth0工作

   eth0

   eth1

    }

}

5.3 配置6m2

修改同组内另一台调度器配置,不同的配置项:

router_id 6m2

state BACKUP

priority 90

5.4 测试

两台主机启动服务,抓包观察双方组播通信过程:

d6ae117b6317be11fdfeba3d78f11f93.png

可看到6m1主机一直发送自己的优先级,宣称自己的MASTER地位。6m2优先级小于100实力没人家强大,迫于淫威所以不发送信息。

将6m1服务停止,继续观察:

95c5d9e937b79056dbab6ee51f5969ae.png

首先6m1发送prio=0表示自己放弃MASTER的地位,此时6m2优先级最高开始宣称主权。

另开一台主机ping 172.18.43.77可发现只有两台调度器同时服务停掉的情况下才会出现不通的状况,从侧面表现出了高可用的特性

5.5 脚本方式实现通知功能

两台服务器自定义通知脚本,并加执行权限:

e386c435d75584cd6d75eec4ce9c6a17.png

修改配置文件:

在虚拟路由器配置实例中添加如图三条配置

537098ef47e52423144d2bb889ed859e.png

测试:

将6m1停止服务后,6m2会收到自己接任master的邮件

d7ceb8d77241d70932bb46d4a20aede6.png

6. 实现负载分摊(双主)配置


实验目的:路由器的一个接口上创建多个虚拟路由器,使得一个实体路由器在一个虚拟路由器中作为master路由器,同时在其他的虚拟路由器中作为backup路由器。多台路由器应对不同业务分饰两角,同时承担业务实现负载均衡。

d62e3a92ca31539b844c12d1142d054c.png

6.1 修改6m1配置文件

在实例1下新增实例2

52e7236b937ec92afe8d792375e9a367.png

6.2 修改6m2配置文件

新增实例2与6m1相比修改内容如下:

state MASTER

priority     100

7. keepalived 结合Ipvs


7.1keepalived.conf中关于IPVS配置段结构:

virtual_server IP port |

virtual_server fwmark int

{

      ...

      real_server {

      ...

}

      ...

}

7.2 常用配置参数

delay_loop <INT>:#服务轮询的时间间隔

lb_algo rr|wrr|lc|wlc|lblc|sh|dh:#定义调度方法

lb_kind NAT|DR|TUN:#集群的类型

persistence_timeout <INT>:#持久连接时长

protocol TCP:#服务协议,仅支持TCP

sorry_server <IPADDR> <PORT>:#所有RS故障时,备用服务器地址

real_server <IPADDR> <PORT>

{

   weight <INT> RS权重

   notify_up <STRING>|<QUOTED-STRING> RS上线通知脚本

   notify_down <STRING>|<QUOTED-STRING> RS下线通知脚本

   HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK

   { ... }:#定义当前主机的健康状态检测方法

}

7.3 KeepAlived应用层配置检测

HTTP_GET|SSL_GET {

 url {

    path <URL_PATH>:  #定义要监控的URL

    status_code <INT>:  #判断上述检测机制为健康状态的响应码

    digest <STRING>:    #判断为健康状态的响应的内容的校验码

     }

connect_timeout <INTEGER>:#连接请求的超时时长

nb_get_retry <INT>:                #重试次数

delay_before_retry <INT>:      #重试之前的延迟时长

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

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

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

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

7.4 实验:实现keepalive结合DR模型ipvs高可用调度

实验拓扑:

cfaa144d1bea5bac984f676ac7aaed32.png

① 后端真实服务器分别安装http,配置DR模型脚本

脚本如下:

#!/bin/bash

#

vip=172.18.43.77

mask='255.255.255.255'

dev=lo:1

rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null

service httpd start &> /dev/null && echo "The httpd Server is Ready!"

echo "<h1>`hostname`</h1>" > /var/www/html/index.html


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

   echo "The RS Server is Ready!"

   ;;

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 "The RS Server is Canceled!"

   ;;

*)

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

   exit 1

   ;;

esac

分别执行脚本:

8fe07ebed18658257014583458ce920b.png

② 分别配置keepalived

vim  /etc/keepalived/keepalived.conf


virtual_server 172.18.43.77 80 {

   delay_loop 6

   lb_algo wrr

   lb_kind DR

   protocol TCP


   real_server 172.18.43.71 80 {

       weight 1

       HTTP_GET {

           url {

             path /index.html

             status_code 200

          }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

   }

   real_server 172.18.43.72 80 {

       weight 1

       HTTP_GET {

           url {

             path /index.html

             status_code 200

          }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

   }

}

③ 前端分别安装ipvsadm,重载keepalived,查看ipvs策略:

b53658f75e333a9ec080b5bc7bd890bb.png

④ 测试

76d8a7b8d5b66f97389f01cbeb20c484.png


8. keepalived调用脚本进行资源监控


8.1 功能实现:

keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整

vrrp_script:自定义资源监控脚本, vrrp实例根据脚本返回值(返回非0值执行下面脚本内容),公共定义,可被多个实例调用,定义在vrrp实例之外

track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script

8.2 配置示例:

分两步: (1) 先定义一个脚本; (2) 实例中调用此脚本

vrrp_script <SCRIPT_NAME> {

   script ""

   interval INT

   weight -INT

}

track_script {

   SCRIPT_NAME_1

   SCRIPT_NAME_2

}

8.3 实验:

(1) 先定义一个脚本

    见附件:定义脚本

(2) 实例中调用此脚本

    见附件:调用脚本


9.keepalived同步组


使用场景:LVS NAT模型VIP和DIP需要同步,需要同步组

示例:

    见附件:同步组







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章