keepalived服务
Posted hbyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keepalived服务相关的知识,希望对你有一定的参考价值。
keepalived介绍
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。
但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作;
当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
keepalived服务的三个重要功能
1.管理LVS负载均衡软件
2.实现对LVS集群节点健康检查功能
3.作为系统网络服务的高可用功能
Keepalived的原理
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
那么,什么是VRRP呢?
VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的
keepalived的部署
硬件环境准备
准备4台物理服务器或4台VM虚拟机,两台用来做keepalived服务,两台做测试的web节点
10.0.0.5 172.16.1.5 keepalived主服务器(Nginx主负载均衡器) 10.0.0.6 172.16.1.6 keepalived备服务器 10.0.0.8 172.16.1.8 web1服务器 10.0.0.7 172.16.1.7 web2服务器
CentOS系统及Nginx代理环境
[[email protected] ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@lb01 ~]# uname -r 2.6.32-642.el6.x86_64 [root@lb01 ~]# uname -m x86_64
开始安装keepalived软件
[[email protected] ~]# yum -y install keepalived [root@lb02 ~]# rpm -qa keepalived keepalived-1.2.13-5.el6_6.x86_64 [root@lb01 ~]# /etc/init.d/keepalived start Starting keepalived: [ OK ] [root@lb01 ~]# /etc/init.d/keepalived stop Stopping keepalived: [ OK ]
keepalived配置文件的说明
和其他使用yum安装的软件一样,keepalived软件的配置文件默认路径及配置文件名
[[email protected] ~]# ls -l /etc/keepalived/keepalived.conf
-rw-r--r-- 1 root root 712 Mar 30 06:06 /etc/keepalived/keepalived.conf
keepalived.conf配置文件包含了两个重要的区块
1、全局定义(Global Definitions)部分
#1-13行表示全局配置 global_defs { #全局配置 notification_email { # 定义报警邮件地址 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #定义发送邮件的地址 smtp_server 192.168.200.1 #邮箱服务器 smtp_connect_timeout 30 #定义超时时间 router_id LVS_DEVEL #定义路由标识信息,相同局域网唯一 }
#15-30行 虚拟ip配置 vrrp vrrp_instance VI_1 { #定义实例 state MASTER #状态参数 master/backup 只是说明 interface eth0 #虚IP地址放置的网卡位置 virtual_router_id 51 #同一家族要一直,同一个集群id一致 priority 150 # 优先级决定是主还是备 越大越优先 advert_int 1 #主备通讯时间间隔 authentication { # ↓ auth_type PASS #↓ auth_pass 1111 #认证 } #↑ virtual_ipaddress { #↓ 10.0.0.3/24 dev eth0 label eth0:1 #设备之间使用的虚拟ip地址 } }
keepalived高可用服务单实例实战
实战配置keepalived主服务器lb01 MASTER
global_defs { router_id LVS_01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:2 } }
配置完毕后,启动keepalived
[[email protected] conf]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
检查lb01网卡上应该多了一个IP
[[email protected] conf]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.3/24 scope global secondary eth0:1
实战配置keeplived备服务器lb02 BACKUP
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.0.0.3/24 dev eth0 label eth0:1 } }
启动keeplived
[[email protected] tools]# /etc/init.d/keepalived reload Reloading keepalived: [ OK ] [root@lb02 tools]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0 这里没有10.0.0.3的IP就对了,当主节点活着时候,它不会接管主
这里我把lb01停了,再看看lb02的变化
[[email protected] conf]# /etc/init.d/keepalived stop Stopping keepalived: [ OK ] 在lb02上明显看到多了一个IP [root@lb02 tools]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.3/24 scope global secondary eth0:1
打开后lb01他又自动跳回了
[[email protected] conf]# /etc/init.d/keepalived start Starting keepalived: [ OK ] [root@lb01 conf]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.3/24 scope global secondary eth0:1
keepalived高可用服务器的“裂脑”问题
什么是裂脑
由于某些原因,导致两台高可用服务器对指定的时间内,无法检测到对方的心跳信息,各自取得资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个IP或服务在两段同时存在而发生冲突,最严重的的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写到两段,这可能会导致服务器两段的数据不一致或造成数据丢失,这种情况就被称为裂脑
导致裂闹发生的原因
一般来说,裂脑的发生,有以下几种原因
高可用服务器对之间心跳线链路发生故障,导致无法正常通行
心跳线坏了
网卡及相关的驱动坏了,IP配置及冲突问题
心跳线间的连接的设备故障
仲裁的机器出问题。
高可用服务器上开启了iptables防火墙阻挡了心跳信息传输
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳发送失败
其他服务配置不当的原因,如心跳方式不同,心跳广播冲突,软件BUG等
解决裂脑的常见方案
同时使用串行电缆和以太网连接,同时用两条心跳线路。
当检测到裂脑时强行关闭一个心跳节点
做好对裂脑的监控报警
如果开启了防火墙,一定要让心跳信息通过
keepalived双主模式配置
global_defs { router_id LVS_01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:2 } }
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.0.0.3/24 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:2 } }
分别启动lb01、lb02上的keepalived
[[email protected] ~]# /etc/init.d/keepalived restart Stopping keepalived: [ OK ] Starting keepalived: [ OK ] #lb01上查看 [root@lb01 ~]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.3/24 scope global secondary eth0:1 #lb02上查看 [root@lb02 tools]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.4/24 scope global secondary eth0:2 #断开lb01 [root@lb01 ~]# /etc/init.d/keepalived stop Stopping keepalived: [ OK ] #查看lb02上的变化 [root@lb02 tools]# ip a |grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0 inet 10.0.0.4/24 scope global secondary eth0:2 inet 10.0.0.3/24 scope global secondary eth0:1
解决服务监听的网卡上不存在IP地址问题
如果配置使用”listen 10.0.0.3:80;”的方式指定IP监听服务,而本地的网卡上没有10.0.0.3这个IP,Nginx就会报错
[[email protected] ~]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 10.0.0.3:80 failed (99: Cannot assign requested address) nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test failed
解决方法就是在/etc/sysctl.conf中添加如下内核参数
echo ‘net.ipv4.ip_nonlocal_bind = 1‘ >>/etc/sysctl.conf
最后执行sysctl -p 使上述修改生效
[[email protected] ~]# echo ‘net.ipv4.ip_nonlocal_bind = 1‘ >>/etc/sysctl.conf [root@lb01 ~]# sysctl -p [root@lb01 ~]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
以上是关于keepalived服务的主要内容,如果未能解决你的问题,请参考以下文章