集群介绍
1. 这里的集群架构指的是由多台机器组成一台大机器,单台机器完不成的任务可以多台机器一起来完成。
2. linux集群根据功能划分为2大类:高可用和负载均衡。
高可用集群通常为2台服务器(功能和角色是一样的),一台在工作,另一台作为冗余。当提供服务的机器宕机,冗余将接替继续提供服务,这样就可以提供系统可用的效率。
高可用集群的衡量标准
要保证集群服务100%时间永远完全可用,几乎可以说是一件不可能完成的任务。比如,淘宝在这几年双十一刚开始的时候,一下子进来买东西的人很多,访问量大,都出现一些问题,如下单后却支付不了。所以说只能保证服务尽可能的可用,当然有些场景相信还是可能做到100%可用的。
通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均故障维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%。
具体HA衡量标准:
描述
通俗叫法
可用性级别
年度停机时间
基本可用性
2个9
99%
87.6小时
较高可用性
3个9
99.9%
8.8小时
具有故障自动恢复能力的可用性
4个9
99.99%
53分钟
极高可用性
5个9
99.999%
5分钟
实现高可用的开源软件有:heartbeat和keepalived(推荐使用)
负载均衡集群
需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少是2台。
实现负载均衡的开源软件有LVS keepalived haproxy nginx ,商业使用的有F5 和Netscaler等负载均衡器。优势在于更高的应答量和良好的稳定性。
使用开源软件来搭建的负载均衡,其稳定性依赖服务器的稳定性
———-
keepalived介绍
使用keepalived来实现高可用集群,因为heartbeat在centos6上存在一些问题,影响实验效果。
keepalived通过VRRP(虚拟路由冗余协议)来实现高可用。
在这个协议中会将多台功能相同的路由器(机器)组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,会认为master宕机了,此时就需要根据各个backup的优先级来决定谁成为新的master.
keepliaved要有3个模块,分别是core, check ,vrrp。其中coremo模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
用keepalived配置高可用集群
需要2台机器,一台作为master,另一台作为backup。并都安装keepalived,都需要有nginx.
keepalived需要包含一个服务,这个服务用来实现高可用,假如集群中角色出现单点故障,这个服务宕机后,就有问题啦。如果想让该服务实现高可用就需要使用keepalived或者heartbeat软件。搭建高可用集群首先需要keepliaved服务、并让哪一个服务实现高可用。这里使用nginx作为高可用的对象,是因为在生产环境中使用nginx作为负载均衡器,假如nginx一旦出现问题,即使后端的web是正常的,那也是不能访问的。不能出现单点故障。
编辑master的keepalived的配置文件/etc/keepalived/keepalived.conf,清空里面的内容,并加入以下内容
global_defs {
notification_email {
aming@aminglinux.com
} //
notification_email_from root@aminglinux.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 //检测间断时间为3秒
}
vrrp_instance VI_1 {
state MASTER //定义角色
interface ens33 //定义发组播的网卡名
virtual_router_id 51 //定义路由器的Id,主从上需要保持一致,说明它们是一组。
priority 100 //定义角色的权重
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress { //定义主从都使用的ip
192.168.244.100
}
track_script { 加载定义的脚本
chk_nginx
}
}
- 定义监控脚本,路径就是配置文件中的script “/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` //计算nginx的进程数
#如果进程为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 //nginx服务没有启动时,停止keepalived,给backup使用。
fi
fi
- 修改该脚本的权限为755,是为了自动加载该脚本,不能加载该脚本就不能启动keepalived服务
chmod 755 /usr/local/sbin/check_ng.sh
[root@chunt ~]# systemctl start keepalived
[root@chunt ~]# ps aux |grep keepalived
root 1582 0.0 0.1 120740 1408 ? Ss 00:38 0:00 /usr/sbin/keepalived -D
root 1583 0.0 0.3 127476 3276 ? S 00:38 0:00 /usr/sbin/keepalived -D
root 1584 0.2 0.3 131780 3116 ? S 00:38 0:00 /usr/sbin/keepalived -D
root 1640 0.0 0.0 112676 980 pts/1 S+ 00:39 0:00 grep --color=auto keepalived
[root@chunt ~]#
- 在配置从之前需要检查是否有防火墙或selinux的存在,否则可能影响实验结果。主从都要关闭。
[root@spring ~]# getenforce
Disabled
[root@spring ~]# systemctl stop firewalld
[root@spring ~]# !ipt
iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[root@spring ~]#
- 在从上的keepliaved的配置文件写入如下内容
global_defs {
notification_email {
aming@aminglinux.com
}
notification_email_from root@aminglinux.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 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.244.100
}
track_script {
chk_nginx
}
}
编写监控脚本/usr/local/sbin/check_ng.sh,加入以下内容
#时间变量,用于记录日志
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
并修改为755的权限,启动服务。
[root@spring ~]# chmod 755 !$
chmod 755 /usr/local/sbin//check_ng.sh
[root@spring ~]# systemctl start keepalived
[root@spring ~]# ps aux |grep keepalived
root 1516 0.0 0.0 120740 1408 ? Ss 01:01 0:00 /usr/sbin/keepalived -D
root 1517 0.0 0.1 127476 3276 ? S 01:01 0:00 /usr/sbin/keepalived -D
root 1518 0.1 0.1 131780 3108 ? S 01:01 0:00 /usr/sbin/keepalived -D
root 1575 0.0 0.0 112676 976 pts/0 S+ 01:02 0:00 grep --color=auto keepalived
[root@spring ~]#
测试访问主IP显示的是master,访问从IP显示backup ,访问192.168.244.100显示的信息和主上是一样的。
测试高可用
- 测试1; 关闭master上的nginx服务,它会自动的开启服务。
- 测试2 :在master上增加iptables规则
iptables -I OUTPUT -p vrrp -j DROP
在master上关闭keepalived服务后再查看IP,发现192.168.244.100IP不在master上了,而是去到了backup上面。当启动master上的keepalived服务后,vip又回到了master上