高可用集群KEEPALIVED

.高可用集群

1.1 集群类型

  • LBLoad Balance 负载均衡
  • LVS/HAProxy/nginxhttp/upstream, stream/upstream
  • HAHigh Availability 高可用集群
  • 数据库、Redis
  • SPoF: Single Point of Failure,解决单点故障
  • HPCHigh Performance Computing 高性能集群

1.2 系统可用性

SLA Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能
等方面所达成的双方共同认可的协议或契约)
A = MTBF / (MTBF+MTTR
99.95%:(60*24*30)*(1-0.9995)=21.6 分钟 # 一般按一个月停机时间统计
指标 : 99.9%, 99.99%, 99.999%,99.9999%

1.3  keepalived 简介

vrrp 协议的软件实现,原生设计目的为了高可用 ipvs 服务
官网: http://keepalived.org/
功能:
  • 基于vrrp协议完成地址流动
  • vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginxhaproxy等服务

1.4 Keepalived 架构

官方文档:
https://keepalived.org/doc/
http://keepalived.org/documentation.html
  • 用户空间核心组件:
vrrp stack VIP 消息通告
checkers :监测 real server
system call :实现 vrrp 协议状态转换时调用脚本的功能
SMTP :邮件组件
IPVS wrapper :生成 IPVS 规则
Netlink Reflector :网络接口
WatchDog :监控进程
  • 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
  • IO复用器:针对网络目的而优化的自己的线程抽象
  • 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

二、Keepalived 环境准备

2.1 实验准备配置

四台红帽7的虚拟机

KA1ip172.25.254.10
KA2ip172.25.254.20
server1ip172.25.254.110
server2ip172.25.254.120

  • 各节点时间必须同步:ntp, chrony
  • 关闭防火墙及SELinux
  • 各节点之间可通过主机名互相通信(非必须)
  • 建议使用/etc/hosts文件实现(非必须)
  • 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(非必须)

2.2  Keepalived 相关文件

软件包名:keepalived
主程序文件:/usr/sbin/keepalived
主配置文件:/etc/keepalived/keepalived.conf
配置文件示例:/usr/share/doc/keepalived/
Unit File:/lib/systemd/system/keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived

2.3 安装keepalived

在10和20两台主机里下载Keepalived

yum  install  keepalived -y

配置文件

 vim /etc/keepalived/keepalived.conf

KeepAlived 配置说明 

配置文件:/etc/keepalived/keepalived.conf

  • GLOBAL CONFIGURATION

                Global definitions: 定义邮件配置, route_id , vrrp 配置,多播地址等

  • VRRP CONFIGURATION

                 VRRP instance(s): 定义每个vrrp虚拟路由器

  • LVS CONFIGURATION

                Virtual server group(s)
                Virtual server(s): LVS集群的VS 和 RS

保存退出后,启动keepalived服务,vip出现

systemctl enable --now keepalived.service

对ka2同样进行配置,这里直接将ka1的配置文件传输给ka2一份并进行修改

scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf

修改KA2的优先级和主备模式

抓包检测

抓包命令

tcpdump -i eth0 -nn host 224.0.0.18

 

用另一台主机110或120主机登录10主机关掉keepalived看备设备是否启动

# ssh -l root 172.25.254.10

关闭keepalived

 systemctl stop keepalived.service

 此时在ka1内的抓包消息变成

20备机上线,查看KA2的IP信息

再重新开启ka1的keepalived

systemctl enable --now  keepalived.service

当KA1的keepalived再次启动时 IP又变成了10主机的IP ,由于KA1的优先级大于KA2的,又是默认抢占式,所以当KA1再次启动时将服务VIP抢过来了

 让VIP通信

或者

注意:要么两种都开,要么两种都不开

两个方法都可以使vip通信

日志分离

编辑文件

vim /etc/sysconfig/keepalived

vim /etc/rsyslog.conf

重启服务

[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# systemctl restart rsyslog.service

独立子配置文件

创建子配置文件

mkdir -p /etc/keepalived/conf.d/

vim  /etc/keepalived/conf.d/172.25.254.100.conf

重启服务

 systemctl restart keepalived.service

查看IP信息

2.4 非抢占模式和延迟抢占

非抢占式

将主备服务器的主服务器也改成备服务器,两台服务器都加上nopreempt开启非抢占模式

ka1

ka2

此时的vip在ka2机子上

测试

两台服务器正常启动关闭KA2的keepalived后重新打开ka2的keepalived后还是ka1在工作,关闭KA1的keepalived后  ,又换回KA2工作非抢占模式,只要一台服务器不挂掉,另一台服务器是不会抢占VIP的

抢占延时模式

五秒只是为了演示,一般是五分钟到十分钟

ka1

ka2

测试关闭KA1的keepalived重启KA1的keepalived后5s才会重新抢占VIP

2.5 VIP单播配置 

KA1

ka2测试

VIP在KA1上VIP在KA2上

2.6 邮件通知

当两台服务器的主备发生变化或者有主机挂掉就会给运维人员发邮件

我们使用qq邮箱做实验

在浏览器上登录qq邮箱

点击右上角的账号与安全

在KA1和KA2主机上下载mailx

yum install mailx -y

在KA1和KA2上编辑邮件的配置文件

vim /etc/mail.rc

 测试发送邮件在KA1和KA2上编写发邮件的脚本         

给脚本执行权限

chmod +x /etc/keepalived/mail.sh

在KA1和KA2的keepalived的配置文件加上该配置

重启服务

systemctl restart keepalived.service

测试

停掉KA1的keepalived

systemctl stop keepalived.service

 重启KA1的keepalived

2.7 双主架构

分别两个虚拟路由

一个KA1为主KA2为备、一个KA2为主KA1为备 ————————————>互为主备

KA1:

在172.25.254.100 为主 在172.25.254.200为备

KA2:

重启服务测试:

KA1ka2关闭KA1的keepalived后2.8 ipvs设定

在server1和server2中设定

vim /etc/sysctl.d/arp.conf

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2

单主的LVS-DR模式

KA1:

下载ipvsadm:         

yum install ipvsadm -y

KA2:

下载ipvsadm

yum install ipvsadm -y

server 1

下载 httpd

yum install httpd -y

在 网页文件中写入数据做测试

启动服务

systemctl enable --now httpd

创建环回地址

ip a a 172.25.254.100/32 dev lo

环回不响应

刷新内核模块

[root@server1 ~]# sysctl --system

server2

下载 httpd

yum install httpd -y

在 网页文件中写入数据做测试

启动服务

systemctl enable --now httpd

创建环回地址

ip a a 172.25.254.100/32 dev lo

环回不响应

刷新内核模块

sysctl --system

测试:

清空策略

ipvsadm -C

重启keepalived服务刷新策略

[root@ka1 ~]# systemctl stop keepalived.service

查看策略

 ipvsadm -Ln

2.9 vrrp Script 配置 脚本控制vip

利用脚本实现主从角色切换

示例:先用例子测试一下:
检测文件是否存在,存在为真(1),ka1就降低优先级,vip飘到ka2上面,不存在为假(0),vip就按兵不动
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/ding ]   ---- 取反
 
chmod +x /etc/keepalived/test.sh ---- 给上可执行权限
 
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
 
vrrp_script check_file {
   script "/etc/keepalived/test.sh"     ------shell命令或脚本的路径
   interval 1                  ------ 检测的间隔时间,默认为1s
   weight -30                  ------ 默认为零,这里测试设置-30,当运行脚本检测到之后,为非0,就会与VIP的优先级相加,优先                                         降低,实现VIP飘移,为0时就VIP就按兵不动。
   fall 2                       ------ 脚本连续几次都执行失败,则转换为失败,建议设置为2以上
   rise 2                         ------ 执行脚本连续几次都成功,把服务器标记为成功
   timeout 2                   ------ 设置的超时时间。
}
 
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.254.10
    unicast_peer {
        172.25.254.20
    }
    track_script {            ------ 调用这个script配置参数
         check_file
    }    
}
 
[root@ka1 ~]# systemctl restart keepalived.service 
 
sh /etc/keepalived/test.sh
echo $?
 
0
此时/mnt底下没有ding这个文件,运行脚本输出0,VIP就按兵不动

此时在/mnt底下创建ding这个文件,输出为非0,执行脚本,此时vip飘到ka2上面

touch /mnt/ding
sh /etc/keepalived/test.sh
echo $?

1

ka1上面: ka2上面:

 删除这个文件之后,VIP就自动飘回来了
rm -rf /mnt/ding
systemctl restart keepalived.service

ifconfig

 3.0 keepalived-haproxy实现高可用

还原状态

两台ka1和ka2上安装haproxy
yum install haproxy -y
 
把两台server机上面的VIP和arp响应给去掉:
[root@realserver1 ~]# ip a d 172.25.254.100/32 dev lo
[root@realserver2 ~]# ip a d 172.25.254.100/32 dev lo
 
arp响应:
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
 
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
 
sysctl --system   ---- 查看
 
 
ka1和ka2上都开启内核路由:
[root@ka1 ~]# vim /etc/sysctl.conf 
[root@ka2 ~]# vim /etc/sysctl.conf 
 
et.ipv4.ip_nonlocal_bind=1    ---- 两台都开启内核路由
 
sysctl -p    ----- 刷新一下
 
记住要把之前做的LVS给注释掉,lvs和haproxy不能同时使用!!!!
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg
 
listen webcluster
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.110:80 check inter 3 fall 2 rise 5
    server web1 172.25.254.120:80 check inter 3 fall 2 rise 5
 
查看端口是否开启:
[root@ka1 ~]# netstat -antlupe | grep haproxy
tcp        0      0 172.25.254.100:80       0.0.0.0:*    LISTEN      0          2636800    5709/haproxy     
tcp        0      0 0.0.0.0:5000            0.0.0.0:*    LISTEN      0          2636798    5709/haproxy     
udp        0      0 0.0.0.0:35424           0.0.0.0:*                0          2636799    5708/haproxy     
[root@ka1 ~]# 

 实现haproxy高可用

如何检测haproxy的存活状态:
killall -0 haproxy
 
写入之前示例的那个脚本:
[root@ks2 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
 
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf 
[root@ka2~]# vim /etc/keepalived/keepalived.conf 
 
vrrp_script check_haproxy {
   script "/etc/keepalived/test.sh"     
   interval 1                  
   weight -30                 
   fall 2                       
   rise 2                         
   timeout 2                   
}
 
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.254.10
    unicast_peer {
        172.25.254.20
    }
    track_script {            
         check_haproxy
    }    
}
 
systemctl restart keepalived.service

 测试

复制一个ka1出来,写个死循环:
while true
>do
>curl 172.25.254.100;sleep 0.5
>done

把ka1上的haproxy挂掉,这边不会受影响,一直循环,VIP会飘到ka2上面

 

把ka1上面的haproxy给挂掉:

systemctl stop haproxy.service

此时ka1上面没有VIP了查看ka2上面:

把ka1上面的haproxy重新启动,VIP又回来了

systemctl start haproxy.service

       死循环也不会受影响,因为ka1上面haproxy挂掉了,ka1上的VIP优先级降低,飘到ka2上面去了,ka2上面的haproxy还存活,也有VIP,所以死循环会一直能访问。最终不会影响架构的最终访问。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值