一、高可用服务
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 | 说明 |
---|---|---|---|
lb01 | lb01 | 192.168.10.5、172.16.1.5 | nginx+keepalived |
lb02 | lb02 | 192.168.10.6、172.16.1.6 | nginx+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_instance | vrrp协议配置,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中比较大小的符号 | 单词 | 说明 |
---|---|---|
-eq | equal | 等于(==) |
-ne | not equal | 不等于(!=) |
-gt | great then | 大于(>) |
-ge | great equal | 大于等于(>=) |
-lt | less then | 小于(<) |
-le | less 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
}
}