keepalived概念
keepalived详解
keepalived 保证集群的高可用 为了解决(防止)单点故障
- 高可用:防止集群中因某个节点坏掉,而导致整个集群不能提供服务
- 高并发: 能够提供多个客户端同时访问
想要实现高可用集群 这里的负载均衡服务器需要有两台,一台作为备份,实际上还是只有一台负载均衡服务器在工作,当一台坏掉之后,进行故障转移,在使用第二台工作
keepalived起初就是为了搭配lvs使用,lvs本身没有对后端服务器进行健康检查的作用,这样如果后端的服务器有一台宕机,lvs还是会将请求交给这个服务器,为了解决这个问题,让keepalived对后端进行健康检查,搭配lvs使用,当后端集群中有一个服务器宕机,它会将这个服务器从集群中剔除,来保证数据的可用性,当后端这个服务能够正常的提供服务,则将这个服务器加到后端集群当中,之后keepalived实现vrrp协议 虚拟路由冗余协议,keepalived就可以对lvs负载均衡服务器进行健康检查, 实现高可用 避免单点故障
原理 :keepalived搭配lvs使用,会将原来的虚拟ip加上特性,使其变成漂移ip。这个漂移ip不用手动设置,而是在keepalived上设置,keepalived分为主备(master backup),主会定期给备发送消息(消息的时间一般为1s),从而证明自己能够继续工作,如果当备接收不到主给的消息,则会认为主宕机,会把这个虚拟ip接替,也就是所谓的漂移ip在备上。由备来进行工作,从而保证集群的正常工作,当主恢复正常工作后,漂移ip又会回到主上面去
keepalived基本配置
配置完两个节点后可以抓包查看一下流量走向
yum -y install tcpdump
# 224.0.0.18是keeplived的组播地址
tcpdump -i ens33 host 224.0.0.18
keepalived监控nginx
但是这样子配置后的keeplived和我去代理的nginx是相互独立的,如何让这两个服务关联起来呢,可以通过附加脚本的方式来实现,来实现nginx挂掉后keeplived切换
简单的定义一个检查nginx服务的脚本即可,这样,在nginx挂掉之后,那么keeplived也会根据这个脚本自己停掉,这样就实现了两个服务之间的整合
也可以增加脚本的冗余性,可以增加启动命令,并在多少秒之后重新检测服务是否存在,如果在检测后还是不可用,则可以进行keepalived切换
keepalived脑裂检查脚本
LVS
LVS有三种模式,NAT、DR、TUE、FULLNAT瓶颈在网卡,他只负责转发流量,每秒几十万的并发,LVS工作在4层传输层
NAT模式
主机 | 网卡IP |
---|---|
LVS主机 | 外网网卡IP:192.168.1.145 内网网卡IP:192.168.247.128 |
后端RS1 | 内网网卡IP:192.168.247.127 |
后端RS2 | 内网网卡IP:192.168.247.129 |
# 安装ipvsadm,在LVS机器上安装
yum -y install ipvsadm
# 在LVS机器上添加一个VIP(在这里VIP使用的是公网IP,因为他是做了一个转发的功能,自己配置一个IP也可以),算法用rr轮询随机分配,-A添加一个VIP,-t是tcp协议
ipvsadm -A -t 192.168.1.145:80 -s rr
# 添加后端地址,在VIP均衡池中添加实例-m是指定的NAT模式,-w是权重
ipvsadm -a -t 192.168.1.145:80 -r 192.168.247.127 -m -w 100
ipvsadm -a -t 192.168.1.145:80 -r 192.168.247.129 -m -w 100
# 删掉某一个代理地址 ipvsadm -d -t 192.168.1.145:80 -r 192.168.247.129
# 查看配置好的列表
ipvsadm -L -n
# 注意NAT模式需要开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 还需要注意的一点是,在机器重启后,ipvs的配置就会消失,所以需要保存配置,当机器重启后导入配置即可
ipvsadm-save -n > lvs_config.txt
# 导入
ipvsadm-restore < lvs_config.txt
当访问1.145的80端口时就会转发给均衡池中的其他地址
当然在测试之前,是需要将后端的web服务网卡网关设置为LVS的内网IP的,不然这样数据包就有去无回了
DR模式
主机 | 网卡IP |
---|---|
LVS主机 | 网卡IP:192.168.1.145/ VIP: 192.168.1.200 |
后端RS1 | 网卡IP:192.168.1.146/ VIP: 192.168.1.200 |
后端RS2 | 网卡IP:192.168.1.147/ VIP: 192.168.1.200 |
# 配置DR模式
ipvsadm -A -t 192.168.1.200:80 -s rr
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.146 -g -w 100
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.147 -g -w 100
配置VIP
每台机器都需要配置,4个255表示独立IP
启动并查看IP
配置好后可以在其他主机ping一下,然后使用arp -a命令查看1.200这个VIP的Mac地址,可发现可以ping通也可以拿到对应的mac地址,说明在这个146上配置的lo:1是对外响应的,没有进行arp抑制,配置了VIP的机器都会对该IP的请求进行响应,所以在配置完VIP之后,要在除LVS机器之外的服务器都进行arp抑制,而且所配置的lo:1这个网卡他本身是无法发送数据出去的
改变一下这几个参数,来解决上面的问题
arp_ignore = 1可以抑制目标IP(这里的目标IP就是1.200)不是在物理网卡上的arp广播
arp_announce = 2 表示忽略机器的源IP所在网卡,选择从机器上任意一个能够对外发送数据的网卡将数据发送出去
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
LVS+Keepalived
Keepalived会自己生成一个VIP,所以LVS不需要进行配置VIP,直接安装好ipvsadm即可,所以之前配置VIP和代理后端的命令就都不需要进行配置了
# 安装ipvs
yum -y install ipvsadm
# 安装keepalived
yum -y install keepalived
[root@localhost keepalived-1.-2.13]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #keepalived节点出现故障 给管理员发送消息
notification_email { #邮箱地址
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #发件人
smtp_server 192.168.200.1 #邮件服务器的ip
smtp_connect_timeout 30 #和邮件服务器连接的超时时间
router_id LVS_DEVEL #节点标识
}
vrrp_instance VI_1 { #vrrp协议组 VI_1协议组的名称 一个协议组一个名称,可以有多组,多个VIP实例
state MASTER #节点状态
interface ens33 #用来接收漂移ip的网卡
virtual_router_id 51 #server_id 一个组的id必须是一致的
priority 100 #节点的优先级
advert_int 1 #发送vrrp心跳包的时间
nopreempt # 不抢占master,因为优先级更高的节点会抢占优先级低的控制权,所以设置这个使它不去抢占
authentication { #认证 主和备之间的通讯
auth_type PASS #加密
auth_pass 1111 #使用的密钥
}
virtual_ipaddress { #虚拟ip(VIP) 也就是客户端访问的ip
192.168.1.200
}
}
# LVS配置,他这个IP均衡的两台后端WEB
virtual_server 192.168.1.200 80 {
delay_loop 6 #对后端健康检查间隔的时间 单位s
lb_algo rr #调度算法
lb_kind DR #工作模式 DR
nat_mask 255.255.255.0 #子网掩码
persistence_timeout 0 #会话保持时间 这里方便测试改为0 如果不改 不会轮询
protocol TCP #使用的协议
real_server 192.168.1.146 80 { #后端的真实节点
weight 1 #权重
connect_port 80 #端口
connect_timeout 3 #超时时间
nb_get_retry 3 #与节点连接的次数
delay_before_retry 3 #没个多久建立一次连接
}
real_server 192.168.1.147 80 {
weight 1
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
lvs(DR)+keepalived
客户端 192.168.2.100
负载 192.168.2.10
负载 192.168.2.11
web1 192.168.2.20 192.168.2.200
web2 192.168.2.30 192.168.2.200
web:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo 11111 > /var/www/html/index.html #站点根目录
[root@localhost ~]# systemctl restart httpd #80
[root@localhost ~]# curl 192.168.2.20
11111
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.2.200
NETMASK=255.255.255.255
NAME=one
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
[root@localhost network-scripts]# vim /etc/sysctl.conf
[root@localhost network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
[root@localhost network-scripts]# route add -host 192.168.2.200 dev lo:0
keepalived+lvs
# 加载模块
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# yum -y install ipvsadm
[root@localhost ~]# yum -y install popt-devel kernel-devel openssl-devel
[root@localhost ~]# tar -zxf keepalived-1.2.13.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/keepalived-1.2.13/
[root@localhost keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
# 文件备份
[root@localhost keepalived-1.2.13]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.bak
[root@localhost keepalived-1.-2.13]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #keepalived节点出现故障 给管理员发送消息
notification_email { #邮箱地址
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #发件人
smtp_server 192.168.200.1 #邮件服务器的ip
smtp_connect_timeout 30 #和邮件服务器连接的超时时间
router_id LVS_DEVEL #节点标识
}
vrrp_instance VI_1 { #vrrp协议组 VI_1协议组的名称 一个协议组一个名称
state MASTER #节点状态
interface ens33 #用来接收漂移ip的网卡
virtual_router_id 51 #server_id 一个组的id必须是一致的
priority 100 #节点的优先级
advert_int 1 #发送vrrp心跳包的时间
nopreempt # 不抢占master,因为优先级更高的节点会抢占优先级低的控制权,所以设置这个使它不去抢占
authentication { #认证 主和备之间的通讯
auth_type PASS #加密
auth_pass 1111 #使用的密钥
}
virtual_ipaddress { #虚拟ip(VIP) 也就是客户端访问的ip
192.168.2.200
}
}
virtual_server 192.168.2.200 80 {
delay_loop 6 #对后端健康检查间隔的时间 单位s
lb_algo rr #调度算法
lb_kind DR #工作模式 DR
nat_mask 255.255.255.0 #子网掩码
persistence_timeout 0 #会话保持时间 这里必须改为0 如果不改 不会轮询
protocol TCP #使用的协议
real_server 192.168.2.20 80 { #后端的真实节点
weight 1 #权重
connect_port 80 #端口
connect_timeout 3 #超时时间
nb_get_retry 3 #与节点连接的次数
delay_before_retry 3 #没个多久建立一次连接
}
real_server 192.168.2.30 80 {
weight 1
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
[root@localhost keepalived-1.2.13]# scp /etc/keepalived/keepalived.conf root@192.168.2.11:/etc/keepalived/keepalived.conf
第二台keepalived
[root@localhost keepalived-1.2.13]# vim /etc/keepalived/keepalived.conf
state BACKUP #节点状态
interface ens32 #网卡
priority 90 #优先级
[root@localhost keepalived-1.2.13]# service keepalived start
Reloading systemd: [ OK ]
Starting keepalived (via systemctl): [ OK ]
[root@localhost keepalived-1.2.13]# 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.2.200:80 rr
-> 192.168.2.20:80 Route 1 0 1
-> 192.168.2.30:80 Route 1 0 1
通过ip a 来查看 主上面有漂移ip
inet 192.168.2.200/32 scope global ens33
客户端验证:
[root@localhost ~]# curl 192.168.2.200
1111
[root@localhost ~]# curl 192.168.2.200
2222
把keepalived1上面的网卡down掉 漂移ip就会在从上面
[root@localhost keepalived-1.2.13]# ifconfig ens33 down
keepalived 脑裂
keepalived 出现两个主的情况 两边都会有漂移ip
1.state MASTER 节点的状态都是主
2.防火墙没有放行
3.priority 100 优先级一致
4. vrrp_instance 协议组名不一致
5.virtual_router_id 节点的标识不一致
6.当主恢复的时候 需要时间 这时候并没有给从发送心跳包
注意:
通常情况下master服务宕机之后backup会工作 当master修好之后,master会继续工作
master —backup 转换需要时间
backup — master 转换需要时间 这段时间可以省略
在实际环境当中 不会选择一个master和一个backup 不会主备的形式
而是两个备份
master —backup 转换需要时间
backup — master 转换需要时间 这段时间可以省略
并且开启非抢占模式
master —backup 转换需要时间
优先级高的
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface ens34
virtual_router_id 51
priority 100