根据功能划分为两大类:高可用和负载均衡;
高可用:高可用集群即“HA集群”,也常称作“双机热备”,用于关键业务。通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务,实现高可用的开源软件有:heartbeat、keepalived,核心原来都是通过心跳线连接两台服务器;
负载均衡:负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2,实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler。
因为heartbeat软件已经在2010年就停止了更新,所以一般建议使用keepalived来实现HA集群。
Keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。VRRP是虚拟路由器冗余协议,广泛应用于边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及及时在第一跳路由器使用失败的情形下,仍能够维护路由器间的连通性。
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析>,check模块负责健康检查,vrrp模块用来实现VRRP协议。
首先准备两台机器128和130,128用作master,130用作backup;
分别在两台机器上安装keepalived(yum install -y keepalived);
因为128在之前已经通过编译安装了nginx,在130上使用yum工具安装nginx(yum install -y nginx)。
这里介绍一下VIP,它的名字是“Virtual IP”,即“虚拟IP”,又叫做“浮动IP”。因为这个IP是有keepalived给服务器上配置的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP就会被分配到backup上。
编辑master(128)的keepalived的配置文件/etc/keepalived/keepalived.conf;
global_defs {
notification_email {
[email protected] #定义接收告警的人
}
notification_email_from [email protected] #定义发送邮件的地址
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 #每隔3秒执行一次该脚本
}
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 yulinux>com #定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.30.100
}
track_script {
chk_nginx #定义监控脚本,这个上面vrr_script后面的字符串保持一致
}
}
监控脚本如下:
#!/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" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
设置监控脚本的权限,并启动keepalived服务。
[root@yuioplvlinux-128 ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@yuioplvlinux-128 ~]# systemctl start keepalived #启动keepalived
[root@yuioplvlinux-128 ~]# ps aux|grep keep #查看keepalived是否启动
root 1912 0.1 0.1 118676 1396 ? Ss 20:00 0:00 /usr/sbin/keepalived -D
root 1913 0.3 0.3 129604 3308 ? S 20:00 0:00 /usr/sbin/keepalived -D
root 1915 0.1 0.2 129544 2844 ? S 20:00 0:00 /usr/sbin/keepalived -D
root 1962 0.0 0.0 112720 972 pts/1 R+ 20:00 0:00 grep --color=auto keep
[root@yuioplvlinux-128 ~]# ps aux|grep nginx ##查看nginx是否启动
root 858 0.0 0.1 46064 1168 ? Ss 17:30 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 859 0.0 0.3 48552 3788 ? S 17:30 0:00 nginx: worker process
nobody 860 0.0 0.3 48552 3800 ? S 17:30 0:00 nginx: worker process
root 2078 0.0 0.0 112724 972 pts/1 R+ 20:01 0:00 grep --color=auto nginx
关闭nginx服务,再去查看nginx发现还是启动的,这是因为在脚本中定义了,当nginx服务挂掉时,就会自动重启。
[root@yuioplvlinux-128 ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl): [ 确定 ]
[root@yuioplvlinux-128 ~]# ps aux|grep nginx
root 2348 0.0 0.1 46064 1276 ? Ss 20:03 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 2352 0.0 0.4 48552 4172 ? S 20:03 0:00 nginx: worker process
nobody 2353 8.0 0.3 48552 3916 ? S 20:03 0:00 nginx: worker process
root 2355 0.0 0.0 112720 972 pts/1 R+ 20:03 0:00 grep --color=auto nginx
编辑backup(130)的keepalived的配置文件/etc/keepalived/keepalived.conf;
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass yulinux>com
}
virtual_ipaddress {
192.168.30.100
}
track_script {
chk_nginx
}
}
监控脚本如下:
#时间变量,用于记录日志
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" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
设置监控脚本的权限,并启动keepalived服务。
[root@yuioplvlinux-130 ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@yuioplvlinux-130 ~]# systemctl start keepalived
[root@yuioplvlinux-130 ~]# ps aux |grep keep
root 2036 0.0 0.1 118676 1400 ? Ss 04:20 0:00 /usr/sbin/keepalived -D
root 2037 0.4 0.3 129604 3304 ? S 04:20 0:00 /usr/sbin/keepalived -D
root 2038 0.0 0.2 129544 2844 ? S 04:20 0:00 /usr/sbin/keepalived -D
root 2073 0.0 0.0 112720 968 pts/1 S+ 04:21 0:00 grep --color=auto keep
[root@yuioplvlinux-130 ~]# ps aux |grep nginx
root 1985 0.0 0.0 46404 968 ? Ss 03:22 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1986 0.0 0.1 46804 1932 ? S 03:22 0:00 nginx: worker process
root 2087 0.0 0.0 112720 968 pts/1 S+ 04:21 0:00 grep --color=auto nginx
在浏览器中分别访问master、backup以及VIP,可以看到VIP是连接到master上的;
在master上关闭keepalived(systemctl stop keepalived)再去访问VIP,可以看到连接到了backup上。