集群介绍
Linux集群根据功能划分为两大类:高可用和负载均衡。
1、高可用集群通常为2台服务器,一台工作,另一台作为冗余,当提供服务的机器宕机时,冗余将接替继续提供服务。
实现高可用的开源软件有:heartbeat、Keepalived,其中heartbeat很多bug已无人维护(不推荐使用),所以今后使用Keepalived来搭建高可用集群。
2、负载均衡集群,需要有1台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外就是给用户提供服务的服务器了,这些服务器数量至少为2台,所以负载均衡集群至少要3台服务器。
实现负载均衡的开源软件有:LVS、Keepalived、haproxy、nginx;商业软件有:F5、Netscaler。
keepalived介绍
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组会有1个master角色和N(N≥1)个backup角色。
Keepalived有三个模块:core、check、vrrp。其中core模块为Keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;check模块负责健康检查,vrrp负责实现vrrp协议。
用keepalived配置高可用集群
准备环境
master:192.168.3.74 安装编译nginx
backup:192.168.3.83 安装编译nginx
VIP:192.168.3.100 # 注: VIP(virtual IP)虚拟IP,由Keepalived设置,用于服务器对外提供服务。
准备工作:
master
[root@centos7 ~]# yum install -y keepalived
[root@centos7 ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.1
backup
[root@test ~]# yum install -y keepalived
[root@test ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.2
配置主服务器上:
1、[root@centos7 ~]# vi /etc/keepalived/keepalived.conf
global_defs { #全局定义
notification_email {
tt@tt.com
} #定义故障提醒邮件接收地址
notification_email_from root@tt.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { #定义nginx监控脚本
script "/usr/local/sbin/check_ng.sh" #指定服务健康检测(check)脚本
interval 3 #检测时间间隔
}
vrrp_instance VI_1 {
state MASTER #定义该服务的角色
interface eno16777736 #定义在本机中监听VIP的网卡
virtual_router_id 51 #虚拟路由id(同组中的服务器保持该id一致)
priority 100 #指定本机权重(决定优先级)
advert_int 1
authentication { #定义认证相关信息
auth_type PASS #认证类型为密码形式
auth_pass 123456 #定义认证密码
}
virtual_ipaddress { #定义VIP
192.168.3.100
}
track_script { #加载监控服务(脚本)
chk_nginx #注意此处服务名称要与上面监控脚本名称一致
}
}
2、[root@centos7 ~]# cat /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" ]; 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 keepalive #在此停止Keepalived服务是为了避免发生脑裂
fi
fi
3、[root@centos7 ~]# chmod 755 /usr/local/sbin/check_ng.sh
4、启动
[root@centos7 ~]# systemctl start keepalived
[root@centos7 ~]# ps -aux | grep keep
root 21327 0.0 0.0 120712 1400 ? Ss 10:33 0:00 /usr/sbin/keepalived -D
root 21328 0.0 0.1 120712 2748 ? S 10:33 0:00 /usr/sbin/keepalived -D
root 21329 0.4 0.1 120712 2440 ? S 10:33 0:00 /usr/sbin/keepalived -D
root 21360 0.0 0.0 112664 968 pts/0 R+ 10:33 0:00 grep --color=auto keep
验证nginx的监控脚本:
1、将nginx服务器停止
[root@centos7 ~]# /etc/init.d/nginx stop
2、再看还是会有nginx服务的进程
[root@centos7 ~]# netstat -nutlp| grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 23022/nginx: master
3、只有当keepalived服务停止,才会停止nginx
4、查看vip
[root@centos7 ~]# ip addr
inet 192.168.3.100/32 scope global eno16777736
“脑裂”,即当master宕机后仍然未释放VIP,同时backup接替master提供服务要使用同一VIP,因而导致两台机器争占同一VIP导致服务紊乱,所以当master宕机后需要关闭其Keepalived服务来避免脑裂现象发生。Keepalived服务的日志位置:/var/log/messages。
配置从服务器上的:
1、
[root@test ~]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
tt@linux.com
}
notification_email_from root@tt.com
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 { #只有该部分与master有区别
state BACKUP #角色
interface eth0
virtual_router_id 51
priority 90 #权重
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.3.100
}
track_script {
chk_nginx
}
}
2、[root@test ~]# 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" ]; 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
/etc/init.d/keepalived stop #在此停止Keepalived服务是为了避免发生脑裂
fi
fi
3、[root@test ~]# chmod 755 /usr/local/sbin/check_ng.sh
4、[root@test ~]# /etc/init.d/keepalived start
5、[root@test ~]# ps -ef | grep keep
root 7473 1 0 10:47 ? 00:00:00 /usr/sbin/keepalived -D
root 7474 7473 0 10:47 ? 00:00:00 /usr/sbin/keepalived -D
root 7475 7473 0 10:47 ? 00:00:00 /usr/sbin/keepalived -D
root 7479 3017 0 10:47 pts/0 00:00:00 grep keep
验证:
宕机前的验证
1、访问master:
2、访问从服务器
3、访问vip
master宕机后:
关闭Keepalived服务:
[root@centos7 ~]# systemctl stop keepalived
[root@centos7 ~]# ps -ef | grep keep
root 25316 16637 0 10:58 pts/0 00:00:00 grep --color=auto keep
此时主机上已经没有vip了,vip已经转移到了从服务器上
[root@test ~]# ip addr
inet 192.168.3.83/24 brd 192.168.3.255 scope global eth0
inet 192.168.3.100/32
访问vip时已转移到备份上:
现将主服务器keepalived启动:
[root@centos7 ~]# systemctl start keepalived
vip又转移到了主服务器上,从服务器上已经没有vip了
再次访问vip,又回到主服务器上了。