目录
[1 高可用的概念](#1 高可用的概念)
[2 心跳监测与漂移 IP 地址](#2 心跳监测与漂移 IP 地址)
[3 Keepalived服务介绍](#3 Keepalived服务介绍)
[4 Keepalived故障切换转移原理介绍](#4 Keepalived故障切换转移原理介绍)
[5 Keepalived 实现 Nginx 的高可用集群](#5 Keepalived 实现 Nginx 的高可用集群)
[5.1 项目背景](#5.1 项目背景)
[5.2 项目环境](#5.2 项目环境)
[5.3 项目部署](#5.3 项目部署)
[5.3.1 web01\web02配置:](#5.3.1 web01\web02配置:)
[5.3.3 主调度服务器](#5.3.3 主调度服务器)
[5.3.4 从调度服务器](#5.3.4 从调度服务器)
[5.3.5 项目测试](#5.3.5 项目测试)
[6 Keepalived+LVS 实现 Nginx 集群](#6 Keepalived+LVS 实现 Nginx 集群)
[6.1 实验介绍](#6.1 实验介绍)
[6.2 实验组网介绍](#6.2 实验组网介绍)
[6.3 实验步骤](#6.3 实验步骤)
步骤1在LVS1和LVS2虚拟机上安装keepalived和ipvs
[步骤 3 修改 LVS2 的配置文件](#步骤 3 修改 LVS2 的配置文件)
[步骤 4 测试](#步骤 4 测试)
1 高可用的概念
高可用集群( High Availability Cluster, HA 集群),其中高可用的含义是最大限度地可以使用。从集群的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断地提供服务。当应用程序出现故障或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节点,从而保证应用持续、不间断地对外提供服务,这就是高可用集群实现的功能
2 心跳监测与漂移IP地址
1 、心跳监测
为了能实现负载均衡、提供高可用服务和执行错误恢复,集群系统提供了心跳监测技术。心跳监测是通过心跳线实现的,可以做心跳线的设备有 RS232 串口线,也可以用独立的一块网卡来跑心跳,还可以共享磁盘阵列等。心跳线的数量应该为集群节点数减 I 。需要注意的是,如果通过网卡来做心跳,每个节点需要两块网卡。其中,一块作为私有网络直接连接到对方机器相应的网卡,用来监测对方心跳。另外一块连接到公共网络对外提供服务,同时心跳网卡和服务网卡的 IP地址尽量不要在一个网段内。心跳监控的效率直接影响故障切换时间的长短,集群系统正是通过心跳技术保持节点间内部通信的有效性 。
2 、漂移 IP 地址
在集群系统中,除了每个服务节点自身的真实 IP 地址外,还存在一个漂移 1P 地址。为什么说是漂移 IP地址呢?因为这个 IP 地址并不固定。例如,在两个节点的双机热备中,正常状态下,这个漂移 1P 地址位于主节点上,当主节点出现故障后,漂移 IP 地址自动切换到备用节点。因此,为了保证服务的不间断性,在集群系统中,对外提供的服务 IP 地址一定要是这个漂移 IP 地址。虽然节点本身的 IP 地址也能对外提供服务,但是当此节点失效后,服务切换到了另一个节点,连接服务的 IP 地址仍然是故障节点的 IP地址,此时,服务就随之中断。
3 Keepalived****服务介绍
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入VRRP的功能,VRRP是Virtual Router Redundancy protocol(虚拟路由器冗余协议)的缩写VRRP出现的目的就是为了解决静态路由器出现的单点故障问题,它能偶保证网络的不间断、稳定的运行。所有,keepalived一方面具有LVS cluster nodes healthchecks功能,另一方面也具有LVS directors faiover功能。
4 Keepalived****故障切换转移原理介绍
Keepalived dirctors之间的故障切换转移,是通过 VRRP 协议来实现的。在keepalived directors 正常工作时,主 Directors 节点会不断的向备节点广播心跳信息,用以告诉备节 点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP 资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的IP 资源及服务,恢复到原来的自身的备用角色。
vrrp协议,英文名称: Virtual Router Redundancy Protocol ,中文名称:虚拟路由器冗余协议。 vrrp 出现就是为了解决静态路由的单点故障,vrrp 是通过一种竞选协议机制来将路由任务交给某台 vrrp 路由器。
MASTER 和 BACKUP
在一个VRRP 虚拟路由器中,有多台物理的 VRRP 路由器,但是这多台物理的机器并不同时工作,而是由一台称为MASTER 的负责路由工作,其他的都是 BACKUP , MASTER 并非一成不变, VRRP 协议让每个VRRP 路由器参与竞选,最终获胜的就是 MASTER 。 MASTER 有一些特权,比如拥有虚拟路由器的 IP 地址,我们的主机就是用这个IP 地址作为静态路由的。拥有特权的 MASTER 要负责转发发送给网关地址的包和响应ARP 请求。
VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过 IP 多播( multicast )包(多播地址224.0.0.18 )形式发送的。虚拟路由器有 VRID (范围 0-255 )和一组 IP 地址组成,对外表现为一个周知的MAC 地址: 00-00-5E-00-01{VRID} 。所有,在一个虚拟路由器中,不管谁是 MASTER ,对外都是相同的MAC 和 IP (称之为 VIP )。客户端主机并不需要因为 MASTER 的改变而修改自己的路由配置,对他们来说,这周主从的切换时透明的。
在一个虚拟路由器中,只有作为MASTER 的 VRRP 路由器会一直发送 VRRP 广告包( VRRP
Advertisement message ), BACKUP 不会抢占 MASTER ,除非它的优先级( priority )更高。当
MASTER 不可用时( BACKUP 收不到广告包),多台 BACKUP 中优先级最高的这台会被抢占为 MASTER 。
keepalived 主要特点如下所示。
1) Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived 部署比其他类似工具更简洁的原因,尤其是相对于Heartbeat 而言, Heartbeat 作为 HA 软件,其复杂的配置流程让许多人望而生畏。
2)通过对服务器池对象的健康检查,实现对失效机器 / 服务的故障隔离。
3)负载均衡器之间的失败切换,是通过 VRRPv2 ( Virtual Router Redundancy Protocol ) stack 实现的,VRRP 当初被设计出来就是为了解决静态路由器的单点故障问题。
4)通过实际的线上项目,我们可以得知, iptables 的启用是不会影响 Keepalived 的运行的。 但为了更好 的性能,我们通常会将整套系统内所有主机的iptables 都停用。
5) Keepalived 产生的 VIP 就是整个系统对外的 IP ,如果最外端的防火墙采用的是路由模式,那就映射此内网IP 为公网 IP 。
5 Keepalived 实现 Nginx 的高可用集群
5.1 项目背景
keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用nginx+keepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现Web服务器端的高可用。使用keepalived可以保证nginx的高可用,他能监控nginx的健康状态,当nginx出现宕机时自动主备切换。
5.2****项目环境
服务器名称 | IP | 用途 |
---|---|---|
Nginx_Master | 192.168.186.100 | 提供负载均衡 |
Nginx_Backup | 192.168.186.101 | 提供负载均衡 |
LVS-DR-VIP | 192.168.186.102 | 网站的VIP地址 |
Web1服务器 | 192.168.186.103 | 提供Web服务 |
Web2服务器 | 192.168.186.104 | 提供Web服务 |
5.3 项目部署
5.3.1 web01\web02配置:
提供httpd服务
#yum install httpd -y //安装httpd服务
[root@web1 ~]# echo "this is first web" > /var/www/html/index.html
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
[root@web2 ~]# echo "this is second web" > /var/www/html/index.html
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# systemctl enable httpd
5.3.2nginx负载均衡配置
两台nginx做同样配置
1、安装nginx
[root@Nginx_Backup ~]# yum install nginx -y
2、配置nginx反向代理
[root@Nginx_Master ~]# cd /etc/nginx/conf.d/
[root@Nginx_Master conf.d]# vim web.conf
upstream websrvs{
server 192.168.186.103:80 weight=1;
server 192.168.186.104:80 weight=1;
}
server{
location / {
proxy_pass http://websrvs;
index index.html;
}
}
5.3.3 主调度服务器
1、安装keepalived
[root@Nginx_Master conf.d]# yum install keepalived -y
2、开发检测nginx存活的shell脚本
[root@Nginx_Master conf.d]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl start nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
then
systemctl stop keepalived
fi
fi
3、配置keepalived
5.3.4****从调度服务器
1、安装keepalived
[root@Nginx_Backup ~]# yum install keepalived -y
2、开发检测nginx存活的shell脚本
[root@Nginx_Backup ~]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl start nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
then
systemctl stop keepalived
fi
fi
3、配置keepalived
state BACKUP //从服务器
priority 150 //优先级
5.3.5****项目测试
启动主从调度的 nginx 和 keepalived
[root@Nginx_Master ~]# systemctl restart nginx keepalived
[root@Nginx_Backup ~]# systemctl restart nginx keepalived
Master,Backup都正常,只有Master对外提供服务
[root@Nginx_Master ~]# systemctl restart nginx keepalived
[root@Nginx_Master ~]# ip a | grep "192.168.186.102"
inet 192.168.186.102/32 scope global ens33
Master宕机,Backup接替Master对外提供服务
#模拟Master的keepalived服务器停止
[root@Nginx_Master ~]# systemctl stop keepalived
#此时VIP在Backup上
[root@Nginx_Backup ~]# ip a | grep "192.168.186.102"
inet 192.168.186.102/32 scope global ens33
Master恢复正常,Master继续提供服务,Backup停止服务
#模拟Master的keepalived服务恢复正常
[root@Nginx_Master ~]# systemctl restart keepalived
#此时VIP在Master上
[root@Nginx_Master ~]# ip a | grep "192.168.186.102"
inet 192.168.186.102/32 scope global ens33
Master上的nginx服务停止,尝试重新启动nginx
[root@Nginx_Master ~]# systemctl stop nginx
[root@Nginx_Master ~]# systemctl status nginx
nginx启动正常,keepalived不做切换
6 Keepalived+LVS 实现 Nginx 集群
6.1 实验介绍
本实验将使用 Keepalived 为 LVS 提供高可用配置,同时 LVS 为后端的 Nginx1 和 Nginx2 提供负载均衡,最终通过 Keepalived+LVS 实现 Nginx 集群。
6.2 实验组网介绍
LVS1 和 LVS2 通过 keepalived 组成高可用集群,同时向后端的 Nginx1 和 Nginx2 提供负载均衡。
服务器名称 | IP |
---|---|
192.168.186.100 | LVS1 |
192.168.186.101 | Nginx1 |
192.168.186.102 | Nginx2 |
192.168.186.103 | LVS2 |
192.168.186.104 | Client |
6.3 实验步骤
步骤1在LVS1和LVS2虚拟机上安装keepalived和ipvs
使用以下命令在LVS1和LVS2虚拟机上安装keepalived和ipvs
[root@LVS2 ~]# yum install -y keepalived ipvsadm
步骤2修改LVS1的配置文件
将LVS1的配置keepalived配置文件修改为以下内容:
bash
[root@LVS1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS1 # 设置lvs的id,在一个网络应该是唯一的
}
vrrp_instance Nginx {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
mcast_src_ip 20.0.0.1
virtual_router_id 51 # 虚拟路由编号,主从要一直
priority 255 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.186.20/24 # 定义虚拟ip(VIP),可多设,每行一个
}
}
virtual_server 192.168.186.20 80 {
delay_loop 6 # 设置健康检查时间,单位为秒
lb_algo rr # 设置负载调度的算法为rr
lb_kind DR # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
persistence_timeout 50 # 同一IP 50秒内的请求都发到同个real server
protocol TCP
real_server 192.168.186.101 80 { # 指定real server1的ip地址
weight 1 # 配置节点权值,数值越大权重越高
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.186.102 80 {
weight 2
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
步骤 3 修改 LVS2 的配置文件
将 LVS2 的配置 keepalived 配置文件修改为以下内容:
bash
[root@LVS2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcasr_src_ip 20.0.0.2
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.186.20/24
}
}
virtual_server 192.168.186.20 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.186.101 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.186.102 80 {
weight 2
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
步骤 4 测试
配置完成两台 LVS 服务器后,,具体如下:
bash
[root@LVS1 ~]# systemctl restart keepalived.service
[root@LVS2 ~]# systemctl status keepalived.service
[root@LVS1 ~]# systemctl restart keepalived
[root@LVS1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.186.20:80 rr
-> 192.168.186.101:80 Route 1 0 0
-> 192.168.186.102:80 Route 2 0 0