第四十一节、Keepalived高可用

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的服务器监控自己本地的端口号并根据脚本做对应的配置.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352