烟波刀客
作者烟波刀客·2023-07-02 17:47
运维·建筑

高可用

字数 3253阅读 481评论 0赞 0

高可用

什么是高可用?

一台服务器出现故障无法提供服务时,备用服务器顶上去。

为什么出现高可用?

服务架构中的节点可能出现单点故障

有哪些应用场景?

nginx负载均衡节点、haproxy负载均衡节点、lvs 负载均衡节点,mysql主节点等

怎么实现高可用?

**高可用=冗余+故障自动转移。
冗余:部署多台相同功能的服务器。
故障自动转移(服务自动转移):虚拟ip自动漂移(保证客户端访问ip不变,服务器自动切换,所以引入虚拟ip,同一时刻只有一台正常服务器占有VIP)**

实现高可用的软件?

keepalived heatbeat

keepalived 详解

基本工作原理:

keepalived以vrrp协议为基础实现了高可用。基本过程如下:

  1. 将多台冗余服务器分成master节点和多个backup节点,通过优先级指定master节点。
  2. master节点占有VIP,通过VIP向外提供服务。
  3. master 节点通过“VIP”向backup组发心跳组播,报告master节点状态。backup若收不到vrrp包则认为master节点宕机。转至步骤一重新开始(涉及到原master又活过来的抢占和非抢占)。

    keepalived架构图(取自公众号骏马金龙)

  4. IPVS wrapper:keepalived最开始是为lvs设计的,可以通过IPVS wrapper组件配置lvs的规则。
  5. Checkers组件:使用4,5,7层的包检查lvs中real-server的健康状态,剔除不健康的,加入健康的real-server。
  6. VRRP Stack模块:提供故障自动转移功能,独立于lvs。
  7. Netlink Reflector模块:用来设定、监控vrrp的vip地址。
  8. WatchDog模块:检测keepalived服务。

    keepalived 的进程

  9. core 核心进程:root用户启动管理配置文件以及子进程
  10. check子进程: 检查状态
  11. vrrp子进程:通信,故障切换

    keepalived 配置文件详解

    vim /etc/keepalived/keepalived.conf

! 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 LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
# 定义脚本,
 vrrp_script chk_haproxy_server {   
script "killall -0 haproxy"   
interval 2   
weight -2   
fall 3   
rise 1   
} 
# vrrp实例配置部分,用来定义VIP区域以及相关属性。实例名在一个配置文件中唯一,在同一组主备间一致
# 虚拟路由=master+backup 
vrrp_instance VI_1 {
    state MASTER  # 节点类型
    interface eth0  #发送组播包的接口
    virtual_router_id 51  #vrrp实例id,同一组,主备保持一致
    priority 100  # 优先级,主备差50
    advert_int 1  # 发送心跳包的间隔
# 认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
# 设置VIP,主备必须一致
    virtual_ipaddress {
        192.168.1.198/24 dev ens33 label ens33:0
    }
    # keepalived只有在服务器宕机或者keepalived服务停止,才会进行主备切换,所以需要配置脚本
 track_script {
 chk_haproxy_server
 }


}

# 定义虚拟服务(IPVS相关配置)
# 虚拟ip和端口
virtual_server 192.168.200.100 443 {
    delay_loop 6    # 健康检查间隔
    lb_algo rr          # 定义负载均衡算法
    lb_kind NAT     # lvs 的模式
    persistence_timeout 50  # 连接时间
    protocol TCP   # tcp转发
    # 真实服务器的配置
    real_server 192.168.201.100 443 {
        weight 1   # 权重
        SSL_GET {  # 探活方式ssl get
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3  # proxy和real-server建立连接的超时时间
            nb_get_retry 3        # 重试次数
            delay_before_retry 3  # 每一次的延时重试
        }
    }
}

主备切换发生的条件

  1. 服务器宕机了
  2. keepalived服务进程被kill了。

    如何保证系统上服务的高可用呢?

  3. 判断服务是否启动
    pgrep haproxy
    killall -0 haproxy
    ps -C haproxy
    ll /var/run/haproxy.pid
  4. 若服务未启用则,停止keepalived服务
    action "/usr/bin/pkill -SIGTERM keepalived"

    keepalived脑裂

    原因:

  5. 心跳线路网络不通
  6. vrrp实例名不一致,优先级一致(实例名不一致,表不是一个虚拟ip,优先级一致无法选举)
  7. 防火墙的拦截
    检查脑裂(备用节点检查):
    1.ping masterip查看是否成功
  8. 查看本机是否有VIP
    vip=192.168.136.199
    master_ip=192.168.136.162
    while true
    do
    vip_cont=ip a|grep -w $vip|wc -l
    ping -c1 $master_ip 1 & >/dev/null #输出重定向
    if [ $?-eq 1 -a $vip_cont -eq 1 ];then

     echo "liekaile "

    fi
    sleep(5)
    done
    如何解决脑裂
    周期性ping 虚拟路由,ping不通则关闭本机的keepalived

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

  • zabbix监控
    评论 0 · 赞 2
  • Docker网络
    评论 0 · 赞 1
  • 负载均衡-haproxy
    评论 0 · 赞 1
  • k8s基本概念
    评论 0 · 赞 0
  • 相关文章

    相关问题

    相关资料

    X社区推广