keepalived原理以及部署

1. Keepalived

​ Keepalived ,看名字为 保持存活,在网络 里面就是保持在线,也就是所谓的高可用或者热备,用于防止单点故障(单点故障时指一旦某一个节点发生故障就会导致整个系统不可用)的发送。

​ Keepalived 是用于保持集群的高可用:

​ 高并发: 能够同时提供能多台客户端访问

​ 高可用: 防止集群中因为某个几点坏掉,从而导致整个集群不能正常的提供服务

​ Keepalived 起初是为了和 LVS 进行搭配使用,主要是配合LVS 对后端的集群,因为 LVS 没有健康检查,所以要是使用Keepalived 配合使用,当后端的集群中有一个服务器宕机,他将会把这个服务从后端节点中剔除,从而实现集群的高可用,当后端的服务器能正常的提供服务的时候,再将该服务器加入到后端的集群中,后来 keepalived 实现了 vrrp 协议。

2. VRRP 协议

​ VRRP 协议: 虚拟路由冗余协议

​ 虚拟路由冗余协议 是由IETF 提出的解决局域网中配置静态网关出现的单点失效现象的路由协议。

​ VRRP 协议用于保证当主机的吓一跳路由器出现故障时,由另一台路由器来代替 出现故障的路由器工作,从而保证网络的连续性和可靠性。

  • ​ VRRP 优点:
    • 简化网络管理,在具有多播或广播能力的局域网中,借助VRRP 能在某台设备出现故障时提供高可用的缺省链路,有效避免单一链路发生故障后网络中断的问题。
    • 适应性强,VRRP 保温封装IP报文中,支持各种上层协议
    • 网络开销小,VRRP 至定义了一种报文—VRRP 通告报文,并且只有处在 Master 状态的路由器可以发送VRRP 报文

3. Keepalived 相关术语:

  • 虚拟路由器: 由一个Master 路由器和多个 Backup的路由器组成,主机将 路由器作为默认网关
  • VRID: 虚拟路由器的标识,相同VRID 为一组
  • Master: 主要工作的主机
  • Backup: 用于备份
  • 虚拟IP地址(漂移地址): 虚拟路由的IP地址,一个虚拟路由器可以有一个或者多个IP地址
  • 优先级: VRRP 根据优先级来确定主机的地位

4. Keepalived 工作原理

​ 负载均衡集群,分为 (master、backup) ,如果 Master 发生故障,从节点将会在集群中选出一个主,来代替的位置,主和从之间会发送特定的消息(这个时间一般为 1S ),当从服务器接收不到Master 发送来的消息,就以为这主服务器宕机了,然后 Backup 将接替 Master 来进行工作,从而保证集群的高可用,当主服务器修改以后,就会继续 Master的位置。

5. Keepalived 配置文件

! Configuration File for keepalived

global_defs {					# 全局配置
   notification_email {			# 发送的邮箱地址
     acassen@firewall.loc		# 接收邮件的地址1
   }
   notification_email_from Alexandre.Cassen@firewall.loc	#发件箱地址
   smtp_server 192.168.200.1			# 指定邮件服务的地址 例如: smtp.163.com
   smtp_connect_timeout 30				# 连接 smtp 超时时间
   router_id LVS_DEVEL					# 运行 Keepalived 机器标识,唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {				# VRRP 协议配置
    state MASTER					# 当前主机状态, Master 主, Backup 辅
    interface ens33					# 当前监听网络接口,网卡名字,用于配置集群IP地址
    virtual_router_id 51			# 虚拟路由ID号,,同一组要一致
    priority 100					# 优先级
    advert_int 1					# 通知周期,单位 秒
    authentication {				# 认证方式
        auth_type PASS				# 认证类型: 密码或者证书
        auth_pass 1111				# 认证密码: 所有节点相同
    }
    virtual_ipaddress {				# 虚拟地址集群,漂移地址
        192.168.200.16				# 漂移地址1
        192.168.200.17				# 漂移地址2
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {		# VIP 地址,要与漂移IP地址一致
    delay_loop 6						   # 健康检查间隔时间
    lb_algo rr							  # LVS 调度算法 rr | wrr | lc | wlc | lblc | sh | dh
    lb_kind NAT								# 负载均衡转发规则 NAT | DR | RUN
    persistence_timeout 50					# 会话保持时间
    protocol TCP							# 使用的协议

    real_server 192.168.201.100 443 {		# 后端真实节点信息
        weight 1						   # 权重
		 connect_port 80				    # 连接端口
          connect_timeout 3					# 超时时间
          nb_get_retry 3					# 与节点连接次数
          delay_before_retry 3				# 每个连接次数的间隔时间
        }
    }
}


6. Keepalived 配置

  • 最简单的配置,实现 Nginx 双击热备

实验环境:

主机IP备注
192.168.116.110漂移地址
Web1-Master192.168.116.103Nginx
Web2-Backup192.168.116.104Nginx

实验目的:

​ 部署两台Nginx ,并配置 Keepalived 实现高可用,当 Web1-Master 宕机之后,Backup 立马顶上称为 Master,保持服务的稳定,当 Master 恢复至集群内再次兼职 Master。

实验步骤:

1) 安装 Nginx

​ 参考 nginx安装

  • Web1-Master 编写验证网页文件
    • 启动服务
[root@localhost ~]#echo 'This is a Web1-Master ' > /usr/local/nginx/html/index.html

[root@localhost ~]#nginx

[root@localhost ~]#curl 192.168.116.103
This is a Web1-Master 

  • Web2-Backup 编写验证网页文件
    • 启动服务
[root@localhost ~]# echo 'This is a Web2-Backup ' > /usr/local/nginx/html/index.html

[root@localhost ~]# nginx

[root@localhost ~]# curl 192.168.116.104
This is a Web2-Backup 

  1.  部署 Keepalived
    
  • 安装 Keepalived
# 解决依赖关系
[root@localhost ~]# yum -y install popt-devel kernel-devel openssl-devel

# 解包,并源码安装 keepalived
[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

  • Master
[root@localhost ~]#vim /etc/keepalived/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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL-R1			# 指定路由标识
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33					# 绑定 网卡
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.116.110				# 漂移地址
    }
}

  • Backup
[root@localhost ~]# vim /etc/keepalived/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 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL-R2			# 路由标识,唯一
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}  

vrrp_instance VI_1 {			# 协议簇
    state BACKUP				# 指定备份主机状态
    interface ens33				# 绑定网卡
    virtual_router_id 51		# 路由ID,要一致
    priority 90					# 调整优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.116.110			# 漂移地址
    }   
}   

4) 启动服务

  • Master
[root@localhost ~]#service keepalived start
Reloading systemd:                                         [  确定  ]
Starting keepalived (via systemctl):                       [  确定  ]

# 查看漂移地址

[root@localhost ~]#ip ad | grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
    inet 192.168.116.103/24 brd 192.168.116.255 scope global noprefixroute ens33
    inet 192.168.116.110/32 scope global ens33
    inet6 fe80::5585:3c11:dae0:cfd6/64 scope link noprefixroute 

  • Backup
[root@localhost ~]# service keepalived start
Starting keepalived (via systemctl):  Warning: keepalived.service changed on disk. Run 'systemctl daemon-reload' to reload units.
                                                           [  确定  ]

5) 测试:

  • 访问 VIP
    • 得到的是 Web 1 界面
[root@localhost ~]#curl 192.168.116.110
This is a Web1-Master 
[root@localhost ~]#curl 192.168.116.110
This is a Web1-Master 

  • 此时关闭 Master Keepalived 服务
[root@localhost ~]#service keepalived stop
Stopping keepalived (via systemctl):                       [  确定  ]

[root@localhost ~]#ip ad | grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
    inet 192.168.116.103/24 brd 192.168.116.255 scope global noprefixroute ens33
    inet6 fe80::5585:3c11:dae0:cfd6/64 scope link noprefixroute 

  • 再次访问 VIP,并查看 Backup的IP地址

[root@localhost ~]#curl 192.168.116.110
This is a Web2-Backup 
[root@localhost ~]#curl 192.168.116.110
This is a Web2-Backup 

[root@localhost ~]# ip add | grep 'inet 192.168.116'
    inet 192.168.116.104/24 brd 192.168.116.255 scope global noprefixroute ens33
    inet 192.168.116.110/32 scope global ens33

  • Master Keepalived 再次上线
[root@localhost ~]#service keepalived start
Starting keepalived (via systemctl):                       [  确定  ]
[root@localhost ~]#curl 192.168.116.110
This is a Web1-Master 

7. 添加 Nginx 监控脚本

  • 在生产环境中,我们不可能做到试试监视 服务,所需要由Nginx的状态触发 Keepalived的启动关闭

  • 编写 脚本内容

[root@localhost ~]#vim /root/nginx.sh

#! /bin/sh
nginxPid=`ps -C nginx --no-header | wc -l`

if [ $nginxPid -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
                killall keepalived
        fi
fi


# 如果Nginx服务掉了,将再次启动,如果还没启动成功,则停止 Keepalived

  • 赋予执行权限
[root@localhost ~]#chmod +x /root/nginx.sh 
  • 修改配置文件
vrrp_script chk_http_port {					# 添加
        script "/root/nginx.sh"				# 指定监控执行的脚本
        interval 2							# 间隔时间
        weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {					# 以脚本为监控
        chk_http_port
    }
    virtual_ipaddress {
        192.168.116.110
    }
}

  • Backup 配置一样

8. Keepalived 脑裂

​ Keepalived 可能出现两个主的情况

  • state 都是Master

  • 防火墙没有关闭

  • priority 100 优先级 不一样

  • vrrp_instance 组名不一样

  • vitual_route_id 51 不一样

  • 当主恢复后,漂移地址转移需要时间,在生产环境中Master 恢复不会转移

  • 配置不抢占,使Master 恢复后不会转移

    • 在 Backup 中设置
vrrp_instance VI_1 {
    state BACKUP     --这里状态指定为backup
    …………
  nopreempt         --设置 nopreempt 防止抢占资源
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值