今天楼主面试就被问到了keepalived高可用,由于之前工作没有接触,方才上了博客看一看
官方介绍:Keepalived 是一个用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施。 负载均衡框架依赖于众所周知且广泛使用的Linux 虚拟服务器 (IPVS)内核模块,提供第 4 层负载均衡。Keepalived 实现了一组检查器,以根据其健康状况动态和自适应地维护和管理负载平衡的服务器池。另一方面,高可用性是通过VRRP实现的 协议。VRRP 是路由器故障转移的基础。此外,Keepalived 为 VRRP 有限状态机实现了一组钩子,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived 实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived 框架可以单独使用,也可以一起使用,以提供弹性基础设施。
Keepalived是高可用解决方案软件,高可用是主备意思;
Master --主上浮有资源(vip) Backup
发广播探测主服务是否存在
<-----------------------------------------
如果主存活,则主会回应
----------------------------------------->
后面一直重复这个动作
<-----------------------------------------
----------------------------------------->
当从服务器发广播时,主服务器没有回应,Backup会去抢主服务器的资源,然后将自己切换为主
<-----------------------------------------
当主服务器故障恢复后,主服务会向组id里探测成员是否存在;
再探测他的状态(他是backup还是master)'
当backup收到master主服务器的探测后,backup再向master发广播,
master回应backup,我存活,这时backup会释放资源(由master转换为backup)给master
----------------------------------------->
这里采用vrrp协议:专门用来做高可用
keepalived官方网站:www.keepalived.org
keepalived搭建方法:Centos7 yum安装
模拟的环境:
keepalived 浮动的VIP 192.1.1.100
keepalived + lvs master 192.1.1.199
keepalived + lvs backup 192.1.1.200
Apache01 192.1.1.201
Apache01 192.1.1.202
一、在lvs的机器操作:
# yum -y install keepalived ipvsadm
# vi /etc/keepalived/keepalived.conf --配置keepalived,达到高可用和负载均衡的效果
global_defs { --通用默认配置,是用于配置keepalived发生故障切换的邮件告警
notification_email {
acassen@firewall.loc --邮件接收人
failover@firewall.loc
sysadmin@firewall.loc
}
notification_eamil_from Alexandre.Cassen@firewall.loc --邮件发送人
smtp_server 192.168.200.1 --邮件发送人的smtp服务器
smtp_connect_timeout 30 --smtp服务器连接超时时间
router_id LVS_DEVEL --标识主备
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance HA_LVS { --配置vrrp冗余协议(高可用),HA_LVS为名称,可自定义
state MASTER --主服务器配置为:MASTER,备:BACKUP
interface ens33 --本机的有效网卡名称
virtual_router_id 20 --主备高可用组ID,主备必须一样,但在网段里必须唯一
priority 100 --优先级,主的值比备要大,例:主:100,备:99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --配置虚拟IP,简称:VIP
192.1.1.100 --VIP地址,必须要和有效网卡在同一网段
}
}
virtual_server 192.1.1.100 80 { --配置虚拟服务(LVS集群),如果只是做单纯的高可用,则这里以下都删除。
delay_loop 6
lb_algo rr --配置lvs算法
lb_kind DR --配置lvs模式
persistence_timeout 50 --配置连接超时间
protocol TCP --配置虚拟服务走TCP协议,如果UPD,则这里改成UDP
real_server 192.1.1.201 80 { --配置虚拟服务里真实的服务器
weight 1 --权值
HTTP_GET { --验证服务器是否健康,有3个方式:SSL_GET,TCP_CHECK,HTTP_GET connect_timeout 3 --验证服务器健康时,如果超过3秒没连接上,算超时有问题
nb_get_retry 3 --如果连接超时,则最多连接3次
delay_before_retry 3 --如果连接超时,则等3秒,再次连接
}
}
real_server 192.1.1.202 80 {
weight 1
HTTP_GET {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
安装完成后,启动keepalived
窗口:systemctl start keepalived
日志窗口:tail tail -f /var/log/messages
备:
主服务器的日志里要有明确的以下内容,代表启动成功
Nov 8 15:05:25 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) forcing a new MASTER election
Nov 8 15:05:26 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) Transition to MASTER STATE
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) Entering MASTER STATE --看到此行,代表主服务器,已识别自己为主
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) setting protocol iptable drop rule
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) setting protocol VIPs.
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) Sending/queueing gratuitous ARPs on ens33 for 192.1.1.100 --代表vrrp浮动在ens33网卡上,vip为192.1.1.100
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:27 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:32 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:32 lvs-master Keepalived_vrrp[2247]: VRRP_Instance(HA_LVS) Sending/queueing gratuitous ARPs on ens33 for 192.1.1.100
Nov 8 15:05:32 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:32 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:32 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
Nov 8 15:05:32 lvs-master Keepalived_vrrp[2247]: Sending gratuitous ARP on ens33 for 192.1.1.100
备服务器的日志里要有明确的以下内容,代表正常
Nov 8 15:05:15 lvs-backup Keepalived_vrrp[2178]: VRRP_Instance(HA_LVS) Entering BACKUP STATE --看到此行,代表备服务器,已识别自己为备
Nov 8 15:05:15 lvs-backup Keepalived_vrrp[2178]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
在主服务器上查看lvs集群配置是否添加成功
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.1.1.100:80 rr persistent 50 --lvs集群服务,也就是对外的访问入口
-> 192.1.1.201:80 Route 1 0 0 --代表lvs集群服务里的,真实服务器
-> 192.1.1.202:80 Route 1 0 0
二、来到Apache服务器上,安装httpd服务,用于测试,并打开arp欺骗
两台Apache服务器都要打开ARP欺骗 :
写一个ARP脚本
# cat lvs-dr
#!/bin/bash
case $1 in
start)
echo "conf localhost lo:0 ip ing........"
ifup lo
/sbin/ifconfig lo:0 192.1.1.100 netmask 255.255.255.255 broadcast 192.1.1.100
/sbin/route add -host 192.1.1.100 dev lo:0
echo
echo "success"
echo
echo "conf arp"
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
echo
echo "arp success"
echo "started"
;;
启动脚本
# sh lvs-dr start
查看本机的arp欺骗是否有绑定lvs的集群服务ip
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
inet 192.1.1.100/32 brd 192.1.1.100 scope global lo:0 --看到已经绑定成功
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 qlen 1000
link/ether 00:0c:29:27:59:9f brd ff:ff:ff:ff:ff:ff
inet 192.1.1.202/24 brd 192.1.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::4db7:1ae0:3cd8:c289/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::f44:eada:b878:ba75/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::ce4d:d2db:f685:3fe3/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
安装httpd服务,用于测试lvs集群服务
# yum -y install httpd
--启动httpd服务
# systemctl restart httpd
--查看httpd服务监听的80端口,是否启用
# netstat -anlp|grep :80
--如果有此输出,则代表httpd启动成功
tcp6 0 0 :::80 :::* LISTEN 1784/httpd
接下来,往httpd服务的数据家目录,写一个index.html文件,写点内容,用于测试识别
Apache01上操作:
# vi /var/www/html/index.html
Test lvs localhost ip :192.1.1.201:80
Apache02上操作:
# vi /var/www/html/index.html
Test lvs localhost ip :192.1.1.202:80
三、来到宿主机上访问192.1.1.100集群服务,看能否看到Apache上写的内容
浏览器访问:http://192.1.1.100
访问过后,再到lvs服务器上查看是否有连接访问本机集群服务
在lvs主服务器上执行以下命令:
# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:46 FIN_WAIT 192.1.1.1:51030 192.1.1.100:80 192.1.1.202:80
TCP 01:46 FIN_WAIT 192.1.1.1:51029 192.1.1.100:80 192.1.1.202:80
TCP 00:25 SYN_RECV 192.1.1.1:51028 192.1.1.100:80 192.1.1.202:80
TCP 00:27 NONE 192.1.1.1:0 192.1.1.100:80 192.1.1.202:80
备:
--这里的source代表正在访问集群服务的ip主机,virtual代表是集群服务,destination代表的是目标真实服务器
--当看到destination转到192.1.1.202服务器时,这里我们再来到192.1.1.202服务器,执行netstat -anlp|grep :80 查看lvs集群服务有没有转到本服务器
在192.1.1.200服务器执行:
# netstat -anlp|grep :80
tcp6 0 0 :::80 :::* LISTEN 1784/httpd
tcp6 0 0 192.1.1.100:80 192.1.1.1:51029 TIME_WAIT -
备:
--192.1.1.100:80代表的本机处理请求的ip地址,192.1.1.1代表的是处理请求过后的结果接收服务器