一、Keepalived案例分析

1、Keepalived工具介绍

(1)专为LVS和HA设计的一款健康检查工具

①支持故障自动切换

②支持节点健康检查

③官方网站:https://www.keepalived.org/

2、Keepalived原理实现

(1)Keepalived采用ARRP热备份协议实现Linux服务器的多机热备功能

(2)VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案

①由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务

②VRRP协议为每一个路由设备定义一个虚拟路由ID(VRID)以及优先级

每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态

④若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

(3)双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器

(4)实现基于Web服务的双机热备

①VIP漂移地址:192.168.10.200

②主服务器:192.168.10.128

③备服务器:192.168.10.129

④提供的应用服务:Web

3、配置Keepalived服务器

(1)Keepalived配置目录位于/etc/Keepalived

(2)Keepalived是主配置文件

①global_defs {…} 区段指定全局参数

②vrrp_instance 实例名称 {…} 区段指定VRRP热备参数

③注释文字以“!”符号开头

④目录samples,提供了许多配置样例作为参考

二、案例:搭载负载均衡+高可用群集

虚拟机编号

设备名称

IP地址

备注

第一台

lvs-master

ens33=192.168.10.128/24 nat模式

第二台

lvs-backup

ens33=192.168.10.129/24 nat模式

第三台

web01

ens33=192.168.10.130/24 nat模式

lo:0=192.168.10.200/32

lo:0子网掩码255.255.255.255

第四台

web02

ens33=192.168.10.131/24 nat模式

lo:0=192.168.10.200/32

lo:0子网掩码255.255.255.255

第五台

nfs

ens33=192.168.10.135/24 nat模式

1、五台虚拟机配置IP地址

2、五台虚拟机配置yum源,关闭防火墙和内核安全机制

[root@localhost ~]# yum clean all && yum makecache

[root@localhost ~]# systemctl disable firewalld --now

[root@localhost ~]# setenforce 0

3、五台虚拟机修改主机名

[root@localhost ~]# hostnamectl set-hostname  lvs-master

[root@localhost ~]# hostnamectl set-hostname  lvs-backup

[root@localhost ~]# hostnamectl set-hostname  web01

[root@localhost ~]# hostnamectl set-hostname  web02

[root@localhost ~]# hostnamectl set-hostname  nfs

[root@localhost ~]# bash

4、五台虚拟机配置hosts文件

[root@localhost ~]# cat >> /etc/hosts << EOF
192.168.10.128 lvs-master
192.168.10.129 lvs-backup
192.168.10.130 web01
192.168.10.131 web02
192.168.10.135 nfs
EOF

2、双机热备搭建

(1)搭建lvs-master(第一台)

[root@lvs-master ~]# yum -y install keepalived ipvsadm

补充

[root@lvs-master ~]# rpm -qc keepalived  #查看rpm包的文件路径

[root@lvs-master ~]# cd /etc/keepalived/

[root@lvs-master keepalived]# cp keepalived.conf{,.bak}
[root@lvs-master keepalived]# vim keepalived.conf
  1 ! Configuration File for keepalived  #这是keepalived的注释信息
#global_defs模块下(4-16行)只保留第12行“router_id LVS_DEVEL”内容,其余删除
  3 global_defs {  #全局配置项
  4    router_id LVS_01  #修改服务器名称
  5 }
  6 
  7 vrrp_instance VI_1 {  #定义虚拟路由冗余协议
  8     state MASTER  #热备状态,master代表主服务器
  9     interface ens33  #绑定VIP地址的接口的网卡
 10     virtual_router_id 51  #设备的身份标识,0-255,同一个热备组保持一致
 11     priority 100  #虚拟路由器的优先级,范围1-254,数值越大优先级越高
 12     advert_int 1  #vrrp通告间隔时间,默认为1s
 13     authentication {  #认证
 14         auth_type PASS  #认证类型,同一个热备组保持一致
 15         auth_pass 1111  #认证密码,同一个热备组保持一致
 16     }
 17     virtual_ipaddress {
 18         192.168.10.200  #虚拟VIP,可以有多个,不指定prefix,默认32
 19     }
 20 }
 22 virtual_server 192.168.10.200 80 {  #虚拟服务器VIP地址与端口
 23     delay_loop 15  #检查后端服务器的时间间隔
 24     lb_algo rr  #负载调度算法,使用的是轮询算法
 25     lb_kind DR  #负载均衡集群的工作类型
 26    !persistence_timeout 50  #添加注释。会话连接时长,lvs在多少时间内没有与后端服务器进行通讯,就会自动断开
 27     protocol TCP  #指定协议类型
 28
 29     real_server 192.168.10.130 80 {  #后端服务器ip地址与端口
 30         weight 1  #权重值
#删除31-39行内容,然后再30行下方添加两行
 31     TCP_CHECK {  #使用TCP协议检查
 32         connect_port 80  #客户端请求端口
 33         connect_timeout 3  #客户端请求的超时时间
 34         nb_get_retry 3  #重试连接次数
 35         delay_before_retry 4  #重试连接的间隔时间(秒)
 36         }
 37     }
#复制28-37行内容到37行下方
 38 
 39     real_server 192.168.10.131 80 {  #将复制后的地址改为131
 40         weight 1  #轮询算法权重值相同
 41     TCP_CHECK {
 42         connect_port 80
 43         connect_timeout 3
 44         nb_get_retry 3
 45         delay_before_retry 3
 46         }
 47     }
 48 }
#删除49行以下内容
[root@lvs-master keepalived]# systemctl start keepalived  #启动
[root@lvs-master keepalived]# ip add show dev ens33  #发现VIP地址在当前主master上
    inet 192.168.10.200/32 scope global ens33

(2)搭建lvs-backup(第二台)

[root@lvs-backup ~]# yum -y install keepalived ipvsadm
[root@lvs-backup ~]# cd /etc/keepalived/
[root@lvs-backup keepalived]# cp keepalived.conf{,.bak}
#在lvs-master第一台上输入命令将配置文件传输到此虚拟机上
(在lvs-master虚拟机输入命令)[root@lvs-master keepalived]# scp keepalived.conf root@192.168.10.129:`pwd`
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.10.129's password: 123456
keepalived.conf            100%  812   594.8KB/s   00:00  #将配置文件传输到lvs-backup虚拟机上
[root@lvs-backup keepalived]# vim keepalived.conf  #进入配置文件,与lvs-master相同
  4    router_id LVS_02  #将“01”改为“02”
  8     state BACKUP  #将“MASTER”改为“BACKUP”
 11     priority 99  #将“100”改为“99”,优先级小于主服务器
[root@lvs-backup keepalived]# systemctl start keepalived

(3)验证双机热备是否搭建成功

①在lvs-master(第一台)停止keepalived服务

[root@lvs-master keepalived]# systemctl stop keepalived

②在lvs-backup(第二台)输入命令查看

[root@lvs-backup keepalived]# ip add show dev ens33
    inet 192.168.10.200/32 scope global ens33  #地址漂移到lvs-backup服务器上

③启动lvs-master(第一台)的keepalived服务

[root@lvs-master keepalived]# systemctl start keepalived
[root@lvs-master keepalived]# ip add show dev ens33
    inet 192.168.10.200/32 scope global ens33  #漂移地址又回到lvs-master服务器上

3、第三、四台虚拟机搭建DR模式的Web节点配置

(1)设置本地回环地址

[root@web01 ~]# cd /etc/sysconfig/network-scripts/
[root@web01 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web01 network-scripts]# cat > ifcfg-lo:0 << EOF
DEVICE=lo:0
IPADDR=192.168.10.200
NETMASK=255.255.255.255
ONBOOT=yes
EOF
[root@web01 network-scripts]# systemctl restart network
[root@web01 network-scripts]# ifconfig  #查看lo:0网卡配置

(2)添加VIP本地路由

[root@web01 ~]# route add -host 192.168.10.200 dev lo:0
[root@web01 ~]# echo 'route add -host 192.168.10.200 dev lo:0' >>/etc/rc.local  #将策略写入开机自启动脚本里
[root@web01 ~]# route -n  #查看网络策略

(3)调整 proc 响应参数

[root@web01 ~]# vim /etc/sysctl.conf
#在末尾添加
net.ipv4.conf.all.arp_ignore = 1  #忽略arp广播数据包,不允许RIP接收请求包
net.ipv4.conf.all.arp_announce = 2  #匹配精确RIP地址回包
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
#详情请查看:https://www.jianshu.com/p/a682ecae9693内容
[root@web01 ~]# sysctl -p  #生效配置文件

(4)web网站节点的配置

[root@web01 ~]# yum -y install httpd
[root@web01 ~]# vim /var/www/html/index.html  #写测试网页
#web01(第一台虚拟机)添加内容
<h1>web01</h1>
#web02(第二台虚拟机)添加内容
<h1>web02</h1>
[root@web01 ~]# systemctl start httpd
[root@web01 ~]# systemctl enable httpd
浏览器输入192.168.10.130和192.168.10.131查看网页

4、搭建nfs共享服务

(1)在nfs(第五台)上安装nfs-utils和rpcbind软件包,并发布nfs共享目录

[root@nfs ~]# yum -y install nfs-utils rpcbind
[root@nfs ~]# systemctl enable nfs
      
[root@nfs ~]# systemctl enable rpcbind

[root@nfs ~]# mkdir -p /opt/wwwroot  #创建网站发布共享目录

[root@nfs ~]# vim /etc/exports  #nfs共享配置文件
/opt/wwwroot   192.168.10.0/24(rw,sync,no_root_squash)

[root@nfs ~]# systemctl start rpcbind

[root@nfs ~]# systemctl start nfs

[root@nfs ~]# netstat -anpt | grep rpcbind  #查看端口号为111

[root@nfs ~]# showmount -e  #查看本机发布的nfs共享目录
Export list for nfs:
/opt/wwwroot 192.168.10.0/24


(2)在两个web节点(第三、四台)中分别挂载nfs共享资源

[root@web01 ~]# yum -y install rpcbind
[root@web01 ~]# systemctl enable rpcbind
[root@web01 ~]# systemctl start rpcbind
#补充:最小化安装使用showmount命令需要安装 yum -y install nfs-utils
[root@web01 ~]# showmount -e 192.168.10.135  #查看共享目录需带上IP地址
Export list for 192.168.10.1351:
/opt/wwwroot 192.168.10.0/24
[root@web01 ~]# mount 192.168.10.135:/opt/wwwroot /var/www/html  #挂载
[root@web01 ~]# tail -1 /etc/mtab  #查看挂载目录(mount命令也可以)
[root@web01 ~]# vim /etc/fstab  #设置开机自动挂载
#文档末尾添加
192.168.10.135:/opt/wwwroot  /var/www/html       nfs  defaults,_netdev  0 0
#_netdev:设备需要网络
[root@web01 ~]# mount -a  #将/etc/fstab的所有内容重新加载

5、nfs节点(第五台虚拟机)上传网页数据

[root@nfs ~]# vim /opt/wwwroot/index.html
<h1>Apache test</h1>  #添加内容

分别到web站点查看数据,若数据内容相同,则表示数据同步成功

[root@web01 ~]# cat /var/www/html/index.html
<h1>Apache test</h1>  #nfs搭建成功

6、浏览器输入192.168.10.200,查看网页

8、在web节点测试访问

[root@web01 ~]# tailf /var/log/httpd/access_log  #web01、web02动态查看日志文件
多次刷新网页,可以轮询看到产生的日志
[root@lvs ~]# ipvsadm -ln  #lvs(第一台虚拟机)查看负载均衡的分配情况

补充

1、在keepalived高可用集群中,同时出现了两个虚拟VIP地址信息的原因

(1)心跳线出现问题

(2)网卡配置有问题

(3)交换设备有问题

(4)有防火墙软件阻止问题

(5)virtual_router_id配置数值不正确

2、利用shell脚本实现监控VIP管理

把脚本放在从节点上
#!/bin/bash
check_info=$( ip a |grep -c 192.168.10.200)    #VIP地址
if [ $check_info -ne 0 ]
then
   echo "keepalived server error!!!"
fi