目录
一、Keepalived
1.1 Keepalived 原理
Keepalived是一个基于VRRP协议的高可用性的工具,它可以在多个服务器之间实现负载均衡和故障转移。Keepalived通过VRRP协议实现了多个服务器之间的虚拟路由器,这些虚拟路由器共享一个虚拟IP地址,客户端通过这个虚拟IP地址来访问服务。当其中一个服务器出现故障时,其他服务器会自动接管服务,保证服务的高可用性。
1.2 主要功能
高可用服务:Keepalived通过VRRP(虚拟路由冗余协议)实现高可用服务。它允许多个服务器共享一个虚拟IP地址,当主服务器出现故障时,备用服务器能够自动接管虚拟IP,从而保持服务的连续性。 Keepalived会定期检测服务器的状态,如果发现某台服务器出现故障,会将其从系统中剔除,并使用其他服务器代替其工作。当故障服务器恢复正常后,Keepalived会自动将其重新加入到服务器群中。
负载均衡:Keepalived还可以通过配置不同的调度算法,Keepalived可以将流量分配到多个后端服务器,以提高系统的整体性能和可靠性。
健康检查:Keepalived支持多种健康检查方式,包括ICMP请求、TCP端口检查、HTTP请求等。这些检查方式可以帮助Keepalived实时监测服务器的健康状态,确保服务的稳定性和可靠性。
1.3 应用场景
Keepalived通常与LVS、HAProxy等负载均衡器结合使用,以确保服务的高可用性和负载均衡。
二、VRRP协议
2.1 角色
MASTER:拥有虚拟路由器IP并处理相关网络功能的路由器,如ARP请求、ICMP和数据转发等。BACKUP:不拥有虚拟路由器IP,但处于待命状态,接收MASTER的VRRP状态通告信息,不执行对外的网络功能。当MASTER失效时,BACKUP将接管其网络功能。
2.2 选举机制
VRRP协议通过配置每个路由器的虚拟路由器ID(VRID)和优先权值来进行分组和选举。具有相同VRID值的路由器属于同一个组,通过优先权值来确定MASTER。优先权值大的路由器成为MASTER,如果优先权值相同,则比较路由器的实际IP地址,IP值较大的路由器优先成为MASTER。
2.3 相关技术
心跳机制:VRRP通过心跳机制来检测Master设备的状态。Master设备会周期性地发送VRRP通告报文,Backup设备则通过监听这些报文来判断Master是否仍然在线。VRRP通告报文的发送间隔(即心跳间隔)可以配置,默认为1秒。这个间隔决定了Backup设备检测Master设备故障的速度。
VRRP通告报文:VRRP协议只有一种报文——VRRP通告报文。这种报文用于在VRRP备份组中的设备之间传递状态信息,包括Master的优先级、虚拟IP地址等。VRRP通告报文的目的地址是组播地址224.0.0.18,TTL(生存时间)是255,协议号是112。这确保了报文只会在同一局域网内传播,并且不会被路由到外部网络。
周期性工作:VRRP协议的工作是周期性的,主要体现在Master设备定期发送VRRP通告报文上。这种周期性工作确保了Backup设备能够实时了解Master的状态,并在必要时进行故障转移。
2.4 工作方式
抢占模式:在这种模式下,如果Backup设备的优先级高于当前的Master设备,它将立即抢占Master地位,并发送VRRP通告报文和免费ARP报文来通知网络。
非抢占模式:在这种模式下,即使Backup设备的优先级高于当前的Master设备,它也不会主动抢占Master地位,除非当前的Master设备失效。这有助于避免不必要的Master切换,从而减少网络波动。
三、Keepalived 配置
yum install keepalived -y
3.1 keepalived配置文件
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc ##定义了当发生状态变化
failover@firewall.loc ##(如MASTER到BACKUP的故障转移)时
sysadmin@firewall.loc ##keepalived将发送通知邮件的电子邮件地址列表
}
notification_email_from Alexandre.Cassen@firewall.loc ##指定了发送通知邮件时使用的“发件人”地址
smtp_server 192.168.200.1 ##用于发送通知邮件的SMTP服务器的IP地址
smtp_connect_timeout 30 ##SMTP服务器连接的超时时间(以秒为单位)。如果在这段时间内无法建立连接,则邮件发送将失败
router_id LVS_DEVEL ##当前keepalived实例的路由器ID。这个ID在日志文件和通知邮件中用于标识keepalived实例(在VRRP环境中,每个VRRP路由器都应该有一个唯一的标识符)
vrrp_skip_check_adv_addr ##指示keepalived在接收VRRP广告时跳过对源IP地址的检查
vrrp_strict
vrrp_garp_interval 0 ##不发送GARP消息
vrrp_gna_interval 0 ##不发送GNA消息
}
### VRRP配置:vrrp_instance
vrrp_instance VI_1 { ##VI_1是实例名字,可以根据需要命名
state MASTER ##实例的初始状态为MASTER
interface eth0 ##VRRP实例绑定的物理网络接口
virtual_router_id 51 ##虚拟路由器的ID
priority 100 ##优先级
advert_int 1 ##VRRP广告消息的发送间隔
authentication { ##VRRP认证
auth_type PASS ##密码认证方式
auth_pass 1111 ##密码
}
virtual_ipaddress { ##与该VRRP实例关联的虚拟IP地址
192.168.200.16
192.168.200.17
192.168.200.18
}
}
### LVS段的配置以“virtual_server”作为开始标识,此段内容有两部分组成,分别是real_server段和健康检测段。
3.2 实验环境
操作系统:所有虚拟机均基于红帽企业版Linux 7(RHEL 7)。
KA1:IP地址为172.25.254.10/24,负责在Keepalived集群中担任主节点或备份节点,具体角色取决于其优先级和选举结果。
KA2:IP地址为172.25.254.20/24,同样负责在Keepalived集群中担任主节点或备份节点,其角色会根据与KA1的优先级和通信状态来确定。
server1:IP地址为172.25.254.110/24,作为后端真实服务器之一。
server2:IP地址为172.25.254.120/24,同样作为后端真实服务器,是realserver1的负载均衡对象。
3.2.1 keepalived虚拟路由管理
全局参数 :配置组播的IP地址
KA1上的配置;定义了VIP地址:172.25.254.100/24
KA2上的配置:
使用tcpdump命令来捕获并显示经过以太网接口eth0的网络数据包信息:
使用 tcpdump 命令来捕获并显示经过以太网接口eth0的网络数据包信息:
KA1正常使用时候:在KA2上抓包看到的:
先把KA1的停了:systemctl stop keepalived.service 这时在KA2上就可以看到VIP,意味着当主节点(KA1)出现故障时,VIP自动切换到备份节点(KA2),以确保服务的连续性。
3.2.2 开启通信功能及独立日志
要想VIP能通信:在配置文件中,同时设定或者删除 vrrp_strict 和 vrrp_iptables 这两个全局参数。
【实现独立日志】
1)vim /etc/sysconfig/keepalived
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# ll /var/log/keepalived.log
-rw-------. 1 root root 5426 Aug 12 13:20 /var/log/keepalived.log
3.2.3 独立子配置文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d #创建子配置文件目录
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf #编辑子配置文件
[root@ka1 ~]# systemctl restart keepalived.service
把keepalived.conf里面的要实现独立的配置先注释掉;然后写到子配置文件中;
成功!!
3.2.4 邮件通知
1)通过QQ邮箱测试;先在QQ邮箱里生成授权码;
2)配置文件:/etc/mail.rc。将生成的授权码复制在下图 smtp-auth-password 后;
3)修改配置文件:/etc/keepalived/keepalived.conf。自定义。
4)测试:
3.2.5 双主模式
1)KA1
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
track_script {
check_haproxy
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 200
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
}
2)KA2
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 200
priority 100
advert_int 1
#preempt_delay 5s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
track_script {
check_haproxy
}
}
对于172.25.254.100/24而言,KA1是主备,KA2是从备;对于172.25.254.200/24恰恰相反:
这两台设备任何一个出现问题,会有从备接替服务。比如我们关掉KA1上的keepalived:
3.2.6 Keepalived+HAProxy
1)在KA1和KA2两台主机上下载haproxy软件包;
yum install haproxy -y
systemctl start --enable haproxy
2)修改内核参数;vim /etc/sysctl.connf
net.ipv4.ip_nonlocal_bind=1
sysctl -p ##使之生效
3)修改haproxy主配置文件 vim /etc/haproxy/haproxy.cfg
listen webcluster
bind 172.25.254.100:80
mode http
server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
server web2 172.25.254.120:80 check inter 3 fall 2 rise 5
4)判断脚本;
vim /etc/keepalived/test.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
chmod +x /etc/keepalived/test.sh
5)修改keepalived主配置文件
把KA2上的服务停止后:
当我们停掉KA1/KA2任何一台机子上的haproxy:systemctl stop haproxy.service ;仍然能够curl。