什么是高可用?

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

高可用通常使用什么软件?

硬件通常使用 F5

软件通常使用 keepalive

keepalived是如何实现高可用的?

keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题

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

keepalived实现高可用的原理

Keepalived高可用对之间是通过 VRRP进行通信的, VRRP是遑过竞选机制来确定主备机的,主机的优先级高于备机,因此,工作时主会优先获得所有的资源,备机节点处于等待状态,当主机挂了的时候,备机节点就会接管主机节点的资源,然后顶替主机节点对外提供服务。
在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备机它还活着,此时备机不会枪占主机,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。
------------------------------------------------------------------------------------------------------
arp -a:查看Ip映射表

ip地址 映射一个mac地址

知识回顾:

#什么是静态页面?
前端代码构成的页面,不需要访问数据库的  如:html、css、js
#什么是动态页面?
后端代码构成的网页,需要调用数据库的,如:java、python、c++、php
------------------------------------------------------------------------------------------------------
#Nginx七四负载/反向代理
反向代理:proxyy_pass http://xxxxx
七层负载: upstream{
    server xxxxxx
}
四层负载:stream

实践部署keepalived高可用(抢占式)

环境准备:

主机名 外网IP 内网IP 角色 环境
web01 10.0.0.7 172.16.1.7 web网站 nginx、php
web02 10.0.0.8 172.16.1.8 web网站 nginx、php
lb01 10.0.0.5 172.16.1.5 负载均衡、master nginx、keepalived
lb02 10.0.0.6 172.16.1.6 负载均衡、backup nginx、keepalived

web配置:

#下载安装ngixn、php
yum install -y nginx php
#编辑配置文件
vim /etc/nginx/conf.d/keep.conf
server{
    listen 80;
    server_name _;
    location / {
        root /code/web;
        index index.html;
    }
}
#创建站点目录和代码
mkdir /code
echo "this is web01" >/code/index.html
#web02同web01部署步骤 //只是echo写入改为"this is web02"
#启动服务
systemctl start nginx 

负载均衡配置

#编写配置文件
upstream jiujiu{
        server 10.0.0.7;
        server 10.0.0.8;
}
server {
        listen 80;
        server_name www.keep.com;

        location / {
                proxy_pass http://jiujiu;
                include /etc/nginx/proxy_params;

        }
}
#优化配置文件
vim /etc/nginx/proxy_params

# 在代理服务器的请求头中,加上域名,携带域名去访问后端的web
proxy_set_header Host $host;
# 在代理服务器的请求头重,透传用户的真实IP给web01
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# lb01链接web01的超时时间(代理服务器链接后端服务的超时时间)
proxy_connect_timeout 30;
# 后端服务器回传代理服务器的超时时间
proxy_send_timeout 60;
# lb01代理服务器读取web01返回数据的超时时间
proxy_read_timeout 60;
# 开启代理服务器的缓冲区
proxy_buffering on;
# 开启存放头部信息的缓冲区大小 32k
proxy_buffer_size 32k;
# 开启4个128k存放数据主体的缓冲区
proxy_buffers 4 128k;
#web02同web01部署步骤

keepalived部署:

# 1.安装keepalived
[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived
# 2.lb01修改keepalived配置文件    //主节点
global_defs {                   
    router_id keepalived01              
}

vrrp_instance VI_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                
    }
}
#lb02修改keepalived配置文件    //备节点
global_defs {                   
    router_id keepalived01              
}

vrrp_instance VI_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                
    }
}
#启动服务
systemctl start keepalived
#查看
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:79:d2:52 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global eth0              #//多了一个虚拟网卡
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe79:d252/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:79:d2:5c brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe79:d25c/64 scope link 
       valid_lft forever preferred_lft forever
#配置文件详解
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}
vrrp_instance VI_1 {
    state MASTER                #标识角色状态
    interface eth0              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        10.0.0.3                #虚拟的VIP地址
    }
}

配置文件的区别:

keepalived配置区别 Master节点配置 Backup节点配置
route_id(唯一标识) router_id :keepalived01 router_id:keepalived02
state(角色状态) state MASTER state BACKUP
priority(竞选优先级) priority 150 priority 100

keepalived非抢占式部署

1.两边的角色都必须是BACKUP
2.两个节点都必须加上配置 nopreempt
3.其中一个节点的优先级必须要高于另外一个节点的优先级。

### 主节点配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
    router_id keepalived01
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.3
    }
}
#备节点配置
global_defs {
    router_id keepalived02
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.3
    }
}
# 重启keepalived
[root@lb01 ~]# systemctl restart keepalived
[root@lb02 ~]# systemctl restart keepalived
#停止其中一台keepalived服务。会发现虚拟ip会转移到另外一台服务器上

关联nginx和keepalived

编写脚本:检测nginx状态,如果nginx停止了,就把keepalived停掉

注意:如果想要检测某个服务是否存活,脚本名,一定不要带服务名

#主节点配置
[root@lb01 ~]# vim check_web.sh
#!/bin/bash
nginx_status=`ps -ef|grep [n]ginx|wc -l`
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
#配置keepalived自动执行检测nginx脚本
global_defs {
    router_id keepalivedlb01
}
vrrp_script jiujiu {
    script "/root/check.sh"
    interval 1
}
vrrp_instance VI_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 {
    jiujiu  
    }
}
#赋予脚本执行权限
chmod +x chedk.sh
# 重启keepalived
[root@lb01 ~]# systemctl restart keepalived
#备节点配置
global_defs {
    router_id keepalivedlb02
}

vrrp_instance VI_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
    }
}
# 重启keepalived
[root@lb01 ~]# systemctl restart keepalived
----------------------------------------------------------------------------------------------------
当lb01检测到nginx服务异常中断的时候,虚拟IP会自动跳到lb02上,使其网页正常运转
#本地域名解析
10.0.0.3 www.keep.com
#浏览器访问
www.keep.com
#测试是否成功
关闭lb01Nginx服务,继续访问网站,查看是否网页正常运行,如果正常运行表示部署成功