faith丶

导航

Keepalived部署使用

###

1、 keepalived软件能干什么?

Keepalived软件起初是专为LVS负载均衡软件设计的,
用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能

①. 管理LVS负载均衡软件
②. 实现对LVS集群节点健康检查功能 
③. 作为系统网络服务的高可用功能

2、keepalived软件工作原理?

1)VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2)VRRP是通过一种竞选协议机制来讲路由任务交给某台VRRP路由器的
3)VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的。
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
5)VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐使用铭文的方式配置认证类型和密码

keepalived服务工作原理:
    keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过精选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,
然后顶替主节点对外提供服务。 在keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度
最快可以小于1秒。


3、服务器规划

服务器 IP
master(keepalived主节点) 10.19.150.37
backup(keepalived备节点) 10.19.150.38
virtual_ipaddress(虚拟IP) 10.19.150.210

4、部署、启动keepalived

4.1、yum部署keepalived

yum install -y keepalived
cd /etc/keepalived/
cp keepalived.conf{,.ori}

4.2、 keepalived.conf文件详解

基础参数说明:
第1行:注释,!号开头和#号开头一样,都是注释
第2行:是空行
第3~8行:定义服务故障报警的Email地址。作用是当服务发生切换或RS节点等有故障时,发报警邮件,这几行是可选配置,notification_email指定在keepalived发生事件时,需要发送Email地址,可以有多个,每行一个。
第9行:指定发送邮件的发送人,即发件人地址,也是可选的配置。
第10行:smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。
第11行:smtp_connect_timeout是连接smtp的超时时间,也是可选配置。
第12行:keepalived服务器的路由标识(router_id),在一个局域网内,这个标识(router_id)应该是唯一的。
大括号"{}":用来分隔区块,要成对出现。如果漏写了半个大括号,keepalived运行时,不会报错,但也不会得到预期的结果。另外,由于区块间存在多层嵌套关系,因此很容易遗漏区块结尾处的大括号,要特别注意。
更多参数信息请执行man keepalived.conf获得。

4.3、主服务器keepalive配置文件    #master服务器

cat > /etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_01
}
# vrrp_instance,实例名出自实例组group所包含的那些名字。  
vrrp_instance VI_1 {     # 定义keepalived实例信息,主备节点实例标识相同
    state MASTER         # 定义实例中主备状态角色(MASTER/BACKUP)
    interface eth0       # 设置主备服务器IP地址防止网卡位置
    virtual_router_id 51 # 虚拟路由ID标识,不同实例不同,主备相同
    priority 150         # 优先级,高优先级竞选为master
    advert_int 1         # 检查间隔,默认1秒
    authentication {     # 主备之间通过认证建立连接
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {  # 定义主备服务器之间使用的虚拟IP,可多设,每行一个
     10.19.150.210/24
    }
}
#虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。 
#该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在viyual_server模块中的,是子模块。 virtual_server
10.19.150.210 80 { # 定义对外提供服务的LVS的VIP以及port delay_loop 6             # 设置健康检查时间,单位是秒 lb_algo wrr             # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR             # 负载均衡转发规则NAT|DR|RUN nat_mask 255.255.255.0 persistence_timeout 50 # 会话保持时间 protocol TCP    # 指定转发协议类型,有TCP和UDP两种 real_server 10.19.150.37 80 { # 指定real server1的IP地址 weight 1 TCP_CHECK { connect_timeout 8 # 连接超时时间 nb_get_retry 3 # 重连次数 delay_before_retry 3 # 重连间隔时间 connect_port 80 #健康检查的端口 } } real_server 10.19.150.38 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
EOF

4.4、备服务器keepalive配置文件    #backup服务器配置文件

cat > /etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     10.19.150.210/24
    }
}

virtual_server 10.19.150.210 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 10.19.150.37 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80 
        }
    }
    real_server 10.19.150.38 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
EOF

4.5、启动keepalived

systemctl start keepalived.service

5、master服务器查看虚ip

[root@rd keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    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 1e:00:14:00:00:23 brd ff:ff:ff:ff:ff:ff
    inet 10.19.150.37/24 brd 10.19.150.255 scope global dynamic eth0
       valid_lft 1894001sec preferred_lft 1894001sec
    inet 10.19.150.210/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::1c00:14ff:fe00:23/64 scope link 
       valid_lft forever preferred_lft forever

 6、keepalived脑裂

6.1、什么是脑裂

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP 或服务在两端同时
存在而发生冲突,最严重的是两台主机占用同一个VIP 地址,当用户写入数据时可能会分别写入到两端 ,这可能会导致服务器两端的数据不一致或造成数据丢失 ,这种情况就被称为裂脑。

6.2、脑裂出现的原因

一般来说,裂脑的发生,有以下几种原因∶
  高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
    心跳线坏了(包括断了,老化)。、
    网卡及相关驱动坏了, IP 配置及冲突问题(网卡直连)。
    心跳线间连接的设备故障(网卡及交换机)。
    仲裁的机器出问题(采用仲裁的方案)。。   高可用服务器上开启了iptables 防火墙阻挡了心跳消息传输。   高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件 Bug 等。 提示∶Keepalived配置里同一VRRP实例如果virtual_router_id 两端参数配置不一致,也会导致裂脑问题发生。
模拟keepalived脑裂情况:   
1、 防火墙开启状态     开启防火墙即可模拟出脑裂的情况     /etc/init.d/iptables start   2、 心跳线断掉   3、 nginx 关闭

6.3、脑裂情况解决方案

在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生∶
  1、同时使用串行电缆和以太网电缆连接 ,同时用两条心跳线路 ,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
  2、当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如 Stonith、fence )。相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源。
  3、做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息发送到管理员手机上,管理员可以通过手机
  回复对应数字或简单的字符串操作返回给服务器 ,让服务器根据指令自动处理相应故障,这样解决故障的时间更短。 当然 ,在实施高可用方案时 ,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务,这个损失是可容忍的。

监控备服务器,及时关注是否发生脑裂:
  告警条件:
    只要被服务器上出现了VIP
  备服务器出现VIP情况
    脑裂情况出现
    正常主备切换也会在备服务器出现VIP
  编写监控脑裂脚本:
vim check_keepalived.sh
#!/bin/bash
while true
do
if [ `ip a show eth0 |grep 10.0.0.3|wc -l` -ne 0 ]
then
    echo "keepalived is error!"
else
    echo "keepalived is OK !"
fi
done

 

 

###

posted on 2021-09-27 17:29  faith丶  阅读(467)  评论(0编辑  收藏  举报