目录
一、keepalived介绍
keeplived 软件起初是专门为LVS 负载均衡 软件设置的,用来管理并监控LVS集群中各个服务节点的状态,后来加入了可以实现高可用的VRRP 功能。因此,keepalived除了能管理LVS 集群以外,还可以为其它服务(如:Nginx、Haproxy、Mysql等)实现高可用。
keepalived 软件主要是通过 VRRP 协议 实现高可用的功能。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的速写,VRRP出现的目的就是为了解决静态路由单点故障的问题,它能保证当个别节点出现问题时,整个网络可以不间断的运行。
1、keepalived功能
①Keepalived是一款专为LVS 和HA 设计的一款健康检查工具
②支持故障自动切换、支持节点健康状态检查
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
2、VRRP通信原理
1、在网络中,主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,服务就会中断,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
2、VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时进行设备切换而不影响主机之间的数据通信。
3、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
4、工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对
5、VRRP路由器在运行过程中有三种状态:①Initialize状态:系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;② Master状态;③ Backup状态;一般主路由器处于Master状态,备份路由器处于Backup状态。
6、VRRP选举机制
①VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
②比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
③比较IP地址。在没有Ip地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。
7、VRRP通过一竞选协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。
3、keepalived服务的工作原理
1、Keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
2、在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
4、保证高可用性
一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
二、LVS-RD和keepalived集群配置
在LVS-RD实验的基础上增加一台虚拟机 作为zwb_dr2
1、LVS-RD以之前的博客作为基础
2、配置zwb_dr2(主)
##关闭防火墙及安全信息中心
[root@zwb_rd2 ~]# systemctl stop firewalld
[root@zwb_rd2 ~]# systemctl disable firewalld
[root@zwb_rd2 ~]# setenforce 0
setenforce: SELinux is disabled
###编译安装 nginx,前面博客有
###安装ipvsadm
[root@zwb_rd2 ~]# yum -y install ipvsadm keepalived
[root@zwb_rd2 ~]# modprobe ip_vs ## 加载模块信息
[root@zwb_rd2 ~]# cat /proc/net/ip_vs ## 查看ipvs 版本信息
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@zwb_rd2 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm ## 创建一个ipvsadm的一个配置文件
[root@zwb_rd2 ~]# systemctl start ipvsadm ## 启动
[root@zwb_rd2 ~]# systemctl enable ipvsadm ##设置开机启动
### 配置负载均衡策略
[root@zwb_rd2 ~]# ipvsadm -C #### 清空原有配置
[root@zwb_rd2 ~]# ipvsadm -A -t 192.168.159.100:80 -s rr ### 添加一台虚拟主机,设置IP及端口
[root@zwb_rd2 ~]# ipvsadm -a -t 192.168.159.100:80 -r 192.168.159.10:80 -g ## 添加真实主机
[root@zwb_rd2 ~]# ipvsadm -a -t 192.168.159.100:80 -r 192.168.159.11:80 -g ## 添加真实主机
## 添加虚拟子接口ens33:0
[root@zwb_rd2 ~]# cd /etc/sysconfig/network-scripts/
[root@zwb_rd2 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@zwb_rd2 network-scripts]# vim ifcfg-ens33:0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.159.100 ###修改为VIP
PREFIX=24
#GATEWAY=192.168.159.2
#DNS1=114.114.114.114
IPV6_PRIVACY=no
[root@zwb_rd2 network-scripts]# systemctl restart network ##重启网络服务
## 配置sysctl.conf 文件
[root@zwb_rd2 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@zwb_rd2 ~]# sysctl -p ## 刷新生效
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
##配置keepalived.conf文件,清空原先配置
[root@zwb_rd2 ~]# vim /etc/keepalived/keepalived.conf
global_defs { # 定义全局参数
router_id lvs_01 # 定义热备组角色(每个节点不能一样)
}
vrrp_instance vi_1 { ## 定义VRRP的实例配置
state MASTER # 指定热备状态,主为master,备为backup
interface ens33 # 指定承载vip地址的物理接口
virtual_router_id 51 # 指定虚拟路由器的ID号,每个热备组保持一致
priority 110 # 7指定优先级,数值越大越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress { ## 定义VIP地址
192.168.159.100
}
}
virtual_server 192.168.159.100 80 { #指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
lb_algo rr #定义轮询规则
lb_kind DR #指定集群工作模式,直接路由DR
persistence_timeout 6 #健康检查的间隔时间
protocol TCP #应用服务采用的是TCP协议
real_server 192.168.159.10 80 { #定义后端真实服务器的参数
weight 1 #节点权重
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.159.11 80 { #指定第二个web节点的地址,端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@zwb_dr2 ~]# systemctl start keepalived.service ##启动
2、配置zwb_dr1(增加配置)(备)
[root@zwb_dr1 ~]# yum -y install keepalived.x86_64 ##安装
[root@zwb_rd2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lvs_02 ##定义热备组
}
vrrp_instance vi_1 {
state BACKUP ##定义BACKUP
interface ens33
virtual_router_id 51
priority 105 ##优先级低于master
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
192.168.159.100
}
}
virtual_server 192.168.159.100 80 {
lb_algo rr
lb_kind DR
persistence_timeout 6
protocol TCP
real_server 192.168.159.10 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.159.11 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@zwb_dr1 ~]# systemctl start keepalived.service ##启动
3、查看VIP飘在那个服务器上
①查看keepalived(主)
主机名:[root@zwb_rd2 ~]# hostname
zwb_rd2
②查看keepalived(备)
主机名:[root@zwb_rd1 ~]# hostname
zwb_rd21
验证:
查看LVS-DR是否工作正常,正常情况下均工作在主设备master上,主机名zwb_rd2
模拟master宕机了。看VIP是否漂移
查看keepalived(备)的ip,发现VIP已经漂移成功
打开浏览器实验