Keepalived介绍
keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。
Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
- Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
- Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
- Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。URL
简单的说基于3层是通过ICMP协议ping包监控ip,4层是监控端口号是否启动,7层是检查具体服务是否运行
VRRP介绍
- VRRP的目的就是为了解决静态路由单点故障问题
VRRP通过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器 - 工作机制
由多个物理路由器虚拟出一个VRRP虚拟路由器,这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其 它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MASTER - MASTER拥有一些特权,比如 拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。由于安全性考虑,VRRP包使用了加密协议进行加密
keepalived服务的安装
涉及到的服务器都需要安装keepalived把自己封装成路由器再进行竞争选举最后生成虚拟路由器VRRP
#首先由于涉及到内核需要先安装内核的软件包
[root@localhost ~]# yum install kernel kernel-devel
#检查内核下是否有目录
[root@localhost 2.6.32-431.el6.x86_64]# pwd
/usr/src/kernels/2.6.32-431.el6.x86_64
#下载软件包解压
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://www.keepalived.org/software/keepalived-1.2.1.tar.gz
[root@localhost src]# tar zxvf keepalived-1.2.1.tar.gz
[root@localhost src]# cd keepalived-1.2.1
[root@localhost keepalived-1.2.1]# ls
AUTHOR configure COPYING INSTALL keepalived.spec.in README
bin configure.in doc install-sh lib TODO
ChangeLog CONTRIBUTORS genhash keepalived Makefile.in VERSION
开始编译安装
#这里预编译不指定安装目录,会默认安装到内核中
[root@localhost keepalived-1.2.1]# ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
[root@localhost keepalived-1.2.1]# make
[root@localhost keepalived-1.2.1]# make install
安装报错信息如下
#报错一、预编译缺少库
checking for poptGetContext in -lpopt... no
configure: error: Popt libraries is required
原因分析:未安装popt的开发包
解决如下:
[root@localhost keepalived-1.2.1]# yum install popt-devel -y
#报错二、编译报错
../include/check_data.h:38:27: 错误:linux/ip_masq.h:没有那个文件或目录
../include/check_data.h:39:25: 错误:net/ip_masq.h:没有那个文件或目录
In file included from ../include/check_api.h:29,
from layer4.c:27:
../include/check_data.h:113: 错误:‘IP_MASQ_TNAME_MAX’未声明(不在函数内)
layer4.c: 在函数‘tcp_socket_state’中:
layer4.c:111: 警告:传递‘getsockopt’的参数 5 给指针时,目标与指针符号不一致
/usr/include/sys/socket.h:190: 附注:需要类型‘socklen_t * __restrict__’,但实参的类型为‘int *’
make[2]: *** [layer4.o] 错误 1
make[2]: Leaving directory `/usr/src/keepalived-1.1.7/keepalived/core'
make[1]: *** [all] 错误 1
make[1]: Leaving directory `/usr/src/keepalived-1.1.7/keepalived'
make: *** [all] 错误 2
原因:解决方法:
进入源码目录就是你解压的目录了:cd /usr/local/src/keepalived-1.2.2
vi keepalived/libipvs-2.6/ip_vs.h
找到下面一行:
#include <linux/types.h> /* For __beXX types in userland */
把他放到下面一行的下面:
#include <sys/types.h>
这是最新版本的问题,如果用keepalived-1.2.1则不会出现这个问题了,我用的是keepalived-1.1.7
安装后所有文件存在/usr/local/etc目录下,拷贝相关文件到系统服务目录
#拷贝启动文件到系统目录
[root@yumserver etc]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
#拷贝系统配置文件到系统目录
[root@yumserver etc]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#创建主配置文件存放目录
[root@yumserver etc]# mkdir -p /etc/keepalived
#拷贝二进制sbin文件到系统目录
[root@yumserver etc]# cp /usr/local/sbin/keepalived /usr/sbin/
创建keepalived服务主配置文件
- 一个功能比较完整的keepalived的配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块。
[root@yumserver etc]# vim /etc/keepalived/keepalived.conf
1 #######GLOBAL CONF#### 全局配置定义管理员邮箱及路由信息,感叹号!开头表示注释信息
2 ! Configuration File for keepalived
3 global_defs {
4 notification_email {
5 wgkgood@139.com #接收邮件的邮箱,一行一个
6 }
7 notification_email_from wgkgood@139.com #发送邮件的邮箱
8 smtp_server 127.0.0.1 #邮件服务器的IP
9 smtp_connect_timeout 30 #发送连接超时设置30秒
10 router_id LVS_DEVEL #设置默认路由ID
11 }
12 ######## VIP1 VRRP CONF###### VRRP虚拟路由器定义块
13 vrrp_instance VI_1 { #配置一个vrrp实例(instance),别名VI_1
14 state BACKUP #状态设置BACKUP
15 interface eth0 #配置实例绑定的网卡eth0
16 lvs_sync_daemon_inteface eth0 #配置虚拟路由器同步的接口
17 virtual_router_id 151 #配置路由ID,虚拟路由器组成的物理机该ID需要保持一致通过#tcpdump vrrp查看
18 priority 100 #优先级,高优先级竞选为master
19 advert_int 5 #master广播发送包的时间间隔
20 nopreempt #设置为不抢占
21 authentication { #设置主机之间认证
22 auth_type PASS #keepalived物理主机之间的认证方式
23 auth_pass 2222 #认证密码
24 }
25 virtual_ipaddress {
26 192.168.15.201 #定义虚拟路由器的IP即VIP
27 }
28 }
29 ############CHECK VHOST PORT############## 虚拟服务器定义块
30 virtual_server 192.168.15.201 3306 { #虚拟服务器检查的端口3306是mysql,80是nginx
31 delay_loop 6 #健康检查时间间隔
32 lb_algo wrr #负载均衡调度算法,互联网应用常使用wlc或rr
33 lb_kind DR #负载均衡转发规则。一般包括DR,NAT,TUN3种,在我的方案中,都使用DR的方式
34 persistence_timeout 60 #会话保持时间6秒
35 protocol TCP #转发协议protocol.一般有tcp和udp两种
36 real_server 192.168.15.103 3306 { #通过TCP协议检查物理服务器的端口,可以是本机或者远程机器
37 weight 100 #权重100使用不同的权重值的目的在于为不同性能的机器分配不同的负载
38 notify_down /data/sh/mysql.sh #端口当机执行的脚本
39 TCP_CHECK {
40 connect_timeout 10 #连接超时时间
41 nb_get_retry 3 #重连次数
42 delay_before_retry 3 #重连间隔时间
43 connect_port 3306 #健康检查的端口
44 }
45 }
将配置文件拷贝到另一台机器修改真实主机的IP以及优先级MASTER
分别重启keepalived服务
[root@localhost ~]# /etc/init.d/keepalived restart
停止 keepalived: [失败]
正在启动 keepalived: [确定]
启动后查看日志信息发现报错
[root@yumserver etc]# tail -fn 10 /var/log/messages
Jan 11 13:39:31 yumserver Keepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
#这是因为没有加载ipvs模块,先临时手动加载后重启keepalived
[root@yumserver etc]# modprobe ip_vs
[root@localhost ~]# /etc/init.d/keepalived restart
#查看日出出现如下信息竞选master成功
Jan 6 19:02:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Jan 6 19:02:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Jan 6 19:02:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Jan 6 19:02:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.15.201
查看虚拟VIP
[root@localhost ~]# ip addr list
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:42:12:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.15.172/24 brd 192.168.15.255 scope global eth0
inet 192.168.15.201/32 scope global eth0
inet6 fe80::20c:29ff:fe42:129e/64 scope link
valid_lft forever preferred_lft forever
关于配置主文件的一些说明
- 虚拟VVRP定义块里面state BACKUP,如果设置为MASTER在集群机器都存活时,该机器就是MASTER,一旦监控端口挂掉,VIP会漂移到竞选产生的新MASTER上,但是一旦原机器恢复并重新加入集群,VIP会立马漂移回来,重新抢回MASTER,造成多次访问中断影响用户体验
- 虚拟VVRP定义块里面priority 100设置权重,之前所有机器都是BACKUP,就通过权重高的竞选MASTER
- 虚拟VVRP定义块里面nopreempt就是为了约束权重高的服务器,当发生异常退出集群后,竞选产生新的MASTER,此时当原来的MASTER服务器恢复故障重新加入集群后,虽然权重高,但由于该条的约束不会去竞争MASTER,直到集群中的新MASTER故障进行重新竞争选举.
- 虚拟服务器定义块里 notify_down /data/sh/check_nginx.sh是监测到端口没存活时执行的脚本,一般语句有三段,首先立刻停止keepalived服务
/etc/init.d/keepalived stop
,之后等待20ssleep 20
集群完成VIP漂移竞选新的MASTER,重启检测的服务如nginx服务/usr/local/nginx/bin/nginx -s restart
,最后重启keepalived加入集群/etc/init.d/keepalived restart
- 一般来说定义虚拟服务器块里面监测的real server真实服务器直接监测本机IP端口号,远端的服务器虽然可以监控但是无法访问验证,因此建议安装keepalived的服务器监控自己本地的端口号并根据脚本做对应的配置.
网友评论