keeplived 基础知识总结(1)
越来越多的发现,随着自己对新知识和新技术的学习和”向往“,在面对曾经信手拈来的熟悉的知识,产生了越来越多的陌生和冷漠,在没有跳出层级之前,还是要把手边的知识掌握好,所以,接下来的还是要对手边的技术重新熟悉起来,才好有的放矢。
一、知识回顾
# HA(high availability)高可用是以减少服务中断时间为目的的技术,通过保护业务不间段,降低故障造成的损失。
# 衡量的标准就是通过平均无故障时间,通过运算可用时间在总时长中的比率来确认系统的可维护性,也就产生了“两个9”“三个9”等等衡量标准。
# 高可用之脑裂:当总从两台机器失去对方的联系,即从服务器无法判段主服务器的存活信息后,“自立为王”以后,和主服务器“共同管理”后台服务器的情况。
# 脑裂解决方案:1、增加心跳线;2、编写脚本进行监视和控制。
# 工作原理:vrrp虚拟路由冗余协议,将几台相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上有一个对外服务器的vip(虚拟ip),master会发组播,放backup收不到vrrp的包时就认为master宕机,根据vrrp的优先级来选举backup成为master,vip也随之漂移到新master上去。
# 组播地址:d类244.0.0.n段ip地址。
二、应用搭建
[root@init-02 ~]# yum -y install keepalived
[root@init-03 ~]# yum -y install keepalived
# keepalived有三个模块分别是core、check和vrrp。
# core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
# check负责健康检查,包括常见的各种检查方式。
# vrrp模块是来实现VRRP协议的。
[root@init-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id 1 # 设备在组中的标识,设置不一样即可
}
#vrrp_script chk_nginx { # 健康检查
# script "/etc/keepalived/ck_ng.sh" # 检查脚本
# interval 2 # 检查频率.秒
# weight -5 # priority减5
# fall 3 # 失败三次
# }
vrrp_instance VI_1 { # 组号VI_1。实例名两台路由器相同。
state MASTER # 主或者从状态MASTER/BACKUP
interface ens33 # 监控网卡
mcast_src_ip 192.168.253.129 # 心跳源IP
virtual_router_id 55 # 虚拟路由编号,主备要一致。
priority 100 # 优先级
advert_int 1 # 心跳间隔默认秒为单位
authentication { # 秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { # VIP
192.168.253.110/24
}
# track_script { # 引用脚本
# chk_nginx
# }
[root@init-02 ~]# scp -r /etc/keepalived/keepalived.conf 192.168.253.130:/etc/keepalived/
[root@init-03 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 2 # 设备在组中的标识,设置不一样即可
}
#vrrp_script chk_nginx { # 健康检查
# script "/etc/keepalived/ck_ng.sh" # 检查脚本
# interval 2 # 检查频率.秒
# weight -5 # priority减5
# fall 3 # 失败三次
# }
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。同学们要注意区分。
state BACKUP # 主或者从状态
interface ens33 # 监控网卡
mcast_src_ip 192.168.253.130 # 心跳源IP
virtual_router_id 55 # 虚拟路由编号,主备要一致。同学们注意区分
priority 90 # 优先级
advert_int 1 # 心跳间隔
authentication { # 秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { # VIP
192.168.253.110/24
}
# track_script { # 引用脚本
# chk_nginx
# }
}
[root@init-02 ~]# systemctl restart keepalived.service && systemctl enable keepalived.service
[root@init-03 ~]# systemctl restart keepalived.service && systemctl enable keepalived.service
[root@init-02 ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@init-03 ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@init-02 ~]# yum -y install nginx
[root@init-03 ~]# yum -y install nginx
[root@init-02 ~]# systemctl enable nginx.service && systemctl restart nginx.service
[root@init-03 ~]# systemctl enable nginx.service && systemctl restart nginx.service
[root@init-02 ~]# echo init-02 > /usr/share/nginx/html/index.html
[root@init-03 ~]# echo init-03 > /usr/share/nginx/html/index.html
[root@init-02 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e5:84:37 brd ff:ff:ff:ff:ff:ff
inet 192.168.253.129/24 brd 192.168.253.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.253.110/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::3038:9a4f:bf64:5855/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 现在虚拟ip已经在这台主机上了,也就是说现在访问虚拟ip得到的是当前主机的nginx界面
# 测试可用性,通过window对虚拟ip进行访问测试

# 将当前主机init-02干掉,vip会漂移到init-03上
[root@init-03 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e1:28:b7 brd ff:ff:ff:ff:ff:ff
inet 192.168.253.130/24 brd 192.168.253.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.253.110/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::25b7:81a2:af9d:e4e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 通过访问vip获得init-03nginx内index.html

# 小结: keepalived是通过vrrp协议来实现的,组内部服务器通过发送组播获取其他服务状态信息的,也就是说只适用于监控主机状况,而无法监控应用状况.
# 虽然keepalived无法监控应用状态,但本身允许嵌套脚本,可以通过脚本的方式,达成用keepalived嵌套脚本的方式监控应用状态,并作出相应的反应。
[root@init-03 ~]# vim /etc/keepalived/ck_ng.sh
#!/usr/bin/bash
number=$(ps -C nginx --no-heading | wc -l )
if [ "${number}" = 0 ] ;then
systemctl restart nginx
sleep 5
if [ "$number" = 0 ] ;then
systemctl stop keepalived
fi
fi
[root@init-03 ~]# chmod +x /etc/keepalived/ck_ng.sh
[root@init-03 ~]# ll /etc/keepalived/ck_ng.sh
-rwxr-xr-x 1 root root 200 Mar 26 21:28 /etc/keepalived/ck_ng.sh
[root@init-03 ~]# scp -r /etc/keepalived/ck_ng.sh 192.168.253.129:/etc/keepalived/
root@192.168.253.129's password:
ck_ng.sh 100% 200 55.9KB/s 00:00
[root@init-03 ~]# vim /etc/keepalived/keepalived.conf
# 去掉注释,启用check模块,其他模块不进行改动,下面是需要修改的部分
vrrp_script chk_nginx { # 健康检查
script "/etc/keepalived/ck_ng.sh" # 检查脚本
interval 2 # 检查频率.秒
weight -5 # priority减5
fall 3 # 失败三次
}
track_script { # 引用脚本名称
chk_nginx
}
}
# 同理对另外一台机器进行此操作。
# 操作结束后,需要对keepalived重启,加载配置项,使其生效!!!
[root@init-02 ~]# systemctl restart keepalived.service
[root@init-03 ~]# systemctl restart keepalived.service
# 这样这个需求才完成,我们尝试关停nginx服务进行测试,查看nginx的状态和页面访问情况。
# 运行良好,本次实验结束。
# 总结:keepalived内部嵌套脚本的方式,实现通过应用状态来保证业务的正常运行,保证了业务的高可用性,原理简单,甚至可以不使用内部嵌套脚本的方式,而使用cron+shell的方式来是实现这一功能,但是终究这样的配置更灵活更系统。另注:在满足功能的前提下,脚本越简单越好,脚本的执行时间过长,也会令其失去意义。