美文网首页
使用 keepalived 实现高可用

使用 keepalived 实现高可用

作者: wayyyy | 来源:发表于2022-01-15 19:20 被阅读0次

在上文中使用 LVS 实现负载均衡,实现了利用LVS实现更高的并发,但是显然也存在单点故障,LVS挂了就不能响应请求。这时,我们可以利用 Keepalived 这一工具来实现自动的主备切换。

配置keepalived

这里,我们选择node2 和 node3 作为RS机器,node1 和 作为主LVS,新建容器node4在作为备LVS。

# docker run -dit --name node3 --hostname node3 --privileged centos /usr/sbin/init

# node1IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node1`
# node2IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node2`
# node3IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node3`
# node4IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node4`
# nodeVIP='172.17.0.100'

# docker exec -it node1 bash -c "echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
# docker exec -it node2 bash -c "echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
# docker exec -it node3 bash -c "echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
# docker exec -it node4 bash -c "echo node1IP=$node1IP >> ~/.bashrc && echo node2IP=$node2IP >> ~/.bashrc && echo node3IP=$node3IP >> ~/.bashrc && echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"

node2 和 node3 其余配置保持不变。

进入node1 和 node 4 配置keepalived:

# yum install -y  net-tools ipvsadm keepalived

// 备份配置文件
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

// 修改配置文件
# cat > /etc/keepalived/keepalived.conf <<EOF
  vrrp_instance VI_1 {
      state MASTER  # 如果是备机的话这里使用 BACKUP
      interface eth0
      virtual_router_id 51
      priority 100  # 优先级,主机优先级肯定要比备机高
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      virtual_ipaddress {
          ${nodeVIP}/16 dev eth0 label eth0:vip # VIP的设置
      }
  }

  virtual_server ${nodeVIP} 80 {
      delay_loop 6
      lb_algo rr  # 轮询
      lb_kind DR  # DR模式
      persistence_timeout 0 # 持久化时间超时,避免三次握手打散在不同的RS上,根据具体情况设置,本例实验所以设置为0
      protocol TCP

      # RS1
      real_server ${node2IP} 80 {
          weight 1
          HTTP_GET {
              url {
                path /
                status_code 200  # 健康检查状态码为200
              }
              connect_timeout 3
              retry 3
              delay_before_retry 3
          }
      }
      
      # RS2
      real_server ${node3IP} 80 {
          weight 1
          HTTP_GET {
              url {
                path /
                status_code 200
              }
              connect_timeout 3
              retry 3
              delay_before_retry 3
          }
      }
  }
  EOF

可以通过man keepalived.conf了解更多配置文件的细节

测试

另外我们通过抓包可以发现keepalived 主备健康检测实现原理:
主主动给所有备广播健康包,当备一段时间没收到主发的健康包就认为主挂了,自己顶上去。


参考资料
1、https://www.cnblogs.com/Sinte-Beuve/p/13392747.html
2、https://zhuanlan.zhihu.com/p/356436234

相关文章

网友评论

      本文标题:使用 keepalived 实现高可用

      本文链接:https://www.haomeiwen.com/subject/pytxhrtx.html