Keepalived
一、keepalived简介
概述:
keepalived起初为Lvs设计的一款强大的辅助工具,保证LB负载调度器的故障切换以及RS节点的健康状态检查,后续被应用到很多需要容错的场景下,keepalived自身基于VRRP协议--虚拟路由冗余协议,思科公有协议。
二、keepalived设计原理
2.1 为什么keepalived能够实现高可用呢?
因为他用到了虚拟路由冗余协议(VRRP)
2.2 keepalived有哪些设计模块?
core模块 //为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析
check模块 //负责real server 节点池内的节点的健康检测
VRRP模块 //在master与backup之间执行心跳检测
2.3 keepalived的热备实现过程
- 将多个主机以软件的方式组成一个热备组,通过共有的虚拟ip(VIP)地址对外提供服务,同一时刻,热备组中只有一台主机在工作,别的主机冗余状态,当当前在线的主机失效时,其他冗余的主机会自动接替虚拟ip地址,继续提供服务,以保证架构的稳定性。
三、VRRP协议
3.1 简介
VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议。
VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。
配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。
VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。
VRRP的工作过程为:
-
虚拟路由器中的路由器根据优先级选举出Master。Master 路由器通过发送免费ARP 报文,将自己的虚拟MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
-
Master 路由器周期性发送VRRP 报文,以公布其配置信息(优先级等)和工作状况;
-
如果Master 路由器出现故障,虚拟路由器中的Backup 路由器将根据优先级重新选举新的Master;
-
虚拟路由器状态切换时,Master 路由器由一台设备切换为另外一台设备,新的Master 路由器只是简单地发送一个携带虚拟路由器的MAC 地址和虚拟IP地址信息的免费ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到Master 路由器已经切换为另外一台设备。
-
Backup 路由器的优先级高于Master 路由器时,由Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。
3.2 VRRP的几个术语
- 虚拟路由器:由一个Master路由器和多个Backup路由器组成。主机将虚拟路由器当作默认网关。
- 虚拟路由器标识 VRID:虚拟路由器的标识。由相同VRID的一组路由器构成一个虚拟路由器。
- Master路由器:虚拟路由器中承担报文转发任务的路由器。
- Backup路由器:Master路由器出现故障时,能够代替Master路由器工作的路由器。
- 虚拟IP地址:虚拟路由器的IP地址。一个虚拟路由器可以拥有一个或多个IP地址。
- 优先级:VRRP根据优先级来确定虚拟路由器中每台路由器的地位。
- 虚拟MAC地址:一个虚拟路由器拥有一个虚拟MAC地址。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
四、keepalived架构图
4.1 示图
4.2 各组件说明
组件说明 | |
---|---|
checkers | 检查后端RS的健康状态,并且也能管理后端RS,该组件使用独立的子进程负责,由父进程管理。 |
VRRPstack | 基于VRRP协议实现高可用的组件,它能够提供故障转移功能,并且能单独使用,即不对后端做健康检查,运行为一个独立的子进程由父进程管理 |
System Call | 提供读取自定义脚本的功能 |
IPVS wrapper | 能够读取配置文件的规则,通过系统调用直接管理ipvs |
NetlinkReflector | 用于管理和检查VIP地址 |
Watch Dog | 用于检查Checkers和VRRPstack进程 |
五、Keepalived 实现双机热备
- 案例环境
系统类型 | IP地址 | 主机名 | 软件包 |
---|---|---|---|
Centos7 | 192.168.2.1 | keep01 | keepalived-1.2.13.tar.gz |
Centos7 | 192.168.2.2 | keep02 | keepalived-1.2.13.tar.gz |
5.1 两台节点上部署httpd服务
//keep01节点
[root@keep01 ~]# yum -y install httpd
[root@keep01 ~]# systemctl start httpd;systemctl enable httpd
[root@keep01 ~]# netstat -utpln |grep 80
[root@keep01 ~]# cat <<END > /var/www/html/index.html
<h1> 192.168.2.1 </h1>
END
//keep02节点
[root@keep02 ~]# yum -y install httpd
[root@keep01 ~]# systemctl start httpd;systemctl enable httpd
[root@keep02 ~]# netstat -utpln |grep 80
[root@keep02 ~]# cat <<END > /var/www/html/index.html
<h1> 192.168.2.2 </h1>
END
- 访问查看一下
5.2 两台节点上安装keepalived(操作相同)
5.2.1 下载官方的软件包并解压
[root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@keep01 ~]# tar -xf keepalived-1.2.13.tar.gz -C /usr/src/
[root@keep01 ~]# cd /usr/src/keepalived-1.2.13/
5.2.2 YUM安装依赖包
//安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源
[root@keep01 keepalived-1.2.13]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum makecache
[root@keep01 keepalived-1.2.13]# yum -y install kernel-devel openssl-devel popt-devel
5.2.3 配置、编译、安装
[root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived
[root@keep01 keepalived-1.2.13]# make &&make install && cd
5.2.4 安装后产生的目录
- 安装完成后会在keepalived家目录生成这 bin etc sbin share 这 4 个目录。
- 其中一个是主配置文件(keepalived.conf)在 /usr/local/keepalived/etc/keepalived/ 这个路径下
- 还有一个是启动文件(keepalived)在 /usr/local/keepalived/etc/rc.d/init.d/ 这个路径下
5.2.5 将上面相关的文件拷贝到对应目录下
//创建keepalived主配置文件目录
[root@keep01 ~]# mkdir -p /etc/keepalived
//主配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
//启动时需要加载的配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
//服务的控制脚本
[root@keep01 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
//优化keepalived的命令
[root@keep01 ~]# ln -s /usr/local/keepalived/sbin/* /usr/bin/
//给启动脚本指定权限
[root@keep01 ~]# chmod 755 /etc/init.d/keepalived
//查看一下keepalived版本
[root@keep02 ~]# keepalived -v
Keepalived v1.2.13 (05/16,2020)
5.2.6 配置文件详解
-
默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义(需要验证的原因),我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。当然两个节点的此项设置可相同,也可不相同。
-
Keepalived的配置文件分为3部分:
- 全局定义本分
- VRRPD部分
- virtual_server部分
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_script chk_nginx_service { #VRRP 脚本声明
script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
interval 3 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 3 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
user keepalived_script #执行脚本的用户或组
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.130
}
track_script { #脚本监控状态
chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/shell.sh start" #当前节点成为master时,通知脚本执行任务
notify_backup "/etc/keepalived/shell.sh stop" #当前节点成为backup时,通知脚本执行任务
notify_fault "/etc/keepalived/shell.sh stop" #当当前节点出现故障,执行的任务;
}
virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称
state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 90 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.131
}
}
virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
5.3 配置keep01的master主节点
- 修改keepalived.conf配置文件
[root@keep01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id kp01 #本服务器的名称,若环境中有多个keepalived时,此名称不能一致
}
vrrp_instance VI_1 { #定义VRRP热备实例,每一个keep组都不同
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface ens32 #承载VIP地址的物理接口
virtual_router_id 51 #虚拟路由器的ID号,每一个keep组都不同
priority 100 #优先级,数值越大优先级越高,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #认证信息
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 123123 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.2.100
}
}
virtual_server 192.168.2.100 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口
delay_loop 3 #每隔3秒检查一次real_server状态
lb_algo wrr #指定lvs的调度算法(如若不结合LVS请删掉此两个配置)
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
persistence_timeout 60 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。注意:这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制。
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.2.1 80 { #配置服务节点,需要指定real server的真实IP地址和端口
weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源。
notify_down /etc/keepalived/check.sh #指定节点失效后,采用的脚本,notify_up表示节点正常后,采用的脚本;##健康检查方式一共有|HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK|这些。
TCP_CHECK { #realserver的状态检测设置部分,单位是秒
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查端口
}
}
}
- 编写配置文件中指定的check.sh采用脚本
[root@keep01 ~]# vim /etc/keepalived/check.sh
#!/bin/bash
/etc/init.d/keepalived stop
IPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`
echo "$IPV4 (httpd) is down on $(date +%F-%T)" >>/root/check_httpd.log
:wq
[root@keep01 ~]# chmod 777 /etc/keepalived/check.sh
- 启动主keepalived 并 检查虚拟VIP是否在他这里
[root@keep01 ~]# /etc/init.d/keepalived startStarting keepalived (via systemctl): [ 确定 ][root@keep01 ~]# ip a |grep 192.168.2.100 inet 192.168.2.100/32 scope global ens32
5.4 配置keep02上backup从节点
[root@keep02 ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id kp02}vrrp_instance VI_1 { state BACKUP interface ens32 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 123123 } virtual_ipaddress { 192.168.2.100 }}virtual_server 192.168.2.100 80 { delay_loop 3 lb_algo wrr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.2.2 80 { weight 3 notify_down /etc/keepalived/check.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }}
- 编写配置文件中指定的check.sh采用脚本
[root@keep02 ~]# vim /etc/keepalived/check.sh#!/bin/bash/etc/init.d/keepalived stopIPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`echo "$IPV4 (httpd) is down on $(date +%F-%T)" >>/root/check_httpd.log:wq[root@keep02 ~]# chmod 777 /etc/keepalived/check.sh
- 启动主keepalived 并 检查虚拟VIP是否在他这里
[root@keep02 ~]# /etc/init.d/keepalived startReloading systemd: [ 确定 ]Starting keepalived (via systemctl): [ 确定 ][root@keep02 ~]# ip a |grep 192.168.2.100#因为他是备的身份,所以只要在主没出现问题的时候,VIP都不会到他这里来
- 启动之后会有三个进程
5.5 客户端访问测试双机热备的效果
- 当master的httpd服务down掉后
- 查看keep01的keepalived的状态
- 查看有没有root下有没有生产check_httpd.log日志文件
- 此时再回到keep02从主机上查看VIP是否会自动漂移过来
可以看到,这里已经实现了双机热备的功能~~~
- 将keep01节点的http和keepalived服务重新启动
[root@keep01 ~]# systemctl start httpd
[root@keep01 ~]# /etc/init.d/keepalived
startStarting keepalived (via systemctl): [ 确定 ]
- 验证虚拟VIP在主keepalived恢复后是否还会飘过来
可以看到,当主keepalived恢复后,VIP会自动再回到他的上面来,下面再来访问一下浏览器
- 上述步骤实现了keepalived在real server节点池中进行了四层健康监测(传输层,基于协议或者端口号),下面展示keepalived如何对节点池中进行七层健康监测(应用层)
[root@keep01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id r1
}
vrrp_script_check_apache {
script/etc/keepalived/check_apache.sh
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
192.168.2.100
}
track_script {
check_apache
}
}
virtual_server 192.168.2.100 80 {
protocol TCP
real_server 192.168.2.1 80 {
weight 3
}
}
[root@keep01 ~]# vi /etc/keepalived/check_apache.sh
#!/bin/bash
Count1= `netstat -anpt|grep -v grep|grep httpd|wc -l`
if [ $Count1 -eq 0 ];then
/etc/init.d/keepalived stop
fi
#重启服务就行了
六、脑裂是什么?【重点】
- 脑裂:经常会出现在高可用软件身上,什么是脑裂?也就是主从上都有vip,那是怎么导致
的这种情况?网络波动、抖动导致的。 - 怎么解决这种问题?
- 直接重启keepalived服务【不建议】
- 给中从做一个机制策略,仲裁,给中从写入一个脚本,让他俩定时ping自己的网关,以但一方ping不通的时候,就把这一方的keepalived服务停掉。【建议】
keepalived实战案例
案例(一)
-
LVS+Keepalived实现高可用负载均衡
-
架构图如下:
- 环境准备
主机名 / 角色 | 操作系统 | IP地址 | 软件包 |
---|---|---|---|
keep01 / LB-MASTER | Centos7.4_3.10 X86 | 192.168.1.1 | keepalived-1.2.13.tar.gz |
keep02 / LB-BACKUP | Centos7.4_3.10 X86 | 192.168.1.2 | keepalived-1.2.13.tar.gz |
web01 / RS-WEBSERVER | Centos7.4_3.10 X86 | 192.168.1.3 | apache或者nginx |
web02 / RS-WEBSERVER | Centos7.4_3.10 X86 | 192.168.1.4 | apache或者nginx |
client01 / 测试 | Centos7.4_3.10 X86 | 192.168.1.5 | curl 或者 wget |
1. 在两台web主机上安装httpd服务
yum -y install httpd
systemctl start httpd;systemctl enable httpd
[root@web01 ~]# echo '<h1> RS-web01_192.168.2.3 </h1>' > /var/www/html/index.html
[root@web02 ~]# echo '<h1> RS-web02_192.168.2.4 </h1>' > /var/www/html/index.html
2. 在两台keep主机上安装keepalived和ipvsadm管理工具(相同配置)
[root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@keep01 ~]# tar -xf keepalived-1.2.13.tar.gz -C /usr/src/
[root@keep01 ~]# cd /usr/src/keepalived-1.2.13/
//安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源
[root@keep01 keepalived-1.2.13]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum makecache
[root@keep01 keepalived-1.2.13]# yum -y install kernel-devel openssl-devel popt-devel
[root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived
[root@keep01 keepalived-1.2.13]# make &&make install && cd
//创建keepalived主配置文件目录
[root@keep01 ~]# mkdir -p /etc/keepalived
//主配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
//启动时需要加载的配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
//服务的控制脚本
[root@keep01 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
//优化keepalived的命令
[root@keep01 ~]# ln -s /usr/local/keepalived/sbin/* /usr/bin/
//给启动脚本指定权限
[root@keep01 ~]# chmod 755 /etc/init.d/keepalived
//查看一下keepalived版本
[root@keep02 ~]# keepalived -v
Keepalived v1.2.13 (05/16,2020)
//在LVS集群环境中应用时,也需要用到ipvsadm管理工具
[root@keep01 ~]# yum install -y ipvsadm
[root@keep01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
3. 配置MASTER调度器(keep01)
[root@keep01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id kp01_2.1
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123123
}
virtual_ipaddress {
192.168.2.100
}
}
virtual_server 192.168.2.100 80 {
delay_loop 3
lb_algo rr
lb_kind DR
#persistence_timeout 60 #这里就不要开启持久连接了,为了更方便的查看负载均和的效果
protocol TCP
real_server 192.168.2.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.2.4 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
4. 配置BACKUP调度器(keep02)
[root@keep01 ~]# scp /etc/keepalived/keepalived.conf 192.168.2.2:/etc/keepalived/
[root@keep02 ~]# vim /etc/keepalived/keepalived.conf
5. 接下来启动lvs 和 keepalived
//启动keep01的lvs和keepalived
[root@keep01 ~]# modprobe ip_vs //#加载ip_vs模块(启动lvs)
[root@keep01 ~]# lsmod |grep ip_vs //查看加载的模块是否成功
[root@keep01 ~]# echo "modprobe ip_vs" >>/etc/rc.local //加入开机启动项
[root@keep01 ~]# chmod +x /etc/rc.d/rc.local
[root@keep01 ~]# /etc/init.d/keepalived start //启动keepalived
//启动keep02的lvs和keepalived
[root@keep02 ~]# modprobe ip_vs
[root@keep02 ~]# lsmod |grep ip_vs
[root@keep02 ~]# echo "modprobe ip_vs" >>/etc/rc.local
[root@keep02 ~]# chmod +x /etc/rc.d/rc.local
[root@keep02 ~]# /etc/init.d/keepalived start
6. 在两台keep节点上查看一下虚拟VIP
- 以上图中可以看到vip地址已经承载到了这块网卡上,接下来启动从服务器查看IP地址
- 以上图中可以看到从服务器上面没有vip地址的,那么就是正常的,因为它是老二,是一个备用服务器,啥时候等主服务器挂了那么它就会自动继承主服务器该做的事情。
7. 在两台keep节点上查看一下LVS集群转发情况
8. 在两台RS上编写realserver.sh脚本
#在两台RS上编写以下脚本文件realserver.sh
vim /opt/realserver.sh
#!/bin/bash
VIP=192.168.2.100
#/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $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
9. 在两台RS上分别执行脚本
[root@web01 ~]# bash /opt/realserver.sh start
RealServer Start OK
[root@web02 ~]# bash /opt/realserver.sh start
RealServer Start OK
10. 客户端测试负载均衡
11. 查看两台web服务的访问日志
12. 模拟主服务器down掉后是否还能正常访问
[root@keep01 ~]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl): [ 确定 ]
[root@keep02 ~]# ip a|grep 192.168.2.100 //去从上面查看vip是否飘了过来
inet 192.168.2.100/32 scope global ens32
13. 验证主服务器恢复之后vip是否还会回来
[root@keep01 ~]# /etc/init.d/keepalived start
Starting keepalived (via systemctl): [ 确定 ]
[root@keep01 ~]#
[root@keep01 ~]# ip a|grep 192.168.2.100
inet 192.168.2.100/32 scope global ens32
#可以看到,将主恢复后,vip会自动回到主keepalived上
[root@keep02 ~]# ip a|grep 192.168.2.100
[root@keep02 ~]# 而此时从上vip已然消失
至此,nginx + keepalived高可用负载均衡已经完成~~~
案例(二)
- Nginx+Keepalived实现高可用负载均衡
- 架构图如下:
环境准备
主机名 / 角色 | 操作系统 | IP地址 | 软件包 |
---|---|---|---|
keep01 / LB-MASTER | Centos7.4_3.10 | 192.168.1.1 | keepalived-1.2.13.tar.gz、nginx-1.12.2.tar.gz |
keep02 / LB-BACKUP | Centos7.4_3.10 | 192.168.1.2 | keepalived-1.2.13.tar.gz、nginx-1.12.2.tar.gz |
web01 / RS-WEBSERVER | Centos7.4_3.10 | 192.168.1.3 | jdk-8u181-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz |
web02 / RS-WEBSERVER | Centos7.4_3.10 | 192.168.1.4 | jdk-8u181-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz |
client01 / 测试 | Centos7.4_3.10 | 192.168.1.5 | curl 或者 wget |
1. 安装Tomcat
1.1 安装JDK(配置相同)
[root@web01 ~]# tar xf jdk-8u181-linux-x64.tar.gz
[root@web01 ~]# mv jdk1.8.0_181 /usr/local/java
[root@web01 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
[root@web01 ~]# source /etc/profile
[root@web01 ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
1.2 安装tomcat(配置相同)
#安装tomcat
[root@web01 ~]# tar xf apache-tomcat-8.5.32.tar.gz
[root@web01 ~]# mv apache-tomcat-8.5.32 /usr/local/tomcat
# 在/usr/local/tomcat/bin/catalina.sh这个文件的注释下追加一下两条配置
[root@web01 ~]# sed -i '1a # JDK' /usr/local/tomcat/bin/catalina.sh
[root@web01 ~]# sed -i '2a JAVA_HOME=/usr/local/java' /usr/local/tomcat/bin/catalina.sh
#备份主配置及删除配置文件注释
[root@web01 ~]# cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml.bak && perl -lne 'print unless (/<!--/../-->/)' /usr/local/tomcat/conf/server.xml.bak > /usr/local/tomcat/conf/server.xml && sed -i /^$/d /usr/local/tomcat/conf/server.xml
#启动tomcat服务
[root@web01 ~]# /usr/local/tomcat/bin/startup.sh
#查看tomcat是否启动成功
[root@web01 ~]# netstat -anptu|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 16297/java
1.3 修改两台tomcat的默认页面
//web01
[root@web01 ~]# vim /usr/local/tomcat/webapps/ROOT/index.jsp
52 <h2>RS_web01-192.168.2.3</h2>
//web02
[root@web02 ~]# vim /usr/local/tomcat/webapps/ROOT/index.jsp
52 <h2>RS_web02-192.168.2.4</h2>
1.4 访问两台web服务
2. 安装 keepalived + Nginx
2.1 安装keepalived
[root@keep01 ~]# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@keep01 ~]# tar -xf keepalived-1.2.13.tar.gz -C /usr/src/
[root@keep01 ~]# cd /usr/src/keepalived-1.2.13/
//安装内核开发包,popt支持库等工具;如果安装不上,请使用阿里的yum源
[root@keep01 keepalived-1.2.13]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum makecache
[root@keep01 keepalived-1.2.13]# yum -y install kernel-devel openssl-devel popt-devel nmap
[root@keep01 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived
[root@keep01 keepalived-1.2.13]# make &&make install && cd
//创建keepalived主配置文件目录
[root@keep01 ~]# mkdir -p /etc/keepalived
//主配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
//启动时需要加载的配置文件
[root@keep01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
//服务的控制脚本
[root@keep01 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
//优化keepalived的命令
[root@keep01 ~]# ln -s /usr/local/keepalived/sbin/* /usr/bin/
//给启动脚本指定权限
[root@keep01 ~]# chmod 755 /etc/init.d/keepalived
//查看一下keepalived版本
[root@keep02 ~]# keepalived -v
Keepalived v1.2.13 (05/16,2020)
2.2 分别配置两台keepalived
2.2.1 主Keepalived配置
[root@keep01 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
router_id nginx-master
}
#执行脚本配置
vrrp_script chk_nginx {
#脚本所在路径
script "/etc/keepalived/check_nginx.sh"
#脚本执行间隔时间,单位为秒
interval 2
#优先级
weight 2
}
#keepalived实例配置
vrrp_instance VI_1 {
#指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
state MASTER
#实例绑定的网卡
interface ens32
#虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
virtual_router_id 51
#优先级,数值越大,优先级越高
priority 100
#MASTER与BACKUP之间同步检查的时间间隔,单位为秒
advert_int 1
#通信验证
authentication {
auth_type PASS
auth_pass 1111
}
#追踪外围脚本
track_script {
#这里配置vrrp_script的名称
chk_nginx
}
#虚拟vip配置,可配置多个
virtual_ipaddress {
192.168.2.100
}
}
2.2.2 备Keepalived配置
[root@keep02 ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
#Keepalived的机器标识,一个网络内保持唯一
router_id nginx-backup
}
#执行脚本配置
vrrp_script chk_nginx {
#脚本所在路径
script "/etc/keepalived/check_nginx.sh"
#脚本执行间隔时间,单位为秒
interval 2
#优先级
weight 2
}
#keepalived实例配置
vrrp_instance VI_1 {
#指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
state BACKUP
#实例绑定的网卡
interface ens32
#虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
virtual_router_id 51
#优先级,数值愈大,优先级越高
priority 99
#MASTER与BACKUP之间同步检查的时间间隔,单位为秒
advert_int 1
#通信验证
authentication {
auth_type PASS
auth_pass 1111
}
#追踪外围脚本
track_script {
#这里配置vrrp_script的名称
chk_nginx
}
#虚拟ip配置,可配置多个
virtual_ipaddress {
192.168.2.100
}
}
2.2.3 Nginx状态检查脚本创建(内容相同)
[root@keep01 ~]# vim /etc/keepalived/check_nginx.sh
#!/bin/sh
NGINX=/usr/local/nginx/sbin/nginx
PORT=80
IPV4=`ip a|grep ens32|grep inet|awk '{print $2}'|awk -F'/' '{print $1}'`
nmap localhost -p $PORT | grep "$PORT/tcp open" > /dev/null
if [ $? -ne 0 ];then
$NGINX -s stop
sleep 5
$NGINX
nmap localhost -p $PORT | grep "$PORT/tcp open" > /dev/null
if [ $? -ne 0 ];then
killall -9 keepalived
echo "$IPV4 (nginx) is down on $(date +%F-%T)" >> /etc/keepalived/check_nginx.log
fi
fi
[root@keep01 ~]# chmod 777 /etc/keepalived/check_nginx.sh
[root@keep01 ~]# scp /etc/keepalived/check_nginx.sh root@192.168.2.2:/etc/keepalived/
2.3 安装Nginx
[root@keep01 ~]# yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
[root@keep01 ~]# tar xf nginx-1.12.2.tar.gz -C /usr/src/ && cd /usr/src/nginx-1.12.2/
[root@keep01 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install && cd
[root@keep01 ~]# useradd -s /sbin/nologin -M nginx && chown -R nginx:nginx /usr/local/nginx/
[root@keep01 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/
2.4 分别配置两台服务器的Nginx(内容相同)
[root@keep01 ~]# vim /usr/local/nginx/conf/nginx.conf
#nginx运行用户
user nginx;
#nginx进程数
worker_processes 1;
#单个进程最大连接数
events {
worker_connections 1024;
}
#http服务器配置
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#upstream负载均衡配置,配置路由到tomcat的服务地址以及权重
upstream tomcat {
server 192.168.2.3:8080 weight=2;
server 192.168.2.4:8080 weight=2;
}
#虚拟主机的配置
server {
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name localhost;
location / {
root html;
index index.html index.htm;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 3;
#后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 30;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 30;
proxy_pass http://tomcat;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@keep01 ~]# cd /usr/local/nginx/conf/
[root@keep01 conf]# scp nginx.conf root@192.168.2.2:$PWD
3. 启动nginx 和 keepalived
nginx -s start/etc/init.d/keepalived start
- 查看虚拟VIP
4. 模拟主服务器的nginx宕机后VIP自动漂移
[root@keep01 ~]# echo 'error' >> /usr/local/nginx/conf/nginx.conf #注释:这上面必须要先在nginx配置文件中插入一条错误配置,不然就算是你关闭了nginx,他之后也会靠着check_nginx.sh脚本将nginx起来!!
[root@keep01 ~]# nginx -s stop
- 验证是否还能够正常访问
- 可以看到,这里已经实现了双机热备的功能~~~
5. 将主节点的nginx和keepalived恢复
[root@keep01 ~]# sed -i '/^error/d' /usr/local/nginx/conf/nginx.conf #将刚才插入到nginx中的配置给其删掉
[root@keep01 ~]# nginx -s start
[root@keep01 ~]# /etc/init.d/keepalived start
可以看到,当主keepalived恢复后,VIP会自动再回到他的上面来,下面再来访问一下浏览器