综合架构之keepalived(高可用)

内容涉及

高可用原理
高可用配置文件
高可用服务常见问题
实现高可用服务双主功能

keepalivd----------->解决单点故障

作用:
01. 利用keepalived软件管理配置lvs
02. 利用keepalived软件可以配合lvs对后端节点进行健康检查(后端的服务)
03. 利用keepalived实现高可用功能


keepalived原理:

利用vrrp(虚拟路由冗余协议)协议实现高可用功能

vrrp抓包信息

image

原理图:

  • 确保负载均衡服务器和后端web集群可以通信
  • 安装keepalived软件后两台主机VRRP进行通讯
  • 通过VRRP协议根据优先级去竞选主备
  • 主不间断向所有备机发送组播包224.0.0.18(组播包可以加密,推荐不要加密。)
  • 主机会生成一个vip,当主机宕机的话会飘逸到备机上。
  • 如果主机恢复的话,根据优先级重新恢复为主机。

keepalived服务部署过程

第一个历程: web集群节点进行配置

    www.conf 
    server {
    listen            80;
    server_name  www.oldboy.com;
         location / {
             root   /html/www;
             index  index.php oldboy.jpg index.html index.htm;
         }
         location ~ \.php$ {
             root /html/www;
             fastcgi_pass  127.0.0.1:9000;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include /etc/nginx/fastcgi_params;
         }
     }

测试lb01lb02能否正常的文本

    web01
    echo "www.oldboy.com web01" >/html/www/oldboy.html  
    web02
    echo "www.oldboy.com web02" >/html/www/oldboy.html      
    web03
    echo "www.oldboy.com web03" >/html/www/oldboy.html  

负载均衡 lb01 lb02 进行web集群节点测试

[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
    www.oldboy.com web01
    [root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
    www.oldboy.com web02
    [root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
    www.oldboy.com web03

    [root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
    www.oldboy.com web01
    [root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
    www.oldboy.com web02
    [root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
    www.oldboy.com web03

第二个历程: 安装部署keepalived服务
yum install -y keepalived

第三个历程: 编写keepalived配置文件

lb01 配置信息
vim /etc/keepalived/keepalived.conf
 /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
    
    global_defs {                       --- 全局配置区域
       notification_email {             --- 当主服务器发生变化进行邮件通知
         330882721@qq.com
       }
       notification_email_from 17778058507@163.com
       smtp_server smtp.163.com
       smtp_connect_timeout 30
       router_id lb01                   --- 表示高可用集群中节点身份信息(相当于ospf router id )
    }
    
    vrrp_instance oldboy {              --- vrrp实例配置区域  家族
        state MASTER                    --- 说明标识服务器为主服务器 (MASTER BACKUP)
        interface eth0                  --- 指定vip地址出现在哪个网卡上                
        virtual_router_id 62            --- 家族标识 62
        priority 150                    --- 决定服务器是否是主服务器  优先级越高越有可能成为主
        advert_int 1                    --- 间隔1s钟发送一个组播包,主备要一致
        authentication {                --- 身份认证 认证主服务真实性
            auth_type PASS
            auth_pass 1234
        }
        virtual_ipaddress {             --- 生成虚拟IP地址信息
            10.0.0.3
        }
    }

实际配置

! 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 lb01
}

vrrp_instance oldboy {
    state MASTER
    interface eth0
    virtual_router_id 62
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

lb02 配置信息

    vim /etc/keepalived/keepalived.conf
    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    
    global_defs {                       --- 全局配置区域
       notification_email {             --- 当主服务器发生变化进行邮件通知
         330882721@qq.com
       }
       notification_email_from 17778058507@163.com
       smtp_server smtp.163.com
       smtp_connect_timeout 30
       router_id lb02                   --- 表示高可用集群中节点身份信息
    }
    
    vrrp_instance oldboy {              --- vrrp实例配置区域  家族
        state BACKUP                    --- 说明标识服务器为主服务器 (MASTER BACKUP)
        interface eth0                  --- 指定vip地址出现在哪个网卡上                
        virtual_router_id 62            --- 家族标识 62
        priority 100                    --- 决定服务器是否是主服务器  优先级越高越有可能成为主
        advert_int 1                    --- 间隔1s钟发送一个组播包
        authentication {                --- 身份认证 认证主服务真实性
            auth_type PASS
            auth_pass 1234
        }
        virtual_ipaddress {             --- 生成虚拟IP地址信息
            10.0.0.3
        }
    }   

实际配置

! 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 lb02
}

vrrp_instance oldboy {
    state BACKUP
    interface eth0
    virtual_router_id 62
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

测试:
将lb01将挂起,模仿lb01宕机,查看lb02能否正常提供负载服务。


高可用服务常见问题:

脑裂问题
出现原因:

  • a 服务配置问题: vrrp实例配置 (组播包发送)
  • b 有安全策略影响主备通讯:
  • c 物理线路出现问题 连接线路(心跳线)

总结: 备服务器收不到主服务器发送的vrrp组播包

解决问题的方法:

  • a. 利用系统日志查看主备通讯问题
    tail -f /var/log/messages
  • b. 利用防火墙命令, 配置允许组播包通过策略
  • c. 多个心跳线做冗余
  • d .监控及时报警:()
    备服务器有vip出现,几种情况:
    1) 正常主备切换
    2) 出现脑裂
    编写脚本,当检测到备服务器有虚拟IP时及时报警
  vi /server/scripts/inotify_vip.sh 
       #!/bin/bash
       ip a s eth0|grep "10.0.0.3" &>/dev/null
       if [ $? -eq 0 ]
       then
          echo "备服务器产生的vip地址,请关注"|mail -s "keepalived_error" 330882721@qq.com
       fi
vi /etc/mail.rc进行设置
systemctl restart postfix.service

负载均衡服务出现异常,高可用服务无法实现切换

负载均衡服务活着---keepalived服务活着
负载均衡服务死了---keepalived殉情

编写脚本

 vim check_lb.sh
       #!/bin/bash 
       count=$(ps -ef|grep -c [n]ginx) #grep随便加一个[]就把grep过滤的行也给去掉
       if [ $count -lt 2 ]
       then 
          systemctl stop keepalived
       fi

只要nginx服务停止, 就立即切换

/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 lb01
       }
       
       vrrp_script check_web {                    --- 定义监控脚本信息
          script "/server/scripts/check_lb.sh"    --- 指定监控执行的脚本
          interval 2                              --- 脚本执行间隔周期             
          weight 2                                 
       }
       
       vrrp_instance oldboy {
           state MASTER
           interface eth0
           virtual_router_id 62
           priority 150
           advert_int 1
           authentication {
               auth_type PASS
               auth_pass 1234
           }
           virtual_ipaddress {
               10.0.0.3
       
           }
           track_script {
                check_web ------调用这个脚本
           }
       }

确认脚本有执行权限
chmod +x /server/scripts/check_lb.sh
keepalived服务需要进行重启

keepalived权重配置

权重数值: 正数

  • 判断脚本: 执行结果信息
    脚本执行为真(成功) 脚本返回值为0
    优先级+weight求和运算
    脚本执行为假(失败) 脚本返回不为0
    优先级不变

权重数值: 负数

  • 判断脚本: 执行结果信息
    脚本执行为真(成功) 脚本返回值为0
    优先级不变
    脚本执行为假(失败) 脚本返回不为0
    优先级-weight 求差运算



    需求01: 当lb01 nginx服务停止, 将资源切换到lb02, 当lb01 nginx恢复, 自动抢占资源
    nginx服务停止 lb01<lb02
    脚本为假
    优先级-weight < lb02

    nginx服务恢复 lb01>lb02
    脚本为真
    优先级 > lb02
    测试代码

if [ $count -lt 2 ]
       then
          exit 1
       else
          exit 0
       fi

调整权重值
01. 调整权重值
02. 调整优先级

提高负载均衡服务安全性

第一个历程: 修改lb01 lb02 nginx配置文件

     lb01 -- 主
     server {
        listen        10.0.0.3:80;#监听地址必须为本地网卡监听地址
        server_name   localhost;
        include  proxy_params;
        location / {
           proxy_pass  http://default;
        }
     }

systemctl restart nginx-------->不能reload重启服务

     lb02 -- 备
     server {
        listen        10.0.0.3:80;
        server_name   localhost;
        include  proxy_params;
        location / {
           proxy_pass  http://default;
        }
     }
     systemctl restart nginx       

可以修改内核,让服务监听没有的地址
解决方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
##/etc/sysctl.conf 加上
sysctl -p

利用高可用服务实现双主配置

原因:解决多个网站都通过一个负载均衡设备增加了一台负载均衡设备的压力。
可以实现不同的网站走不同的负载设备。

第一个历程: 修改keepalived配置文件

    lb01 修改 
    vrrp_instance oldboy {
        state MASTER
        interface eth0
        virtual_router_id 62
        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 63
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1234
        }
        virtual_ipaddress {
            10.0.0.4
        }
    }   
    
    lb02 修改
    vrrp_instance oldboy {
        state BACKUP
        interface eth0
        virtual_router_id 62
        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 63
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1234
        }
        virtual_ipaddress {
            10.0.0.4
        }
    }

第二个历程: 修改lb01/02nginx配置文件

    26     server {
    27         listen        10.0.0.3:80;
    28         server_name   www.oldboy.com;
    29         include  proxy_params;
    30         location / {
    31            proxy_pass  http://default;
    32         }
    33     }
    34     server {
    35         listen        10.0.0.4:80;
    36         server_name   bbs.oldboy.com;
    37         include  proxy_params;
    38         location / {
    39            proxy_pass  http://default;
    40         }
    41     }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341