上述演示中,不论是lvs-nat仍是lvs-nat模型,都会有2个遗留问题:前端
(1) 若是调度器服务器挂了,如何对调度器作高可用linux
(2) 若是RS中某台服务器挂了,如何对RS作集群的健探测nginx
健康监测的方式有不少种,好比网络层可使用icmp ping监测主机的存活状态,传输层可使用tcp端口监测工具探测端口的可用性,好比nmap,应用层,好比能够对关键服务发起请求。算法
而实现高可用的方案通常有2种,一种是vrrp协议的实现,好比keepalived,一种是ais的实现方案,好比heartbeat, corosync, pacemaker。其中ais是很是完备,很是重量级的实现。windows
首先,这里以很是简单的方式描述下ais方案,首先假设这样一种场景,由多台服务器提供相同的服务,好比是httpd服务,此时集群中每台机器须要知道对方的生存情况,好比机器A持续的向其余机器发送信息表示本身存活(假如连续3次失败则会被断定为非存活状态),这种方式被称为心跳检测,可是可能会有这样一种网络缘由形成的故障,A认为本身是存活的,可是信息没有成功被其余服务器接收,好比B和C都认为A是非存活状态,此时会形成分裂现象,解决这个问题须要一个仲裁方案,好比最简单的少数服从多数原则,这也是通常推荐奇数台机器构建集群的缘由,有时候只有2台,可使用好比网关服务器当观察者凑够3台也能够,总之必须有一个仲裁机制。假设此时多数的认为机器B能够当作Master向外提供服务,须要一个机制能够中止掉机器A的服务,而且剥夺他的ip使用权,最简单的方式,就是停掉A,而后在机器B上配置的接口上配置一个别名。而实际上ais的实现很是复杂,分为三层,最底层是集群事务层,还有资源管理层和资源代理层,它是一个很是完备的实现,基本上能够知足一切的高可用方案,后面会详细介绍。bash
这里咱们关注的是vrrp协议,,Virtual Redundant Routing Protocol,vrrp协议是很是老的一个协议,是一个虚拟的路由器协议,而keepalived则是vrrp协议的实现。服务器
关于VRRP的协议详情能够参考华为等公司一些vrrp协议白皮书,由于vrrp协议本来就是用来作虚拟路由之类的。网络
VRRP中术语说明:app
VRRP的工做过程:负载均衡
(1) 虚拟路由器根据优先级选举Master。Master经过发送免费ARP报文,将本身的虚拟MAC地址通知给与它链接的设备或者主机,从而承担报文转发任务。
(2) Master路由器周期性发送VRRP报文,以公布其配置信息和工做状态
(3)若是Master出现故障,根据优先级从Backup中选举
(4)虚拟路由器状态切换时,Master路由器由一台设备切换为另外一台,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就能够更新与它相链接的主机或者设备中的ARP相关信息。网络上的主机感知不到Master路由器已经切换为另一个台设备
(5)Backup路由器的优先级高于Master时,根据工做方式决定是否从新选举
VRRP的工做模式
keepalived
keepalived做为vrrp协议的实现,设计目的是为了高可用ipvs服务器,他可以在配置文件定义ipvs规则,并能对RS的健康状态进行探测;vrrp_script,vrrp_track
keepalivedz中包含多个组件:
控制组件:配置文件分析器
内存管理
IO复用
核心组件
vrrp stack
checker
ipvs wrapper
watch dog
HA集群配置的前提,通常Linux都须要如下配置
(1)各节点时间同步,Centos上能够基于ntp协议,Centos7上能够是chrony
(2)确保iptables以及selinux不会阻碍;
(3)各节点之间经过主机名互相铜线,即名称解析服务器的解析结果必须和"uname -n"命令的结果一致;
(4)各个节点之root用户基于密钥认证的ssh通讯;
yum -y install keepalived
同步下时间:
ntpdate time.windows.com hwclock -w
经过命令rpm -qc keepalived发现配置文件只须要关注keepalived.conf便可,详情使用man keepalived.conf观察,下面简要说明一下,Keepavlived分为多个配置段,global配置段,vppr配置段,lvs配置段
global_defs:定义全局配置
global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ysz202 vrrp_mcast_group4 224.0.100.18 }
说明:
vrrp_instance : vrrp实例配置
定义一个虚拟路由实例
state MASTER|BACKUP:在当前VRRP实例中此节点的初始状态;
interface IFACE_NAME:vrrp用于绑定vip的接口;
virtual_router_id #:当前VRRP实例的VRID,可用范围为0-255,默认为51;
priority #:当前节点的优先级,可用范围0-255;
advert_int 1:通告时间间隔;
authentication { #认证机制
# PASS||AH
# PASS - Simple Passwd (suggested)
# AH - IPSEC (not recommended))
auth_type PASS
# Password for accessing vrrpd.
# should be the same for all machines.
# Only the first eight (8) characters are used.
auth_pass 1234
}
# 最关键的。定义vip
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18.24 dev eth2 label eth2:1
}
# 一个主机上可能有多个接口,定义要监控的接口
trace_interface {
eth0
eth1
...
}
nopreempt #非抢占模式,默认是抢占模式,若是2个服务器性能有优劣之别,能够抢占..
#通告脚本定义
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
其中的脚本notify.sh能够大体以下
#!/bin/bash # contact='root@localhost' notify() { subject="$(hostname) to be $1 :vip floating" body="$(date +'%F %T'): vrrp transition, $(hostname) change to be $1" echo $body | mail -s "$subject" $contact } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage:$(basename $0) {master|backup|fault}" ;; esac
virtual_server : 虚拟服务器
功能描述:
f
virtual server IP port或者vitual server FWM #
virtual_server 192.168.200.100 443 { delay_loop 6 # lb_algo rr #负载均衡调度算法 lb_kind NAT #调度类型 nat_mask 255.255.255.0 # persistence_timeout 50 #持久链接时长 protocol TCP #只支持TCP协议 # quality regression. Defaults to 1. quorum 1 sorry_server 192.168.1.202 80 real_server 192.168.201.100 443 { weight 1 #notify_up <STRING>|<QUOTED-STRING> #notify_down <STRING>|<QUOTED-STRING> #应用层检测 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc #特征码 } url { path /mrtg/ status_code 200 #基于状态码断定 } connect_timeout 3 #链接的超时时长 nb_get_retry 3 #链接的重试次数 delay_before_retry 3 #链接的重试间隔 } } }
总结:
若是只是须要vip服务,能够只配置vrrp实例,若是须要keepalived来帮助完成lvs负载均衡才须要配置Vitual Server
vrrp_script: 资源脚本
track_script: 调用vrrp_script脚本去监控资源;
vrrp_script chk_httpd { script "killall -0 httpd" interval 2 weight -5 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.111/32 brd 192.168.1.111 dev eth0 label eth0:0 } track_script { chk_httpd } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
说明:上述配置中命令killall -0 httpd 用来检测当前httpd进程是否存活,假如没有的话返回失败,当前服务器的优先级会下降,在抢占工做模式下由Master->Backup实现地址漂移,这种方式能够为任何服务作高可用,好比说这里的httpd能够改为Nginx。
设计以下:
ysz211(192.168.1.211)和ysz214(192.168.1.214)做为VS提供ipvsadm服务,使用keepalived作ha实现高可用,虚拟ip为192.168.1.204在ysz211和ysz214上地址漂移
ysz212(192.168.1.212)和ysz213(192.168.1.213)做为RS提供httpd服务
yum install ipvsadm yum install keepalived
keepalived的配置文件keepalived.conf大体以下:
ysz211为MASTER,ysz214为BACKUP,另一台只须要将state设置为BACKUP且优先级调低为98便可
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_mcast_group4 224.0.100.18
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.204 dev eno16777736 label eno16777736:0
}
}
virtual_server 192.168.1.204 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.1.212 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.213 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
使用tail -f /var/log/messages发现成功启动,信息以下:
Nov 14 21:38:05 www Keepalived_healthcheckers[5180]: Opening file '/etc/keepalived/keepalived.conf'.
Nov 14 21:38:05 www Keepalived_healthcheckers[5180]: Configuration is using : 17026 Bytes
Nov 14 21:38:05 www Keepalived_healthcheckers[5180]: Using LinkWatch kernel netlink reflector...
Nov 14 21:38:05 www Keepalived_healthcheckers[5180]: Activating healthchecker for service [192.168.1.212]:80
Nov 14 21:38:05 www Keepalived_healthcheckers[5180]: Activating healthchecker for service [192.168.1.213]:80
Nov 14 21:38:06 www Keepalived_vrrp[5181]: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov 14 21:38:07 www Keepalived_vrrp[5181]: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 14 21:38:07 www Keepalived_vrrp[5181]: VRRP_Instance(VI_1) setting protocol VIPs.
Nov 14 21:38:07 www Keepalived_vrrp[5181]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eno16777736 for 192.168.1.204
Nov 14 21:38:07 www Keepalived_healthcheckers[5180]: Netlink reflector reports IP 192.168.1.204 added
Nov 14 21:38:12 www Keepalived_vrrp[5181]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eno16777736 for 192.168.1.204
且ipvsadm也成功启动,截图以下
搭建成功,能够模拟ysz211 keepalived 故障和ysz213 httpd服务故障,对外服务都可用,从而同时实现了负载均衡和高可用的目的。
双主模型实际上也是主备模型,2个实例互为主备,好比一个httpd服务,一个nginx服务,尽量减小资源浪费,注意下面是2个不一样的ip地址,所以还能够在DNS解析服务器上再作一次负载均衡,使得请求分散到2个ip中,使得前端2个调度器都不会空闲。
ysz202配置文件
global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ysz202 vrrp_mcast_group4 224.0.100.18 } vrrp_script chk_httpd { script "killall -0 httpd" interval 2 weight -5 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.111/32 brd 192.168.1.111 dev eth0 label eth0:0 } track_script { chk_httpd } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.112/32 brd 192.168.1.111 dev eth0 label eth0:1 } track_script { chk_httpd } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
ysz204上配置文件
global_defs { notification_email { root@localhost } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ysz202 vrrp_mcast_group4 224.0.100.18 } vrrp_script chk_httpd { script "killall -0 httpd" interval 2 weight -5 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.111/32 brd 192.168.1.111 dev eth0 label eth0:0 } track_script { chk_httpd } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.112/32 brd 192.168.1.111 dev eth0 label eth0:1 } track_script { chk_httpd } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }