keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS集群中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,keepalived 除了能够管理 LVS集群外,还可以为其他服务(例如:Nginx、Haproxy、MySQL等)实现高可用。
(1)管理 LVS 负载均衡软件:
Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能。
(2)支持故障自动切换:
Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器。
Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
(3)实现 LVS 负载调度器、节点服务器的高可用性(HA):
一般企业集群需要满足的三个特点:负载均衡、健康检查、故障切换,使用 LVS + Keepalived 完全可以满足需求。
keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
vrrp模块:是来实现VRRP协议的。
check模块:负责健康检查,常见的方式有端口检查及URL检查。
1、Keepalive脑裂:
主备调度器通过内网交换机连接,如果交换机挂了,则此时主调度器仍存活,但备份调度器收不到主调度器的VRRP信息,备调度器就会工作,两台调度器就会同时工作,出现脑裂现象。
主备调度器同时工作,如果web是无状态应用,那么客户端无论从哪一个调度器进行访问,页面内容相同。但如果是有状态应用,则两台调度器同时工作,会导致客户端显示的页面资源不一致。
2.脑裂原因:
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
因心跳线间连接的设备故障(网卡及交换机)
因仲裁的机器出问题(采用仲裁的方案)
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输
Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
vrrp实例名字不一致、优先级一致。
3.脑裂应对策略:
主备调度器多连一条线,即使交换机挂了,这两个还可以通信。
通过第三方监控软件,当发现两台调度器同时工作,则杀掉主调度器。
自己写一个脚本,例如crontab和while死循环执行,当监控到备调度器工作了,就杀掉主调度器的keepalived服务。
当主服务器宕机或服务出现问题时,备服务器抢占转发
- 1.#关闭防火墙
- systemctl disable --now firewalld
- setenforce 0
-
- 2.yum安装ipvsadm和keepalived
- yum install ipvsadm keepalived.x86_64 -y
-
-
- 3.加载模块
- modprobe ipvsadm
- cat /proc/net/ip_vs #查看ip_vs版本信息
-
- 4.调整 proc 响应参数,关闭Linux 内核的重定向参数响应
- vim /etc/sysctl.conf
- net.ipv4.conf.all.send_redirects = 0
- net.ipv4.conf.default.send_redirects = 0
- net.ipv4.conf.ens33.send_redirects = 0
-
- sysctl -p #刷新加载
-
- 5.编写keepalived配置文件:
-
- 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必须为bakcup,并加上配置 nopreempt
- --23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
- priority 100
- advert_int 1 #通告间隔秒数(心跳频率)
- authentication { #定义认证信息,每个热备组保持一致
- auth_type PASS #认证类型
- --27行--修改,指定验证密码,主备服务器保持一致
- auth_pass 123456
- }
- virtual_ipaddress { #指定群集vip地址
- 192.168.10.200
- }
- }
-
- --36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
- virtual_server 192.168.10.200 80 {
- delay_loop 6 #健康检查的间隔时间(秒)
- lb_algo rr #指定调度算法,轮询(rr)
- --39行--修改,指定群集工作模式,直接路由(DR)
- lb_kind DR
- persistence_timeout 0 #连接保持时间(秒) 修改为0以便查看效果
- protocol TCP #应用服务采用的是 TCP协议
- --43行--修改,指定第一个Web节点的地址、端口
- real_server 192.168.10.133 80 {
- weight 1 #节点的权重
- --45行--删除,添加以下健康检查方式
- TCP_CHECK {
- connect_port 80 #添加检查的目标端口
- connect_timeout 3 #添加连接超时(秒)
- nb_get_retry 3 #添加重试次数
- delay_before_retry 3 #添加重试间隔
- }
- }
-
- real_server 192.168.10.134 80 { #添加第二个 Web节点的地址、端口
- weight 1
- TCP_CHECK {
- connect_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- }
- }
- ##删除后面多余的配置##
- }
-
- 6.启动服务:
- ipvsadm-save >/etc/sysconfig/ipvsadm
- systemctl start ipvsadm.service
- systemctl restart keepalived
-
- 把keepalived.conf文件远程拷贝过来,更改备服务器参数
-
- scp keepalived.conf 192.168.88.102:`pwd`
- ## 在master主机使用scp 注意我这里是相对路径
-
- notification_email_from Alexandre.Cassen@firewall.loc
- 10 smtp_server 127.0.0.1
- 11 smtp_connect_timeout 30
- 12 router_id LVS_02 #更改id
- 13 vrrp_skip_check_adv_addr
- 14 #vrrp_strict
- 15 vrrp_garp_interval 0
- 16 vrrp_gna_interval 0
- 17 }
- 18
- 19 vrrp_instance VI_1 {
- 20 state BACKUP #备服务器为backup
- 21 interface ens33
- 22 virtual_router_id 51
- 23 priority 90 #优先级90
- 24 advert_int 1
- 25 authentication {
- 26 auth_type PASS
- 27 auth_pass 1111
- 28 }
-
- 1. #关闭防火墙
- systemctl stop firewalld
- setenforce 0
-
- 2. #配置web服务器网页,自定
-
-
- 4. #配置虚拟vip
- vim /etc/sysconfig/network-scripts/ifcfg-lo:0
- DEVICE=lo:0
- ONBOOT=yes
- IPADDR=192.168.88.200
- NETMASK=255.255.255.255
-
- 5. #重启网络服务,开启虚拟网卡
- systemctl restart network
- ifup lo:0
- ifconfig lo:0
-
- 6. #设置路由
- route add -host 192.168.88.200 dev lo:0
- route -n
-
- 7. #调整 proc 响应参数
- #添加系统只响应目的IP为本地IP的ARP请求
- #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
- vim /etc/sysctl.conf
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.all.arp_announce = 2
- 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
-
- 8. #刷新proc参数
- sysctl -p
-
- 两台配置一样。。。。。。。
-
- 想要快速测试调度结果,需要关闭web服务的长连接