返回顶部

zhangfd

个人博客,仅供学习使用

导航

Keepalived + Nginx:负载均衡+高可用服务 --keepalived介绍及应用

keepalived -- 综合架构高可用服务

01. 内容说明:

1) 负载均衡遗留知识点补充
2) 高可用服务的概念介绍
3) 部署安装高可用服务
4) 高可用服务配置文件参数说明
5) 高可用服务VRRP协议原理
6) 高可用服务常见问题(脑裂文件)
7) 高可用服务如何进行监控
8) 高可用服务实现双主配置

02. 回顾负载均衡企业实践应用

https://www.cnblogs.com/moox/p/12775455.html

03. 高可用服务介绍说明

避免负载均衡服务出现单点问题
设置主备负载均衡服务器,备负载均衡服务器会时时监控主服务器的运行情况
当主负载均衡服务器出现故障时,备服务器自动接管主服务器作为主负载均衡服务器

keepalived高可用服务的原理示意图



04. 高可用服务的原理

05. 如何实现部署高可用服务

利用keepalived软件实现,keepalived是管理LVS的软件

  • 作用:

    • 为LVS服务而诞生出来的:k8s + 容器技术docker 容器<--镜像<--仓库(春节抢红包)
      keepalived + LVS负载均衡软件(4层)--4层只能识别端口信息
  • 实现高可用服务功能

    1. 管理LVS负载均衡负载功能
    2. 实现对LVS集群节点健康检查功能-healthcheck
    3. 作为系统网络服务的高可用服务-- failover

06. 高可用keepalived服务部署流程

第一个历程: 准备高可用服务架构

## 克隆安装两台一样的负载均衡服务器lb01-10.0.0.5和lb02-10.0.0.6(用lb01克隆)
grep 5 /etc/sysconfig/network-scripts/ifcfg-eth[01]
sed -i 's/5/6/g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
hostnamectl set-hostname lb02
systemctl restart network.service

第二个历程: 安装部署keepalived软件

(所有负载均衡服务器上:lb01和lb02)

yum install -y keepalived
yum -ql keepalived -- 查看安装的配置文件,如/etc/keepalived/keepalived.conf

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

man keepalived.conf 可以看到keepalived.conf分为三个部分
GLOBAL CONFIGURATION --- 全局配置部分
VRRPD CONFIGURATION --- VRRP协议配置部分
LVS CONFIGURATION --- LVS服务管理配置部分

  • 配置项说明/etc/keepalived/keepalived.conf
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived		## 注释信息

## 全局配置部分
global_defs {                  		--- 全局配置部分
	notification_email {			--- 设置发送邮件信息的收件人
		acassen@firewall.loc
		failover@firewall.loc
		sysadmin@firewall.loc
	}
	notification_email_from oldboy@163.com   --- 设置连接的邮件服务器信息
	smtp_server 163.smtp.xxx_
	smtp_connect_timeout 30 
	## 以上为全局配置中的邮件配置,可以不用配置,全部删除,使用监控替代。
	router_id LVS_DEVEL           --- 高可用集群主机身份标识(集群中主机身份标识名称不能重复)
}
## vrrp 实例配置-- 一个服务可以起多个主进程
vrrp_instance oldboy {           --- Vrrp协议家族 oldboy
	state MASTER                 --- 标识所在家族中的身份 (MASTER/BACKUP)
	interface eth0               --- 指定虚拟IP地址出现在什么网卡上
	virtual_router_id 51         --- 标识家族身份信息 多台高可用服务配置要一致 
	priority 100                 --- 设定优先级 优先级越高,就越有可能成为主,决定是否是master
	advert_int 1                 --- 定义组播包发送的间隔时间(秒)  主和备配置一样  1 s
	authentication {             --- 实现通讯需要有认证过程
		auth_type PASS
		auth_pass 1111
	}
	virtual_ipaddress {          --- 配置虚拟IP地址信息,启动服务时在master主机上会生成虚拟IP地址
		192.168.200.16
		192.168.200.17
		192.168.200.18
	}
}
    ## 下方为LVS配置,暂且跳过
  • lb01(主master)配置信息:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
	
global_defs {
	router_id lb01
}

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

  • lb02(备backup)配置信息:
! Configuration File for keepalived
	
global_defs {
	router_id lb02
	}

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

第三个历程: 启动keepalived服务

systemctl start keepalived 
ip a show 
## 在master主机上能看到虚拟IP地址10.0.0.3,在backup上没有;
## 当master10.0.0.5主机挂起或其他情况时,backup10.0.0.6主机会自动接管称为master并产生虚拟ip10.0.0.3;
## 当10.0.0.5主机重启启动恢复正常时,会抢占10.0.0.6再次称为master。
## 用户访问10.0.0.3时,就等价于访问master所在负载服务器

第四个历程: 修改域名和IP地址解析关系

  • Windows host解析
    10.0.0.3 www.moox.com

  • keepalived抓包详情

07. 高可用服务企业应用

1. keepalived -- 脑裂问题

高可用服务常见异常问题---脑裂问题

  • 出现原因:
    高可用备服务器接收不到主服务器发送的组播包,备服务器上会自动生成VIP地址

    • 物理原因:
      高可用集群之间通讯线路出现问题,如主备之间通讯的心跳线断开

    • 逻辑原因:
      有安全策略阻止,如备服务器开启了防火墙,此时收不到主的组播包,就认为自己是主,产生vip地址
      抓包vrrp可以看到现象

  • 如何解决脑裂问题:

    • 01.最直接的解决办法:
      服务器都有VIP时,直接关闭其中其余任意服务器的keepalived服务,保留一台

    • 02.进行监控,发出告警:

      备服务器出现VIP地址的原因:
      a 主服务器出现故障
      b 出现脑裂问题

    • 03.脚本监控,邮件通知:

    vim /server/scripts/check_keepalived.sh

    #!/bin/bash
    ip a s eth0|grep "10.0.0.3" >/dev/null
    if [ $? -eq 0 ]
    then	
    	echo "keepalived服务出现异常,请进行检查"|mail -s 异常告警-keepalived  2144865225@qq.com
    fi
    
    ## 163邮箱配置见扩展介绍
    ## 测试:备服务器开启防火墙后执行脚本
    
  • PS:shell脚本进行比较判断

    -eq  等于		   -lt  小于   -le  小于等于
    -ne  不等于	   -gt  大于   -ge  大于等于
    

2. keepalived-- 实时监控自动释放vip

如何实现master(10.0.0.5)keepalived服务自动释放vip地址资源?
nginx(皇帝) + keepalived(妃子): nginx服务停止(皇帝死了),keepalived也必须停止(殉情)

  • 第一个历程: 编写监控nginx服务状态监控

vim /server/scripts/check_web.sh -- 注意脚本名不要包含服务名如nginx

#!/bin/bash
num=`ps -ef|grep -c nginx`
if [ $num -lt 2 ]
then
   systemctl stop keepalived
   echo "10.0.0.5 nginx service failed.keepalived service has been stopped" |mail -s nginx服务异常 2144865225@qq.com
fi
  • 第二个历程: 测试监控脚本

    systemctl start nginx keepalived
    systemctl stop nginx.service 
    sh /server/scripts/check_web.sh
    ps -ef|grep keepalived
    ## 然后检查邮箱是否收到
    
  • 第三个历程: 实时监控nginx服务状态---keepalived配置文件

    • 配置文件/etc/keepalived.keepalived.conf内容解释
    ## 定义监控脚本check_web=/server/scripts/check_web.sh
    ## 位置:放在global_defs模块和vrrp_instance模块之间
    vrrp_script check_web {
       script "/server/scripts/check_web.sh"   --- 定义需要监控脚本(脚本是执行权限)   
       interval 2                              --- 执行脚本的间隔时间(秒)  
       weight 2                                --- 扩展部分介绍
    }
    ## 调用执行监控脚本$check_web
    ## 位置:放在vrrp_instance模块中
    track_script {                             
         check_web                             --- 调用执行你的脚本信息
    }	
    
    • 最终keepalived.conf信息配置
    [root@lb01 scripts]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    ## 全局变量
    global_defs {
       router_id lb01
    }
    ## 实时监控脚本定义
    vrrp_script check_web {
     script "/server/scripts/check_web.sh"  
     interval 3   
     weight 2
    }
    
    vrrp_instance moox {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
         10.0.0.3/24
        }
        ## 实时监控脚本调用
        track_script {
             check_web
       }
    }
    
    • 测试步骤
    chmod +x /server/scripts/check_web.sh
    systemctl restart  nginx keepalived 
    systemctl stop nginx
    ps -ef|grep keeplived ## 服务没有了
    ip a show	## 没有VIP:10.0.0.3
    
    • 注意点:以上配置能实现当master主机nginx停止时,也停掉Keepalived,将VIP给backup主机接管;

      但当原来的master主机nginx再次启动恢复正常时,也需要气孔keepalived才可以。

      实际上:keepalived可以不停止服务,只需要修改配置文件即可。

3. keepalived -- 双主配置

如何高可用集群双主配置?

不同的客户端固定设置访问不同的负载时,负载可能都是双主

  • 第一个历程: 编写lb01服务器keepalived配置文件

    ## 文件中没有加上实时监控脚本配置,按需要自行添加
    [root@lb01 keepalived]# cat keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id lb01
    }
    
    vrrp_script check_web {
       script "/server/scripts/check_web.sh"
       interval 2
       weight 2
    }
    
    vrrp_instance oldboy {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
    	10.0.0.3/24
        }
       # track_script {
       #  check_web
       # }
    }
    vrrp_instance oldgirl {
        state BACKUP
        interface ens33
        virtual_router_id 52
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
    	10.0.0.4/24
        }
       # track_script {
       #  check_web
       # }
    }
    
  • 第二个历程: 编写lb02服务器keepalived配置文件

    [root@lb02 keepalived]# cat keepalived.conf
    ! Configuration File for keepalived
    
    global_defs {
       router_id lb02
    }
    
    vrrp_instance oldboy {
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3/24
        }
    }
    vrrp_instance oldgirl {
        state MASTER
        interface ens33
        virtual_router_id 52
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.4/24
        }
    }
    
    • 检查
    systemctl restart nginx keepalived   
    ip a show --  lb01有vip:10.0.0.3  lb02有vip:10.0.0.4  == 双主
    curl -H host:www.moox.com 10.0.0.7
    
  • 第三个历程: 编写Windows域名和IP地址解析信息

10.0.0.3 www.moox.com
10.0.0.4 bbs.moox.com
  • ​ 进行抓包查看:

    www.oldboy.com --- 10.0.0.3(10.0.0.5)
    10.0.0.1       --- 10.0.0.3
    10.0.0.5       --- 10.0.0.7
    10.0.0.7       --- 10.0.0.5
    10.0.0.3       --- 10.0.0.1
    
    bbs.oldboy.com --- 10.0.0.4(10.0.0.6)
    10.0.0.1       --- 10.0.0.4
    10.0.0.6       --- 10.0.0.7
    10.0.0.7       --- 10.0.0.6
    10.0.0.4       --- 10.0.0.1
    

4. Keepalived+ nginx --安全访问配置

高可用服务安全访问配置(负载均衡服务)
由于负载均衡必须使用外网地址,不能使用内网地址。
为了保护外网地址不受攻击,可以使用监听虚拟IP地址,即keepalived产生的master的VIP

  • 第一个历程: 修改nginx负载均衡文件/etc/nginx/conf.d/lb.conf

    upstream oldboy {
    	server 10.0.0.7:80;
    	server 10.0.0.8:80;
    	server 10.0.0.9:80;
    }
    server {
    	listen       10.0.0.3:80;  ## 设置为监听虚拟IP地址,保护实际的外网IP地址10.0.0.5
    	server_name  www.oldboy.com;
    	location / {
    		proxy_pass http://oldboy;
    		proxy_set_header Host $host;
    		proxy_set_header X-Forwarded-For $remote_addr;
    		proxy_next_upstream error timeout http_404 http_502 http_403;
    	}
    }
    server {
    	listen       10.0.0.4:80;
    	server_name  bbs.oldboy.com;
    	location / {
    		proxy_pass http://oldboy;
    		proxy_set_header Host $host;
    		proxy_set_header X-Forwarded-For $remote_addr;
    	}
    }
    
  • 第二个历程: 修改内核文件
    异常问题:

    1. 如何设置监听网卡上没有的地址
      解决: 需要修改内核信息
    echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
    sysctl -p 
    
  • 第三个历程: 重启nginx负载均衡服务

    systemctl restart nginx     -- 注意,修改配置文件ip地址时,只能restart,不能reload
    

08. 高可用服务内容总结

    1. 负载均衡服务扩展补充
      根据用uri信息进行负载均衡(动静分离架构)
      根据user_agent信息进行负载均衡(手机用户和浏览器访问用户页面信息可以不一致)
    1. 高可用服务作用(避免出现单点故障)
    1. keepalived高可用服务
      1. 管理LVS负载均衡软件
      2. 实现高可用功能(vrrp原理)
    1. keepalived服务配置文件
    1. keepalived服务企业应用
      1. 可能出现脑裂问题 --- 脚本编写
      2. 如何实现自动释放资源 --- 脚本(监控web服务) 修改keepalived文件
      3. 如何实现双主配置 --- 编写keepalived配置文件 编写多个vrrp实例
      4. 如何实现负载均衡安全访问 --- 编写负载均衡nginx配置文件 配置监听vip地址信息

09.扩展:

  1. 如何实现keepalived服务实时监控---while循环
  2. 预习: zbbix监控服务 (基础部分(手工配置)+高级部分(自动监控))
    克隆好一台zabbix服务器 --- zabbix软件安装好 yum
  3. nginx服务停止 keepalived服务也自动停止
    nginx服务启动 keepalived服务自动恢复 ??? --- weight

weight参数:

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

  • 重要知识点01:
    求和运算: weight数值必须是正数 weight + priority 自动提升优先级, 使主机可以成为主服务器
    求差运算: weight数值必须是负数 weight + priority 自动降低优先级, 使主机可以成为备服务器

  • 重要知识点02:
    运行一个脚本, 执行脚本结束之后, 脚本的执行结果可以为真 看脚本执行返回值 $?==0
    运行一个脚本, 执行脚本结束之后, 脚本的执行结果可以为假 看脚本执行返回值 $$<>0

  • 重要知识点03:

如何将知识01 + 知识02

- 权重值为正数(10):
	1. 脚本运行后为真,返回值为0  weight(10) + priority(150) = priority(160)
	2. 脚本运维后为假,返回值为1  priority(150)
- 权重值为负数(-10):
	1. 脚本运行后为真,返回值为0  priority(150)
	2. 脚本运维后为假,返回值为1  weight(-10) + priority(150)= priority(140)

@163邮件服务配置

  • 申请并配置163企业邮箱

  • 编写Linux配置文件/etc/mail.rc

    set from=zhangfd2020@163.com smtp=smtp.163.com
    set smtp-auth-user=zhangfd2020@163.com smtp-auth-password=******** smtp-auth=login
    
  • 启动邮件服务

    systemctl start postfix.service
    
  • 邮件功能测试

    echo 123456|mail -s moox_test 2144865225@qq.com
    mail -s "邮件测试" 2144865225@qq.com </etc/host 
    

posted on 2020-04-26 16:37  zhangfd  阅读(668)  评论(0编辑  收藏  举报