Keepalived介绍
大白话:就是虚拟一个ip,然后虚拟机绑定该ip,如果该虚拟机挂掉,该另一个虚拟机就绑定虚拟ip。
keepalived是基于VRRP
协议为LVS
服务提供高可用方案。主要提供了负载均衡和高可用功能,用来避免单点故障。负载均衡是通过linux的IPVS(ip虚拟服务器)实现,高可用通过VRRP实现多机故障转移。
keepalived一般是2个节点运行keepalived,一台是主节点(MASTER
),一台是备节点(BACKUP)
,对外
表现都是一个虚拟IP
,主节点会通过组播方式发送特定的消息给备节点,如果备节点收不到这个特定消息时,说明主节点就宕机
了,此时备节点就会接管VIP
进行服务提供,这就实现了高可用。
VRRP: 虚拟路由器冗余协议(英语:Virtual Router Redundancy Protocol,缩写为 VRRP)是一种网络协议,可以为参与的路由器自动分配可用的IP地址。这个协议通过在子网中,自动选取默认网关,来增加路由的可用性和可靠性。
VRRP原理:是一种容错协议,保证当主机的下一条路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。
VRRP相关术语:
- 虚拟路由器:由一个Master路由器和一个或多个Backup路由器组成。
- VRID:虚拟路由器的标识。同一虚拟路由器内的路由器有着相同的VRID。
- VIP(虚拟IP地址):路由器组(虚拟路由器)的IP地址。
- 抢占模式与非抢占模式:Master会以组播方式不断的向虚拟路由器组内发送自己的心跳报文,一旦Backup在设定时间内没有收到心跳信息的次数超过了设定次数,则会将Master的所有权转移到优先级最高的Backup,则就是抢占模式。非抢占模式是指只有在主节点完全故障时才能将backup变为master。
组播:网卡支持并开启组播功能,组播通信方式是一种很节省资源的通信方式。其余还有单播、广播。
LVS:Linux虚拟服务器(Linux Virtual Server)是一个虚拟的服务器集群系统,用于实现负载平衡。
VIP:虚拟IP地址(Virtual IP Address),主要是用来进行不同主机之间的切换,主要用在服务器的主从切换。
实战
常用命令
1 2 3 4
| yum install -y keepalived
systemctl start keepalived
|
10.0.0.10
双主热备配置文件 /etc/keepalived/keepalived.conf
,10.0.0.11
修改相反即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| ! Configuration File for keepalived
global_defs { router_id NGINX_DEVEL1 }
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight 2 fall 3 rise 2 }
vrrp_instance VI_1 { state MASTER interface eth0 mcast_src_ip 10.0.0.10 virtual_router_id 51 priority 200 advert_int 1
track_interface { eth0 }
authentication { auth_type PASS auth_pass password123 }
virtual_ipaddress { 10.0.0.20/24 }
track_script { chk_nginx } }
vrrp_instance VI_2 { state BACKUP interface eth0 mcast_src_ip 10.0.0.11 virtual_router_id 52 priority 180 advert_int 1
track_interface { eth0 }
authentication { auth_type PASS auth_pass password123 }
virtual_ipaddress { 10.0.0.21/24 }
track_script { chk_nginx } }
|
后面就可以通过vip进行访问了。
ip a s
查看vip
1 2 3 4 5 6
| 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 52:54:99:e5:7e:13 brd ff:ff:ff:ff:ff:ff inet 10.0.0.10/24 brd 10.255.243.255 scope global noprefixroute dynamic eth0 valid_lft 58597sec preferred_lft 58597sec inet 10.0.0.20/24 scope global secondary eth0 valid_lft forever preferred_lft forever
|
/etc/keepalived/check_nginx.sh
脚本内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/bin/bash
function check_nginx() { for ((i=0;i<5;i++));do nginx_job_id=$(pgrep nginx) if [[ ! -z $nginx_job_id ]];then return else sleep 2 fi nginx_job_id=0 done }
check_nginx if [[ $nginx_job_id -eq 0 ]]; then /usr/bin/systemctl stop keepalived exit 1 else exit 0 fi
|