LVS+Keepalived群集

Keepalived及其工作原理:

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

Keepalived体系主要模块及其作用:

keepalived体系架构中主要有三个模块,分别是core、check和vrrp。

●core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。

●vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)

●check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

一个合格的群集应该具备的特点:

1)负载均衡 用于提高群集的性能 LVS Nginx HAProxy SLB F5

2)健康检查(探针) 针对于调度器和节点服务器 Keepalived Heartbeat

3)故障转移 通过VIP漂移实现主备切换 VRRP 脚本

健康检查(探针)常用的工作方式:

1)发送心跳消息 vrrp报文 ping/pong

2)TCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常

3)HTTP URL检查 向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET 请求方法,如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常

如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常

Keepalived工作原理:

Keepalived 是基于 VRRP 协议实现的高可用方案。

默认情况下通过优先级决定主备服务器的角色(优先级最高的为主),主服务器(MASTER)会通过ip命令在本地生成VIP,接收并处理客户端发送的请求消息;同时主服务器还会定时发送VRRP报文给备服务器(BACKUP)告知主服务器的存活状态。当主服务器异常时,备服务器就会接管VIP(也是通过ip命令生成VIP),继续提供服务,保证服务的高可用。

Keepalived的工作模式:

  • 抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
  • 非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)

脑裂故障:

现象:主服务器和备服务器都同时拥有相同的VIP

原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP

解决:关闭主服务器或备服务器其中一个的keepalived服务

预防:(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输

(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信

(3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务

(4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务

实验:

如何部署Keepalived

【1】先去官网下载:
【2】初始化:
[root@l4 ~]# systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@l4 ~]# setenforce 0
[root@l4 ~]# vim /etc/selinux/config 
[root@l4 ~]# 
(1)挂载yum
[root@l4 ~]# df
文件系统                   1K-块    已用     可用 已用% 挂载点
devtmpfs                 1913544       0  1913544    0% /dev
tmpfs                    1930624       0  1930624    0% /dev/shm
tmpfs                    1930624   12744  1917880    1% /run
tmpfs                    1930624       0  1930624    0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 4578304 34191876   12% /
/dev/sda1                1038336  191104   847232   19% /boot
tmpfs                     386128      40   386088    1% /run/user/0
/dev/sr0                 4635056 4635056        0  100% /run/media/root/CentOS 7 x86_64
[root@l4 ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@l4 ~]# 
(2)下载
[root@l4 ~]# df          //下载keepalived
文件系统                   1K-块    已用     可用 已用% 挂载点
devtmpfs                 1913544       0  1913544    0% /dev
tmpfs                    1930624       0  1930624    0% /dev/shm
tmpfs                    1930624   12744  1917880    1% /run
tmpfs                    1930624       0  1930624    0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 4578976 34191204   12% /
/dev/sda1                1038336  191104   847232   19% /boot
tmpfs                     386128      40   386088    1% /run/user/0
/dev/sr0                 4635056 4635056        0  100% /mnt
[root@l4 ~]# cd /mnt/Packages/
[root@l4 Packages]# ls | grep keepalived
keepalived-1.3.5-19.el7.x86_64.rpm
[root@l4 Packages]# 
(3)在线下载(这里我们使用在线下载)
[root@l4 Packages]# cd /etc/yum.repos.d/
[root@l4 yum.repos.d]# ls
local.repo  repo.bak
[root@l4 yum.repos.d]# mv repo.bak/* .           //在线源挪出来
[root@l4 yum.repos.d]# mv local.repo repo.bak/     //本地源移进去
[root@l4 yum.repos.d]# 

[root@l4 yum.repos.d]# ls
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo
CentOS-CR.repo         CentOS-Media.repo      CentOS-x86_64-kernel.repo
CentOS-Debuginfo.repo  CentOS-Sources.repo    repo.bak
[root@l4 yum.repos.d]# yum install -y epel-release

[root@l4 yum.repos.d]# yum install -y keepalived
(4)也可以源码编译安装,配置方法基本相同

关闭同步

【3】修改配置:

主 (五号机):
[root@l5 yum.repos.d]# cd /etc/keepalived/
[root@l5 keepalived]# ls
keepalived.conf
[root@l5 keepalived]# vim keepalived.conf 

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_01
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.18.100
    }
}
备 (四号机):
[root@l4 ~]# cd /etc/keepalived/
[root@l4 keepalived]# ls
keepalived.conf
[root@l4 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@l4 keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.18.100
    }
}

主(5号机):

[root@l5 keepalived]# systemctl start keepalived.service 
[root@l5 keepalived]# systemctl enable keepalived.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@l5 keepalived]# 

备服务器也同上

systemctl start keepalived.service
systemctl enable keepalived.service

主:

备:

主: 防火墙没有关,关闭防火墙

[root@l5 keepalived]# systemctl stop firewalld.service    

备服务器也如上操作这个时候如果关闭主 keepalived

[root@l5 keepalived]# systemctl stop keepalived.service 

没有vip地址

备 有VIP地址

抢占模式:MASTER节点从故障中恢复后,会将VIP从BACKUP节点中抢占过来。


主打开keepalived

[root@l5 keepalived]# systemctl start keepalived.service
[root@l5 keepalived]# vim keepalived.conf
[root@l5 keepalived]# systemctl stop keepalived.service 

备 :

[root@l4 keepalived]# systemctl stop keepalived.service

非抢占模式:MASTER节点恢复后不抢占VIP。(主备节点的state都配置为BAKCUP,且都添加配置nopreempt)

不再按照优先级,而是按照启动顺序


LVS+Keepalived高可用负载均衡 :

打开上一篇的节点服务器,nfs存储服务器

由于虚拟机冲突,这里我们把四号机改成nfs,一号机接替他的工作(备)

[root@localhost ~]# showmount -e    //nfs
Export list for localhost.localdomain:
/share/xy102 192.168.18.0/24
/share/xy101 192.168.18.0/24
[root@localhost ~]# 

两个节点服务器

节点服务器:

二号机

[root@l2 ~]# cd /etc/sysconfig/network-scripts/
[root@l2 network-scripts]# vim ifcfg-lo:0

[root@l2 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@l2 network-scripts]# 

[root@l2 network-scripts]# route -n    //路由
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.18.2    0.0.0.0         UG    100    0        0 ens33
192.168.18.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@l2 network-scripts]# 

[root@l2 network-scripts]# route add -host 192.168.18.100 dev lo:0  //添加路由(临时添加)
[root@l2 network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.18.2    0.0.0.0         UG    100    0        0 ens33
192.168.18.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.18.100  0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
[root@l2 network-scripts]# 
[root@l2 network-scripts]# vim /etc/sysconfig/static-routes   //永久添加路由

any host 192.168.18.100 dev lo:0
[root@l2 network-scripts]# systemctl restart network

三号机

同上一样

ifconfig

sysctl -p

vim /etc/sysconfig/static-routes

___________________________________________________
any host 192.168.18.100 dev lo:0
___________________________________________________

systemctl restart network

route -n

开始配置

【4】配置负载调度器(主、备相同)以下两台主备服务器都要操作:

[root@l1 ~]# systemctl stop keepalived.service
[root@l1 ~]# yum install -y ipvsadm    //两台主备服务器都要下载(1号机,5号机)

[root@l5 ~]# modprobe ip_vs      //两台主备服务器都要加载模块

[root@l1 ~]# lsmod | grep ip_vs   //两台主备服务器都要模块已经加载好了
ip_vs                 145458  0 
nf_conntrack          139264  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack
[root@l1 ~]# 

[root@l1 ~]# touch /etc/sysconfig/ipvsadm    //两台主备服务器都要  ipvsadm启动起来
[root@l5 ~]# systemctl start ipvsadm.service  //主服务器
[root@l5 ~]# systemctl enable ipvsadm.service  //主服务器
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
[root@l5 ~]# 

[root@l1 ~]# systemctl enable --now ipvsadm   //备服务器

[root@l1 ~]# systemctl status ipvsadm.service  //两台主备服务器都要  检查状态

配置keeplived(主、备DR 服务器上都要设置):

[root@l5 ~]# cd /etc/keepalived/
[root@l5 keepalived]# ls
keepalived.conf  keepalived.conf.bak
[root@l5 keepalived]# cp keepalived.conf.bak keepalived.conf
cp:是否覆盖"keepalived.conf"? y

[root@l5 keepalived]# vim keepalived.conf

(1)配置keeplived(主、备DR 服务器上都要设置)
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs {						#定义全局参数
--10行--修改,邮件服务指向本地
	smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
	router_id LVS_01
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
	#vrrp_strict
}

vrrp_instance VI_1 {				#定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
    state MASTER
--21行--修改,指定承载vip地址的物理接口
    interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致	
    virtual_router_id 10
	#nopreempt		#如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
    priority 100
    advert_int 1					#通告间隔秒数(心跳频率)
    authentication {				#定义认证信息,每个热备组保持一致
		auth_type PASS				#认证类型
--27行--修改,指定验证密码,主备服务器保持一致
        auth_pass abc123
    }
    virtual_ipaddress {				#指定群集vip地址
        192.168.80.188
    }
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.80.188 80 {
    delay_loop 6					#健康检查的间隔时间(秒)
    lb_algo rr						#指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
    lb_kind DR
    persistence_timeout 0			#连接保持时间(秒)
    protocol TCP					#应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
    real_server 192.168.80.12 80 {
        weight 1					#节点的权重
--45行--删除,添加以下健康检查方式		
        TCP_CHECK {
			connect_port 80			#添加检查的目标端口
			connect_timeout 3		#添加连接超时(秒)
			nb_get_retry 3			#添加重试次数
			delay_before_retry 3	#添加重试间隔
		}
	}

	real_server 192.168.80.13 80 {		#添加第二个 Web节点的地址、端口
        weight 1
        TCP_CHECK {
			connect_port 80
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}
##删除后面多余的配置##
}


systemctl start keepalived
ip addr						#查看虚拟网卡vip

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_01
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.18.100
    }
}

virtual_server 192.168.18.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.18.20 80 {
        weight 1
        TCP_CHECK {
            connetc_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.18.30 80 {
        weight 1
        TCP_CHECK {
            connetc_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

[root@l5 keepalived]# scp keepalived.conf 192.168.18.10:`pwd`   //复制到另一台备服务器
The authenticity of host '192.168.18.10 (192.168.18.10)' can't be established.
ECDSA key fingerprint is SHA256:PzjuREbX063cokEwp/v3k5xRLoPVZ07ik8g9RMXp4rE.
ECDSA key fingerprint is MD5:aa:ba:2e:89:05:cb:b1:af:37:32:c6:10:77:ea:07:30.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.18.10' (ECDSA) to the list of known hosts.  
//出现这个输入a
root@192.168.18.10's password:  //输入密码
keepalived.conf                                                                                                                   100% 1079     2.2MB/s   00:00    
[root@l5 keepalived]# 

备:

[root@l1 keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.18.100
    }
}

virtual_server 192.168.18.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.18.20 80 {
        weight 1
        TCP_CHECK {
            connetc_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.18.30 80 {
        weight 1
        TCP_CHECK {
            connetc_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

主:

[root@l5 keepalived]# systemctl start keepalived.service 
[root@l5 keepalived]# 

备:

[root@l1 keepalived]# systemctl start keepalived.service 
[root@l1 keepalived]#

主:

[root@l5 keepalived]# 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.18.100:80 rr
  -> 192.168.18.20:80             Route   1      0          0         
  -> 192.168.18.30:80    

备:

测试: 把主关了

备:


Keepalived脑裂故障

脑裂故障

现象:主服务器和备服务器都同时拥有相同的VIP

原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP

解决:关闭主服务器或备服务器其中一个的keepalived服务

预防:

(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输

(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信

(3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务

(4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务

#主服务器脚本
 
#!/bin/bash
while true
do
ping -c4 -i 0.5 -W 2 备服务器IP
    if 「 $? -ne 0 ]
    then ssh 另一台主机IP ping -c 4 -i 0.5 -W2 -I 另一台主机IP 备服务器IP
        if [ $? -eg 0 ]
            then systemctl stop keepalived
        fi
    fi
sleep 20
done
相关推荐
中云DDoS CC防护蔡蔡43 分钟前
微信小程序被攻击怎么选择高防产品
服务器·网络安全·微信小程序·小程序·ddos
远歌已逝2 小时前
维护在线重做日志(二)
数据库·oracle
HPC_fac130520678162 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
yaoxin5211233 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
qq_433099403 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz3 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺5 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i6 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl6 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql