zoukankan      html  css  js  c++  java
  • keepalived 高可用

    Keepalived高可用

    一、高可用概念

    1.什么是高可用

    一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,
    另外一台服务器就能快速的接管,对于访问的用户是无感知的。
    

    2.高可用使用的工具

    1.硬件:
    	F5
    2.软件:
    	keepalived
    

    3.keepalived是如何实现高可用的

    keepalived是基于VRRP协议实现的
    
    如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup
    外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,
    无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息
    

    4.高可用的使用场景

    通常业务系统需要保证7×24小时不DOWN机,比如公司内部的OA系统,
    每天公司人员都需要使用,则不允许Down机,作为业务系统来说随时都可用
    

    5.高可用keepalived核心概念

    1.如何确定谁是主节点谁是背节点(选举投票,优先级)
    2.如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占式、非抢占式)
    3.如果两台服务器都认为自己是Master会出现什么问题(脑裂)
    

    二、keepalived搭建

    1.环境准备

    主机 IP 身份
    web01 172.16.1.7
    web03 172.16.1.9
    nfs 172.16.1.31
    db01 172.16.1.51
    lb01 172.16.1.4 master
    lb02 172.16.1.5 backup
    10.0.0.3 VIP

    2.保证两台七层负载配置一致

    [root@lb01 ~]# scp /etc/nginx/conf.d/* 172.16.1.5:/etc/nginx/conf.d/
    
    #访问测试
    10.0.0.5 linux.blog.com
    10.0.0.4 linux.blog.com
    

    3.安装keepalived

    [root@lb01 ~]# yum install -y keepalived
    [root@lb02 ~]# yum install -y keepalived
    

    4.配置keepalived主节点

    #查找配置文件
    [root@lb01 ~]# rpm -qc keepalived
    /etc/keepalived/keepalived.conf
    
    [root@lb01 ~]# vim /etc/keepalived/keepalived.conf
    global_defs {				#全局配置
       router_id lb01			#身份识别
    }
    vrrp_instance VI_1 {		        #VRPP协议配置
        state MASTER			#告诉你一开始这台机器是主
        interface eth0			#绑定的网卡
        virtual_router_id 51	        #虚拟路由标识,就是编组,将master和backup分为一组
        priority 100			#优先级(真正判断是主还是备的条件)
        advert_int 1			#检测心跳的时间间隔
        authentication {		        #认证相关
            auth_type PASS		        #以密码的形式认证
            auth_pass 1111		        #密码
        }
        virtual_ipaddress {		        #指定VIP地址
            10.0.0.3
        }   
    }
    
    [root@lb01 ~]# vim /etc/keepalived/keepalived.conf
    global_defs {
       router_id lb01
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }   
    }
    

    5.配置keepalived备节点

    [root@lb02 ~]# vim /etc/keepalived/keepalived.conf 
    global_defs {
       router_id lb02
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 51
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
    }
    

    6.主备节点配置区别

    区别 master主节点 backup备节点
    router_id(唯一标识符) lb01 lb02
    state(角色状态) MASTER BACKUP
    priority(优先级) 100 90

    7.启动服务

    [root@lb02 ~]# systemctl start keepalived.service
    [root@lb02 ~]# tail -f /var/log/messages
    
    [root@lb01 ~]# systemctl start keepalived.service
    [root@lb02 ~]# tail -f /var/log/messages
    

    8.配置keepalived日志

    #配置keepalived
    [root@lb02 ~]# vim /etc/sysconfig/keepalived
    KEEPALIVED_OPTIONS="-D -d -S 0"
    
    #配置rsyslog
    [root@lb02 ~]# vim /etc/rsyslog.conf
    local0.*               /var/log/keepalived.log
    
    #重启服务
    [root@lb02 ~]# systemctl restart rsyslog 
    [root@lb02 ~]# systemctl restart keepalived
    
    #查看日志
    [root@lb02 ~]# tail -f /var/log/keepalived.log
    

    三、高可用keepalived的抢占式与非抢占式

    1.两个节点都启动

    #由于节点1的优先级高于节点2,所以VIP在节点1上面
    [root@lb01 ~]# ip addr | grep 10.0.0.3
        inet 10.0.0.3/32 scope global eth0
    
    [root@lb02 ~]# ip addr | grep 10.0.0.3
    

    2.停止主节点

    [root@lb01 ~]# systemctl stop keepalived
    
    #节点2联系不上节点1,主动接管VIP
    [root@lb02 ~]# ip addr | grep 10.0.0.3
    	inet 10.0.0.3/32 scope global eth0
    

    3.重新启动主节点

    [root@lb01 ~]# systemctl start keepalived
    
    #由于节点1的优先级高于节点2,所以恢复节点1之后,vip又漂回节点1
    [root@lb01 ~]# ip addr | grep 10.0.0.3
        inet 10.0.0.3/32 scope global eth0
    

    4.配置非抢占式

    1)节点一修改

    [root@lb01 ~]# vim /etc/keepalived/keepalived.conf 
    ... ...
    vrrp_instance VI_1 {
        state BACKUP
        nopreempt
        ......
    }
    
    [root@lb01 ~]# systemctl restart keepalived
    

    2)节点2修改

    [root@lb02 ~]# vim /etc/keepalived/keepalived.conf 
    ... ...
    vrrp_instance VI_1 {
        state BACKUP
        nopreempt
        ......
    }
    
    [root@lb02 ~]# systemctl restart keepalived
    

    3)配置注意事项

    1.两台机器节点状态都要改成 BACKUP
    2.两个节点都要加上 nopreempt
    3.优先级不需要改变
    

    5.访问页面测试

    #配置hosts
    10.0.0.3 linux.blog.com
    
    #访问页面
    http://linux.blog.com/
    
    #节点测试
    [root@lb01 ~]# ip addr | grep 10.0.0.3
        inet 10.0.0.3/32 scope global eth0
    #访问网站,并且windows查看mac地址测试
    C:Users11764>arp -a
    	VIP						VMAC
      10.0.0.3              00-0c-29-d7-bc-2c     动态
      10.0.0.4              00-0c-29-d7-bc-2c     动态
      10.0.0.5              00-0c-29-89-2f-10     动态
      
    #关闭节点1keepalived
    [root@lb01 ~]# systemctl stop keepalived.service
    [root@lb02 ~]# ip addr | grep 10.0.0.3
        inet 10.0.0.3/32 scope global eth0
    #访问网站,并且windows查看mac地址测试
    C:Users11764>arp -a
    	VIP						VMAC
      10.0.0.3              00-0c-29-89-2f-10     动态
      10.0.0.4              00-0c-29-d7-bc-2c     动态
      10.0.0.5              00-0c-29-89-2f-10     动态
    

    四、高可用的脑裂现象

    由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,
    各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
    

    1.脑裂的原因

    1.服务器网线松动等网络故障
    2.服务器硬件故障发生损坏现象而崩溃
    3.主备都开启firewalld防火墙
    

    2.故障演示

    1)开启防火墙

    [root@lb01 ~]# systemctl start firewalld
    [root@lb02 ~]# systemctl start firewalld
    

    2)查看两个节点

    [root@lb01 ~]# ip addr | grep 10.0.0.3
        inet 10.0.0.3/32 scope global eth0
        
    [root@lb02 ~]# ip addr | grep 10.0.0.3
        inet 10.0.0.3/32 scope global eth0
    

    3)访问项目页面

    #拒绝访问,需要配置防火墙规则
    [root@lb01 ~]# firewall-cmd --add-service=http
    success
    [root@lb01 ~]# firewall-cmd --add-service=https
    success
    
    #访问页面正常
    

    3.解决脑裂的办法

    #如果发生闹裂,则随机kill掉一台即可
    #在备节点上编写检测脚本, 测试如果能ping通主,并且备节点还有VIP的话则认为产生了脑裂
    [root@lb02 ~]# vim /scripts/check_split_brain.sh 
    #!/bin/sh
    vip=10.0.0.3
    lb01_ip=10.0.0.4
    lb02_vip=$(ip add|grep "$vip"|wc -l)
    while true;do
        ssh $lb01_ip "ip add|grep $vip" &>/dev/null
        if [ $? -eq 0 -a $lb02_vip -eq 1 ];then
            echo "ha is split brain.warning."
        else
            echo "ha is ok"
        fi
    sleep 5
    done
    
    -eq		#等于
    -ne		#不等于
    -lt		#小于
    -gt		#大于
    -le		#小于等于
    -ge		#大于等于
    

    五、高可用keepalived与nginx

    Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,
    所以可以访问到nginx所在机器
    但是.....如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,
    所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalived
    

    1.nginx故障切换脚本

    [root@lb01 ~]# vim check_web.sh
    #!/bin/sh
    nginxpid=$(ps -C nginx --no-header|wc -l)
    #1.判断Nginx是否存活,如果不存活则尝试启动Nginx
    if [ $nginxpid -eq 0 ];then
        systemctl start nginx
        sleep 3
        #2.等待3秒后再次获取一次Nginx状态
        nginxpid=$(ps -C nginx --no-header|wc -l) 
        #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
        if [ $nginxpid -eq 0 ];then
            systemctl stop keepalived
       fi
    fi
    #给脚本增加执行权限
    [root@lb01 ~]# chmod +x /root/check_web.sh
    

    2.调用脚本

    [root@lb01 ~]# vim /etc/keepalived/keepalived.conf
    global_defs {           
        router_id lb01      
    }
    #每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
    vrrp_script check_web {
        script "/root/check_web.sh"
        interval 5
    }
    vrrp_instance VI_1 {
        state MASTER        
        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_web
    	}
    }
    #在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。
    (注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)
    
  • 相关阅读:
    CentOS6.3升级GCC到GCC4.8.2
    监督式学习 -- 分类决策树(一)
    DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store
    百度地图----->地图类型、定位模式、实时交通、我的位置、加入覆盖物、覆盖物详情及提示
    "浪潮杯"第六届ACM山东省省赛山科场总结
    标题栏风格设置
    ActionBarActivity设置全屏无标题
    王立平--自己定义TitleBar
    C++ const限定符
    黑马day14 过滤器概述&生命周期&运行过程
  • 原文地址:https://www.cnblogs.com/xiaolang666/p/13638885.html
Copyright © 2011-2022 走看看