Keepalived集群快速入门

Keepalived

  • 第 1 章 集群基础
    • 1.1 高可用指标
    • 1.2 关键技术
  • 第 2 章 Keepalived快速入门
    • 2.1 软件基础
      • 2.1.1 keepalived软件结构【记住】
      • 2.1.2 LVS
      • 2.1.3 VRRP
    • 2.2 软件部署【应用】
      • 2.2.1 安装软件
      • 2.2.2 配置文件简介
      • 2.2.3 配置软件
      • 2.2.4 故障演练
      • 2.2.5 ❤负载均衡
        • 1、网络环境配置
        • 2、软件配置
  • 第 3 章 总结
  • 第 4 章 配置详解【★记住】
    • 4.1 全局配置段
    • 4.2 VRRP配置段
    • 4.3 状态监测【应用】
    • 4.4 虚拟主机配置段
    • 4.5 HTTP健康检测【应用】
    • 4.6 TCP健康检测【应用】
    • 4.7 友情提示
    • 4.8 日志配置【应用】
  • 第 5 章 总结
  • 第 6 章 原理详解
    • 6.1 结构详解
    • 6.2 路由方式
  • 第 7 章 综合实践【应用】
  • keepalive高可用抢占式和非抢占式
  • keepalive高可用与Nginx集成
  • keepalive脑裂问题

第 1 章 集群基础

1.1 高可用指标

1.什么是高可用,为什么要设计高可用?
两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将称之为高可用。

2.系统可用率算法例:

  • 1个9:(1-90%)*365=36.5天 ----> 表示该系统1年时间里最多可能的业务中断时间是36.5天
  • 2个9:(1-99%)*365=3.65天 ----> 表示该系统1年时间里最多可能的业务中断时间是36.5天

网络可用性

Keepalived集群快速入门_第1张图片

恢复能力

Keepalived集群快速入门_第2张图片

1.2 关键技术

高可用方式
主备:两个角色主机处理同一个业务,使用一套主备配置参数
双主:两个角色主机处理不同的业务,互为主备,简单理解为两个反方向的主备叠加场景。(使用两套主备配置参数)
集群:多个备用结点、多种业务。当主故障后,被动节点通过内部的选举机制,选取临时的主节点来接管vip

关键技术
为了实现高可用的效果,后端的高可用结点需要如下几种技术来保证:

时间同步

  • 作为一个集群,他们彼此间进行信息通信的一个前提是,时间状态必须一致,如果出现一个主机在2018年,一个在2020年,这种情况下,集群的通信肯定会出现问题,甚至不会传输信息。
  • 我们一般会采用时间协议,从一个专用的时间服务器上获取时间,从而保证同一个集群中的所有主机时间都是一致的,这个协议我们一般使用ntp协议。

心跳检测

  • 对于高可用集群的各模式来说,有一个关键的点就是:主节点故障了,从节点接管一切。这就涉及到了一种场景:高可用集群节点间需要知道彼此的状态,就类似于我们要知道一个人是否是活的,就看他有没有心跳。
  • 所以我们需要通过一种专用的技术来时刻了解集群节点间的状态,我们一般称这种技术为“心跳检测”,常见的软件有VRRP。

第 2 章 Keepalived快速入门

2.1 软件基础

2.1.1 keepalived软件结构【记住】

官方网站:http://www.keepalived.org/
github地址:https://github.com/acassen/keepalived
文档:https://www.keepalived.org/pdf/UserGuide.pdf

关键点:
Keepalived软件是有c语言编写的一个开源软件项目,其本质是一个路由软件。
Keepalived基于IPVS功能进行二次整合实现负载均衡功能。
Keepalived基于VRRP协议进行二次整合实现高可用性功能。
Keepalived借助于大量的功能脚本实现高质量的状态检查功能。
Keepalived框架可以单独使用,也可以和其他软件进行整合使用。

核心模块:
这两个内核模块却是keepalived实现负载均衡和高可用性功能的核心模块,其中NETLINK主要用于提供高可用性的路由及网络功能IPVS主要实现虚拟主机的负载均衡功能。

功能组件:
Keepalived的大部分功能模块位于用户空间,主要有这么几个比较核心的功能组件:
WatchDog、Checkers、VRRP Stack、IEVS wrapper、Netlink Reflector

工作流程

  • keepalived部署在多台主机上(一般是两台),keepalived服务启动后,会加载专用的配置文件,调用内核的LVS服务(IPVS)以创建虚拟服务器,并根据配置启用对外的统一访问接口,并且基于相关插件脚本对服务进行监控。
  • 为了保证服务对外的统一接口的高可用,VRRP协议将物理Router进行统一管理,并创建一个虚拟路由地址,作为外网的统一出口,物理Router内部通过VRRP机制进行内部通信,保证虚拟路由地址永远可用。

2.1.2 LVS

Keepalived集群快速入门_第3张图片

负载均衡层
位于集群服务的最前端,有一台或多态负载调度器(Director Server)组成,LVS软件就部署在这层的主机上,我们结合内核空间的IPVS模块,使用用户空间的ipvsadm定义各种ipvs规则,来管理后端所有的应用服务主机。
这一层是LVS集群架构中最核心的一层。

应用服务层
位于集群服务的中间层,由一大堆运行应用服务的主机组成,Real Server可以是web服务、mysql服务、DNS服务等服务器中的一个或多个组合,他们通过基础网络被前段的Director Server进行管理。

数据共享层
位于集群服务的最末端,为所有Real Server提供共享存储空间和内容一致性的存储区域,根据业务场景的不同,可以基于NFS或者是分布式文件系统软件来实现。

核心功能【记住】

  • 互联网中常见的负载均衡解决方案有很多:基于DNS域名轮流解析方案、基于客户端调度访问方案、基于IP地址的调度方案、基于应用层系统负载的调度方案等等。
  • LVS结合IPVS内核模块实现为中间层的应用集群服务提供负载均衡的方式也有很多,其中效率最高的就是基于IP方式的负载均衡,它基于Director Server启用IPVS模块,结合ipvsadm来管理中间层的应用服务器,通过LVS服务器上的VIP同一对外提供服务。
  • IPVS实现负载均衡的方法主要有四种,分别是NAT、DR、TUN、Fullnet。其中效率最高的是DR模型、使用最广的是NAT模型,大网络场景下适用TUN模型,更大的网络场景下可以使用Fullnet模型,只不过该模型需要进行二次内核编译才能实现。
  • LVS不但实现了多种的负载均衡模型,而且实现了多种资源调度算法,在最新版的Linux内核中,IPVS模块提供了将近13种资源调度算法,我们可以结合实际的业务应用场景进行合理的调整和选择。
  • 这13种调度算法如下:RR、WRR、LC、WLC、FO、OVF、LBLC、LBLCR、DH、SH、MH、SED、NQ

2.1.3 VRRP

借助VRRP可以有效避免单一链路发生故障后网络中断的现象。

虚拟路由冗余协议(Virtua1 Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点故障现象的路由协议,其本质上是一种路由容错协议。

VRRP将局域网内的一组路由器虚拟为单个路由器。我们称该路由器组为VRRP备份组,它根据优先级选择一个Master主路由器,承担网关功能,其他路由器称为Backup从路由器。基于VRRP虚拟出来是路由我们称之为虚拟路由,该虚拟路由有独立的IP地址(VIP)。

整个过程,后端真实主机看到的仅仅是虚拟路由,无论真实路由如何变幻,整个网络不受任何影响。

Keepalived集群快速入门_第4张图片

2.2 软件部署【应用】

2.2.1 安装软件

序号 主机ip 主机名 安装软件 系统版本 虚拟网络模型
1 192.168.8.14 kpmaster keepalived nginx Centos7.5 NAT
2 192.168.8.15 kpslave keepalived nginx Centos7.5 NAT
软件包安装
yum -y install keepalived
yum -y install nginx

keepalived -v

2.2.2 配置文件简介

软件结构
默认安装的keepalived软件结构如下:

rpm -ql keepalived
/etc/keepalived			# 默认工作目录
/etc/keepalived/keepalived.conf		# 默认配置文件
/etc/sysconfig/keepalived			# 服务配置文件
/usr/lib/systemd/system/keepalived.service  # 服务配置文件
/usr/sbin/keepalived		# 软件命令
...
/usr/share/doc/keepalived-1.3.5/samples		# 模板文件目录

配置结构
keepalived默认配置文件主要有三部分组成:global_defs、vrrp_instance、virtual_server
其中最重要的配置内容是vrrp_instance,在这个配置段中,设置了我们keepalived对外提供的统一入口。

对于keepalived软件的默认配置文件来说,它主要有这么几块组成:

cat /etc/keepalived/keepalived.conf
# 全局配置段
global_defs {
   ...
   router_id LVS_DEVEL
   ...
}
# VRRP配置段
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
# 虚拟主机配置段
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

一个virtual_server就是一个LVS的VIP的效果

例如:

**lb01配置**:
cat /etc/keepalived/keepalived.conf
global_defs {     
    router_id lb01     #标识信息
}

vrrp_instance VI_1 {
    state MASTER
    priority 150                      #优先级
    interface eth0                    #绑定的网卡
    virtual_router_id 50              #同一个虚拟的路由
    advert_int 1                      #心跳的间隔时间
    authentication {
        auth_type PASS      #两个主机之间的密语
        auth_pass 1111          #心跳密码
}
    virtual_ipaddress {
        10.0.0.3     #虚拟IP地址(可以绑定多个虚拟IP地址)
    }
}
**lb02配置**:
#lb02配置如下
global_defs {
    router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    priority 100
    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3         #虚拟IP地址
    }
}

配置简介
作为快速入门阶段来说,此时它的配置信息没有那么的复杂,我们这里只需要修改两台keepalived主机的global_defs和vrrp_instance部分的属性内容,就可以让keepalived正常启动了。在这里我们来简单的看一下这里面的基础重要的属性配置:

global_defs
在这部分的配置段中,我们暂时只需要关心router id即可
router_id 设定当前eepalived提供的路由标识,它在keepalived集群中必须唯一

vrrp_instance
在这部分的配置段中,我们选优关心以下几处的配置信息:

必备:
state  				描述keepalived主机间的角色定位的,一般只有两个值VASTER、BACKUP 
interface   		指定在哪个网卡上绑定VIP 
virtual_router_id   指定VIP的唯一标识,在keepalived集群中,此配器必须一致。
priority   			被VRRP协议来判断那个router_id作为主路由,值越大,优先级越高
authentication      多个路由之间通信的认证
virtual_ipaddress   指定VIP的地址,可以是多个。

2.2.3 配置软件

全局配置段的router_id是唯一标识
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
Keepalived集群快速入门_第5张图片

 
启动后ip addr查看
Keepalived集群快速入门_第6张图片

根据配置文件的属性值,VIP设定到了kpmaster主机上了。
默认情况下,keepalived的日志都打印到message,我们也可以使用 tail -f /var/log/messages的命令来查看服务状态。

因为默认在global_defs配置文件中有vrrp_strict,自动在主机上产生一个keepalived拒绝所有的防火墙。这样就没法基于VRRP访问应用。所以想访问192.168.8.100,需要关闭这个属性 或者防火墙上。
vim /etc/keepalived/keepalived.conf 删掉vrrp_strict 后重启

nginx测试访问效果:

for i in {1..10};do curl 192.168.8.100;done

2.2.4 故障演练

主机故障(自动切换)
模拟master主机故障
1、关停kpmaster主机上的keepalived服务
2、查看kpmaster主机日志效果:可以看到该节点移除了VIP内容
3、kpslave结点检查,ip addr,查看日志。 VIP就被kpslave主机接管了
4、master主机恢复,kpmaster又恢复到master状态,VIP被kmaster重新接管

小结
Keepalived集群快速入门_第7张图片

2.2.5 ❤负载均衡

后端服务实现负载均衡的效果。 Keepalived基于IPVS功能进行二次整合实现负载均衡功能。没有ipvsadm也可以。

DR模型,全在同一个网段,要配置相应的VIP和地址冲突的信息。

Keepalived集群快速入门_第8张图片

操作实践

1、网络环境配置

Keepalived集群快速入门_第9张图片

2、软件配置

2.1 基础软件

安装软件
yum install nginx -y

配置首页
# lvs-RS1 主机
echo "nginx-RS1" > /usr/share/nginx/html/index.html
# lvs-RS2 主机
echo "nginx-RS2" > /usr/share/nginx/html/index.html

启动两台主机nginx服务
systemctl restart nginx

检查服务效果
curl 192.168.8.16
curl 192.168.8.17

2.2 配置LVS的DR模式(顺便测试,保证后端主机能实现lvs负载均衡效果)
后端主机配置arp抑制(RS1、RS2)

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

启动后端主机VIP(RS1、RS2)

ifconfig lo 192.168.8.100/32 up

LVS主机配置虚拟ip(以kpmaster主机为例)

ifconfig eth0:0 192.168.8.100/32 up
ip addr add 192.168.8.100 dev eth0:0

配置ipvs规则(以kpmaster主机为例)

yum install ipvsadm -y 
ipvsadm -A -t 192.168.8.100:80 -s rr
ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.16
ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.17
ipvsadm -Ln

检查效果

curl 192.168.8.100

为不影响后续keepalived的操作,需要ipvsadm情况规则清空 (这一部分只是随便测试下)
ipvsadm -C

2.3 配置keepalived(高可用+负载均衡)
属性简介:
虚拟主机配置格式:virtual_server { .… }
delay_loop 用于服务轮询的延迟计时器
lb_algo 设定访问后端服务的调度策略
lb_kind 设定数据转发的模型
protocol 设定数据通信的协议
real_server 设定后端主机的信息

后端主机配置格式:real_server { ... }
注意:以上5项是必须设置的。
real_server 后面的 “{ }” 中即使没有属性,也不能写成"{ }",必须使用Enter换行格式隔开

配置样例

virtual_server 192.168.8.100 80 {
	delay_loop 2
	lb_algo rr
	lb_kind NAT
	protocol TCP
	real_server 192.168.8.14 80 {
	}
	real_server 192.168.8.15 80 {
	}
}

这一块配置就像
ipvsadm -a -t 192.168.8.100:80 -r 192.168.8.14 -m

实际配置:DR
Keepalived集群快速入门_第10张图片

注意:这里采用的后端主机负载均衡模式是DR模型
real_server后面的"{ }" 必须换行写,否则的话会报错

对于LVS主机不能进行访问,因为他是转发的效果。只能去没有192.168.8.100的主机上进行测试。
用客户端进行访问测试
curl 192.168.8.100 可以看到轮询效果

模拟keepalived故障、服务故障

第 3 章 总结

集群基础:
Keepalived集群快速入门_第11张图片

快速入门
Keepalived集群快速入门_第12张图片

第 4 章 配置详解【★记住】

4.1 全局配置段

记住全局配置的核心属性
记住VRRP配置的核心属性
应用VRRP状态检测功能
应用虚拟主机核心属性
应用http&tcp服务监控检测
应用keepalived日志定制

全局配置段
默认配置
以下内容是keepalived.conf中的全局配置内容样例:

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
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

配置详解: man keepalived.conf
在默认的全局配置信息中,主要包含两部分的内容:

  • 邮件信息
  • VRRP全局配置

邮件信息(在真实环境有相应的监控平台,更好的实现告警,没必要采取这种)

在这部分中,主要涉及到以下四种属性配置:
notification_email		用于设定邮件的接收人员列表
notification_email_from 用于设定邮件的发送人员信息
smtp_server			    邮件服务器地址
smtp_connect_timeout	设定邮件连接超时时间

VRRP全局配置

router_id		设定主机的唯一标识,默认是本地主机名,生产中不推荐
vrrp_skip_check_adv_addr	设定是否跳过检查VRRP所有的通知信息
vrrp_strict		强制执行VRRP协议
vrrp_grap_interval	设定接口发送arp协议信息间的延迟时间,单位ms
vrrp_gna_interval	设定接口上发送的未经请求的NA消息之间的延迟时间

配置示例:
一般情况下,我们只设置一下本机的邮件配置,然后设置一个router_id就可以了。

global_defs {
   notification_email {
	root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id master  # 唯一的路由标识,不推荐使用主机名,默认的值:主机名    要保证主机名不会改变
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

4.2 VRRP配置段

默认配置

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

配置详解
vrrp_instance { ... }
注意:VRRP实例名称是唯一的,我们可以在一个配置文件中配置多个VRRP实例,只要名称不一致就可以了。

常见属性

state:用于设定集群主机的初始化状态
该状态值有两个:MASTER和BACKUP,不过在集群中一旦加入新的主机,keepa1ived会自动比较并选择一个最优的主机定位MASTER角色,所以该配置可以忽略,基于keepalived自动管理,如果我们做好规划的话,最好设置。

interface:用于设定VRRP实例绑定的物理网卡
该接口必须在宿主机上存在,否则的话会报错。

virtual_router_1d:用于设定VRRP实例的唯一标识
一台主机可能设置多个VRRP实例,我们可以基于0~255数字,用于区分同一个网卡上的多个VRRP实例

priority:用于主机间进行MASTER角色选举用的优先级
如果我们要设置某主机为MASTER角色的话,尽量比其他BACKUP角色主机的值大50

advert_int:VRRP协议用于发送通知信息的时间间隔,单位是s,一般采用默认值

authentication	高可用集群间通信的认证,PASS AH 
注意:可用可不用。官方已经没用了

负载均衡的访问地址:单网卡效果下,直接用ip即可。  多网卡推荐增加dev和label
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }

Keepalived集群快速入门_第13张图片

4.3 状态监测【应用】

需求分析
1.编写检查脚本文件
2.keepalived配置文件使用脚本

  • 检测脚本在vrrp_script定义
  • 检测脚本在vrrp_instance中使用
    3.效果检查

VRRP script配置
根据man keepalived.conf方式来查看VRRP script的配置信息显示,vrrp_script配置是专门用于设定监控VRRP实例用的配置,格式效果如下:

vrrp_script <SCRIPT_NAME> {
重要	script <STRING>|<QUOTED-STRING> # 设定执行脚本的路径,也可以是命令行的检测命令
重要	interval <INTEGER>	# 设定脚本执行的间隔时间,默认1s
	timeout <INTEGER>	# 设定脚本失败的超时时间
	weight <INTEGER:-254..254>	# 设定脚本的权重,默认是0
	rise <INTEGER>	# 执行多少次,表示成功OK
	fail <INTEGER>	# 执行多少次,表示失败KO
	user USERNAME [GROUPNAME]	# 设定脚本的用户/组属性信息
	init_fail		# 假设脚本最初处于失败状态
}

注意:一般使用前两条。
检测命令的是VRRP专用的,一定要保证在VRRP场景下是唯一的。
script属性要求尽量使用脚本格式,不包含特殊字符和白到时的简单命令也可以,如果命令里包含特殊字符就不能执行。比如 “[[ ]]”

配置示例
定义检测脚本

vrrp_script <SCRIPT_NAME> {
	script xxx
}

Keepalived集群快速入门_第14张图片

使用检测脚本

track_script {
	<SCRIPT_NAME>
}

Keepalived集群快速入门_第15张图片

 
★操作实践

❤关键点

  • 顺序:先编写 vrrp_script,再使用 track_script
  • vrrp_script 里面的script必须是标准的脚本执行方式
  • track_script 一定要写到指定的vrrp_instance中
  • 关于vrrp_script和track_script的内容在所有的keepalived主机上完全一致

权重值:weight
工作目的:自动的切换MASTER和BACKUP
工作原理:有priority 和 weight的差值来确定高可用集群主机间的最终优先级。
一般是将weight设置为负值,达到降低优先级的效果
Keepalived集群快速入门_第16张图片

 
Keepalived集群快速入门_第17张图片

模拟:touch /tmp/keepalived.fail

4.4 虚拟主机配置段

一个keepalive.conf可以允许出现多个Virtual_server配置信息
多个lvs集群
组成:虚拟主机组 + 虚拟主机

默认配置
IP+端口

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

常见属性
7种调度算法、3种调度模式、3种数据转发协议

delay_1oop	用于服务轮询的延迟计时器
1b_algo		设定访问后端服务的调度策略
在当前的keepalived版本下,它支持7种调度算法 rr wrr lc wlc lblc sh dh

1b_kind		设定数据转发的模型
因为是基于IPVS进行负载均衡的,所以数据转发的模型与LVS一致 NAT、DR、TUN

persistence_timeout 设定数据持久性的超时时间,黑默认为6分钟
protocol	设定数据通信的协议,默认支持三种 TCP UDP SCTP
这一项是必备的,因为我们使用ipvsadm创建集群的时候,必须指定通信协议

sorry_server 	备用真实主机,当所有RS失效后,开始启用该后备主机。
real_server 	设定后端真实主机的信息

真实主机属性
六中状态检测

weight	设定真实主机的权重,黑默认是1
HTTE_GET	以HTTP方式来检查后端主机   ❤
TCP_CHECK	以TCP方式来检查后端主机    ❤
SMTP_CHECK  以SMTP方式来检查后端主机
DNS_CHECK	以DNS方式来检查后端主机
MISC_CHECK  以MISC方式来检查后端主机

HTTP检测和TCP检测属性
Keepalived集群快速入门_第18张图片

4.5 HTTP健康检测【应用】

Keepalived集群快速入门_第19张图片

 
操作实践
Keepalived集群快速入门_第20张图片

 
模拟后端服务
Keepalived集群快速入门_第21张图片

测试内容:日志效果、ipvsadm规则效果、curl访问效果

4.6 TCP健康检测【应用】

Keepalived集群快速入门_第22张图片

 

Keepalived集群快速入门_第23张图片

测试内容:日志效果、ipvsadm规则效果、curl访问效果

Keepalived集群快速入门_第24张图片

Keepalived集群快速入门_第25张图片

 
注意:如果后端RS主机设置了NAT模式,端口映射,那么就需要自己定制,保证TCP检测的端口和ip地址必须准确。

TCP检测属性:
connect ip
connect port

4.7 友情提示

Keepalived集群快速入门_第26张图片

场景需求:当keepalived的所有RS主机出现故障后,提供一个友好页面

1、要准备维护页面,维护web配置
2、配置失效跳转属性,virtual_server配置sorry_server

配置样例

如果不是NAT模式的话,端口必须要一致。
virtual_server 192.168.8.100 80 {
	sorry_server 192.168.8.17 80
}

注意:要保证失败的主机端口和VIP的端口一致。

4.8 日志配置【应用】

keepalived默认记录到/var/log/meesages文件中了,在该文件中不仅仅输出了keepalived日志,还输出了其他无关的日志

需求:将keepalived日志从message中剥离开,单独存放

环境变量文件
rpm -ql keepalived
cat /usr/lib/systemd/system/keepalived.service
cat /etc/sysconfig/keepalived
得知 和日志相关的属性: -D,-S
日志参数详解:根据注释信息系提示,日志的高级配置参数是“”–log-facility“”,该参数的作用其实是借用syslog的0-7用户自定义功能来定制keepalived服务的日志信息。我们可以基于该参数来定制我们的keepalived日志。

syslog用户自定义格式如下:

grep -A 2 'boot' /etc/rsyslog.conf
local7.*		/var/log/boot.log   # 打开该文件 默认有这个

rsyslog中的local0~7其实指的是8个自定义的接口设备,可以存放定制的日志信息,然后进行转储。

❤日志定制实践
设定的keepalived的启动 命令参数,使用用户自定义日志功能,我们这里使用0级别

vim /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 0"

定制rsyslog的用户自定义日志功能

vim /etc/rsyslog.conf
# Save boot message also to boot.log
local0.*		/var/log/keepalived.log
注意:localn 的值应该与keepalived文件中的-S指定的值一样。

重启服务,顺序很重要
systemctl restart rsyslog
systemctl restart keepalived

查看日志效果
ls /var/log/
cat /var/log/keepalived.log

第 5 章 总结

Keepalived集群快速入门_第27张图片

第 6 章 原理详解

记住keepalived的状态检测原理
记住keepalived虚拟服务原理
记住keepalived路由方式及特点

6.1 结构详解

内核空间:ipvs、netlink
核心模块:watchdog、vrrp stack、checker、ipvs wrapper、netlink reflecter
Keepalived集群快速入门_第28张图片

状态检测原理
watchdog —— 监控
vrrp stack —— vrrp相关的功能
checker —— 状态检测、健康检测
ipvs wrapper —— ipvsadm的封装和加强
netlink reflecter —— 网络相关:负载均衡网络、虚拟路由网络

  1. 高可用方面
    watchdog – vrrp
    vrrp_script + track_script
  2. 负载均衡方面
    watchdog + checker + ipvs wrapper
    vrrp_script + track_script
    real_server 内部的 专用检测工具(HTTP_GET + TCP_CHECK)

Keepalived集群快速入门_第29张图片

 
虚拟服务原理

  1. 管理方面
    ipvs warpper + IPVS + 配置管理组件
    ipvs warpper 通过配置管理组件
    加载keepalived.conf文件中的各种属性,然后将virtual_server中的配置转换为ipvsadm相关的规则,借助于内核空间中的IPVS模块实现后端真实主机的负载均衡管理。

Keepalived集群快速入门_第30张图片

 

6.2 路由方式

转发简介:

  • 用户请求——keepalived —— virtual_server —— real_server
  • 转发功能实现:
    lb_algo 调度方法 rr、wrr、lc、wlc、lblc、sh、dh
    lb_kind 转发模式 NAT、DR、TUN
    keepalived默认推荐的转发模式:DR

NAT方式:
进入:客户端 —— 外部VIP —— 转换DNAT —— RS
出去:RS —— 内部VIP —— 转换SNAT —— 客户端
配置:需要同时再keepalived.conf当中设置两个vrrp_instance
inside_network 和 outside_network

特点:进入和退出都需要经过keepalived集群,所以在大规模场景下,有可能会成为瓶颈,但是在小场景下,使用范围广
Keepalived集群快速入门_第31张图片

DR方式
进入:外部VIP —— RS
出去:RS —— 互联网 —— 客户端
特点:在各种场景下,效率高,不适用端口映射场景

ARP_ignore、ARP_announce
Keepalived集群快速入门_第32张图片

第 7 章 综合实践【应用】

双主方式

需求案例:
业务场景
在实际的工作中,我们的网站服务一般都是以域名的方式对外提供服务,对于这种情况下一般有这么两种现象:

  • 一个域名对应一个ip地址,万一域名解析的ip地址故障,就出现单点故障现象
  • 一个域名可以解析不同的后端服务,我们可以基于同域名解析多个不同服务的ip地址,更精确的响应用户
  • 也就是说,我们在实现keepalived的高可用时候,需要在同一组高可用集群中,设置多个对外的VIP即多组VRRP实例,任意一组失误,都不影响用户的访问体验。

Keepalived集群快速入门_第33张图片

需求分析
1.准备基本网络环境(DR模型)
2.定制keepalived配置(双VIP实例)
3.测试

操作实践
1.准备基本网络环境
网络设备和网卡信息与之前效果一致,我们无需变动

2.定制keepalived配置
后端主机配置多vip

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.8.100/32 up
ifconfig lo:1 192.168.8.200/32 up

keepalived配置
配置多个vrrp示例
vim /etc/keepalived/keepalived.conf
Keepalived集群快速入门_第34张图片

Keepalived集群快速入门_第35张图片

3.查看效果
结果现实:
当kpslave节点keepalived服务未启动时候,两个vrrp实例都在kpmaster主机上
当kpslave节点keepalived服务启动时候,VI_2的实例优先级较kpmaster主机高,所以将8.200的VIP抢过来了
当RS服务停止的时候,会进行移除,ipvsadm -Ln查看
当两个RS服务都停止的时候,会转为sorry_server

总结:

Keepalived集群快速入门_第36张图片

keepalive高可用抢占式和非抢占式

(1)默认配置为抢占式:
master挂掉,backup上台,master重新启动则将IP抢占过去。
(2)非抢占式配置:
两台均为backup,在优先级上做区分,如master挂掉,backup上台,则backup变成master,master变为backup。
a.两个节点的state均为backup(官方建议)
b.两个节点都在vrrp_instance中添加nopreempt
c.其中一个节点的优先级要高于另外一个节点
两台服务器角色都启用了nopreempt后,必须修改角色状态统一为backup,唯一的区别就是优先级不同。

#Master
    vrrp_instance VI_1 {
        state BACKUP
        priority 150
        nopreempt    
    }

#Backup
    vrrp_instance VI_1 {
        state BACKUP
        priority 100
        nopreempt
    }

keepalive高可用与Nginx集成

  • PS: 有Nginx负载均衡,并不一定必须要装Keepalived
  • Nginx负载均衡实现高可用,需要借助Keepalived地址漂移功能
  • 比如:第一次 keepalived绑定在Master上, 通过vip地址访问到这台master上的所有服务
  • 因为所有的服务都是 listen port;

keepalive脑裂问题

keepalive高可用故障脑裂
由于某些原因,导致两台keepalive高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
a.服务器网线松动等网络故障
b.服务器硬件故障发生损坏现象而奔溃
c.主备服务器都开启了firewalld防火墙

解决方法:

  • 如果Nginx宕机, 会导致用户请求失败, 但Keepalived并不会进行地址漂移
  • 所以需要编写一个脚本检测Nginx的存活状态, 如果不存活则kill nginx和keepalived
# 脚本如下
[root@lb01 ~]# cat  /server/scripts/check_www.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)            # -C是cmd
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginxpid -eq 0 ];then
    systemctl start nginx
    sleep 3
    #2.等待3秒后再次获取一次Nginx状态
    nginxpid=$(ps -C nginx --no-header|wc -l) 
    #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
    if [ $nginxpid -eq 0 ];then
        systemctl stop keepalived
   fi
fi
[root@lb01 ~]# chmod +x /server/scripts/check_www.sh

配置keepalived使用

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {     
    router_id lb01   
}

#定义脚本所在的位置,以及执行时间
vrrp_script  check_www {
    script "/server/scripts/check_www.sh"
    interval 5
}


vrrp_instance VI_1 {
    state BACKUP
    priority 150
    nopreempt
    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
    virtual_ipaddress {
        10.0.0.3
    }

    #调用脚本
    track_script {
        check_www
    }
}

你可能感兴趣的:(#,LVS,1024程序员节,lvs,负载均衡)