Linux集群高可用之Keepalived 原理 实操~

一.keepalived简介与工作原理:

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器

keepalived工作在IP/TCP协议栈的IP层,TCP层,及应用层,工作原理基于VRRP协议。

  • 网络层:Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包,(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。
  • 传输层:Keepalived以TCP端口的状态来决定服务器工作正常与否,如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
  • 应用层:只要针对应用上的一些探测方式,如URL的get请求,或者对nginx脚本检测等;可以根据用户自定义添加脚本针对特定的服务进行状态检测,当检测结果与用户设定不一致,则把这台服务器从服务器群中剔除。

二.VRRP协议与工作原理

  • VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议是一种容错的主备模式的协议,当网络设备发生故障时,可以不影响主机之间通信情况下进行设备切换,并且相对用户时切换过程时透明的。
  • 路由器开启VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为主用路由器,优先级低的成为备用路由器。主用路由器拥有虚拟IP与虚拟MAC,实现各种网络功能,并发送VRRP通告报文,通知备用路由器组内的其他路由器自己工作正常;备用路由器则启动定时器等待通告报文。抢占模式下,当备用路由器收到VRRP通告报文后,会将自己的优先级与通告报文中的优先级进行比较。如果大于通告报文中的优先级,则成为主用路由器;否则将保持备用状态。非抢占模式下,只要主用路由器不发生故障,就算备用路由器的优先级再高,也始终保持备用状态。如果备用路由器的定时器超时后仍未收到主用路由器发送来的VRRP通告报文,则认为主用路由器已经无法正常工作,备份组内的路由器根据优先级选举出主用路由器。
  • 一个VRRP路由器有唯一的标识:VRID,范围为0—255。该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。
  • 同一台路由器可以加入多个备份组,在不同备份组中有不同的优先级,使得该路由器可以在一个备份组中作为主用路由器,在其他的备份组中作为备用路由器。
  • 提供了两种安全认证措施:明文认证和IP头认证。

三.Linux keepalived的简单实验

1:环境:两台服务器,并且共同维护一个虚拟IP (VIP)

centos7

server1:192.168.211.158  (master)
server2:192.168.211.160
vip: 192.168.211.123

两台服务器都需要安装 keepalived服务 以及进行keepalived.conf的配置文件修改, 如下所示:

yum install -y keepalived  #安装keepalived服务

#MASTER的keepalived.conf文件如下所示

! Configuration File for keepalived
global_defs {
router_id 1    #设备在组中的标识,设置不一样即可
}

vrrp_instance VI_1 {   #VI_1.实例名,两台路由器要相同
state MASTER      #主或者从状态
interface ens33   #监控指定心跳网卡
mcast_src_ip 192.168.211.158    #心跳源IP
virtual_router_id 55     #虚拟路由编号,主备机需要一致
priority 100      #优先级 谁大谁优先  只有两台设备的时候,不配置也不影响
advert_int 1      #心跳间隔 秒为单位  每秒探测一次心跳

authentication {   #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 123456

}

virtual_ipaddress {
192.168.211.123  #主从共同维护的虚拟IP  VIP
}

}

# 在BACKUP那台服务器上只需要修改 router_id, state这两个参数即可, 其它的根据实际情况设置.

实验效果:  通过浏览器访问 http://192.168.211.123, 可以访问到master的web服务, 将master关机之后,仍然可以通过keepalived服务切换到backup主机, 继续访问. 

2: keepalived感知 nginx 服务实验

环境:

server1:192.168.211.158  (master)
server2:192.168.211.160
vip: 192.168.211.123 

需要先在/etc/keepalived目录下编写一个shell脚本, 用来检查nginx服务是否启动,如果没有启动的话将其启动,如果启动失败的话,将会关闭keepalived服务,让备机来工作.

#!/bin/bash

counter=$(netstat -nltp | grep -i 80 | wc -l)

if [ "${counter}" = "0" ];then

        systemctl start nginx
        sleep 5

        counter=$(netstat -nltp | grep -i 80 | wc -l)
        if [ "${counter}" = "0" ];then
        systemctl stop keepalived
        fi
fi

编写完shell脚本之后,修改keepalived.conf的配置文件, 使其通过执行脚本任务,来感知nginx服务状态!

! Configuration File for keepalived
global_defs {
router_id 1         #设备在组中的标识,设置不一样即可
}

vrrp_script chk_nginx {
script "/etc/keepalived/ck_ngx.sh"
interval 2                          # 每隔2s执行脚本
weight -5                           #减去优先级
fall 3                              #尝试三次, 如果无法启动nginx服务,就会降权
}

vrrp_instance VI_1 {                 #VI_1.实例名,两台路由器要相同
state MASTER                         #主或者从状态
interface ens33                      #监控指定心跳网卡
mcast_src_ip 192.168.211.158         #心跳源IP
virtual_router_id 55                 #虚拟路由编号,主备机需要一致
priority 100                         #优先级 谁大谁优先
advert_int 1                         #心跳间隔 秒为单位  每秒探测一次心跳

authentication {                     #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 123456

}

virtual_ipaddress {
192.168.211.123                       #主从共同维护的虚拟IP  VIP
}

track_script {
chk_nginx                             #对应上面的执行脚本策论名
}

}

实现效果: 当master的nginx服务器停掉的时候,keepalived会通过执行脚本,将其重新运行,继续保持工作状态,如果拉取失败的话,会将master的keepalived服务停掉. 使其切换到backup服务器进行工作.

3. keepalived+LVS实验:

环境: 4台服务器(2台作为(LVS+keepalived) 2台作为web真实服务器)

LVS1 + KEEPALIVED1: 192.168.211.158  (ipvsadm安装就行 不需要启动, 因为keepalivd集成了lvs配置)
LVS2 + LEEPALIVED2: 192.168.211.160
WEB1 : 192.168.211.161
WEB2 : 192.168.211.162

步骤1:  配置master的 keepalived文件

! Configuration File for keepalived
global_defs {
router_id Director1                       #目录服务器编号
}

vrrp_instance VI_1 {                      #VI_1.实例名,两台路由器要相同
state MASTER                              #主或者从状态
interface ens33                           #监控指定心跳网卡
virtual_router_id 55                      #虚拟路由编号,主备机需要一致
priority 150                              #优先级 谁大谁优先
advert_int 1                              #心跳间隔 秒为单位  每秒探测一次心跳

authentication {                          #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 1111

}

virtual_ipaddress {
192.168.211.123/24 dev ens33               # LVS对外服务的VIP
}
}

virtual_server 192.168.211.123 80 {         #LVS负载均衡策略配置部分
delay_loop 3                                #服务轮询时间间隔
lb_algo rr                                  #使用rr轮询算法
lb_kind DR                                  #使用DR直接路由模式
protocol TCP

real_server 192.168.211.161 80 {
weight 1
TCP_CHECK {
connect_timeout 3                            #测试超时时间
}
}

real_server 192.168.211.162 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}

master设置完配置文件之后,copy到 backup机子上, 在backup主机上进行相应的修改, 需要修改的参数正常有: router_id,  state, priority 

backup主机的配置文件如下:

! Configuration File for keepalived
global_defs {
router_id Director2 #目录服务器编号
}

vrrp_instance VI_1 { #VI_1.实例名,两台路由器要相同
state BACKUP   #主或者从状态
interface ens33   #监控指定心跳网卡
virtual_router_id 55   #虚拟路由编号,主备机需要一致
priority 100   #优先级 谁大谁优先
advert_int 1   #心跳间隔 秒为单位  每秒探测一次心跳

authentication {   #密码认证,防止非法服务器加入集群
auth_type PASS
auth_pass 1111

}

virtual_ipaddress {
192.168.211.123/24 dev ens33  # LVS对外服务的VIP
}
}

virtual_server 192.168.211.123 80 {  #LVS负载均衡策略配置部分
delay_loop 3 #服务轮询时间间隔
lb_algo rr  #使用rr轮询算法
lb_kind DR  #使用DR直接路由模式
protocol TCP

real_server 192.168.211.161 80 {
weight 1
TCP_CHECK {
connect_timeout 3  #测试超时时间
}
}

real_server 192.168.211.162 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}

步骤2:配置2台web主机

首先  对web服务器进行回环接口VIP配置,使其能够将相应报文直接回复给客户端.如下:先新增一个虚拟网卡lo:0    Linux集群高可用之Keepalived 原理 实操~_第1张图片

[root@localhost network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.211.123
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes

其次进行路由规则配置: 确保如果请求的目的地址是VIP, 那么让出去的数据包的源地址也显示为VIP

 Linux集群高可用之Keepalived 原理 实操~_第2张图片

 最后配置sysctl.conf文件,让web主机忽略arp请求,但是可以进行发送.

[root@localhost ~]# vi /etc/sysctl.conf


# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#忽略arp请求,可以回复

两台web服务器一样配置即可. 最后通过访问192.168.211.123 可以轮询的访问到两台web服务器的httpd页面, 即使其中一台LVS宕机了, 用户仍然可以继续进行访问.

你可能感兴趣的:(Linux服务应用,linux,服务器,运维,负载均衡)