keepalived

简介:

    vrrp, virtual routing redundant protocol, 虚拟路由协议, 是为了解决局域网中配置静态网关出现单点失败现象的路由协议; 设计目标时是支持特定情况下IP数据流量失败转移不会引起混乱, 允许主机使用单路由器, 以及及时在实际第一跳路由器使用失败的情形下, 仍然能够维护路由器间的连通性. keepalived的是vrrp协议的软件实现; 作用是检测服务器的状态, 如果有一台web服务器死机, 或工作出现故障, keepalived将检测到, 并将有故障的服务器从系统中剔除, 同时使用其他服务器代替该服务器的工作, 当服务器工作正常后keepalived自动将服务器加入到服务器集群中, 这些工作全都自动完成, 不需要人工干涉, 需要人工做的只是修复故障的服务器.

keepalived的安装前提:

    (1) 各节点时间必须同步;

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

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

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

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

keepalived的安装配置

程序环境

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

    主程序:/usr/sbin/keepalived

    Unit File:keepalived.service

配置文件组件部分

    TOP HIERACHY
    GLOBAL CONFIGURATION
    Global definitions
    Static routes/addresses
    VRRPD CONFIGURATION
    VRRP synchronization group(s)
    VRRP instance(s)
    LVS CONFIGURATION
    Virtual server group(s)
    Virtual server(s)

配置语法


1. 配置虚拟路由器

vrrp_instance <STRING> {
    ....
}

专用参数:

state MASTER|BACKUP    #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
interface IFACE_NAME    #绑定为当前虚拟路由器使用的物理接口;
virtual_router_id VRID    #当前虚拟路由器的惟一标识,范围是0-255;
priority 100    #当前主机在此虚拟路径器中的优先级;范围1-254;
advert_int 1    #vrrp通告的时间间隔;
authentication {
    auth_type AH|PASS
    auth_pass <PASSWORD>
}
virtual_ipaddress {
    <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    192.168.200.17/24 dev eth1
    192.168.200.18/24 dev eth2 label eth2:1
}
track_interface {
    eth0
    eth1
    ...
}    #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

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

#定义通知脚本
notify_master <STRING>|<QUOTED-STRING>    #当前节点成为主节点时触发的脚本;
notify_backup <STRING>|<QUOTED-STRING>    #当前节点转为备节点时触发的脚本;
notify_fault <STRING>|<QUOTED-STRING>     #当前节点转为“失败”状态时触发的脚本;
notify <STRING>|<QUOTED-STRING> #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

2. 虚拟服务器

配置参数

virtual_server IP port | virtual_server fwmark int 
{
    ...
    real_server {
    ...
}
    ...
}

常用参数

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>            #备用服务器地址
real_server <IPADDR> <PORT>
{
    weight <INT>
    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 {
        path <URL_PATH>        #定义要监控的URL
        status_code <INT>      #判断上述检测机制为健康状态的响应码
        digest <STRING>        #判断上述检测机制为健康状态的响应的内容的校验码
    }
    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>           #发出健康状态检测请求时使用的源端口
    connect_timeout <INTEGER>  #连接请求的超时时长
}
TCP_CHECK {
    connect_ip <IP ADDRESS>    #向当前RS的哪个IP地址发起健康状态检测请求
    connect_port <PORT>        #向当前RS的哪个PORT发起健康状态检测请求
    bindto <IP ADDRESS>        #发出健康状态检测请求时使用的源地址
    bind_port <PORT>           #发出健康状态检测请求时使用的源端口
    connect_timeout <INTEGER>  #连接请求的超时时长
}

配置示例

示例一: 单主模型

前提:

1. 在两台server上添加/etc/hosts解析文件

2. 建立ssh的连接

步骤:

在node1上生成自己的公钥

ssh-keygen -t rsa -P ''

将自己的公钥拷贝给node2

ssh-copy-id -i .ssh/id_rsa.pub root@node2

    同样的在node2上建立与node1的连接

4. 确定ssh通信是否成功, 同时确定时间是否完全同步

date && ssh node2 'date'

若不能同步, 使用ntpdate TIME_SERVER_IP同步

直到时间完全同步为止

配置文件

global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id node1
    vrrp_mcast_group4 224.0.100.19 #需要打开多播, 
    # ip link set dev eno16777736 multicast on
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 15
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        10.1.52.123/24 dev 16777736
    }
}

配置完之后, 实验, 当两个同时启动, IP地址主节点上, 当主节点的服务停止后, 备用节点将IP地址拿到; 当主节点的服务启动后, 又把IP地址抢回来.

示例二: 双主模型

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_mcast_group4 224.0.52.19
   }
   vrrp_instance VI_1 {
       state MASTER
       interface eno16777736
       virtual_router_id 167   #两个虚拟路由ID要不同
       priority 100
       advert_int 1
       authentication {
           auth_type PASS
           auth_pass 536ecfc2
       }
       virtual_ipaddress {
           10.1.52.234/16  dev eno16777736
       }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 168   #与上边的虚拟路由要不同
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass b823e7f0
    }
    virtual_ipaddress {
        10.1.52.235/16 dev eno16777736
    }
}

首先启动第一个节点, 能够拿到两个IP, 当第二节点也启动后, 将备用IP抢夺过去; 第一个节点服务停止后, 第二个节点能够将另外一个IP地址也拿到;

示例三: 基于lvs-dr模型的keepalived单主实践

规划:

    10.1.52.2和10.1.52.3当做RS主机, 安装httpd, 搭建lvs-dr.

    10.1.52.11和10.1.51.22提供负载均衡

RS配置脚本

#!/bin/bash
#
vip='10.1.52.123'
vport='80'
netmask='255.255.255.255'
iface='lo:0'

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 $iface $vip netmask $netmask broadcast $vip up
	route add -host $vip dev $iface
	;;
stop)
	ifconfig $iface 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
esac

提供负载均衡主机的keepalived配置文件

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_mcast_group4 224.0.52.19
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 167
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 536ecfc2
    }
    virtual_ipaddress {
        10.1.52.123/16  dev eno16777736
    }
}
virtual_server 10.1.52.123 80 {
    delay_loop 3
virtual_server 10.1.52.123 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
    real_server 10.1.52.2 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 10.1.52.3 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

示例四: 基于lvs-dr模型的双主实践

规划:

    10.1.52.2和10.1.52.3当做RS主机, 安装httpd, 搭建lvs-dr.

    10.1.52.11和10.1.51.22提供负载均衡

RS配置脚本

#!/bin/bash
#
vip_1='10.1.52.123'
vip_2='10.1.52.124'
vport='80'
netmask='255.255.255.255'
iface_1='lo:0'
iface_2='lo: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 ${iface_1} ${vip_1} netmask $netmask broadcast ${vip_1} up
	route add -host ${vip_1} dev ${iface_1}
	ifconfig ${iface_2} ${vip_2} netmask $netmask broadcast ${vip_2} up
	route add -host ${vip_2} dev ${iface_2}
	;;
stop)
	ifconfig $iface_1 down
	ifconfig $iface_2 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
esac

其中一台keepalived服务的配置示例

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_mcast_group4 224.0.52.19
}

vrrp_instance VI_1 {
	state MASTER
	interface eno16777736
	virtual_router_id 167
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 536ecfc2 
	}
	virtual_ipaddress {
		10.1.52.123/16	dev eno16777736
	}
}

virtual_server 10.1.52.123 80 {
	delay_loop 3
	lb_algo rr
	lb_kind DR
	protocol TCP
	real_server 10.1.52.2 80 {
		weight 1
		HTTP_GET {
			url {
				path /
				status_code 200
			}
			connect_timeout 1
			nb_get_retry 3
			delay_before_retry 1
		}
	}
	real_server 10.1.52.3 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 eno16777736
	virtual_router_id 163
	priority 98
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 536ecfc2 
	}
	virtual_ipaddress {
		10.1.52.124/16	dev eno16777736
	}
}
virtual_server 10.1.52.124 80 {
	delay_loop 3
	lb_algo rr
	lb_kind DR
	protocol TCP
	real_server 10.1.52.2 80 {
		weight 1
		HTTP_GET {
			url {
				path /
				status_code 200
			}
			connect_timeout 1
			nb_get_retry 3
			delay_before_retry 1
		}
	}
	real_server 10.1.52.3 80 {
		weight 1
		HTTP_GET {
			url {
				path /
				status_code 200
			}
			connect_timeout 1
			nb_get_retry 3
			delay_before_retry 1
		}
	}
}

原创文章,作者:black_fish,如若转载,请注明出处:http://www.178linux.com/56582