keepalived

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.当主恢复的时候   需要时间    这时候并没有给从发送心跳包

keepalived中调用脚本发送邮箱

注意:
通常情况下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值