集群从功能实现上分为两种:高可用集群和负载均衡集群。
高可用集群,顾名思义,当一台服务器宕机不能提供服务了,还有另外的服务器替代提供服务。
负载均衡集群,简单讲就是把用户的大量请求按一定的调度算法分摊到多台服务器上,从而让每台服务器都不至于负载太高。
18.1 搭建高可用集群
高可用集群,即“HA集群”,也称为“双机热备”,用于关键业务。
常用实现高可用集群的开源软件有heartbeat和Keepalived,其中Keppalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机,备用服务器顶替。这里建议使用Keepalived。
Keepalived工作原理
VRRP(Virtual Router Redundancy Protocol)协议叫做虚拟路由冗余协议,它是实现路由高可用的一个通信协议。
VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是MASTER,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当MASTER失效时,BACKUP将接管原先MASTER的网络功能。
Keepalived就是基于VRRP协议实现的。Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为Keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;check模块负责健康检查;vrrp模块用来实现VRRP协议。
安装Keepalived
刚刚提到的VRRP协议有1个master角色和至少一个backup角色,所以做本实验需要准备至少两台linux机器。这里我用了两台虚拟机来完成实验。
master 192.168.33.128
backup 192.168.33.129
- 在两台机器上都安装keepalived:
# yum install -y keepalived
Keepalived+Nginx实现Web高可用
在生产环境中,很多企业把Nginx作为负载均衡器使用,它很重要,一旦宕机就会导致整个站点不能访问。这种情况下需要再准备一台备用Nginx,Keepalived用在这种场景下非常合适。
在配置之前,我把两台机器的IP、角色罗列一下:
master 192.168.33.128 keepalived/nginx
backup 192.168.33.129 keepalived/nginx
VIP(虚拟ip) 192.168.33.100
VIP(虚拟IP)是由Keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP就会被分配到backup机器上继续对外提供服务,而用户是无法感知的。
配置master
- master上编辑keepalived配置文件:
# vim /etc/keepalived/keepalived.conf #更改为下面内容
global_defs {
notification_email {
lzx@lzxlinux.com #定义接收告警的人
}
notification_email_from root@lzxlinux.com #定义发邮件的地址
smtp_server 127.0.0.1 #定义发邮件服务器地址,若为127.0.0.1则使用本机自带邮件服务器发送
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
#chk_nginx为自定义名字,后面会用到
script "/usr/local/sbin/check_ng.sh" #自定义脚本,该脚本为监控nginx服务的脚本
interval 3 #每隔3s执行一次该脚本
}
vrrp_instance VI_1 {
state MASTER #角色为master
interface ens33 #针对哪个网卡监听VIP
virtual_router_id 51
priority 100 #设置权重为100,master权重必须要比backup大,因为权重越大优先级越高
advert_int 1
authentication {
auth_type PASS
auth_pass lzxlinux>com #定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.33.100 #定义VIP地址
}
track_script {
chk_nginx #定义监控脚本,这里和上面vrrp_script后面的字符串保持一致
}
}
keepalived要实现高可用,监控nginx服务是必须的,它本身没有这个功能,需要借助自定义脚本来实现。
- 定义监控Nginx服务的脚本:
# vim /usr/local/sbin/check_ng.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; th