一、高可用服务

1、HA高可用概述

高可用:HA,High Acailablity

生成vip、dns解析到这个ip地址即可

选型说明
keepalived活着,高可用软件,负载使用,一些不涉及数据服务
heartbeat心跳,高可用软件,涉及数据库,存储数据相关可以使用
商业高可用软件例如:RoseHA

2、keepalived概述

(1)概述
keepalive基于VRRP协议实现高可用。
1、VRRP,全称Virutal Router Redundancy Protocol(虚拟路由冗余协议),VRRP的出现是为了解决静态路由的单点故障,最开始是给网络设备实现高可用。目前keepalived实现vrrp协议,通过vrrp实现高可用。
2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
3、VRRP使用IP多播(Multicast)方式实现高可用之间的通信,默认多播地址为:224.0.0.18。
4、工作时主节点发包,备节点接包。当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选。
5、VRRP使用了加密协议加密数据,但keepalive官方目前还是推荐使用明文的方式配置认证类型和密码。
(2)工作原理
keepalived高可用对之间通过VRRP进行通信,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此在工作时会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

在keepalive服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。

3、极速上手指南

3.1 环境准备
高可用环境准备主机名ip说明
lb01lb01192.168.10.5、172.16.1.5nginx+keepalived
lb02lb02192.168.10.6、172.16.1.6nginx+keepalived
3.2 服务部署
a)安装nginx

nginx的yum源:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

安装nginx

yum install -y nginx

b)安装keepalived

yum install -y keepalived

keepalived配置文件分类(分为3个部分)

配置文件(/etc/keepalived/keepalived.conf)结构:

配置文件结构说明说明
global_defs全局定义部分
vrrp_instancevrrp协议配置,vip,主备、网卡…等,重点部分
用于管理与配置lvs的部分virtual_server部分,用于管理控制lvs的

4、keepalived配置详解

备份配置文件

[root@lb01 ~]#cp /etc/keepalived/keepalived.conf{,.bak}
4.1 配置文件详解
! Configuration File for keepalived
#全局定义部分
global_defs {
   router_id lb01      #每一个keepalived的名字,当前网络中唯一,即每个节点不同,一般设为主机名即可
}
#vrrp实例配置部分,用于配置VIP(Virtual_IPaddress),设置主、备
vrrp_instance vip_3 {  #vip_3:vrrp实例名称
                       #设置在1对主备之间的名字,注意:在同一对主备之间这个名字要一致
    state MASTER       #主/备,MASTER:主,BACKUP:备,要大写
    interface eth0     #指定网卡
    virtual_router_id 51 #id号,一对主备之间id号要相同,默认是51
    priority 100       #优先级,数字越大优先级越高,设置建议:主>备,主备相差50,如果主100,备就50
    advert_int 1       #心跳间隔,多久发一次vrrp数据包,默认是1秒
    authentication {   #授权与认证,保持默认即可。对数据包加密
        auth_type PASS #简单认证,默认PASS
        auth_pass 1111 #默认1111
    }
    virtual_ipaddress {  #设备vip
        192.168.10.3  dev  eth0 label eth0:0  #label,设置别名,给eth0设置别名为:eth0:0
                                              #其ip为:192.168.10.3
    }
}
4.2 配置keepalived

lb01配置:

[root@lb01 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
   router_id lb01      #每一个keepalived的名字,当前网络中唯一,即每个节点不同,一般设为主机名即可
}
#vrrp实例配置部分,用于配置VIP(Virtual_IPaddress),设置主、备
vrrp_instance vip_3 {  #vip_3:vrrp实例名称
                       #设置在1对主备之间的名字,注意:在同一对主备之间这个名字要一致
    state MASTER       #主/备,MASTER:主,BACKUP:备,要大写
    interface eth0     #指定网卡
    virtual_router_id 51 #id号,一对主备之间id号要相同,默认是51
    priority 100       #优先级,数字越大优先级越高,设置建议:主>备,主备相差50,如果主100,备就50
    advert_int 1       #心跳间隔,多久发一次vrrp数据包,默认是1秒
    authentication {   #授权与认证,保持默认即可。对数据包加密
        auth_type PASS #简单认证,默认PASS
        auth_pass 1111 #默认1111
    }
    virtual_ipaddress {  #设备vip
        192.168.10.3  dev  eth0 label eth0:0  #label,设置别名,给eth0设置别名为:eth0:0
                                              #其ip为:192.168.10.3
    }
}

lb02配置:

[root@lb02 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
   router_id lb02      #每一个keepalived的名字,当前网络中唯一,即每个节点不同,一般设为主机名即可
}
#vrrp实例配置部分,用于配置VIP(Virtual_IPaddress),设置主、备
vrrp_instance vip_3 {  #vip_3:vrrp实例名称
                       #设置在1对主备之间的名字,注意:在同一对主备之间这个名字要一致
    state BACKUP       #主/备,MASTER:主,BACKUP:备,要大写
    interface eth0     #指定网卡
    virtual_router_id 51 #id号,一对主备之间id号要相同,默认是51
    priority 50       #优先级,数字越大优先级越高,设置建议:主>备,主备相差50,如果主100,备就50
    advert_int 1       #心跳间隔,多久发一次vrrp数据包,默认是1秒
    authentication {   #授权与认证,保持默认即可。对数据包加密
        auth_type PASS #简单认证,默认PASS
        auth_pass 1111 #默认1111
    }
    virtual_ipaddress {  #设备vip
        192.168.10.3  dev  eth0 label eth0:0  #label,设置别名,给eth0设置别名为:eth0:0
                                              #其ip为:192.168.10.3
    }
}

lb02与lb01对比,只修改router_id, state ,priority_router_id即可,其他参数不变。

lb01、lb02重启keepalived:

systemctl start keepalived
systemctl enable keepalived

查看ip:

[root@lb01 ~]#ip addr | grep 192.168.10
    inet 192.168.10.5/24 brd 192.168.10.255 scope global noprefixroute eth0
    inet 192.168.10.3/32 scope global eth0:0
[root@lb01 ~]#

vip(192.168.10.3)在主节点(lb01)上。

如果停止lb01的keeaplived服务,则vip转移到lb02上。

#lb01停止keepalived服务
[root@lb01 ~]#systemctl stop keepalived
​#vip转移到lb02上
[root@lb02 ~]#ip addr | grep 192.168.10    inet 192.168.10.6/24 brd 192.168.10.255 scope global noprefixroute eth0    inet 192.168.10.3/32 scope global eth0:0[root@lb02 ~]#

5、keepalived抓包

使用Wireshark抓包,转转VMnet8:

输入vrrp:

点开任意一个数据包,详情如下:

也可使用tcpdump抓包

[root@lb01 ~]#yum install -y tcpdump
#抓取vrrp协议的数据包,保存在vrrp.pcap文件中
[root@lb01 ~]#tcpdump -vvv -nnn vrrp -w vrrp.pcap

6、keepalived脑裂

在某些情况下(比如,防火墙阻止),备节点没有收到主节点的心跳信息,而认为主节点挂了,进而备节点接管了主节点的资源,但实际上主节点并没有挂,这种现象就叫做脑裂。

脑裂/裂脑:

现象:主备都有vip
原因:备认为主挂了,接管资源生成vip,实际上主并没有挂,仍有vip
     有很多原因可以导致脑裂,如:开启防火墙、selinux,keepalived配置问题,物理线路问题
解决:监控(备节点监控),只要备节点有vip就告警。
     监控备节点只要有vip,远程控制主节点,只要备节点认为主挂了,那就让他真的挂了

监控脑裂或主备切换脚本:

1、在备节点执行监控脚本
2、脚本流程步骤:
  (1)统计 ip  a  | grep  vip 数量
  (2)判断如果等于1则发出告警邮件

if判断中,比较大小的符号如下:

if中比较大小的符号单词说明
-eqequal等于(==)
-nenot equal不等于(!=)
-gtgreat then大于(>)
-gegreat equal大于等于(>=)
-ltless then小于(<)
-leless equal小于等于(<=)

判断脚本如下:

[root@lb02 ~]#vim /server/script/check-vip.sh
#!/bin/bash
#author: xzm
#desc: 检查脑裂或主备切换 
#url: test.com

#1、vars
vip=192.168.10.3

#2、统计vip数量
vip_count=`ip a | grep "\b$vip\b" | wc -l`

#3、进行判断
# -eq  equal       等于   ==
# -ne  not equal   不等于 !=
# -gt  great then  大于   >
# -ge  great equal 大于等于 >=
# -lt  less then   小于 <
# -le  less equal  小于等于 <=

if [ $vip_count -ne 0 ];then
   echo "keepalived 发生故障!"
fi

if判断语法格式:

if [变量];then
   命令
fi

或者
if [变量]
then
   命令
fi

7、案例

案例01:keepalived基于主机高可用软件

· keepalived只会在主机挂了,网络断开后,才会进行主备切换

· 默认情况下,keepalived不会监控某个服务

· 项目目标:某个服务关闭了,keepalived就进行主备切换

· 项目步骤:

1、主备节点都书写脚本,过滤服务进程数,端口数量,检查是否运行
2、然后在脚本中进行判断,如果服务没有运行,则关闭keepalived
3、修改keepalived配置文件,通过keepalived调用这个脚本

lb01配置如下:

1)书写脚本

监控nginx服务

[root@lb01 ~]#vim /server/script/check_ngx.sh
#!/bin/bash
#author: xzm
#desc: 监控nginx

#如果nginx停止服务,则停止keepalived服务
port_cnt=`ss -tnlup | grep nginx | wc -l`
# ss -tnlup | grep nginx | wc -l可以写成:ss -tnlup | grep -wc nginx 
#判断
if [ $port_cnt -eq 0 ]
then
   systemctl stop keepalived
fi
[root@lb01 ~]#chmod +x  /server/script/check_ngx.sh

注意:

1、要给该脚本添加可执行权限(chmod +x  /server/script/check_ngx.sh)
2、脚本名字中不要包含服务的名字(为啥?,脚本名字包含了服务名称,运行后会误以为是服务)
3、修改keepalived配置文件

2)修改keepalived配置文件

定义监控脚本,然后,vrrp实例调用

[root@lb01 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
   router_id lb01      #每一个keepalived的名字,当前网络中唯一,即每个节点不同,一般设为主机名即可
}
#定义监控脚本
vrrp_script check_ngx.sh {
   script /server/script/check_ngx.sh  #定义监控的脚本
   interval 2  #脚本多久执行一次,2表示2秒
   weight 1    #权重
   user root   #执行脚本的用户,root
}
#vrrp实例配置部分,用于配置VIP(Virtual_IPaddress),设置主、备
vrrp_instance vip_3 {  #vip_3:vrrp实例名称
                       #设置在1对主备之间的名字,注意:在同一对主备之间这个名字要一致
    state MASTER       #主/备,MASTER:主,BACKUP:备,要大写
    interface eth0     #指定网卡
    virtual_router_id 51 #id号,一对主备之间id号要相同,默认是51
    priority 100       #优先级,数字越大优先级越高,设置建议:主>备,主备相差50,如果主100,备就50
    advert_int 1       #心跳间隔,多久发一次vrrp数据包,默认是1秒
    authentication {   #授权与认证,保持默认即可。对数据包加密
        auth_type PASS #简单认证,默认PASS
        auth_pass 1111 #默认1111
    }
    virtual_ipaddress {  #设备vip
        192.168.10.3  dev  eth0 label eth0:0  #label,设置别名,给eth0设置别名为:eth0:0
                                              #其ip为:192.168.10.3
    }
    #这个实例使用check_ngx.sh 脚本
    track_script {
       check_ngx.sh
    }
}

3)重启keepalived服务

[root@lb01 ~]#systemctl restart keepalived

存在的问题:

nginx服务停止,则keepalived服务也停止
此时,nginx启动,但keepalived服务不会跟着启动,必须手动启动。

lb02配置:

1)脚本

把lb01的脚本/server/script/check_ngx.sh发送到lb02的/server/script/目录中即可

[root@lb01 ~]#scp -p /server/script/check_ngx.sh 192.168.10.6:/server/script/

参照lb01修改,如下:

[root@lb02 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
   router_id lb02      #每一个keepalived的名字,当前网络中唯一,即每个节点不同,一般设为主机名即可
}
vrrp_script check_ngx.sh {
   script /server/script/check_ngx.sh
   interval 2
   weight 1
   user root
}
#vrrp实例配置部分,用于配置VIP(Virtual_IPaddress),设置主、备
vrrp_instance vip_3 {  #vip_3:vrrp实例名称
                       #设置在1对主备之间的名字,注意:在同一对主备之间这个名字要一致
    state BACKUP       #主/备,MASTER:主,BACKUP:备,要大写
    interface eth0     #指定网卡
    virtual_router_id 51 #id号,一对主备之间id号要相同,默认是51
    priority 50       #优先级,数字越大优先级越高,设置建议:主>备,主备相差50,如果主100,备就50
    advert_int 1       #心跳间隔,多久发一次vrrp数据包,默认是1秒
    authentication {   #授权与认证,保持默认即可。对数据包加密
        auth_type PASS #简单认证,默认PASS
        auth_pass 1111 #默认1111
    }
    virtual_ipaddress {  #设备vip
        192.168.10.3  dev  eth0 label eth0:0  #label,设置别名,给eth0设置别名为:eth0:0
                                              #其ip为:192.168.10.3
    }
    track_script {
       check_ngx.sh
    }
}

3)重启keepalived服务

[root@lb02 ~]#systemctl status  keepalived

案例小结(监控指定服务):

1、书写脚本:获取服务的端口数或进程数,通过if进行判断,如果端口或进程数为0,则停止keepalived服务
2、修改keepalived配置
  定义脚本:vrrp_script  名称  { script 脚本文件(绝对路径) ...}
  调用脚本:vrrp_instance中通过track_script { 名称 }进行调用

局限:适用于非存储数据的服务

8、进阶用法

8.1 非抢占模式

keepalived主备默认是抢占模式,即,主节点挂了,备节点接管,主恢复了,主重新抢回资源。

非抢占模式:主恢复了,主不重新抢回资源。

配置非抢占模式:

1、两个节点配置为BACKUP,不配置MASTER
2、配置nopreempt选项

lb01配置如下:

global_defs {
   router_id lb01
}
vrrp_script check_ngx.sh {
   script /server/script/check_ngx.sh
   interval 2
   weight 1
   user root
}
vrrp_instance vip_3 { 
    state BACKUP 
    nopreempt
    interface eth0 
    virtual_router_id 51
    priority 100   #优先级100
    advert_int 1
    authentication { 
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.3  dev  eth0 label eth0:0 
    }
    track_script {
       check_ngx.sh
    }
}

lb02配置如下:

global_defs {
   router_id lb02
}
vrrp_script check_ngx.sh {
   script /server/script/check_ngx.sh
   interval 2
   weight 1
   user root
}
vrrp_instance vip_3 {                  
    state BACKUP 
    nopreempt
    interface eth0
    virtual_router_id 51
    priority 100  #优先级100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { 
        192.168.10.3  dev  eth0 label eth0:0 
    }
    track_script {
       check_ngx.sh
    }
}

重启keepalived服务即可

8.2 双主模式

应对高并发的时候设置双主模式

设置两个vip,如果两个vip都在主节点,则主的压力大,因此,设置一个在主,一个在备,主备同时使用。也就是2对主备

lb01的配置:

[root@lb01 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id lb01
}
vrrp_instance vip_3 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.3  dev  eth0 label eth0:0
    }
}
vrrp_instance vip_4 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.4  dev  eth0 label eth0:1
    }
}

lb02的配置:

[root@lb02 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id lb02
}
vrrp_instance vip_3 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.3  dev  eth0 label eth0:0
    }
}
vrrp_instance vip_4 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.4  dev  eth0 label eth0:1
    }
}

lb01、lb02重启keepalived服务

systemctl restart keepalived

每个节点配置2个实例。

lb01:

vip_3:主,vip:192.168.10.3
vip_4:备,vip:192.168.10.4

lb02:

vip_3:备,vip:192.168.10.3
vip_4:主,vip:192.168.10.4

这就是双主模式

未来:

192.168.10.3对应一个域名

192.168.10.4对应另一个域名

二、https

1、https概述

基于http协议,传输的时候进行加密

如果不使用https,数据传输都是明文

应用场景:

目前大部分的业务都是使用httpd加密
企业想用http2.0,基于https

部署https加密的流程

1、域名
2、根据域名申请https证书(私钥和公钥[ca证书]),自己创建
3、进行配置web或lb
4、跳转http-->https

证书分类:

证书类型适用网站类型公信等级认证强度安全性支持证书品牌
DV(域名型)个人网站一般CA机构审核个人网站真实性,不验证企业真实性一般1、DigiCert(原Synmantec)
2、GeoTrust
3、GlobalSign
4、vTrus(国产)
5、WoSign(国产)
OV(企业型)政府组织、企业、教育机构等CA机构审核组织及企业真实性1、DigiCert(原Synmantec)
2、GeoTrust
3、GlobalSign
4、vTrus(国产)
5、CFCA(国产)
EV(企业增强型)大型企业、金融机构等最高严格认证最高1、DigiCert(原Synmantec)
2、GeoTrust
3、CFCA(国产)

2、https证书申请

可以到阿里云、腾讯云等平台申请

3、实战案例

假设申请到的ssl证书放在/etc/nginx/ssl_keys/目录中:

私钥:/etc/nginx/ssl_keys/test.com.key
公钥(CA证书):/etc/nginx/ssl_keys/test.com.pem

nginx站点配置文件示例如下:

serverv{
   listen 80;
   server_name test.com;
   return 302 https://test.com$request_uri;  #也可以使用301
   #使用rewrite如下
   #rewrite ^(.*)$ https://test.com$1  permanent;
}

server {
   listen 443 ssl;
   #ssl on; nginx1.15.0以后版本被废弃了
   server_name test.com;
   error_log /var/log/nginx/ssl-error.log notice;
   access_log /var/log/nginx/ssl-access.log main;
   root /app/code/ssl;
   
   #ssl配置
   ssl_certificate  /etc/nginx/ssl_keys/test.com.pem  #公钥,ca证书
   ssl_certificate_key /etc/nginx/ssl_keys/test.com.key #私钥

   location / {
       index index.php
   }
}