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

[经验分享] KeepAlived实现高可用集群LVS

[复制链接]

尚未签到

发表于 2017-10-31 15:50:15 | 显示全部楼层 |阅读模式
前言
    前面介绍过LVS实现负载均衡,通过不同的算法进行调度请求。LVS有一个缺点就是如果后面有一台RSdown了,LVS服务器是无法发现的,调度还是正常进行调度。如果是在实际生产环境中,就会导致有一部分用户无法正常访问。还有一个不足之初LVS本身万一down机了,怎么办呢?LVS虽然很强大,但是功能比较少。这里给大家介绍和LVS绝配的一个软件:keepalived。它既能对IPVS做高可用,还可以最RS对健康性检查,作用有点像ldirectord,但是功能更强大。

keepalived:
    vrrp协议的软件实现,原生设计目的为了高可用ipvs服务。
    功能:
    1、vrrp协议完成地址流动
    2、为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
    3、为ipvs集群的各RS做健康状态检测
    4、基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

注意事项:
    (1) 各节点时间必须同步:ntp, chrony
    (2) 确保iptables及selinux不会成为阻碍
    (3) 各节点之间可通过主机名互相通信(对KA并非必须),建议使用/etc/hosts文件实现
    (4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并非必须)

环境准备:
        两台Keepalived服务器虚拟成一个网络组,对外提供服务。虚拟的IP在实际生产中应为公网IP。

    7e2d56f5cde4ad31d4ec53b3bd870f8f.png-wh_500x0-wm_3-wmp_4-s_26223335.png
2台Keepalived配置,要注意主必须不同的地方(router_id 、state、priority、weight)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
]#yum install -y keepalived
]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     
  }               
   notification_email_from                        <===配置报警邮件地址        
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1                                <===主机名,在另一结点为node2
   vrrp_mcast_group4 224.100.100.100              <===组播地址
}
vrrp_instance VI_1 {                              <===一个vrrp虚拟路由器
    state MASTER                                  <===在另一个结点上为BACKUP,一个主,一个备
    interface eth0                                <===虚拟组ip绑定的接口
    virtual_router_id 22                          <===多个节点必须相同
    priority 100                                  <===优先级,主必须高于备,
    advert_int 1
    authentication {
        auth_type PASS                            <===预共享密钥认证
        auth_pass 0fef0348                        <===随机密码较为安全:openssl rand -hex|-base64  4|12,仅前8位有效
    }
    virtual_ipaddress {
        192.168.32.99/24                          <===虚拟的公网IP
    }
        notify_master "/etc/keepalived/tongzhi.sh master"      <===当主备之间切换的时候发邮件通知,脚本内容见后面
        notify_backup "/etc/keepalived/tongzhi.sh backup"
        notify_fault "/etc/keepalived/tongzhi.sh fault"
}
virtual_server 192.168.32.99 80 {
    delay_loop 6                                    <===服务轮询的时间间隔
    lb_algo wrr                                     <===定义调度方法:rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR                                      <===集群的类型:NAT|DR|TUN
    protocol TCP                                    <====服务协议,仅支持TCP
    sorry_server 127.0.0.1 80                       <===所有RS故障时,备用服务器地址
     
    real_server 192.168.32.9 80 {                   <===定义RS
        weight 2                                    <===权重
        HTTP_GET {
            url {
              path /index.html                      <===定义要监控的URL
                status_code 200                     <===判断上述检测机制为健康状态的响应码
             }                  
            connect_timeout 3                       <===连接请求的超时时长
            nb_get_retry 3                          <===重试次数
            delay_before_retry 3                    <===重试之前的延迟时长
        }
    }
       real_server 192.168.32.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
                status_code 200
             }
            
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
]#cat tongzhi.sh
#!/bin/bash

notify() {
        mailsubject="$(hostname) to be $1, vip floating"
        mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
        echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
        notify master
        ;;
backup)
        notify backup
        ;;
fault)
        notify fault
        ;;
*)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac



RS上配置DR模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
]#cat lvs_rs.sh
#!/bin/bash
vip=192.168.32.99                        <===虚拟的公网IP地址
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



测试:ipvs的规则自动添加进去,当其中一台Keepalived故障后,备份服务器会自动配上虚拟公网IP,提供服务;当RS某一台出现故障时,会自动从规则中删除,恢复正常后会自动加入。在一定范围内实现了高可用。

1
2
3
4
5
6
7
8
9
10
11
12
]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.32.99:80 wrr
  -> 192.168.32.9:80              Route   2      0          0         
  -> 192.168.32.10:80             Route   1      0          0      
]#tcpdump  -i eth0 -nn host 224.100.100.100
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:44:23.381450 IP 192.168.32.111 > 224.100.100.100: VRRPv2, Advertisement, vrid 22, prio 100, authtype simple, intvl 1s, length 20
17:44:24.383358 IP 192.168.32.111 > 224.100.100.100: VRRPv2, Advertisement, vrid 22, prio 100, authtype simple, intvl 1s, length 20



记录日志:
1
2
3
4
5
]#vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 2"
]#vim /etc/rsyslog.conf
local2.*                                                /var/log/keepalived.log
]#systemctl restart rsyslog



运维网声明 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-406308-1-1.html 上篇帖子: keepalived知识梳理 下篇帖子: keepalived双主模式实现nginx高可用及LNAMMP架构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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