LVS+keepalived配置

DR模式

LB上配置

step1:
查看内核是否支持lvs
#lsmod |grep ip_vs
安装lvs
#yum install ipvsadm
安装依赖:
#yum -y install opensll-devel
安装keepalived
#wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
#tar -zxvf keepalived-1.2.24.tar.gz
#cd keepalived-1.2.24
#./configure --sysconf=/etc --with-kernel-dir=/lib/modules/2.6.32-279.el6.x86_64/
#make && make install
#ln -s /usr/local/sbin/keepalived /sbin/

step2: 配置keepalived
配置keepalived
#vim /etc/keepalived/keepalived.conf
#! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc #告警邮件信息配置
   }
   notification_email_from Alexandre.Cassen@firewall.loc #指定当keepalived出现问题时,发送邮件给哪些用户。
   smtp_server 192.168.200.1 #smtp server地址
   smtp_connect_timeout 30 # smtp连接超时时间
   router_id LVS_DEVEL  #负载均衡标识,在局域网内应该是唯一的
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

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

virtual_server 127.0.0.1 9- {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 127.0.0.1 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 80
      }
    }
    real_server 127.0.0.1 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 80
      }
    }
}

virtual_server 127.0.0.1 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 127.0.0.1 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 443
      }
    }
    real_server 127.0.0.1 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            delay_before_retry 3
            connect_port 443
      }
    }
}
  • 参数详解:
    ** 全局定义参数 **
    notification_email:指定当keepalived出现问题时,发送邮件给哪些用户。
    notification_emai_from:发送邮件时,邮件的来源地址。
    smtp_server <DOMAIN|IP> [<PORT>]:smtp服务器的地址或域名。默认端口为25.如:smtp_server smtp.felix.com 25
    smtp_helo_name <HOST_NAME>:指定在HELO消息中所使用的名称。默认为本地主机名。
    smtp_connect_timeout:指定smtp服务器连接的超时时间。单位是秒。

    router_id:指定标识该机器的route_id. 如:route_id LVS_01
    vrrp_mcast_group4 224.0.0.18:指定发送VRRP组播消息使用的IPV4组播地址。默认是224.0.0.18
    vrrp_mcast_group6 ff02::12 指定发送VRRP组播消息所使用的IPV6组播地址。默认是ff02::12
    default_interface eth0:设置静态地址默认绑定的端口。默认是eth0。
    lvs_sync_daemon <INTERFACE> <VRRP_INSTANCE> [id <SYNC_ID>] [maxlen <LEN>] [port <PORT>] [ttl <TTL>] [group <IP ADDR>]
    设置LVS同步服务的相关内容。可以同步LVS的状态信息。
    INTERFACE:指定同步服务绑定的接口。
    VRRP_INSTANCE:指定同步服务绑定的VRRP实例。
    id <SYNC_ID>:指定同步服务所使用的SYNCID,只有相同的SYNCID才会同步。范围是0-255.
    maxlen:指定数据包的最大长度。范围是1-65507
    port:指定同步所使用的UDP端口。
    group:指定组播IP地址。

    lvs_flush:在keepalived启动时,刷新所有已经存在的LVS配置。
    vrrp_garp_master_delay 10:当转换为MASTER状态时,延迟多少秒发送第二组的免费ARP。默认为5s,0表示不发送第二组免的免费ARP。
    vrrp_garp_master_repeat 1:当转换为MASTER状态时,在一组中一次发送的免费ARP数量。默认是5.
    vrrp_garp_lower_prio_delay 10:当MASTER收到更低优先级的通告时,延迟多少秒发送第二组的免费ARP。
    vrrp_garp_lower_prio_repeat 1:当MASTER收到更低优先级的通告时,在一组中一次发送的免费ARP数量。
    vrrp_garp_master_refresh 60:当keepalived成为MASTER以后,刷新免费ARP的最小时间间隔(会再次发送免费ARP)。默认是0,表示不会刷新。
    vrrp_garp_master_refresh_repeat 2: 当keepalived成为MASTER以后,每次刷新会发送多少个免费ARP。默认是1.
    vrrp_garp_interval 0.001:在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0.
    vrrp_lower_prio_no_advert true|false:默认是false。如果收到低优先级的通告,不发送任何通告。
    vrrp_version 2|3:设置默认的VRRP版本。默认是2.
    vrrp_check_unicast_src:在单播模式中,开启对VRRP数据包的源地址做检查,源地址必须是单播邻居之一。
    vrrp_skip_check_adv_addr:默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
    vrrp_strict:严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。

    vrrp_iptables:不添加任何iptables规则。默认是添加iptables规则的。
    ** vrrp_instance **
    state MASTER|BACKUP:指定该keepalived节点的初始状态。
    interface eth0:vrrp实例绑定的接口,用于发送VRRP包。
    use_vmac [<VMAC_INTERFACE>]:在指定的接口产生一个子接口,如vrrp.51,该接口的MAC地址为组播地址,通过该接口向外发送和接收VRRP包。
    vmac_xmit_base:通过基本接口向外发送和接收VRRP数据包,而不是通过VMAC接口。
    native_ipv6:强制VRRP实例使用IPV6.(当同时配置了IPV4和IPV6的时候)
    dont_track_primary:忽略VRRP接口的错误,默认是没有配置的。

track_interface {
eth0
eth1 weight <-254-254>
...
}:如果track的接口有任何一个出现故障,都会进入FAULT状态。

track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254-254>
}:添加一个track脚本(vrrp_script配置的脚本。)

mcast_src_ip <IPADDR>:指定发送组播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
unicast_src_ip <IPADDR>:指定发送单薄数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
version 2|3:指定该实例所使用的VRRP版本。

unicast_peer {
<IPADDR>
...
}:采用单播的方式发送VRRP通告,指定单播邻居的IP地址。

virtual_router_id 51:指定VRRP实例ID,范围是0-255.
priority 100:指定优先级,优先级高的将成为MASTER。
advert_int 1:指定发送VRRP通告的间隔。单位是秒。
authentication {
auth_type PASS|AH:指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)。
auth_pass 1234:指定认证所使用的密码。最多8位。
}

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
}:指定VIP地址。

nopreempt:设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级的机器已经上线。如果要使用这个功能,则初始化状态必须为BACKUP。
preempt_delay:设置抢占延迟。单位是秒,范围是0---1000,默认是0.发现低优先级的MASTER后多少秒开始抢占。

通知脚本:
notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
notify <STRING>|<QUOTED-STRING> [username [groupname]]

当停止VRRP时执行的脚本。

notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]
smtp_alert
** virtual_server **
virtual_server IP Port | virtual_server fwmark int | virtual_server group string {
delay_loop <INT>:健康检查的时间间隔。
lb_argo rr|wrr|lc|wlc|lblc|sh|dh:LVS调度算法。
lb_kind NAT|DR|TUN:LVS模式。
persistence_timeout 360:持久化超时时间,单位是秒。默认是6分钟。
persistence_granularity:持久化连接的颗粒度。
protocol TCP|UDP|SCTP:4层协议。
ha_suspend:如果virtual server的IP地址没有设置,则不进行后端服务器的健康检查。
virtualhost <STRING>:为HTTP_GET和SSL_GET执行要检查的虚拟主机。如virtualhost www.felix.com
sorry_server <IPADDR> <PORT>:添加一个备用服务器。当所有的RS都故障时。
sorry_server_inhibit:将inhibit_on_failure指令应用于sorry_server指令。

alpha:在keepalived启动时,假设所有的RS都是down,以及健康检查是失败的。有助于防止启动时的误报。默认是禁用的。
omega:在keepalived终止时,会执行quorum_down指令所定义的脚本。

quorum <INT>:默认值1. 所有的存活的服务器的总的最小权重。
quorum_up <STRING>:当quorum增长到满足quorum所定义的值时,执行该脚本。
quorum_down <STRING>:当quorum减少到不满足quorum所定义的值时,执行该脚本。
}
real_server
real_server IP Port {
weight <INT>:给服务器指定权重。默认是1.
inhibit_on_failure:当服务器健康检查失败时,将其weight设置为0,而不是从Virtual Server中移除。
notify_up <STRING>:当服务器健康检查成功时,执行的脚本。
notify_down <STRING>:当服务器健康检查失败时,执行的脚本。
uthreshold <INT>:到这台服务器的最大连接数。
lthreshold <INT>:到这台服务器的最小连接数。
}
real_server中的健康检查
HTTP_GET | SSL_GET {
url {
path <STRING>:指定要检查的URL的路径。如path / or path /mrtg2
digest <STRING>:摘要。计算方式:genhash -s 172.17.100.1 -p 80 -u /index.html
status_code <INT>:状态码。
}
nb_get_retry <INT>:get尝试次数。
delay_before_retry <INT>:在尝试之前延迟多长时间。

connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
}

TCP_CHECK {
connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry <INIT>:重试次数。默认是1次。
delay_before_retry <INT>:默认是1秒。在重试之前延迟多少秒。
}

SMTP_CHECK {
connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。 默认是25端口
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。

retry <INT>:重试次数。
delay_before_retry <INT>:在重试之前延迟多少秒。
helo_name <STRING>:用于SMTP HELO请求的字符串。
}

DNS_CHECK {
connect_ip <IP ADDRESS>:连接的IP地址。默认是real server的ip地址。
connect_port <PORT>:连接的端口。默认是real server的端口。 默认是25端口
bindto <IP ADDRESS>:发起连接的接口的地址。
bind_port <PORT>:发起连接的源端口。
connect_timeout <INT>:连接超时时间。默认是5s。
fwmark <INTEGER>:使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。

retry <INT>:重试次数。默认是3次。
type <STRING>:DNS query type。A/NS/CNAME/SOA/MX/TXT/AAAA
name <STRING>:DNS查询的域名。默认是(.)
}

MISC_CHECK {
misc_path <STRING>:外部的脚本或程序路径。
misc_timeout <INT>:脚本执行超时时间。
user USERNAME [GROUPNAME]:指定运行该脚本的用户和组。如果没有指定GROUPNAME,则GROUPNAME同USERNAME。
misc_dynamic:根据退出状态码动态调整权重。
0,健康检查成功,权重不变。
1,健康检查失败。
2-255,健康检查成功。权重设置为退出状态码减去2.如退出状态码是250,则权重调整为248
warmup <INT>:指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
}

RS 配置

#!/bin/bash
SNS_VIP=172.19.112.101
. /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;

stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351