keepalived 是一个类似于layer3, 4 & 5 交换机制的软件,也就是我们平时说的第3 层、第4 层和第5层交换。Keepalived 的作用是检测web 服务器的状态,如果有一台web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的web 服务器从系统中剔除,当web 服务器工作正常后Keepalived 自动将web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web 服务器。
拓展:OSI七层
拓展:OSI七层相关协议
Keepalived工作原理
Layer3,4&5 工作在IP/TCP 协议栈的IP 层,TCP 层,及应用层,。
Layer3:Keepalived 使用Layer3 的方式工作式时,Keepalived 会定期向服务器群中的服务器发送一个ICMP 的数据包(既我们平时用的Ping 程序), 如果发现某台服务的IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP 地址是否有效作为服务器工作正常与否的标准。
Layer4:主要以TCP 端口的状态来决定服务器工作正常与否。如web server 的服务端口一般是80,如果Keepalived 检测到80 端口没有启动,则Keepalived 将把这台服务器从服务器群中删除。
Layer5:Layer5 就是工作在具体的应用层了,比Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived 将把服务器从服务器群中剔除。
Keepalived的作用与构建
1.管理VIP VIP 会在LVS 之间漂移
2.监控LVS分发器
运行在主分发的Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主LVS 挂了,开始接手主分发器工作,把VIP 配给自己。
3.管理RS
Keepalived 会每隔一个时间段去做一次类似于访问的操作如:
探针:elinks http://172.17.0.34 –dump
经典高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选)
http://www.keepalived.org/
下载:http://www.keepalived.org/download.html
使用Keepalived构建LVS-DR模式的高可用集群
安装ipvsadm
yum install ipvsadm
安装完成不需要做任何配置,启动方式由keepalived控制
安装keepalived
第一种安装方法:
yum install –y keepalived
查看安装路径:
rpm -ql keepalived-1.3.5-1.el7.x86_64
拓展:VRRP/HSRP
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。使用组播方式通信。
VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。
工作流程如图:
HSRP:热备份路由器协议(HSRP)的设计目标是支持特定情况下IP 流量失败转移不会引起混乱、并允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能维护路由器间的连通性。换句话说,当源主机不能动态知道第一跳路由器的IP 地址时,HSRP 协议能够保护第一跳路由器不出故障,是CISCO的私有协议!该协议中含有多台路由器,对应一个HSRP组。该组中只有一个路由器承担转发用户流量的职责,这就是活动路由器。当活动路由器失效后,备份路由器将承担该职责,成为新的活动路由器。这就是热备份的原理。
HSRP和VRRP的区别:HSRP是cisco的专有协议.在Cisco的HSRP之后,internet工程任务小组(internet engineering task force,IETF)也制定一种路由冗余协议:虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP),目前包括Csico在内的主流厂商均在其产品中支持VRRP协议!VRRP和HSRP也有很多不同。VRRP和HSRP 的一个主要的区别在安全方面:它允许参与VRRP组的设备间建立认证机制。另一个主要区别:VRRP中只有三种状态----初始状态(Initialize)、主状态(Master)、备份状态(Backup),而HSRP 有六种状态。其余在报文类型、报文格式和通过TCP而非UDP发送的报文方面也有所不同
[root@localhost ~]# ip add
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0:
link/ether 02:00:08:5b:00:76 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.150/20 brd 172.17.15.255 scope global eth0
配置Keepalived+LVS-DR模式
在这种模式下,虚拟IP 在某时刻只能属于某一个节点,另一个节点作为备用节点存在。当主节点不可用时,备用节点接管虚拟IP,提供正常服务。
配置参数:节点172.17.1.150(主节点);节点172.17.1.151(备用节点) ; 虚拟IP 172.17.1.160对外提供服务的IP。要求默认情况下由节点172.17.1.150提供服务,当节点172.17.1.150 不可用时,由节点172.17.1.151 提供服务(即虚拟IP 漂移至节点172.17.1.151)。
主节点172.17.1.150配置
[root@localhost ~]# cp keepalived.conf keepalived.conf.bak
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost #默认三个地址,修改可用地址
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL #标识当前节点名字,两个节点的此项需要不相同。
}
vrrp_instance apache {
state MASTER #指定A 节点为主节点备用节点上设置为BACKUP 即可
interface eth0 #绑定虚拟IP 的网络接口
virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP 组
priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.1.160 #指定虚拟IP, 两个节点设置必须一样
}
}
#类似添加虚拟一个服务ipvsadm -A -t 192.168.1.70:80 -s rr
virtual_server 172.17.1.160 80 {
delay_loop 6 #Keepalived 多长时间监测一次RS
lb_algo rr #分发算法
lb_kind DR #DR 模式
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
real_server 172.17.1.152 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.17.1.153 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# systemctl enable keepalived
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
#注:没有看到realserver,是因为两台realserver 还没有开启httpd 服务。
备用节点172.17.1.151配置
安装ipvsadm
yum install –y ipvsadm
安装keepalived
第一种安装方法:
yum install –y keepalived
和主节点172.17.1.150配置差不多相同,直接从172.17.1.150上scp拷贝配置文件
[root@localhost ~]# scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/
复制过来之后,还要做一定的修改:
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
注:红色为改动项值
vrrp_instance apache {
state BACKUP #当前LVS 状态为备用分发器
interface ens32
virtual_router_id 51
priority 90 #LVS 优先级,备的要比主的小
……
启动:
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# systemctl enable keepalived
测试LVS IP飘移
[root@localhost ~]# systemctl stop keepalived
去从的机器查看ip是否漂移过来
[root@localhost ~]# ip add
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0:
link/ether 02:00:25:30:04:01 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.151/20 brd 172.17.15.255 scope global eth0
inet 172.17.1.160/32 scope global eth0
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
-> 172.17.1.152:80 Route 1 0 0
-> 172.17.1.153:80 Route 1 0 0
#看到172.17.1.160飘移过来了,就证明一切正常了
配置RS1
[root@localhost ~]# vim /etc/init.d/lvsrsdr #写一个配置RS的脚本
#!/bin/bash
#description:start relserver
VIP=172.17.1.160
source /etc/init.d/functions #加载环境变量(可以加载所有的环境变量)
case $1 in
start)
echo ' start LVS of REALServer'
/sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
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
;;
stop)
/sbin/ifconfig lo:1 down
echo 'close LVS Directorserver'
echo '0' > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo '0' > /proc/sys/net/ipv4/conf/lo/arp_announce
echo '0' > /proc/sys/net/ipv4/conf/all/arp_ignore
echo '0' > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 (start|stop)"
exit 1
esac
[root@localhost ~]#chmod +x /etc/init.d/lvsrsdr
[root@localhost ~]# /etc/init.d/lvsrsdr start
[root@localhost ~]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:00:08:5B:00:76
inet addr:172.17.1.152 Bcast:172.17.15.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16881281353 errors:0 dropped:0 overruns:0 frame:0
TX packets:14227651287 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3628449350074 (3.3 TiB) TX bytes:2081268815287 (1.8 TiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4307 errors:0 dropped:0 overruns:0 frame:0
TX packets:4307 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:576540 (563.0 KiB) TX bytes:576540 (563.0 KiB)
lo:0 Link encap:Local Loopback
inet addr:172.17.0.9 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# echo yunweimao > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
配置RS2
从172.17.1.152上拷贝脚本
[root@localhost ~]# scp /etc/init.d/lvsrsdr 172.17.1.153:/etc/init.d/
然后执行
[root@localhost ~]# chmod +x /etc/init.d/lvsrsdr
[root@localhost ~]# /etc/init.d/lvsrsdr start
[root@localhost ~]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:00:08:5B:00:76
inet addr:172.17.1.153 Bcast:172.17.15.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16881281353 errors:0 dropped:0 overruns:0 frame:0
TX packets:14227651287 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3628449350074 (3.3 TiB) TX bytes:2081268815287 (1.8 TiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4307 errors:0 dropped:0 overruns:0 frame:0
TX packets:4307 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:576540 (563.0 KiB) TX bytes:576540 (563.0 KiB)
lo:0 Link encap:Local Loopback
inet addr:172.17.0.9 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# echo maoxiaopu > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
测试
http://172.17.1.160
测试主备切换,首选在主上172.17.1.150上查看状态
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
-> 172.17.1.152:80 Route 1 0 0
-> 172.17.1.153:80 Route 1 0 0
[root@localhost ~]# ip add
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0:
link/ether 02:00:1e:72:04:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.150/20 brd 172.17.15.255 scope global eth0
inet 172.17.1.160/32 scope global eth0
在备上查看172.17.1.151的状态
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
-> 172.17.1.152:80 Route 1 0 0
-> 172.17.1.153:80 Route 1 0 0
[root@localhost ~]# ip add
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0:
link/ether 02:00:25:30:04:01 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.151/20 brd 172.17.15.255 scope global eth0
关于运维学习、分享、交流,笔者开通了微信公众号【运维猫】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学运维知识。
女票从事平面设计这一块,需要设计海报,宣传册的也可以联系我,明码标价3元/1页。
有需要技术交流的小伙伴可以加我微信,期待与大家共同成长,本人微信: