外贸企业网站制作,做网站创业,四川品牌网站建设,深圳美联英语总部概念 keepalived 是一款基于 VRRP#xff08;Virtual Router Redundancy Protocol#xff0c;虚拟路由冗余协议#xff09;协议来实现高可用#xff08;High Availability, HA#xff09;的轻量级软件。它主要用于防止单点故障#xff0c;特别是在 Linux 环境下#xff…概念 keepalived 是一款基于 VRRPVirtual Router Redundancy Protocol虚拟路由冗余协议协议来实现高可用High Availability, HA的轻量级软件。它主要用于防止单点故障特别是在 Linux 环境下为 LVSLinux Virtual ServerLinux 虚拟服务器集群和其他服务提供高可用性和故障转移功能。虽然它最初是为 LVS 设计的但现在也被广泛用于其他需要高可用性的场景比如 MySQL 数据库集群、Nginx 负载均衡器等。 工作原理 keepalived 在集群中通常部署为一对或多对主备服务器。每个 keepalived 实例都会运行 VRRP 协议并通过组播Multicast或单播Unicast方式与其他实例通信。主服务器定期发送 VRRP 广告包通知其他备份服务器其状态。如果备份服务器在一定时间内没有收到主服务器的广告包它会认为主服务器已经故障并接管虚拟 IP 和服务。 VRRP是什么 VRRPVirtual Router Redundancy Protocol虚拟路由器冗余协议是一种由IETFInternet Engineering Task Force互联网工程任务组提出的路由协议旨在解决局域网中配置静态网关时可能出现的单点失效问题。该协议于1998年推出。 VRRP的工作原理 1.选举机制VRRP协议通过选举机制确定哪台路由器成为Master路由器。选举基于路由器的优先级优先级高的路由器成为Master。如果优先级相同则比较接口IP地址IP地址大的成为Master。 2.状态维持Master路由器定期发送VRRP通告报文通知备份组内的其他路由器自己工作正常。Backup路由器则启动定时器等待通告报文的到来并根据收到的通告报文判断Master路由器的状态。 3.故障转移如果Backup路由器在定时器超时后仍未收到Master路由器的VRRP通告报文则认为Master路由器已经无法正常工作此时Backup路由器将升级为主路由器并对外发送VRRP通告报文接管数据转发任务。 keepalived的主要模块 1.core模块KEEPALIVED的核心模块负责主进程的启动、维护以及全局配置文件的加载和解析。 2.check模块负责健康检查包括各种常见的检查方式如ICMP、TCP端口状态、HTTP GET等以确保集群中各节点的正常运行。 3.vrrp模块实现VRRP协议的关键模块负责虚拟路由器的选举、状态维护和报文发送等工作。 keepalived的安装与基本配置 安装keepalived
dnf install keepalived -y
systemctl start keepalived
keepalived的基本配置 配置文件位于/etc/keepalived/keepalived.conf
全局配置
notification_email { xxxxxxxqq.com #keepalived 发生故障切换时邮件发送的目标邮箱可以按行区 分写多个} notification_email_from keepalivedka1.exam.com #发邮件的地址
smtp_server 127.0.0.1 #指定用于发送邮件的 SMTP 服务器地址这里是 127.0.0.1 。
smtp_connect_timeou 30 #每个keepalived主机唯一标识
router_id ka1.exam.com #建议使用当前主机名但多节点 重名不影响
vrrp_skip_check_adv_addr #对所有通告报文都检查会比较消耗性能#启用此配置后如果收到的通告报文和上一 个报文是同一 个路由器则跳过检查默认 值为全检查
vrrp_strict #严格遵循vrrp协议 #启用此项后以下状况将无法启动服务: #1.无VIP地址 #2.配置了单播邻居 #3.在VRRP版本2中有IPv6地址 #建议不加此项配置
vrrp_garp_interval 0 #报文发送延迟0表示不延迟
vrrp_gna_interval 0 #消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP的地址。
虚拟服务器配置
vrrp_instance VI_1 {state BACKUPinterface eth0 #绑定为当前虚拟路由器使用的物理接口如eth0,可以和VIP不在一 个网卡virtual_router_id 100 #每个虚拟路由器惟一标识,范围0-255每个虚拟路由器此值必须唯一 #否则服务无法启动 #同属一个虚拟路由器的多个keepalived节点必须相同 #务必要确认在同一网络中此值必须唯一priority 80 #当前物理节点在此虚拟路由器的优先级范围1-254 #值越大优先级越高,每个keepalived主机节点此值不同advert_int 1 #vrrp通告的时间间隔默认1s#preempt_delay 5sauthentication { #认证机制auth_type PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 1111 #预共享密钥仅前8位有效 #同一个虚拟路由器的多个keepalived节点必须一样}virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址172.25.254.100/24 dev eth0 label eth0:1 #指定VIP不指定网卡默认为eth0,注意不指定/prefix,默认32}
}virtual_server IP port { #VIP和PORTdelay_loop #检查后端服务器的时间间隔lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法lb_kind NAT|DR|TUN INT #集群的类型,注意要大写persistence_timeout #持久连接时长 protocol TCP|UDP|SCTP #指定服务协议,一般为TCPsorry_server IPADDR PORT #所有RS故障时备用服务器地址real_server IPADDR PORT{ #RS的IP和PORTweight INT #RS权重notify_up STRING|QUOTED-STRING #RS上线通知脚本notify_down STRING|QUOTED-STRING #RS下线通知脚本 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定义当前主机健康状 态检测方法}}#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错
应用层监测
HTTP_GET|SSL_GET {
url {
path URL_PATH #定义要监控的URL
status_code INT #判断上述检测机制为健康状态的响应码一般为 200
}
connect_timeout INTEGER #客户端请求的超时时长, 相当于haproxy的timeout server
nb_get_retry INT #重试次数
delay_before_retry INT #重试之前的延迟时长
connect_ip IP ADDRESS #向当前RS哪个IP地址发起健康状态检测请求
connect_port PORT #向当前RS的哪个PORT发起健康状态检测请求
bindto IP ADDRESS #向当前RS发出健康状态检测请求时使用的源地址
bind_port PORT #向当前RS发出健康状态检测请求时使用的源端口}
tcp监测
TCP_CHECK {
connect_ip IP ADDRESS #向当前RS的哪个IP地址发起健康状态检测请求
connect_port PORT #向当前RS的哪个PORT发起健康状态检测请求
bindto IP ADDRESS #发出健康状态检测请求时使用的源地址
bind_port PORT #发出健康状态检测请求时使用的源端口
connect_timeout INTEGER #客户端请求的超时时长
}
定义VRRP script
vrrp_script
script STRING | QUOTED_STRING #shell命令或脚本路径
interval INTEGER #间隔时间单位为秒默认1秒
timeout INTEGER #超时时间
weight INTEGER #默认为0,如果设置此值为负数 #当上面脚本返回值为非0时 #会将此值与本节点权重相加可以降低本节点权重
#即表示fall. #如果是正数当脚本返回值为0 #会将此值与本节点权重相加可以提高本节点权重 #即表示 rise.通常使用负值
fall INTEGER #执行脚本连续几次都失败,则转换为失败建议设为2以上
rise INTEGER #执行脚本连续几次都成功把服务器从失败标记为成功
user USERNAME [GROUPNAME] #执行监测脚本的用户或组
init_fail #设置默认标记为失败状态监测成功之后再转换为成功状态
}keepalived实例 环境配置 实现master/slave的 keepalived 单主架构 ka1主机配置
[rootka1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {notification_email {923452780qq.com}notification_email_from keepalivedexam.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka1.exam.orgvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}ka2主机配置
vim /etc/keepalived/keepalived.conf
global_defs {notification_email {923452780qq.com}notification_email_from keepalivedexam.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka2.exam.orgvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18
}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
测试
tcpdump -i eth0 -nn host 224.0.0.18关闭ka1主机上的keepalived服务时VIP将转移到ka2主机上
启用keepalived日志
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS-D -S 6
systemctl restart keepalived.service vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
systemctl restart keepalived.service rsyslog.service
tail -f /var/log/keepalived.log 实现独立子配置文件 注意如果需要独立子配置文件就需要把原配置文件的内容注释掉或者删掉
vim /etc/keepalived/keepalived.conf
include /etc/keepalived/conf.d/*.conf[rootka1 ~]# mkdir -p /etc/keepalived/conf.d[rootka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}systemctl restart rsyslog.service
keepalived的通知脚本配置 邮件配置
yum install mailx -y
vim /etc/mail.rc
#######mail set##########
set fromXXXXXXXXqq.com
set smtpsmtp.qq.com
set smtp-auth-userXXXXXXXXqq.com
set smtp-auth-passwordXXXXXXXX #自己邮箱的授权码
set smtp-authlogin
set ssl-verifyignore
#发送邮件
echo hello word | mail -s test xxxxxxxxxqq.com实现Keepalived状态切换的通知脚本
vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dstxxxxxxxxxqq.com
send_message()
{mail_sub$HOSTNMAE to be $1 vip movemail_msgdate %F\ %T: vrrp move $HOSTNAME change $1echo $mail_msg | mail -s $mail_sub $mail_dst
}
case $1 inmaster)send_message master;;backup)send_message backup;;fault)send_message fault;;*);;
esacchmod x /etc/keepalived/mail.sh
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
...unicast_src_ip 172.25.254.10 #本机IPunicast_peer {172.25.254.20 #对端IP}notify_master /etc/keepalived/mail.sh masternotify_backup /etc/keepalived/mail.sh backupnotify_fault /etc/keepalived/mail.sh fault
}
实现 master/master 的 Keepalived 双主架构 master/slave的单主架构同一时间只有一个Keepalived对外提供服务此主机繁忙而另一台主机却 很空闲利用率低下可以使用master/master的双主架构解决此问题。 master/master 的双主架构 即将两个或以上VIP分别运行在不同的keepalived服务器以实现服务器并行提供web访问的目的提高 服务器资源利用率 ka1主机和ka2主机都要配置都需要添加一个VRRP虚拟路由冗余协议实例的配置模块。
[rootka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1vrrp_ipsets keepalived#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}
}vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 200priority 80advert_int 1vrrp_ipsets keepalived#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}
}[rootka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.20unicast_peer {172.25.254.10}
}vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 200priority 100advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2}unicast_src_ip 172.25.254.20unicast_peer {172.25.254.10}
}
测试
实现单主的 LVS-DR 模式 准备web服务器并使用脚本绑定VIP至web服务器lo网卡realserver1主机和realserver2主机都要配置
[rootrealserver1 ~]# ip a a172.25.254.100 dev lo
[rootrealserver1 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore1
net.ipv4.conf.lo.arp_ignore1
net.ipv4.conf.all.arp_announce2
net.ipv4.conf.lo.arp_announce2[rootrealserver1 ~]# sysctl --system[rootrealserver2 ~]# ip a a172.25.254.100 dev lo
[rootrealserver2 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore1
net.ipv4.conf.lo.arp_ignore1
net.ipv4.conf.all.arp_announce2
net.ipv4.conf.lo.arp_announce2[rootrealserver2 ~]# sysctl --system配置keepalived服务ka1主机和ka2主机都要做
[rootka1 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.100 80 {delay_loop 6lb_algo wrrlb_kind DR#persistence_timeout 50protocol TCPreal_server 172.25.254.110 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}real_server 172.25.254.120 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}
}[rootka1 ~]# systemctl restart keepalived.service
[rootka1 ~]# ipvsadm -Ln测试 将realserver2的http服务停掉我们可以观察到keepalived会控制ipvsadm自动将172.25.254.120这个策略剔除。但是如果realserver2的http服务重新启动keepalived会将172.25.254.120这个策略重新恢复。 重启后