本次测试环境:

两台虚拟机

centos7.3虚拟机A 10.0.3.46

centos7.3虚拟机B 10.0.3.110

对外开放的虚拟ip 10.0.3.96(这个ip只需要在keepalived里面配置就可以了)

简述实验原理:

虚拟机A和B都需要安装nginx和keepalived(过程省略,其中keepalived为yum安装模式yum install keepalived -y,编译安装的貌似不能正常运行,暂时不清楚什么原因)我简单将keepalived理解为检测i服务器是否可用,如果某台服务器宕机,则将虚拟ip转移到另一台服务器

实验步骤:

为了区别虚拟机AB,修改nginx的默认页面

分别开启nginx

分别修改keepalived的配置文件keepalived.conf,yum安装默认放在/etc/keepalived/keepalived.conf,或者也可以自行find / -name keepalived.conf。注意需要把原文件内容全部删除(或者把原文件重命名做备份),否则会出错

在两台keepalived上都需要在/etc/sysctl.conf中添加以下参数,否则无法正常绑定虚拟ip

net.ipv4.ip_nonlocal_bind = 1

虚拟机A的keepalived配置文件全部内容为:(正常来说还应该配套一个检测Nginx存活状态的脚本,后续我实践了再加进来)

vrrp_instance VI_1 {
state MASTER
interface ens33 #这里需要根据自己的网卡接口修改
virtual_router_id 66 #该值保持一致,默认为51,但是建议修改为其他值,我的就是因为局域网内已经部署有一个keepalived占用了51这个id,导致keepalived无法正常启动
priority 101 #具有更高的优先级,比如说当这台虚拟机A宕机恢复后,keepalived根据这个优先级决定是否优先使用虚拟机A
advert_int 1
authentication { #类型和密码必须与另一台虚拟机保持一致
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.3.96 #这个是我随便取的,只要局域网内该ip没有被占用就可以了
}
}

 虚拟机B的keepalived配置文件为

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.3.96
}
}

Nginx存活状态检测脚本:(目前没有添加这个配置,放在这里是让大家知道有这个东西)

#!/bin/bash
A=`ps -C nginx–no-header |wc -l`
if [ $A -eq ];then
/usr/local/nginx/sbin/nginx
sleep
if [ `ps -C nginx --no-header |wc -l` -eq ];then
killallkeepalived
fi
fi

现在启动两台虚拟机的keepalived

systemctl start keepalived

此时ping 10.0.3.96会有反应,必须能ping通

PS:这种配置方法,会出现在ifconfig无法找到virtual_ipaddress的情况,但是可以正常ping通,整个keepalived也可以正常使用。这个以后熟悉了再回来补充

测试实验效果

尝试从外界访问10.0.3.96,优先访问46,因为46的优先级101比另一台的优先级100大

 现在我们把虚拟机B上的keepalived服务停掉,再次访问,发现切换到虚拟机B上了(该nginx默认页面我没有进行修改)

 现在把虚拟机A的keepalived重新启动

题外话扩展:

另外,还有一个关于Nginx的session(会话)处理问题,之前面试的时候被问过,一脸懵逼,所以这里顺便提一下

解决方法

1.Nginx配置ip_hash,使client访问的服务器固定

2.使用Redis等缓存会话

3.设置使用浏览器本地cookie

最新文章

  1. 1、启动oracle的步骤
  2. 【GoLang】golang底层数据类型实现原理
  3. Retrofit学习入门
  4. Oracle在所有内容前追加一些内容的方法
  5. linux系统的文件类型学习
  6. php本页面调试报错配置
  7. commons-logging和slf4j都是日志的接口
  8. AIX系统开启ftp服务
  9. 混合拉普拉斯分布(LMM)推导及实现
  10. NEST 中的协变
  11. Spring Boot Security
  12. XSS攻击常识及常见的XSS攻击脚本汇总
  13. 【原创】大叔经验分享(4)Yarn ResourceManager页面如何实现主被自动切换
  14. Linux命名空间
  15. python从零安装
  16. filter过滤器实现验证跳转_返回验证结果
  17. 如何使用jqueryUi的datepicker日历控件?
  18. LeetCode题解之Unique Paths II
  19. Redis缓存与springboot集成
  20. 20155339 2016-2017-2 《Java程序设计》第5周学习总结

热门文章

  1. LOJ P10065 北极通讯网络 题解
  2. Cogs 2546. 取石块儿(博弈)
  3. LOJ#2983. 「WC2019」数树 排列组合,生成函数,多项式,FFT
  4. 【2019.10.17】十天Web前端程序员体验(软件工程实践第五次作业)
  5. postgresql 字段sql语句 更改表名
  6. 关于python 的参数的汇总转
  7. 【Tomcat】本地域名访问配置
  8. Spring 中开启Mybatis缓存
  9. End-To-End Memory Networks
  10. vue入门|ElementUI使用指南