keepalive概述与lvs-dr
keepalive服务的重要功能
管理lvs负载均衡器的软件
可以通过读取自身的配置文件,实现通过更底层的接口直接管理lvs配置以及服务的启动 停止功能,这会使lvs应用更加简便
支持故障自动切换(failover)
两台主机同时安装好keepalive并且启动服务
当启动的时候master主机获得所有资源并且对用户提供服务,backup主机作为master主机的热备份,当master主机出现故障的时候,backup主机将自动接管master主机所有工作,包括接管VIP资源及相应的资源服务
当master主机修复故障之后,会自动接管回他原来处理的工作,backup主机则同时释放master主机失效时接管的工作,此时两台主机将恢复到最初启动时各自的原始工作状态
抢占模式:master主机从故障恢复后,会将VIP从backup节点中抢占过来
非抢占模式:master主机从故障恢复后,不抢占backup主机,backup主机升级为master主机
实现lvs集中节点的健康检查(health checking)
keepalived.conf文件配置lvs的节点ip和相关参数来实现对lvs直接管理
如果几个节点服务器同时发生故障,无法提供服务,keepalive会自动将失效的节点服务器从lvs正常转发的列中清除,并将请求调度到别的正常节点中,从而保证最终用户的访问不受影响,当故障的节点服务器修复以后,keepalive又会自动把他们加入到正常转发队列中,对外面客户提供服务
实现lvs负载调度器 节点服务器的高可用性
企业集群需要满足三个特点:负载均衡 健康检查 故障切换 lvs+keepalive
keepalive高可用故障切换转移的原理
keepalive 高可用服务集群之间的故障切换转移,是通过vrrp(虚拟路由器冗余协议)来实现的
VRRP通信原理
在keepalive服务正常工作时,master节点会不断向backup节点发送(多播的方式)心跳信息,用意是告诉backup节点自己还在工作,当master节点发生故障时就无法发送心跳消息,backup节点就会无法检测到来自master节点的心跳,于是调用了自身的接管程序,接管主节点的ip资源和服务,当master节点回复时,backup节点又会释放master节点故障时自身接管的ip资源服务,恢复到原来的备用角色
keepalive的体系主要模块和作用
core:keepalive的核心,负责主进程启动,维护全局配置文件,加载和解析
vrrp:来实现vrrp协议
check:负责健康检查,常见的检查方式:端口 URL
keepalive服务的工作原理
keepalive脑裂及解决方法
脑裂:在一个高可用系统中,当联系着的两个节点断开联系时,本来为一个整体的系统分裂为两个独立的几点,这个时候我们两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏
脑裂是如何产生的:在某一个故障切换之后,原本的master并没有真正的宕机,VIP还在master上,这个时候backup主机则已经开始抢占master,并也在本地配置了VIP
解决预防:
网络层面再加一条链路
本地通过脚本解决,写一个while循环,每一轮ping网关,累计连续失败的次数,当连续失败的次数到达一定的次数则运行systemctl stop keepalive
通过第三方监控软件:监控服务 监控网络流量
LVS+Keepalived 高可用群集
1.配置主副负载调度器
关闭防火墙与安全机制
[root@lvs1 ~]# systemctl stop firewalld.service
[root@lvs1 ~]# setenforce 0
安装相关软件并配置
[root@lvs1 ~]# yum -y install ipvsadm keepalived
[root@lvs1 ~]# modprobe ip_vs
[root@lvs1 ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
配置keepalive
[root@lvs1 ~]# cd /etc/keepalived/
[root@lvs1 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@lvs1 keepalived]# vim keepalived.conf
10 smtp_server 127.0.0.1 修改邮件服务指向本地
12 router_id LVS_01
14 # vrrp_strict
21 interface ens33
22 virtual_router_id 10
23 priority 100
24 advert_int 1
25 authentication {
26 auth_type PASS
27 auth_pass abc123
28 }
29 virtual_ipaddress {
30 192.168.116.180
31 }
32 }
33
34 virtual_server 192.168.116.180 80 {
35 delay_loop 6
36 lb_algo rr
37 lb_kind DR
38 persistence_timeout 50
39 protocol TCP
40
41 real_server 192.168.116.14 80 {
42 weight 1
43 TCP_CHECK {
44 connect_port 80
45 connect_timeout 3
46 nb_get_retry 3
47 delay_before_retry 3
48 }
49 }
50
51 real_server 192.168.116.12 80 {
52 weight 1
53 TCP_CHECK {
54 connect_port 80
55 connect_timeout 3
56 nb_get_retry 3
57 delay_before_retry 3
58 }
59 }
60 }
配置虚拟网卡
[root@lvs1 keepalived]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.116.180
NETMASK=255.255.255.255
[root@lvs1 keepalived]# systemctl restart network
[root@lvs1 keepalived]# ifup ens33:0
[root@lvs1 keepalived]# systemctl start keepalived
[root@lvs1 keepalived]# ip addr
启动ipvsadm并配置
[root@lvs1 keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs1 keepalived]# systemctl start ipvsadm
[root@lvs1 keepalived]# ipvsadm -C
[root@lvs1 keepalived]# ipvsadm -A -t 192.168.116.180:80 -s rr
[root@lvs1 keepalived]# ipvsadm -a -t 192.168.116.180:80 -r 192.168.116.14:80 -g
[root@lvs1 keepalived]# ipvsadm -a -t 192.168.116.180:80 -r 192.168.116.12:80 -g
调整 proc 响应参数,关闭Linux 内核的重定向参数响应
[root@lvs1 keepalived]# 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
2.配置节点服务器
关闭防火墙与安全机制
[root@web1 ~]# systemctl stop firewalld
[root@web1 ~]# setenforce 0
安装httpd并设置
[root@web1 ~]# yum -y install httpd
[root@web1 html]# systemctl start httpd
[root@web1 html]# echo 'this is kgc web!' > /var/www/html/index.html
[root@web1 /]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.116.180
NETMASK=255.255.255.255
[root@web1 /]# systemctl restart network
[root@web1 /]# ifup lo:0
[root@web1 /]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.116.180 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
[root@web1 /]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@web1 /]# sysctl -p