Keepalived及其工作原理
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
Keepalived体系主要模块及其作用
keepalived体系架构中主要有三个模块,分别是core、check和vrrp
●core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
●vrrp模块:是来实现VRRP协议的。
●check模块:负责健康检查,常见的方式有端口检查及URL检查
部署LVS+Keepalived 高可用群集
主DR 服务器:192.168.126.22
备DR 服务器:192.168.126.23
Web 服务器1:192.168.126.24
Web 服务器2:192.168.126.25
vip:192.168.126.88
客户端:192.168.126.21
实验原理图
实验步骤
LVS 部署
1.配置负载调度器(主、备相同)
systemctl stop firewalld.service
setenforce 0
#安装keepalived
[root@zy2 ~]# yum -y install keepalived ipvsadm #安装keepalived 和ipvsadm
[root@zy2 ~]# modprobe ip_vs #加载ip_vs模块
[root@zy2 ~]# 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
[root@zy2 ~]# cd /etc/keepalived/
[root@zy2 keepalived]# ls
keepalived.conf
[root@zy2 keepalived]# cp keepalived.conf keepalived.conf.bak #备份
[root@zy2 keepalived]# vim keepalived.conf #修改配置文件
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 #指向本地
smtp_connect_timeout 30
router_id LVS_01 #指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02 下面的vrrp_strict等四行内容删除
}
vrrp_instance VI_1 {
state MASTER #设为主 zy3设为BACKUP
interface ens33 #物理网卡ens33
virtual_router_id 51 #虚拟路由id 要和BACKUP一致
priority 100 #优先级100 BACKUP设为90小于100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #密码可以默认
}
virtual_ipaddress {
192.168.126.88 #VIP
}
}
virtual_server 192.168.126.88 80 { #设置VIP的策略
delay_loop 6
lb_algo rr #算法轮询
lb_kind DR #调度器DR模式
persistence_timeout 0 #不进行连接超时等待
protocol TCP
real_server 192.168.126.24 80 { #添加节点服务器1的RIP
weight 1
TCP_CHECK { #添加健康检查方式
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.126.25 80 { #添加节点服务器2的RIP
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
} #下面的内容不用可以删除
[root@zy2 keepalived]# systemctl start keepalived
[root@zy2 keepalived]# ip addr #查看虚拟网卡vip
而BACKUP的虚拟网卡VIP则没有起
启动 ipvsadm 服务
[root@zy2 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@zy2 ~]# systemctl start ipvsadm #启动 ipvsadm 服务
[root@zy2 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.126.88:80 rr
-> 192.168.126.24:80 Route 1 0 0
-> 192.168.126.25:80 Route 1 0 0
调整内核proc 响应参数,关闭Linux 内核的重定向参数响应
[root@zy2 ~]# vim /etc/sysctl.conf
#末行添加 关闭转发和icmp重定向
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@zy2 ~]# sysctl -p #加载配置
2.配置节点服务器(两台节点服务器配置一样)
[root@zy4 ~]# systemctl stop firewalld
[root@zy4 ~]# setenforce 0
[root@zy4 ~]# yum -y install httpd
[root@zy4 ~]# systemctl start httpd
[root@zy4 ~]# echo 'this is test1 web!' > /var/www/html/index.html
#节点服务器2中写入test2以作区分
[root@zy4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #配置lo接口
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.126.88
NETMASK=255.255.255.255
[root@zy4 network-scripts]# ifup lo:0
[root@zy4 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.126.88 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
[root@zy4 network-scripts]# route add -host 192.168.80.188 dev lo:0
修改内核参数
[root@zy4 network-scripts]# 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@zy4 network-scripts]# sysctl -p
测试:客户端去访问VIP192.168.126.88
此时已实现负载均衡,然后关闭主调度器的keepalived,查看是否还是能正常访问
客户端再次访问
总结:
Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP?
Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
然后再对比所有服务器的优先级priority,谁的优先级高谁是最终的主服务器。
优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。
keepalived的抢占与非抢占模式
抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。
非抢占模式俩节点state必须为backup,且必须配置nopreempt。
注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了
keepalived的脑裂现象
主备调度器都出现VIP(因为主备服务器之间的网络中断导致备服务器接收不到主服务器发送的vrrp通告报文。)
解决方案:
- 主备服务器之间使用双链路通信
- 通过脚本来实时监控主备的网络状态,然后再根据脚本逻辑采取措施(关掉主服务器的keepalived服务)
- 通过第三方监控系统来实时监控主备服务器及网络状态,然后再根据情况采取措施(关掉主服务器的keepalived服务)