目录
3.配置负载调度器(主:192.168.100.11 备:192.168.100.10)
3.2配置虚拟IP地址(VIP:192.168.100.100)
5.1配置虚拟IP地址(vip:192.168.100.100)
5.2添加vip本地访问路由,设置系统自动识别,并设置执行权限
5.3调整内核的ARP响应参数以阻止更新vip的MAC地址,避免冲突
6.1安装Keepalived(主:192.168.100.11)
6.2配置keepalived(主:192.168.100.11)
6.4安装keepalived(备:192.168.100.10)
6.5配置keepalived(备:192.168.100.10)
1、keeplived 软件起初是专门为LVS 负载均衡 软件设置的,用来管理并监控LVS集群中各个服务节点的状态,后来加入了可以实现高可用的VRRP 功能。因此,keepalived除了能管理LVS 集群以外,还可以为其它服务(如:Nginx、Haproxy、Mysql等)实现高可用。
2、keepalived 软件主要是通过 VRRP 协议 实现高可用的功能。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的速写,VRRP出现的目的就是为了解决静态路由单点故障的问题,它能保证当个别节点出现问题时,整个网络可以不间断的运行。
Keepalived是一款专为LVS 和HA 设计的一款健康检查工具。
支持故障自动切换、支持节点健康状态检查
:Keepalive是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
:在一个LVS服务集群中,通常有 主服务器(MASTER) 和备服务器(BACKUP) 两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证高可用性。
:在Keepalive服务之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,备监听不到主发送的广播包后,就会启动相关服务器接管资源,保证业务的连续性,接管速度最快可以小于1秒。
Keepalive体系架构中主要有三个模块,分别是core、check和vrrp
core模块: 为keepalive的核心、负责主进程的启动,维护及全局配置文件的加载和解析
check模块: 负责健康检查,常见的方式有端口检查及URL检查
vrrp模块: 是来实现VRRP协议的
Keepalive可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止功能
:Keepalived可以实现任意两台主机之间,例如:Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器。
:Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服,角色为Backup的主机为Master主机的热备,当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务,当角色为Master的主机故障修复后,又会自动接管回他原来处理的工作,角色Bachup的主机则同时释放Master主机时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始及工作状态。
Keepalived可以通过在自身的Keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把它们加入到正常转发队列中,对客户提供服务。
一般企业集群需要满足三个特点: 负载均衡、健康检查、故障切换 ,使用LVS+Keepalived完全可以满足需求
keeplived的检查方式
ping方式检查(不全面)
基于脚本检查(周期检查master服务器的服务是否停止,停止之后使用停止keeplived,进行漂移,并邮件告警
VRRP也就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障
VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的
VRRP用IP多播的方式(默认多播地址224.0.0.18)实现高可用之间通信
工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对
VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码
在高可用(HA)系统中,当联系两个节点的"心跳线"断开时,本来为一整体、动作协调的HA系统,就分裂成为两个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢"共享资源"、挣起"应用服务",就会发生严重后果——或者共享资源被瓜分、两边"服务"都起不来了;或者两边"服务"都起来了,但同时读写"共享存储",导致数据损坏(常见如数据库轮询着的联机日志出错)
1、高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)
2、因网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
3、因心跳线间连接的设备故障(网卡及交换机)
4、因仲裁的机器出问题(采用仲裁的方案)
5、高可用服务器上开启了iptables防火墙阻挡了心跳信息传输
6、Keepalived配置里同一VRRP实例如果Virtual_router_id两端参数配置不一致也会导致脑裂问题发生
7、vrrp实例名字不一致,优先级一致
1、添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"脑裂"发生几率
2、启动磁盘锁。正在服务一方锁住共享磁盘,“脑裂"发生时,让对方完全"抢不走"共享磁盘资源。但使用磁盘锁也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中加入服务器节点突然死机或崩溃,就不可能执行解锁命令。后背节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
3、设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,两个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源
4、利用脚本检测、报警
- LVS-DR服务器:主-192.168.100.11
- LVS-DR服务器:备-192.168.100.10
- web01:192.168.100.12
- web02:192.168.100.13
- vip(虚拟回环):192.168.100.100
- NFS服务器:192.168.100.14
- 客户端:192.168.100.110
部署前关闭所有机器防火墙及核心防护
- systemctl stop firewalld
- systemctl disable firewalld
- setenforce 0
在内网的服务器无法直接通过yum下载,需要配置本地yum仓库,在机器中执行以下脚本
- #!/bin/bash
- mount /dev/cdrom /mnt
- mkdir /etc/yum.repos.d/bak
- mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
- touch /etc/yum.repos.d/local.repo
- echo "
- [local]
- name=local
- baseurl=file:///mnt
- enabled=1
- gpgcheck=0
- " > /etc/yum.repos.d/local.repo
- yum cleam all
- yum makecache
- cd /etc/sysconfig/network-scripts/
- cp ifcfg-ens33 ifcfg-ens33:0
- vim ifcfg-ens33:0
ifup ens33:0 #启动虚拟IP
ifconfig
由于LVS负载均衡器和各个节点需要共用vip地址,应该关闭Linux内核的重定向响应参数,不充当路由器,这样当DS收到客户端发来的数据包时,就不会立马转发给后台RS服务器,而是转发给自己的虚拟子接口。
- vim /etc/sysctl.conf #编辑内核proc参数
- 修改以下内容
- net.ipv4.ip_forward = 0 #关闭路由转发功能
- net.ipv4.conf.all.send_redirects = 0 #关闭所有send重定向
- net.ipv4.conf.default.send_redirects = 0 #关闭默认重定向
- net.ipv4.conf.ens33.send_redirects = 0 #关闭网卡重定向
- sysctl -p #查看内核参数
- ipvsadm -C #清空规则
- ipvsadm -A -t 192.168.100.100:80 -s rr #创建虚拟主机,指定ip地址,并指定分流模式为轮询
- ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.12:80 -g
- #添加真实服务器ip地址,并指定负载均衡模式为DR
- ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.13:80 -g
- #添加真实服务器ip地址,并指定负载均衡模式为DR
- ipvsadm #启动策略
- ipvsadm-save > /etc/sysconfig/ipvsadm #保存策略
LVS2(备:192.168.100.10)与LVS相同配置,重复执行以上操作
- yum -y install nfs-utils rpcbind
- systemctl start nfs
- systemctl start rpcbind
- echo "this is web01" > /opt/web01/index.html
- echo "this is web02" > /opt/web02/index.html
- vim /etc/exports
- 添加以下内容
- /opt/web01 192.168.100.0/24(rw,sync)
- /opt/web02 192.168.100.0/24(rw,sync)
以下步骤web01和web02都要配置
此地址仅作为发送web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发),因此使用虚拟接口lo:0来承载VIP,并为本机添加一条路由记录,并将访问的VIP的数据限制在本地,以免通信紊乱
- cd /etc/sysconfig/network-scripts/
- cp ifcfg-lo ifcfg-lo:0
- vim ifcfg-lo:0
- 编写以下内容
- DEVICE=lo:0
- ONBOOT=yes
- IPADDR=192.168.100.100
- NETMASK=255.255.255.255
-
- ifup lo:0 #启动环回网卡
- ifconfig lo:0 #查看环回网卡
- route add -host 192.168.100.100 dev lo:0
- 或者下面方式,都可实现路由禁锢,下面为永久添加
- vim /etc/rc.local #Linux在开机启动时,会加载的内容
- /sbin/route add -host 192.168.100.100 dev lo:0
- chmod +x /etc/rc.d/rc/local
- vim /etc/sysctl.conf
- 添加以下内容
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.all.arp_announce = 2
- net.ipv4.conf.default.arp_ignore = 1
- net.ipv4.conf.default.arp_announce = 2
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
立即生效
yum -y install nfs-utils rpcbind httpd
以上步骤 web01 和 web02 一样
web01
- systemctl start nfs
- systemctl start rpcbind
- systemctl start httpd
- mount.nfs 192.168.100.14:/opt/web01 /var/www/html
- df -hT
web02
- cd /etc/keepalived/
- cp keepalived.conf keepalived.conf.bak
- vim keepalived.conf
修改配置文件
- 1 ! Configuration File for keepalived
- 2
- 3 global_defs { #定义全局参数
- 4 notification_email {
- 5 acassen@firewall.loc
- 6 failover@firewall.loc
- 7 sysadmin@firewall.loc
- 8 }
- 9 notification_email_from Alexandre.Cassen@firewall.loc
- 10 smtp_server 127.0.0.1 #邮件服务指向位置,修改为本地
- 11 smtp_connect_timeout 30
- 12 router_id LVS_01 #指定服务器名称,主备服务器不能相同
- 13 vrrp_skip_check_adv_addr
- 14 #vrrp_strict #注释,取消严格遵守VRRP协议功能,否则VIP无法被连接
- 15 vrrp_garp_interval 0
- 16 vrrp_gna_interval 0
- 17 }
- 18
- 19 vrrp_instance VI_1 { #定义VRRP热备份实力参数
- 20 state MASTER #指定热备状态,主为MASTER,备为BACKUP
- 21 interface ens33 #指定承载的VIP地址的物理接口
- 22 virtual_router_id 51 #指定虚拟路由器的ID号,每个热备组保持一致
- 23 priority 100 #指定优先级,数值越大,优先级越高
- 24 advert_int 1 #通告间隔秒数(心跳频率)
- 25 authentication { #定义认证信息,每个热备组保持一致
- 26 auth_type PASS #认证类型
- 27 auth_pass 1111 #指定验证密码,主备服务器保持一致
- 28 }
- 29 virtual_ipaddress { #指定集群VIP
- 30 192.168.100.100
- 31 }
- 32 }
- 33
- 34 virtual_server 192.168.100.100 80 { #指定虚拟服务器地址(VIP)、端口、定义虚拟服务器和web服务器池参数
- 35 delay_loop 6 #健康检查的间隔
- 36 lb_algo rr #指定调度算法:轮询(rr)
- 37 lb_kind DR #指定集群工作模式,直接路由(DR)
- 38 persistence_timeout 50 #连续保持时间
- 39 protocol TCP #应用服务采用的TCP协议
-
- 41 real_server 192.168.100.12 80 { #指定第一个web节点的地址、端口
- 42 weight 1 #节点权重
- 43 TCP_CHECK { #添加健康检查方式
- 44 connect_port 80 #添加检查的端口
- 45 connect_timeout 3 #添加连接超时时间
- 46 nb_get_retry 3 #添加重试次数
- 47 delay_before_retry 3 #添加重试间隔
- 48 }
- 49 }
- 50 real_server 192.168.100.13 80 { #指定第二个web节点的地址、端口
- 51 weight 1 #节点权重
- 52 TCP_CHECK { #健康检查方式
- 53 connect_port 80 #检查的端口
- 54 connect_timeout 3 #连接超时时间
- 55 nb_get_retry 3 #重试次数
- 56 dalay_before_retry 3 #重试时间
- 57 }
- 58 }
- 59 }
- ##删除后面多余的配置
- systemctl start keepalived
- ip addr
- cd /etc/keepalived/
- cp keepalived.conf keepalived.conf.bak
- vim keepalived.conf
-
-
- 1 ! Configuration File for keepalived
- 2
- 3 global_defs { #定义全局参数
- 4 notification_email {
- 5 acassen@firewall.loc
- 6 failover@firewall.loc
- 7 sysadmin@firewall.loc
- 8 }
- 9 notification_email_from Alexandre.Cassen@firewall.loc
- 10 smtp_server 127.0.0.1 #邮件服务指向位置,修改为本地
- 11 smtp_connect_timeout 30
- 12 router_id LVS_02 #指定服务器名称,主备服务器不能相同
- 13 vrrp_skip_check_adv_addr
- 14 #vrrp_strict #注释,取消严格遵守VRRP协议功能,否则VIP无法被连接
- 15 vrrp_garp_interval 0
- 16 vrrp_gna_interval 0
- 17 }
- 18
- 19 vrrp_instance VI_1 { #定义VRRP热备份实力参数
- 20 state BACKUP #指定热备状态,主为MASTER,备为BACKUP
- 21 interface ens33 #指定承载的VIP地址的物理接口
- 22 virtual_router_id 51 #指定虚拟路由器的ID号,每个热备组保持一致
- 23 priority 90 #指定优先级,数值越大,优先级越高
- 24 advert_int 1 #通告间隔秒数(心跳频率)
- 25 authentication { #定义认证信息,每个热备组保持一致
- 26 auth_type PASS #认证类型
- 27 auth_pass 1111 #指定验证密码,主备服务器保持一致
- 28 }
- 29 virtual_ipaddress { #指定集群VIP
- 30 192.168.100.100
- 31 }
- 32 }
- 33
- 34 virtual_server 192.168.100.100 80 { #指定虚拟服务器地址(VIP)、端口、定义虚拟服务器和web服务器池参数
- 35 delay_loop 6 #健康检查的间隔
- 36 lb_algo rr #指定调度算法:轮询(rr)
- 37 lb_kind DR #指定集群工作模式,直接路由(DR)
- 38 persistence_timeout 50 #连续保持时间
- 39 protocol TCP #应用服务采用的TCP协议
-
- 41 real_server 192.168.100.12 80 { #指定第一个web节点的地址、端口
- 42 weight 1 #节点权重
- 43 TCP_CHECK { #添加健康检查方式
- 44 connect_port 80 #添加检查的端口
- 45 connect_timeout 3 #添加连接超时时间
- 46 nb_get_retry 3 #添加重试次数
- 47 delay_before_retry 3 #添加重试间隔
- 48 }
- 49 }
- 50 real_server 192.168.100.13 80 { #指定第二个web节点的地址、端口
- 51 weight 1 #节点权重
- 52 TCP_CHECK { #健康检查方式
- 53 connect_port 80 #检查的端口
- 54 connect_timeout 3 #连接超时时间
- 55 nb_get_retry 3 #重试次数
- 56 dalay_before_retry 3 #重试时间
- 57 }
- 58 }
- 59 }
- systemctl start keepalived
- ip addr
- #因为是备用服务器,所以不会显示虚拟IP
用一台win10机器,修改IP
访问192.168.100.100
我们模拟主LVS故障,查看虚拟IP是否会飘到备LVS上
关闭keepalived后主LVS上虚拟IP没了
查看备LVS是否顶上
再次启动主LVS,看是否能抢占
看备LVS上虚拟IP是否消失
备LVS上虚拟IP消失