• Keepalived


    一、Keepalived概述

    1.1 Keepalived定义

    Keepalived为LVS应运而生的高可用服务。由于LVS的调度器无法做高可用,于是引入keepalived软件。实现的是调度器的高可用。

    但是keepalived不是专门为lvs集群服务的,也可以做其他代理服务器的高可用。

    1.2 LVS+Keepalived集群

    LVS的高可用集群:主调度器和备调度器(可以有多个)一主两备/一主一备

    主调度器能够正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器都处在冗余状态。

    备用调度器不参与集群的运转。主调度器出现故障无法运行,vip飘移至备调度器,此时备调度器才会承担主调度器的工作。

    一旦主调度器恢复工作,继续由主调度器进行处理,备调度器又变成冗余。

    1.3 VRRP协议

    VRRP协议:提高网络路由器的可靠性开发的一种协议,keepalived是基于vrrp协议实现lvs服务的高可用,解决了调度器单节点的故障问题

    由优先级决定服务器的主备角色。一旦开启服务,优先级高的会自动抢占主的位置。

    vrrp组播通信:224.0.0.18是一个保留的组播地址,用于VRRP状态通告报文的传输。VRRP协议当中的主备服务器通过组播地址进行通信,交换主备服务器之间的运行状态。主服务器会周期性的发送VRRP报文消息,以告知其他备服务器,主服务器现在的状态。

    主备切换:主服务器发生故障,或者不可达,vrrp协议会把请求转移到备服务器。通过组播地址,vrrp可以迅速地通知其他服务器发生了主备切换,确保新的主服务器可以正常地处理客户端地请求。

    故障恢复:一旦主服务器恢复通信,由组播地址进行通信,发现恢复的主服务器优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接收请求。

    二、LVS+Keepalived的部署

    1. 实验配置:
    2. 20.0.0.10:主调度器
    3. 20.0.0.20:备调度器
    4. 20.0.0.61:后端真实服务器1
    5. 20.0.0.62:后端真实服务器2
    6. 20.0.0.100:vip地址
    7. 20.0.0.63:访问客户端

    1、配置主调度器

    1. [root@pup1 ~]# yum -y install keepalived
    2. [root@pup1 ~]# yum -y install ipvsadm
    3. [root@pup1 ~]# cd /etc/keepalived/
    4. [root@pup1 keepalived]# cp keepalived.conf keepalived.conf.bak
    5. [root@pup1 keepalived]# vim keepalived.conf

    Keepalived配置文件修改及解析

    1. --10行--修改
    2. smtp_server 127.0.0.1
    3. --12行--修改,主备服务器的id,主和备不能一致
    4. router_id LVS_01
    5. --14行--注释,取消严格遵守vrrp协议功能,否则VIP无法连接
    6. #vrrp_strict
    7. --21行--修改,指定vip地址的物理接口
    8. interface ens33
    9. --23行--修改,指定优先级,数字越大优先级越高,主设为100,备设为90
    10. priority 100
    11. advert_int 1 #发送报文的间隔时间
    12. --29行--修改,指定集群vip
    13. virtual_ipaddress {
    14. 20.0.0.100
    15. }
    16. --34行--修改,指定VIP、端口,定义虚拟服务器和web服务器池参数
    17. virtual_server 20.0.0.100 80 {
    18. delay_loop 6 #健康检查的间隔时间
    19. lb_algo rr #负载均衡的调度算法
    20. lb_kind DR #指定lvs集群的工作方式
    21. persistence_timeout 0 #连接保持50
    22. protocol TCP #应用服务采用TCP协议
    23. --41行--修改,后端真实服务器1的轮询权重
    24. real_server 20.0.0.61 80 {
    25. weight 1
    26. --添加--
    27. TCP_CHECK {
    28. connect_port 80 #添加检查的目标端口
    29. connect_timeout 3 #添加连接超时(秒)
    30. nb_get_retry 3 #添加重试次数
    31. dealy_before_retry 4 #添加重试间隔秒数
    32. }
    33. }
    34. --添加--后端真实服务器2
    35. real_server 20.0.0.62 80 {
    36. weight 1
    37. TCP_CHECK {
    38. connect_port 80
    39. connect_timeout 3
    40. nb_get_retry 3
    41. dealy_before_retry 4
    42. }
    43. }
    44. }
    45. [root@pup1 keepalived]# ipvsadm-save > /etc/sysconfig/ipvsadm
    46. [root@pup1 keepalived]# systemctl restart keepalived.service

    1. vim /etc/systcl.conf
    2. net.ipv4.ip_forward = 0
    3. net.ipv4.conf.all.send_redirects = 0
    4. net.ipv4.conf.default.send_redirects = 0
    5. net.ipv4.conf.ens33.send_redirects = 0
    6. [root@pup1 keepalived]# sysctl -p

    2、配置备调度器

    1. [root@pup1 ~]# yum -y install keepalived
    2. [root@pup1 ~]# yum -y install ipvsadm
    3. [root@pup2 ~]# scp root@20.0.0.10:/etc/keepalived/keepalived.conf /etc/keepalived/
    4. [root@pup2 ~]# vim /etc/keepalived/keepalived.conf
    5. --12行--修改
    6. router_id LVS_02
    7. --20行--修改
    8. state BACKUP
    9. --23行--修改
    10. priority 90
    11. [root@pup2 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
    12. [root@pup2 ~]# systemctl restart keepalived.service

    3、配置web服务器

    1. 6162相同操作:
    2. [root@nginx1 ~]# cd /usr/local/nginx/html
    3. [root@nginx1 html]# vim index.html
    4. --删除--添加--
    5. this is test1 #62服务器写入test2
    6. [root@nginx1 html]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    7. --添加--
    8. DEVICE=lo:0
    9. ONBOOT=yes
    10. IPADDR=20.0.0.100
    11. NETMASK=255.255.255.255
    12. [root@nginx1 html]# ifup ifcfg-lo:0

    1. 6162相同操作
    2. [root@nginx1 html]# route add -host 20.0.0.100 dev lo:0
    3. [root@nginx1 html]# vim /etc/sysctl.conf
    4. --添加--
    5. net.ipv4.conf.lo.arp_ignore = 1
    6. net.ipv4.conf.lo.arp_announce = 2
    7. net.ipv4.conf.all.arp_ignore = 1
    8. net.ipv4.conf.all.arp_announce = 2
    9. [root@nginx1 html]# sysctl -p

    4、访问测试

    5、验证高可用

    三、Nginx+Keepalived的部署

    1. 实验配置:
    2. 20.0.0.61:主
    3. 20.0.0.62:备
    4. 20.0.0.63:客户端

    1、配置主

    1. 61
    2. [root@nginx1 ~]# cd /usr/local/nginx/html/
    3. [root@nginx1 html]# vim index.html
    4. --删除并添加--
    5. this is test1
    6. [root@nginx1 ~]# yum -y install keepalived
    7. [root@nginx1 ~]# cd /etc/keepalived/
    8. [root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
    9. [root@nginx1 keepalived]# vim keepalived.conf

    1. [root@nginx1 keepalived]# cd /opt
    2. [root@nginx1 opt]# vim check_nginx.sh
    3. #!/bin/bash
    4. /usr/bin/curl -I http://localhost &> /dev/null
    5. if [ $? -ne 0 ]
    6. then
    7. systemctl stop keepalived
    8. fi
    9. [root@nginx1 opt]# chmod 777 check_nginx.sh
    10. [root@nginx1 opt]# sz check_nginx.sh #发送至桌面
    11. [root@nginx1 opt]# systemctl restart keepalived.service

    2、配置备

    1. [root@nginx2 ~]# cd /usr/local/nginx/html/
    2. [root@nginx2 html]# vim index.html
    3. --删除并添加--
    4. this is test2
    5. [root@nginx2 ~]# yum -y install keepalived
    6. [root@nginx2 ~]# cd /etc/keepalived/
    7. [root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
    8. [root@nginx2 keepalived]# scp root@20.0.0.61:/etc/keepalived/keepalived.conf /etc/keepalived/
    9. [root@nginx2 keepalived]# vim keepalived.conf

    1. [root@nginx2 keepalived]# cd /opt
    2. [root@nginx2 opt]# rz -E #传入脚本文件
    3. rz waiting to receive.
    4. [root@nginx1 opt]# chmod 777 check_nginx.sh
    5. [root@nginx2 opt]# systemctl restart keepalived.service

    3、访问测试

    4、验证高可用

    四、 脑裂现象

    脑裂现象:主和备调度器同时拥有vip地址

    在高可用系统当中,联系两个节点的心跳线,本来是一体的、动作协调的高可用系统。心跳线断开之后,分裂成了两个独立的个体。主备之间失去了联系,都以为是对方出现了故障。两个调度器,就像脑裂人一样开始抢占主的位置,抢占vip。主也有vip,备也有vip,导致整个集群失败。

    脑裂原因及解决方法

    软件层面:
    1、配置文件出错
    2、通过tcpdump抓包分析

    网络层面:
    高可用服务器之间心跳线检测失败,主备之间无法进行通信

    硬件层面:
    连接主备之间的心跳线老化
    网卡或者网卡驱动失效\ip地址配置冲突
    防火墙没有配置心跳线消息的传输通道,导致检测失败
    后端服务器的配置问题,例如心跳方式不同、心跳广播冲突

    如何解决

    • 重启
    • 准备两条心跳线,这样断了一条,依然能够传送心跳消息
    • 设置防火墙一定要让心跳消息通过
    • 依靠监控软件实时检测(zabbix)
  • 相关阅读:
    1200*D. Same Differences(数学&推公式)
    string格式显示
    使用 mapstructure 解析 json
    【元胞自动机】元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】
    花生壳配置TCP服务器
    通过机器视觉对硬盘容器上盖的字符进行视觉识别,判断是否混料
    javascript学习笔记-Promise的基本用法
    文心一言 VS 讯飞星火 VS chatgpt (108)-- 算法导论10.1 6题
    Javascript知识【案例:复选框操作】
    Terminator终端
  • 原文地址:https://blog.csdn.net/pupcarrot/article/details/134009373