综合架构之keepalived(高可用)

2019-08-08  本文已影响0人  一只打不死的小强

内容涉及

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

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

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


keepalived原理:

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

vrrp抓包信息

image

原理图:


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能否正常提供负载服务。


高可用服务常见问题:

脑裂问题
出现原因:

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

解决问题的方法:

  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权重配置

权重数值: 正数

权重数值: 负数

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     }
上一篇 下一篇

猜你喜欢

热点阅读