1.含义
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
2.工作原理
Layer3,4,5工作在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将把这台服务器从服务器群中剔除。
Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。
SSL_GET与HTTP_GET相同,但使用SSL连接到远程Web服务器。
MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是0或1.该脚本在导演盒上运行,这是测试内部应用程序的理想方式。可以使用完整路径(即/path_to_script/script.sh)调用可以不带参数运行的脚本。那些需要参数的需要用双引号括起来(即“/path_to_script/script.sh arg 1 … arg n”)
3.环境准备
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
服务器详情
IP | 作用 |
192.168.180.131 | keepalived+nginx(主) |
192.168.180.132 | keepalived+nginx(从) |
192.168.180.133 | web站点(tomcat) |
192.168.180.134 | web站点(tomcat) |
4.配置过程
在LB01和LB02上安装keepalived(yum安装)
yum install keepalived -y
修改配置文件
vim /etc/keepalived/keepalived.conf
配置如下
LB01:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LB01 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.110.200/24 dev ens33 label ens33:1 } }
LB02
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LB02 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.110.200/24 dev ens33 label ens33:1 } }
主要配置注释
- router_id 是路由标识,在一个局域网里面应该是唯一的;
- vrrp_instance VI_1{…}这是一个VRRP实例,里面定义了keepalived的主备状态、接口、优先级、 认证和IP信息;
- state 定义了VRRP的角色;
- interface定义使用的接口,这里我的服务器用的网卡都是eth1,根据实际来填写
- virtual_router_id是虚拟路由ID标识,一组的keepalived配置中主备都是设置一致
- priority是优先级,数字越大,优先级越大
- auth_type是认证方式
- auth_pass是认证的密码
- virtual_ipaddress{…}定义虚拟IP地址,可以配置多个IP地址,这里我定义为192.168.101.200,绑定了ens33的网络接口,虚拟接口ens33:1
启动keepalived
systemctl start keepalived.service
写入开机自启动
echo "systemctl start keepalived.service" >> /etc/rc.local
查看进程(3个进程)
ps -ef|grep keepalived
过几分钟,可以看到LB01(MASTER)上生成了一个虚拟IP,我们称之为VIP
ifconfig ens33:1
VIP即为虚拟IP
正常情况下只会在主节点上生产VIP,当主节点发生故障时,自动漂移到备节点,当两个节点同时出现VIP时,此时服务不可用,我们称之为"脑裂".
5.高可用切换试验
停掉LB01主节点服务,查看备节点状态
systemctl stop keepalived.service
可以看到VIP已经漂移到了备节点,现在我们将主节点起来,此时主节点会再将VIP夺回来
而备节点VIP消失
此时基本可以断定keepalived配置正确
nginx安装
LB01与LB02上,获取nginx源地址
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
执行yum安装
yum install -y nginx
启动Nginx
systemctl start nginx
在/root下新建nginx状态监测脚本
#vim /root/check_ng.sh nginx_num=` ps -ef|grep nginx|grep -v grep|wc -l` if [ $nginx_num -eq 0 ] then systemctl stop keepalived fi
在keepalived配置监测脚本路径(此脚本需要先启动nginx在启动keepalived)
vim /etc/keepalived/keepalived.conf
新加入以下一段
vrrp_script check_nginx { script "/root/check_ng.sh" interval 2 weight -20 } #当检查心跳的时候,发现当前的nginx或keepalived停止了,权重值就减少20,这样的话就会比另一台服务器的权重小
重启keepalived
systemctl restart keepalived.service
此时正常
测试nginx页面,浏览器访问http://192.168.110.131/http://192.168.110.132,可以看到欢迎界面
6.配置WEB站点
在WEB01与WEB02上安装jdk与tomcat
安装jdk1.7
#yum安装 yum install java-1.7.0-openjdk -y #配置环境变量 vim /etc/profile #在末位加上以下参数 JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 #该位置对应你的实际路径 JRE_HOME=$JAVA_HOME CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH #:wq保存后 source /etc/profile
验证是否成功
[root@192 ~]# java -version java version "1.7.0_261" OpenJDK Runtime Environment (rhel-2.6.22.2.el7_8-x86_64 u261-b02) OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode) [root@192 ~]# vim /etc/profile
tomcat站点安装就不一一描述了,我这里使用的apache-tomcat-7.0.103,官网下载后直接传上去即可
修改默认欢迎页面
将apache-tomcat-7.0.103/webapps/ROOT
下的index.jsp换成我们的测试文件,我的效果是这样的
接下来配置NGINX反向代理,转发到后端的两台tomcat上
LB01与LB02
vim /etc/nginx/conf.d/tomcat.conf upstream tomcat { server 192.168.110.133:8080; server 192.168.110.134:8080; } server{ listen 80; server_name localhost; location / { proxy_pass http://tomcat; } }
配置完后校验一下语法
[root@192 conf.d]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载nginx
nginx -s reload
完成
7测试集群情况
浏览器无法加载,且ping不通VIP,出现此问题的原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。
vim /etc/keepalived/keepalived.conf global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LB01 vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #重启keepalived systemctl restart keepalived.service
此时在ping
再次访问
停掉主节点的keepalived试验,此时VIP在备机上
再次访问
*
码字不易,希望多多点赞,谢谢!`