Keepalived简介
什么是Keepalived:keepalived可以实现服务的高可用或热备,用来防止单点故障的问题;而Keepalived的核心VRRP协议,VRRP协议主要实现了在路由器或三层交换机处的冗余;Keepalived就是使用VRRP协议来实现高可用的;下面一起来看一下Keepalived的原理图:
Keepalived启动后会有三个进程:
父进程:内存管理,子进程管理
子进程:VRRP子进程
子进程:healthchecker子进程
由上图可知:两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的VRRP子进程,让它删除通告,并且去掉虚拟IP,转换为BACKUP状态;
Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器,管理服务器池,而不仅仅用来做双机热备。通过LVS+Keepalived构建的LVS集群,LVS负载均衡用户请求到后端Real WEB服务器,Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
使用keepalived构建LVS群集更加简便易用,主要优势体现在:
对LVS负载调度器实现热备切换,提高可用性;
对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。
负载均衡架构图:
配置安装LVS+keepalived
1.在Master与Backup服务器上分别安装Ipvsadm、Keepalived软件包、这里使用的是yum安装方式
yum install -y keepalived ipvsadm
注释:IPVSADM理解为IPVS管理工具;LVS(Linux Virtual Server)的核心为IPVS(IP Virtual Server), 从Linux内核版本2.6起,IPVS模块已经编译进了Linux内核。
这里安装Ipvsadm工具主要是为了查看lvs规则使用,不安装ipvsadm工具也能成功配置规则,但不方便。
2.修改Master端的keepalived配置文件
keepalived的文件路径/etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived
global_defs {
notification_email { #设置邮件报警通知地址,可以设置多个
admin@fandenggui.com
}
notification_email_from root@localhost #设置报警邮件的发送地址
smtp_server 127.0.0.1 #设置SMTP server的地址,必须存在
smtp_connect_timeout 30 #设置连接SMTP server的超时时间
router_id LVS_MASTER #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
}
vrrp_instance VI_1 { #定义VRRP实例,实例名自定义
state MASTER #指定Keepalived角色MASTER/BACKUP
interface eth0 #指定HA监测的接口
virtual_router_id 51 #虚拟路由标识,1-255之间的数字,在一个VRRP实例中主备服务器ID必须一致
priority 100 #优先级,数字越大优先级越高,在一个实例中主服务器要高于备服务器的优先级
advert_int 1 #设置主备之间同步检查的时间间隔(秒)
authentication { #设置验证类型和密码
auth_type PASS #验证类型(PASS|HA)
auth_pass mypass #验证密码,一个实例中主备密码要保持一致
}
virtual_ipaddress { #定义虚拟IP地址,可以有多个,每行一个
10.1.2.100
}
}
virtual_server 10.1.2.100 80 { #设置虚拟服务器,需要指定虚拟IP与服务端口,用空格隔开
delay_loop 6 #设置健康检查时间(秒)
lb_algo rr #设置负载算法,rr为轮询
lb_kind DR #设置负载机制,NAT/TUN/DR三种
nat_mask 255.255.255.0 #设置掩码
persistence_timeout 50 #会话保持时间(秒)这个选项对于动态网站非常有用,为集群系统中session共享提供了一个很好的解决方案
protocol TCP #指定转发协议类型(TCP/UDP)
real_server 10.1.2.20 80 { #设置后端服务器节点,指定Real_server的IP与端口,用空格隔开
weight 1 #配置服务器节点的权重,数字越大权重越高
TCP_CHECK { #设置检测Real_server的方式为HTTP协议{TCP_CHECK|HTTP_GET|SSL_GET|MISC_CHECK}
connect_timeout 3 #设置响应超时时间
nb_get_retry 3 #设置超时重试次数
delay_before_retry 3 #设置超时后重试间隔时间
}
}
real_server 10.1.2.21 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3.将Master服务器节点上的主配置文件拷贝到Backup服务器节点上稍作修改
##修改如下两项
# vim /etc/keepalived/keepalived.conf state BACKUP priority 99
4.启动两台服务器上的Keepalived服务并设置为开机自启动
service keepalived start chkconfig keepalived on
PS:Keepalived的日志信息存储在/var/log/message中
5.开启Master节点与Backup节点服务器的路由转发功能
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p #执行该命令,使配置生效
安装配置后端Real Web服务器
1. 出于测试考虑,我先安装Apache服务器,并定义两台WEB页面为不同的内容
yum install httpd -y vim /var/www/html/index.html From Real Web 1..... service httpd start chkconfig httpd on
在Real Web2上面执行相同的操作,将index.html的内容改为
From Real Web 2.。。。。
2. 使用脚本为两台Real Web服务器配置自动修改内核参数与虚拟IP
vim /etc/init.d/lvsrs #!/bin/bash SNS_VIP=10.1.2.100 . /etc/rc.d/init.d/functions case "$1" in start) /sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up /sbin/route add -host $SNS_VIP dev lo:0 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 syscty -p > /dev/null 2>&1 echo "RealServer Start Ok" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 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 "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0 chmod +x /etc/init.d/lvsrs #为脚本添加执行权限 sersvice lvsrs start
3. 在另一台Real Web服务器编辑相同的脚本,并执行启动该脚本。
4.查看节点的VIP地址设置完成与否:
# ip addr show lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet 10.1.2.100/32 brd 10.1.2.100 scope global lo:0 inet6 ::1/128 scope host valid_lft forever preferred_lft forever
访问测试:
这里我们用的是轮询调度算法(简称rr),更多算法:点击了解!
模拟故障发生:
一、模拟lvs层故障,将LVS_Master中的Keepalived服务停止,查看LVS_Slave服务器是否接管所有服务。
1. 默认LVS层只有Master上面有虚拟IP的信息
#LVS_Master执行如下命令: ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:1f:c8:6f brd ff:ff:ff:ff:ff:ff inet 10.1.2.10/24 brd 10.1.2.255 scope global eth1 inet 10.1.2.100/32 scope global eth0 #这里是虚拟IP inet6 fe80::20c:29ff:fe1f:c86f/64 scope link valid_lft forever preferred_lft forever #LVS_Slave执行同样命令则没有虚拟IP ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:75:91:de brd ff:ff:ff:ff:ff:ff inet 10.1.2.11/24 brd 10.1.2.255 scope global eth0 inet6 fe80::20c:29ff:fe75:91de/64 scope link valid_lft forever preferred_lft forever
2. 下面我们关闭Master上面的Keepalived,查看相关信息变化:
Master上执行: service keepalived stop # LVS_Master中的日志信息: Oct 10 19:22:02 localhost Keepalived_healthcheckers[21125]: Removing service [10.1.2.20]:80 from VS [10.1.2.100]:80 Oct 10 19:22:02 localhost Keepalived_vrrp[21126]: VRRP_Instance(VI_1) sending 0 priority Oct 10 19:22:02 localhost Keepalived_vrrp[21126]: VRRP_Instance(VI_1) removing protocol VIPs. Oct 10 19:22:02 localhost Keepalived_healthcheckers[21125]: Removing service [10.1.2.21]:80 from VS [10.1.2.100]:80 Oct 10 19:22:02 localhost kernel: IPVS: __ip_vs_del_service: enter Oct 10 19:22:02 localhost Keepalived[21123]: Stopping Keepalived v1.2.13 (03/19,2015) # LVS_Slave中的日志信息变化: Oct 10 19:22:03 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Transition to MASTER STATE Oct 10 19:22:04 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Entering MASTER STATE Oct 10 19:22:04 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) setting protocol VIPs. Oct 10 19:22:04 localhost Keepalived_healthcheckers[11096]: Netlink reflector reports IP 10.1.2.100 added Oct 10 19:22:04 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 10.1.2.100 Oct 10 19:22:09 localhost Keepalived_vrrp[11097]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 10.1.2.100 # 再次查看LVS_Slave中的地址 ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:75:91:de brd ff:ff:ff:ff:ff:ff inet 10.1.2.11/24 brd 10.1.2.255 scope global eth1 inet 10.1.2.100/32 scope global eth0 #多了虚拟IP。 inet6 fe80::20c:29ff:fe75:91de/64 scope link valid_lft forever preferred_lft forever
3. 测试访问服务是否正常。
4. 如果Master服务器修复好重新上线,则虚拟IP会重新配置到Master上而在Slave上面删除。
二、如果后端Real Web 服务出现故障,则LVS会自动剔除相应故障主机的规则
关闭Real Web 1 上面的httpd服务查看相关信息
# Real Web 1 执行: service httpd stop # 产看LVS_Master上的日志信息: Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: TCP connection to [10.1.2.20]:80 failed !!! Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: Removing service [10.1.2.20]:80 from VS [10.1.2.100]:80 Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: Remote SMTP server [127.0.0.1]:25 connected. Oct 10 19:36:38 localhost Keepalived_healthcheckers[25886]: SMTP alert successfully sent. # 查看LVS_Master上的ipvs规则: # ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.2.100:80 rr persistent 50 -> 10.1.2.21:80 Route 1 0 0 # 查看LVS_Slave上的日志信息: Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: TCP connection to [10.1.2.20]:80 failed !!! Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: Removing service [10.1.2.20]:80 from VS [10.1.2.100]:80 Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: Remote SMTP server [127.0.0.1]:25 connected. Oct 10 19:36:39 localhost Keepalived_healthcheckers[11096]: SMTP alert successfully sent.
可以看到当后端Real server出现问题,lvs规则中会剔除故障主机信息,并发送报警邮件。
注:LVS主备中的优先级问题,如果两者优先级一致,则会导致Master故障并修复启动后,并不会重新接管VIP和IPVS规则。虽然经过测试Slave发送故障时候,Master也会再次接管,但是为了避免一些位置问题,实际生产环境中,主节点优先级一定要高于备节点。
Be First to Comment