keepalived
当我们只搭建了一个lvs的时候,假如lvs挂掉了是不是整个业务就下线了,所以我们要考虑一个问题,如果lvs瘫痪了怎么办,这个问题叫做单点故障。
第二个问题,如果我们的RS服务器挂掉了怎么办,假如部署了多个Rs服务器,lvs还在正常运行的时候其中的某些Rs挂掉了,但是因为lvs还在和Rs保持连接并不知道rs不能运行了,还是会向rs进行负载,这时候如果访问就会访问不到,就导致有些客户的请求会出现异常,那有没有什么方法可以解决这两个问题,这就要用到keepalived,可以部署多个lvs,并且监控lvs的状态,(master)lvs会通告自己的状态(backup)lvs监听master的状态,一旦出现问题推举出新的master顶上去继续负载均衡,并且检测rs服务器的状态,如果rs出现了问题及时切断连接就可以不影响客户的请求,实现HA(高可用),还可以帮我们配置目标地址,和rs的地址,上一篇我们需要手动配置的-A -a都可以自动帮我们
这里说一个小知识点,如何检测rs是否正常运行,需要用应用层的http协议,get我们的rs服务器的地址,如果返回的200ok那么就证明rs无异常
首先在多个lvs服务器上安装keepalived
yum install keepalived -y
然后去到etc的keepalived目录,里面就有配置文件,先拷贝一份这个配置文件以防以后出问题
然后打开这个配置文件修改配置
里面有一个vrrp(虚拟路由冗余协议)
state这个属性就可以看到master表明这个就是主lvs,修改成backup就变成了备用机,我们先把第一个当成主lvs所以不用修改
interface :接口的意思,修改成我们本地的接口就行
proiprity:权重,backup备用机按照权重值来推举新的master
再往下就是配置目标地址的地方也就是VIP virtual_ipaddress
把里面的地址修改成我们的目标地址
192.168.76.100/24 dev ens33 label ens33:8
有没有发现很像之前自己在网卡配置ip的命令
ifconfig ens33:8 192.168.76.100/24
然后配置下面的v server
也就是执行我们之前-A -a的操作
可以看到rr轮循,net模型,只要改成我们需要的就可以,这里我们要把net变成dr模型
persistence_timeout这个属性要了解一下,他是判定持久化时间的,作用简单说一下,当一个客户端访问lvs的时候负载给了某一个rs,然后三次握手的包都给了这个rs因为握手和分手过程是原子性的,然后访问完断开了过了一会又请求rs,这时候lvs很有可能会负载给另一个rs,这时候是不是两个rs都对这个对象积攒了一些数据资源的缓存动态链接什么的消耗资源,那如果很多的客户端在请求,每台rs都要给这些客户消耗资源就造成了资源浪费,这时候就要用持久化这个属性,再某一时间里相同的客户端的请求只发给客户第一次请求负载给的rs里,这样就避免了上述情况的发生,由于我们要做实验所以把时间改成0
然后到real_server环节
就是我们之前配置的-a
real_server 192.168.76.4 80 把rs的地址写上去,目前为止所有关于地址的配置都完成了,但是下面可以看到有一个GET,之前也说了keepalived有对rs的健康检查的功能需要用应用层的http协议,
HTTP_GET {
url {
path /
status_code 200
修改成这样就可以了
然后就是几个rs配置几个real_server就可以了只要把ip修改一下别的不用动光标移到real_server哪行然后用-,$-1y命令复制用p粘贴到指定位置就可以
然后就可以访问了,访问成功后来验证HA,是否做到了高可用,把master那台lvs挂掉直接ifconfig ens33 down把物理网卡down掉,然后可以发现backup的lvs启动了,到backup那个lvs里面ifconfig可以发现成功配置了ip接口,然后把master启动后又回到原状态了,然后来看看有没有对rs进行检测,先把其中一台rs关掉,systemctl stop httpd,然后ipvsadm -ln查看发现关掉的rs已经不现实与lvs连接了,刷新页面也刷新不到了,然后启动rs发现又恢复原状了,说明成功检测rs状态。
但是keepalived是一个程序,只要是计算机程序都有可能异常退出,我们模拟一下,ps -fe | grep kee来看一下keepalived都有什么进程,然后强制关闭这些进程,可以发现有三个进程,第一个是检测master这个lvs的状态的,剩下两个是检测rs的状态,因为我配了两个rs所以是两个进程,我们来给他们关闭,这时候我们检查一下ifconfig,发现vip就算异常退出也收回了。。。可能是又优化了,反正就是依靠keepalived也不是非常保险,这时候就要用到zookper了,后面再说