1.Keepalived VRRP 介绍
keepalived是什么
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。(云服务器不支持VRRP)
虚拟路由冗余协议,可以认为是实现高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
=========================================================================================
脑裂(裂脑):
Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
解决方式:
1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(指标不治本,只是提高了检测到的概率);
2、做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
3、爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信
2.项目准备
准备四台虚拟机,两台做代理服务器,两台做真实服务器(真实服务器只是用来进行web测试)
1、选择两台LVS服务器作为keepalived(一台master 一台backup)。
真实服务器需要nginx来提供web服务
2、给两台LVS服务器安装keepalived制作高可用生成VIP
[root@master ~]# 192.168.13.128 主节点
[root@backup ~]# 192.168.13.129 备用节点
[root@real-server1 ~]# 192.168.13.133 第一台真实服务器
[root@real-server2 ~]# 192.168.13.137 第二台真实服务器
3.nginx安装
给两台真实服务器安装nginx,用来作为web服务器进行测试
给所有的机器关闭防火墙和selinux
[root@real-server1 ~]# systemctl stop firewalld && setenforce 0
给第一台真实服务器安装nginx
[root@real-server1 ~]# cd /etc/yum.repos.d/
[root@real-server1 yum.repos.d]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@real-server1 yum.repos.d]# yum install yum-utils -y
[root@real-server1 yum.repos.d]# yum install nginx -y
[root@real-server1 yum.repos.d]# systemctl start nginx #启动
给第二台真实服务器安装nginx
[root@real-server2 ~]# cd /etc/yum.repos.d/
[root@real-server2 yum.repos.d]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@real-server2 yum.repos.d]# yum install yum-utils -y
[root@real-server2 yum.repos.d]# yum install nginx -y
[root@real-server2 yum.repos.d]# systemctl start nginx #启动
4.LVS_Director + KeepAlived
KeepAlived在该项目中的功能:
1. 管理IPVS的路由表(包括对RealServer做健康检查)
2. 实现调度器的HA(高可用)
Keepalived所执行的外部脚本命令建议使用绝对路径
=================================================================================
实施步骤:
1.主/备调度器安装软件及配置
192.168.13.128
[root@master ~]# yum -y install ipvsadm keepalived
[root@master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #备份
[root@master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #只是名字而已,辅节点改为directory2(两个名字一定不能一样)
}
vrrp_instance VI_1 {
state MASTER #定义主还是备,备用的话写backup
interface ens33 #VIP绑定接口
virtual_router_id 80 #整个集群的调度器一致(在同一个集群)
priority 100 #(优先权)back改为50(50一间隔)
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS #主备节点认证
auth_pass 1111
}
virtual_ipaddress {
192.168.13.144/24 #VIP(自己网段的)
}
}
virtual_server 192.168.13.144 80 { #LVS配置
delay_loop 3 #启动3个进程
lb_algo rr #LVS调度算法
lb_kind DR #LVS集群模式(路由模式)
nat_mask 255.255.255.0
protocol TCP #健康检查使用的协议
real_server 192.168.13.133 80 {
weight 1
inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除
TCP_CHECK { #健康检查
connect_port 80 #检查的端口
connect_timeout 3 #连接超时的时间
}
}
real_server 192.168.13.137 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
192.168.13.129
[root@backup ~]# yum install -y ipvsadm keepalived
[root@backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@backup ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory2
}
vrrp_instance VI_1 {
state BACKUP #设置为backup
interface ens33
nopreempt #设置到back上面,不抢占资源
virtual_router_id 80
priority 50 #备用改为50
advert_int 1 #检测间隔1s
authentication {
auth_type PASS
auth_pass 1111 #认证类型和密码主备一样,要不然无法互相认证
}
virtual_ipaddress {
192.168.13.144/24 #抢占的VIP也一样
}
}
virtual_server 192.168.13.144 80 {
delay_loop 3
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
protocol TCP
real_server 192.168.13.133 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
real_server 192.168.13.137 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
2.启动KeepAlived(主备均启动)
[root@master ~]# systemctl start keepalived
[root@backup ~]# systemctl start keepalived
开机自启(可以不设置)
[root@master ~]# systemctl enable keepalived
[root@backup ~]# systemctl enable keepalived
[root@master ~]# 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.13.144:80 rr
-> 192.168.13.133:80 Route 1 0 0
-> 192.168.13.137:80 Route 1 0 0
[root@backup ~]# 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.13.144:80 rr
-> 192.168.13.133:80 Route 1 0 0
-> 192.168.13.137:80 Route 1 0 0
3.所有RS配置(nginx1,nginx2)
配置好网站服务器,测试所有RS
192.168.13.133
[root@real-server1 ~]# ip addr add dev lo 192.168.13.144/32
[root@real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
[root@real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
[root@real-server1 ~]# sysctl -p
[root@real-server1 ~]# echo "this is first real-server" > /usr/share/nginx/html/index.html
[root@real-server1 ~]# vim /etc/nginx/nginx.conf
keepalive_timeout 0; #设置长链接
[root@real-server1 ~]# nginx -s reload
192.168.13.137
[root@real-server2 ~]# ip addr add dev lo 192.168.13.144/32
[root@real-server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
[root@real-server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
[root@real-server2 ~]# sysctl -p
[root@real-server2 ~]# echo "this is second real-server"> /usr/share/nginx/html/index.html
[root@real-server2 ~]# vim /etc/nginx/nginx.conf
keepalive_timeout 0;#默认keepalive_timeout 65;
[root@real-server2 ~]# nginx -s reload
#修改后端nginx服务器的长连接是为了方便测试
注意:
如果你网页访问不到,可能是配置文件出错了。如果你是直接复制本文章的代码,建议你将注释都去掉,有时候可能你的输入法的问题,导致配置文件出现一些多余的空格之类的。
访问你自己设置的VIP 192.168.13.144
查看两个节点服务器,你会发现VIP在主节点
如果这个时候主节点服务器宕机了(我们把服务停止了用来测试),VIP会自己漂移到备用节点上。
但是用户访问时却感觉不到
网页照样可以继续使用,这就是高可用性。