keepalived高可用负载均衡

为什么需要keepalived(保持存活)

keepalived实现高可用的工作原理

1.  准备一个集群,为了实现高可用,如nginx负载均衡的2个机器,确保用户的请求,能正确,高可用性的到达这个nginx集群

2. 部署keepalived,生成VIP,虚拟IP资源。


3. keepalived是将 一组服务器,组成一个虚拟设备组,实现他们之间的心跳通信(可以通过抓包,查看他们的通信协议,其实是VRRP虚拟路由冗余协议。)

vrrp协议图解

虚拟,路由, 冗余,协议  ,vrrp

在同一组虚拟网络设备中,master可以和backup互相通信,知道对方的存活。

vip的漂移条件是,
心跳机制。
当backup收不到master发来的心跳数据包之后,就确认master挂掉了


vrrp工作原理

1. keppalived高可用是基于VRRP虚拟路由冗余协议实现的,因此我从VRRP给您描述起
2. VRRP也就是虚拟路由冗余协议,是为了解决静态路由的单点故障;
3. VRRP通过竞选协议将路由任务交给某一台VRRP路由器。
4. VRRP正常工作时,master会自动发送数据包,backup接收数据包,目的是为了判断对方是否存活;如果backup收不到master的数据包了,自动接管master的资源;
backup节点可以有多个,通过优先级竞选,但是keepalived服务器一般都是成对出现;
5. VRRP默认对数据包进行了加密,但是官网默认还是推荐使用明文来配置认证;

说完了VRRP,我再给您描述下keepalived工作原理。
1.keepalived就是基于VRRP协议实现的高可用,master的优先级必须高于backup,因此启动时master优先获得机器的IP资源,backup处于等待状态;若master挂掉后,backup顶替上来,继续提供服务。
2.在keepalived工作时,master角色的机器会一直发送VRRP广播数据包,告诉其他backup机器,“我还活着”,此时backup不会抢夺资源,老实呆着。
当master出现问题挂了,导致backup收不到master发来的广播数据包,因此开始接替VIP,保证业务的不中断运行,整个过程小于1秒。

通过抓包工具,查看lb5和lb6的vrrp数据包的通信(心跳数据包的发送)

查看数据包

模拟master挂掉,查看数据包
目前,master会不断的向这个组播地址,发心跳数据包,。

查看数据包

恢复master机器,查看这个心跳数据包的走向。

keepalived组播原理

单播流量走向图

广播数据流

组播数据流

keepalived环境准备(实践部署)

1.先部署web机器组(web7、web8)

简单部署,让web7,web8分别提供一个不同的静态页面,能看出负载均衡的效果即可。

1. 安装nginx
yum install nginx -y


2. 部署nginx,提供静态页面的虚拟主机就OK


3.创建测试数据
echo 'web7 ~~~~~~~~~~~~~~'   > /usr/share/nginx/html/index.html

echo 'web8 ===================='   > /usr/share/nginx/html/index.html

4.启动2个web机器
nginx

5.本地测试,检查nginx
[root@web-7 ~]#ps -ef|grep nginx
root       2172      1  0 10:40 ?        00:00:00 nginx: master process nginx
nginx      2173   2172  0 10:40 ?        00:00:00 nginx: worker process
root       2175   2054  0 10:40 pts/1    00:00:00 grep --color=auto nginx

[root@web-7 ~]#
[root@web-7 ~]#netstat -tnlp|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2172/nginx: master  
tcp6       0      0 :::80                   :::*                    LISTEN      2172/nginx: master  


[root@web-7 ~]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~

2.部署负载均衡设备(lb5,lb6)

1. 安装nginx,使用它的负载均衡功能

yum install nginx -y

2. 创建负载均衡地址池

upstream web_pools {
        server 10.0.0.7;
        server 10.0.0.8;
}
server {
listen 80;
server_name _;
location / {

        proxy_pass http://web_pools;
        include proxy_params;
}

}


代理参数的配置
[root@lb-6 /etc/nginx/conf.d]#cat /etc/nginx/proxy_params 
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;


3.启动nginx,查看负载均衡的效果
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web8 ====================
[root@lb-5 /etc/nginx]#curl 127.0.0.1
web7 ~~~~~~~~~~~~~~

到这里,就明确配置好了  slb5 和slb6,都可以正确的进行负载均衡

3.部署两台lb设备,需要支持高可用了。(keepavlied技术)

这里得细心了,注意看配置文件。,默认基于epel源即可安装。

yum install keepalived -y


1.  部署slb5的keepalived(master角色,优先获取VIP资源,当master挂掉不可用,然后才轮到backup上场。)
注意,中文注释,别写入到配置文件中


global_defs {
    router_id lb-5 # 路由器ID,每个机器不一样
}

vrrp_instance VIP_1 {       # 设置VRRP路由器组组名,属于同一组的名字一样
    state MASTER            # 角色,master、backup两种            
    interface eth0          # VIP绑定的网卡         
    virtual_router_id 50    # 虚拟路由IP,同一组的一样    
    priority 150            # 优先级,优先级越高,权重越高
    advert_int 1            # 发送组播间隔1s
    authentication {        # 认证形式
        auth_type PASS      # 密码认证,明文密码 1111
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3            # 指定虚拟VIP地址,必须没人使用
    }
}



# lb5机器的配置文件

global_defs {
    router_id lb-5
}

vrrp_instance VIP_1 {
    state MASTER        
    interface eth0      
    virtual_router_id 50    
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24
    }
}

# 简单能理解,keepalived的配置文件,需要设置哪些参数的,扣6,
# 总结一波,如下设置,理解这个参数,是方便你如果出错,可以去拍错,检查这些参数即可。

# 
 router_id 在这个虚拟路由器组中的都不一样
 state 只有一个master,可以有多个backup
 interface 指定当前负载均衡机器的 通信的网卡即可,。
 virtual_router_id  注意,每个机器,都一样,表示是一组内的设备
 priority 优先级,master需要高于backup
 authentication  一组设备中的master和backup的通信认证,是明文形式的 1111
 这个信息,可以通过抓包看到。
 
 virtual_ipaddress  指定VIP的ip地址,需要在局域网内,无人使用。。
 
 

 
 
# lb6机器的配置文件,注意如下部分参数,要和lb5机器区分开即可。

global_defs {
    router_id lb-6
}

vrrp_instance VIP_1 {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24
    }
}



4.分别启动两台机器的keepalived

systemctl start keepalived


5.绑定客户端的VIP,访问查看效果,查看日志

10.0.0.3  www.linux0224.cc

keepalived脑裂问题

2.如何解决脑裂

基于shell脚本去维护。
问题1,故障出在了backup机器,抢夺了VIP问题1,故障出在了backup机器,抢夺了VIP
[root@lb-6 /etc/keepalived]#ls
check_vip.sh keepalived.conf

# 1.在backup机器,设置好监控脚本
[root@lb-6 /etc/keepalived]#
[root@lb-6 /etc/keepalived]#cat check_vip.sh 
#!/bin/bash
MASTER_VIP=$(ssh 10.0.0.5 ip a|grep 10.0.0.3|wc -l)
MY_VIP=$(ip a|grep 10.0.0.3|wc -l)

# 如果远程有VIP并且自己本地也存在了VIP,就干掉自己
if [ ${MASTER_VIP} == 1 -a ${MY_VIP} == 1 ]
then
   systemctl stop keepalived
fi



#  2. 让keepalived去检测使用这个脚本,修改配置文件如下
【前提矫健是,lb5和lb6机器可以免密登录,才可以远程执行命令,以及给脚本添加可执行权限】


global_defs {
    router_id lb-6
}

# 定义脚本
vrrp_script check_vip {
    script "/etc/keepalived/check_vip.sh"
    interval 5 # 脚本执行的时间间隔
}

vrrp_instance VIP_1 {
    state BACKUP 
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
    # 调动脚本
    track_script {
        check_vip
    }
}

[root@lb-6 /etc/keepalived]#chmod +x check_vip.sh

[root@lb-6 /etc/keepalived]#ssh-copy-id root@10.0.0.5


确保可以正确重启keepavlied
[root@lb-6 /etc/keepalived]#systemctl restart keepalived

[root@lb-6 /etc/keepalived]#systemctl status keepalived


去手动,让backup机器,抢夺VIP资源,如开启防火墙服务
systemctl restart firewalld
3. 等待,查看backup机器的是否会干掉自己的keepalived以及检查VIP

故障2,master机器出现了nginx挂掉的解决方案

这个脚本,运行于 master机器

#!/bin/bash
NGINX_STATUS=$(ps -ef|grep ngin[x]|wc -l)
# 如果nginx挂了
if [ ${NGINX_STATUS} == 0 ]
then
   systemctl restart nginx
   # 如果重启失败
   if [ $? == 1 ]
   then
         # keepalived没必要活着了
      systemctl stop keepalived
   fi
fi


# 给脚本执行权限

[root@lb-5 /etc/keepalived]#vim check-web.sh


[root@lb-5 /etc/keepalived]#chmod +x check-web.sh 


修改keepalived配置文件
global_defs {
    router_id lb-5
}

vrrp_script check_web {
    script "/etc/keepalived/check_web.sh"
    interval 5
}

vrrp_instance VIP_1 {
    state MASTER
        interface eth0
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
        track_script {
            check_web
        }
}


[root@lb-5 /etc/keepalived]#systemctl restart keepalived

[root@lb-5 /etc/keepalived]#systemctl status keepalived

[root@lb-5 ~]#echo 'yuchaoit.cn' >> /etc/nginx/nginx.conf 
[root@lb-5 ~]#systemctl stop nginx
5.此时已经正确切换到backup了。
posted @ 2024-04-02 22:58  不太聪明的大鹅  阅读(15)  评论(0编辑  收藏  举报