zoukankan      html  css  js  c++  java
  • 综合架构_高可用服务_keepalived

    高可用冗余服务介绍

    1)  解决网站单点故障

      负载均衡服务

      数据库服务(高可用 MHA)

      存储服务器(NFS 实现高可用 Keepalived高可用脚本 (脚本)+sersync)

          heartbeat+drbd(同步数据): http://www.linux-ha.org/wiki/Heartbeat

      备份服务器  数据同步

      批量管理服务  

     

    2)减轻服务器压力 (负载均衡压力)

    实现方式: 利用keepalived服务软件

    keepalived软件介绍:
      1) 利用keepalived软件实现管理lvs服务
      2) 利用keepalived软件实现后端节点健康检查功能
      3) 利用keepalived软件可以实现冗余功能 ***

    高可用服务实现主和备切换原理(vrrp 虚拟路由冗余协议)

     

     

     

    Keepalived的工作原理:
    Keepalived高可用对之间是通过VRRP通信的,因此,我从VRRP开始讲起:
    1)VRRP,全程Vritual Redundancy Protocol,中文名为虚拟路由器冗余协议,VRRP的出现是为了解决静态里有的单点故障。
    2) VRRP是通一种竞选协议机制来将路由任务交给某台VRRP路由器的。
    3)VRRP用IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。
    4)工作时主节点发包,备节点接包,当备节点接受不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
    5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
       介绍完了VRRP,接下来我再介绍一下Keepalived服务的工作原理:
       Keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主就会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,
    备节点就会接管主节点的资源,然后顶替主节点对外提供服务。 在Keepalived服务队之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,
    保证业务的联系性。接管速度最快小于1秒!

     

     实现高可用服务方法:keepalived

    keepalived服务软件:

    1) 为LVS而诞生。方便管理LVS

    2) 利用keepalived实现负载均衡节点健康检查

    3)实现高可用功能  负载均衡主备, NFS

    综合架构高可用服务部署:

    
        第一个历程: lb01/lb02负载均衡服务器上部署安装高可用服务
        yum install -y keepalived
        
        第二个历程: 编写keepalived配置文件
        lb01负载均衡服务器 - 主
        vim /etc/keepalived/keepalived.conf
        [root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
        ! Configuration File for keepalived
        
        global_defs {                       --- 全局配置
           notification_email {
             acassen@firewall.loc           --- 邮箱地址配置(主服务出现vip切换, 需要进行邮件告知管理员)
           }
           notification_email_from Alexandre.Cassen@firewall.loc
           smtp_server 192.168.200.1        --- 邮件信息配置
           smtp_connect_timeout 30
           router_id lb01                   --- 定义一个高可用集群中节点名称
        }
        
        vrrp_instance(家族) oldboy {        --- vrrp协议响应参数配置   数据库-实例  tomcat--实例
            state MASTER                    --- 指定服务器在高可用服务中的身份(MASTER BACKUP)
            interface eth0                  --- 指定vip地址出现在哪个网卡上
            virtual_router_id 66            --- 家族标识
            priority 150                    --- 设置服务器优先级, 优先级越高, 越有可能成为主
            advert_int 1                    --- 主服务器发送组播包间隔
            authentication {                --- 配置高可用服务认证信息
                auth_type PASS              --- 确认进行组播通讯主机是在一个实例中
                auth_pass 1234
            }
            virtual_ipaddress {
                10.0.0.3                    --- 定义vip地址信息
            }
        }
    
    
        lb02负载均衡服务器 - 备
        vim /etc/keepalived/keepalived.conf
        [root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
        ! Configuration File for keepalived
        
        global_defs {                       --- 全局配置
           notification_email {
             acassen@firewall.loc           --- 邮箱地址配置(主服务出现vip切换, 需要进行邮件告知管理员)
           }
           notification_email_from Alexandre.Cassen@firewall.loc
           smtp_server 192.168.200.1        --- 邮件信息配置
           smtp_connect_timeout 30
           router_id lb02                   --- 定义一个高可用集群中节点名称   *主备不一样*
        }
        
        vrrp_instance(家族) oldboy {        --- vrrp协议响应参数配置   数据库-实例  tomcat--实例
            state BACKUP                    --- 指定服务器在高可用服务中的身份(MASTER BACKUP)
                                                *主备不一样*
            interface eth0                  --- 指定vip地址出现在哪个网卡上
            virtual_router_id 66            --- 家族标识
            priority 100                    --- 设置服务器优先级, 优先级越高, 越有可能成为主
                                                *主备不一样*
            advert_int 1                    --- 主服务器发送组播包间隔
            authentication {                --- 配置高可用服务认证信息
                auth_type PASS              --- 确认进行组播通讯主机是在一个实例中
                auth_pass 1234
            }
            virtual_ipaddress {
                10.0.0.3                    --- 定义vip地址信息
            }
        }
    
        第三个里程: 进行测试检查
        检查主备切换:
        PS: 注意DNS域名解析, vip 网站域名 建立关系

     高可用服务企业应用说明

    1)高可用服务脑裂问题解决

    主和备 都拥有vip地址

    a.物理原因
    
        主备之间心跳线通讯异常
    
     设备上有防火墙服务开启
    
       systemctl status firewalld.service
    
    b 逻辑原因:
    
      高可用服务服务配置文件错误

     

    报警通知

    脚本: 实时发现是否出现脑裂问题

    思路1)确认监控那个主机

    监控负载均衡备服务器

      1:主备进行切换  进行报警

      2:主备脑裂问题  进行报警

    思路2) 如何进行报警通知

    编写定时任务,利用邮件发送通知

    思路3) 如何发现出现问题了

    ip a s eth0|grep "10.0.0.3" echo $? 0或者 !0

    [root@lb02 scripts]# cat monitor_vip.sh 
    #!/bin/bash
    
    vip_info="10.0.0.3"
    ip a s eth0|grep "$vip_info" > /dev/null
    REVAL=$?
    
    if [ $REVAL -eq 0 ]
    then 
        echo "please check keepalived server"|mail -s "keepalived error" **********@qq.com
    fi

    设置定时任务:
    * * * * *  /bin/sh /server/scripts/monitor_vip.sh &>/dev/null
    查看脚本的执行流程:
    [root@lb02 scripts]# sh -x monitor_vip.sh + vip_info=10.0.0.3 + ip a s eth0 + grep 10.0.0.3 + REVAL=1 + '[' 1 -eq 0 ']'

     

     2)实现监控nginx服务状态,进行主备切换

    情况一:主服务器进行监控

    a 确认nginx 服务进程信息

    [root@lb01 ~]# ps -ef|grep -v grep|grep nginx
    root      11450      1  0 06:26 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    www       11451  11450  0 06:26 ?        00:00:00 nginx: worker process
    [root@lb01 ~]# ps -ef|grep "n[g]inx"
    root      11450      1  0 06:26 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    www       11451  11450  0 06:26 ?        00:00:00 nginx: worker process

    中括号起作用是因为 grep进程是 '[n]ginx'  不是nginx ****

    b 确认nginx服务端口信息

    [root@lb01 ~]# netstat -lntup|grep -c nginx
    1

    备注:当有多个扩展配置文件的时候,是会出现多个nginx信息的 (80, 81 8080..)

    方法一:实现秒级执行监控脚本

    [root@lb01 scripts]# cat monitor_lb01.sh 
    #!/bin/bash 
    
    ps_num=$(ps -ef|grep -c n[g]inx)
    while true
    do
        if [ $ps_num -lt 2 ]
        then 
            systemctl stop keepalived
            echo "please check lb01 nginx server"|mail -s "lb01 nginx error" **********@qq.com
        fi
    done

    方法二: 编写keepalived配置文件

           vrrp_script check_web {                           --- 设置监控项目名称
              script "/server/scripts/monitor_lb01.sh"     --- 指定监控脚本路径和名称信息
              interval 2                                   --- 监控脚本执行间隔时间 默认秒                                
              weight   2                                   --- 影响高可用服务优先级???
           }       
           
           track_script {
               check_web                                   --- 需要调用监控项目信息
           }
           PS: 确认脚本文件权限拥有执行权限
           
           lb01配置文件
           [root@lb01 scripts]# cat /etc/keepalived/keepalived.conf 
           ! Configuration File for keepalived
           
           global_defs {
              notification_email {
                acassen@firewall.loc
              }
              notification_email_from Alexandre.Cassen@firewall.loc
              smtp_server 192.168.200.1
              smtp_connect_timeout 30
              router_id lb01
           }
           
           vrrp_script check_web {                      
              script "/server/scripts/monitor_lb01.sh"
              interval 2                              
              weight   2                              
           }       
           
           vrrp_instance oldboy {
               state MASTER
               interface eth0
               virtual_router_id 66
               priority 150
               advert_int 1
               authentication {
                   auth_type PASS
                   auth_pass 1234
               }
               virtual_ipaddress {
                   10.0.0.3
               }
               track_script {
                   check_web 
               }
           }

    查看脚本执行的结果:

    [root@lb01 scripts]# systemctl stop  nginx 
    [root@lb01 scripts]# systemctl is-active nginx keepalived.service 
    unknown
    unknown

    情况二:备服务器进行监控

    weight   2      --- 修改服务优先级

     1) 权重数值可以是正数:  weight 10
          a 脚本执行成功:  返回值为0    实际优先级=weight+priority(默认的优先级)     优先级增加
          b 脚本执行失败:  返回值为非0  实际优先级=priority(默认的优先级)
        
       2) 权重数值可以是负数:  weight -10
              a 脚本执行成功:  返回值为0    实际优先级=priority(默认的优先级)
          b 脚本执行失败:  返回值为非0  实际优先级=priority(默认的优先级)+(-weight)  优先级减少

     

     主服务器出现问题,备将优先级抢占过来
           a 备服务器上权重值(正数/负数)  正数
           b 脚本执行结果(成功/失败)      成功
             备优先级=weight+priority >主优先级
             
           脚本如何进行监控:
           思路1: 发现主服务器网站页面出现故障(返回状态码 200 301 302)

        [root@lb01 scripts]# curl -I www.baidu.com 2>/dev/null|awk 'NR==1 {print $2}'
        200
        [root@lb01 scripts]# curl -I www.360buy.com 2>/dev/null|awk 'NR==1 {print $2}'
        301

    
    

        [root@lb01 scripts]# curl -I www.baidu.com 2>/dev/null|awk 'NR==1 {print $2}'
        200
        [root@lb01 scripts]# curl -I www.360buy.com 2>/dev/null|awk 'NR==1 {print $2}'
        301

        -w   :  指定输出的信息
           -o   :  指定默认输出到指定文件中 
           -s   :  减少输出信息
           
           #!/bin/bash
           
           code_info="$(curl -I -w "%{http_code}
    " -o /dev/null -s  www.oldboy.com)"
           
           if [ $code_info -ne 200 ]
           then
              exit 0
           else
              exit 1
           fi
    
           编写keepalived配置文件
           vrrp_script check_web {                           --- 设置监控项目名称
              script "/server/scripts/monitor_lb02.sh"     --- 指定监控脚本路径和名称信息
              interval 2                                   --- 监控脚本执行间隔时间 默认秒                                
              weight   60                                  --- 影响高可用服务优先级???
           }       
           
           track_script {
               check_web                                   --- 需要调用监控项目信息
           }

    3)高可用服务的双柱

     

     

         第一个历程: 编写keepalived配置文件:
           lb01: vip 10.0.0.3   www.oldboy.com
           global_defs {
           notification_email {
              router_id lb01
           }
                  
           vrrp_instance oldboy {
               state MASTER
               interface eth0
               virtual_router_id 66
               priority 150
               advert_int 1
               authentication {
                   auth_type PASS
                   auth_pass 1234
               }
               virtual_ipaddress {
                   10.0.0.3
               }
           }
    
           vrrp_instance oldgirl {
               state BACKUP
               interface eth0
               virtual_router_id 67
               priority 100
               advert_int 1
               authentication {
                   auth_type PASS
                   auth_pass 4321
               }
               virtual_ipaddress {
                   10.0.0.4
               }
           }       
           
          
           lb02: vip 10.0.0.4  bbs.oldboy.com
           global_defs {
           notification_email {
              router_id lb02
           }
                  
           vrrp_instance oldboy {
               state BACKUP
               interface eth0
               virtual_router_id 66
               priority 100
               advert_int 1
               authentication {
                   auth_type PASS
                   auth_pass 1234
               }
               virtual_ipaddress {
                   10.0.0.3
               }
           }
    
           vrrp_instance oldgirl {
               state MASTER
               interface eth0
               virtual_router_id 67
               priority 150
               advert_int 1
               authentication {
                   auth_type PASS
                   auth_pass 4321
               }
               virtual_ipaddress {
                   10.0.0.4
               }
           }
        
        第二个历程: 编写lb01负载均衡配置文件
        lb01 lb02
        
        配置方法一: lb01 lb02
        upstream oldboy {
           server 172.16.1.7:80;
           server 172.16.1.8:80;
           server 172.16.1.9:80;
        }
        sever {
           listen  10.0.0.3:80;
           server_name  www.oldboy.com;   
           location
              proxy_pass  http://oldboy;
        }
        
        sever {
           listen  10.0.0.4:80;
           server_name  bbs.oldboy.com;   
           location
              proxy_pass  http://oldboy;
        }
        
        监听地址有什么要求:  监听地址必须是本地网卡上有的地址
        ==========================================================================
        如何监听本地网卡上没有的地址
        修改系统内核文件
        echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
        sysctl -p 
        ==========================================================================
        
        配置方式二:
        upstream oldboy {
           server 172.16.1.7:80;
           server 172.16.1.8:80;
           server 172.16.1.9:80;
        }
        sever {
           listen        80;
           server_name   localhost;       www.oldboy.com --> 10.0.0.3 --> lb01
           location                       bbs.oldboy.com --> 10.0.0.4 --> lb02
              proxy_pass  http://oldboy;
        }
  • 相关阅读:
    【移动安全基础篇】——30、class.dex文件格式讲解
    【移动安全基础篇】——29、Android源码定制添加反反调试机制
    【移动安全基础篇】——28、Apk加固
    【移动安全基础篇】——27、常用调试检测方法与过检测方法
    【移动安全基础篇】——26、两个简单app破解
    粒子特效优化
    android studio生成aar包
    AndroidManifest
    声音
    unity webview
  • 原文地址:https://www.cnblogs.com/zhanghongqi/p/11857507.html
Copyright © 2011-2022 走看看