HOME
BLOG
TIME
FRIENDS
SAY TO ME
MOOD
TRAVELING
KeepAlived实现高可用
2020/08/21 1.2k 5 分钟 点击

对于主负载均衡服务器,修改配置文件
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id lb01    #组成员名称
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100    #优先级
    advert_int 1    #定义组播包发送的间隔时间,主备设置必须一致
    authentication {        #组成员通信密码,明文
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.2/24        #虚拟IP
    }
}

备用负载均衡服务器
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.2/24
    }
}

这里需要注意,其中邮箱通知删除,是为了以后的监控服务来统一监控。请关注后续博文。

这个时候重新启动keepalived服务
systemctl restart keepalived
如果发现有两个虚拟VIP 这是因为防火墙没有关闭的原因。
iptables -L
systemctl disable firewalld
就可以。
这就是脑裂现象。

还有虚拟的VIP的子网掩码必须加,不然默认为32。会造成不能自动切换。

这里实现使用脚本来监测,从而实现邮件通知。

监控VIP,防止脑裂

首先Linux需要下载:mailx软件
yun install -y mailx
然后配置配置文件:
vim /etc/mail.rc
在最后几行添加

set from=yangyang_linux@163.com smtp=smtp.163.com
set smtp-auth-user=yangyang_linux@163.com set smtp-auth-password=LJXZIHMLYIRYEEZL smtp-auth=login

两行,其中set from使用的是第三方邮箱,自行注册,我这里是163的,还有smtp-auth-password是SMTP的码不是邮箱密码。

一切准备好之后,重新启动服务。
systemctl restart postfix

脚本:

#! /bin/bash
ip a s eth0 Igrep "192.168.1.2" >/dev/nul1
if[ $?-ne 0 ];then
echo "keepalived服 务出现异常,请进行检查" |mail -s 异常告警-keepalived 177156668@qq . com
fi

写入定时任务,每几分钟进行监控。

实现keepaliveed与Nginx一起停止,释放VIP

脚本:

vim check_web.sh
#! /bin/bash
num=ps -ef I grep -c nginx 
if[ $num -lt 2 ];then
    systemctl stop keepalived
fi

需要注意,check_web.sh这里脚本名称如果带有nginx的话会造成查询问题。

实时监控nginx服务状态—keepalived配置文件

keepalived配置文件

check_ web =/server/scripts/check_web. sh
vrrp_script check_web {
    script "/server/scripts/check_web. sh    #定义需要监控脚本(脚本有执行权限,而且是绝对路径)
    interval 2            #执行脚本的间隔吋同(秒)
    weight 2            #权重,在Nginx调度器down了之后,自动下降权重,另一台可以顶替它
}

$check web
track_ script {
    check web    #调用执行你的脚本信息
}
}

weight参数:权重值参数,主要用于和优先级进行运算

  • 重要知识点01:
    • 求和运算: weight数值必须是正数 weight + priority 自动提升优先级,使主机可以成为主服务器
    • 求差运算: weight数值必须是负数 weight - priority 自动降低优先级,使主机可以成为备服务器
  • 重要知识点02:
    • 运行一个脚本,执行脚本结束之后,脚本的执行结果可以为真看脚本执行返回值$?==0
    • 运行一个脚本,执行脚本结束之后,脚本的执行结果可以为假看脚本执行返回值$$<>0
  • 重要知识点03:
    • 如何将知识01 +知识02加以结合
      权重值为正数:
    • 1.脚本运行后为真 weight + priority
    • 2.脚本运维后为假 priority
      权重值为负数:
    • 1.脚本运行后为真. priority
    • 2.脚本运维后为假 weight-priority

双主配置

第一台负载均衡服务器
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id lb01 
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.2/24
    }   
}
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.5/24
    } 
    }

第二台负载均衡服务器
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.2/24
    }   
}
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 100 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.1.5/24
    }   
}

重启服务
systemctl restart keepalived

高可用服务安全访问配置(负载均衡服务)

修改nginx负载均衡文件
第一台负载均衡服务器

upstream load_banalcing {
        server  172.16.69.101:80;
        server  172.16.69.102:80;
        server  172.16.69.103:80;
}

server {
        listen  192.168.1.2:80 default_server;
        server_name     www.yangyang.com;
        location / {
                proxy_pass      http://load_banalcing;
        }
}

server {
        listen  192.168.1.5:80 default_server;
        server_name     blog.yangyang.com;
        location / {
                proxy_pass      http://load_banalcing;
        }
}

第二台负载均衡服务器

upstream load_banalcing {
        server  172.16.69.101:80;
        server  172.16.69.102:80;
        server  172.16.69.103:80;
}

server {
        listen  192.168.1.2:80 default_server;
        server_name     www.yangyang.com;
        location / {
                proxy_pass      http://load_banalcing;
        }
}

server {
        listen  192.168.1.5:80 default_server;
        server_name     blog.yangyang.com;
        location / {
                proxy_pass      http://load_banalcing;
        }
}

再重启的时候会有报错
异常问题报错:
nginx: [emerg] bind() to 192.168.1.2:80 failed (99: Cannot assign requested address)
如何设置监听网卡上没有的地址
解决:需要修改内核信息
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p

这里需要注意,有关IP的设置,reload配置文件是不可以的,必须重新启动。

项目实验