##集群介绍
Linux集群根据功能划分为两大类:高可用和负载均衡。
高可用集群
高可用集群通常为2台服务器,一台工作,另一台作为冗余,当提供服务的机器宕机时,冗余将接替继续提供服务。
实现高可用的开源软件有:heartbeat、Keepalived,其中heartbeat已无人维护,基本上使用Keepalived来搭建高可用集群。
负载均衡集群
负载均衡集群,需要有1台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外就是给用户提供服务的服务器了,这些服务器数量至少为2台,所以负载均衡集群至少要3台服务器。
实现负载均衡的开源软件有:LVS、Keepalived、haproxy、nginx;商业软件有:F5、Netscaler。
##Keepalived介绍
在这里我们使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果
keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
两台机器,都要安装keepalived.
master: ip:192.168.176.135 编译安装Nginx
backup: ip : 192.168.176.134 yum安装Nginx
master:
安装keepalived
[root@shuai-01 ~]# yum install -y keepalived
查看Nginx的版本:
[root@shuai-01 ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.2
backup:
安装keepalived
[root@shuai-02 ~]# yum install -y keepalived
yum 安装Nginx
[root@shuai-02 ~]# yum install -y nginx
问题:
[root@shuai-02 ~]# yum install -y nginx
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
base: mirrors.163.com
extras: mirrors.cqu.edu.cn
updates: mirrors.cqu.edu.cn
没有可用软件包 nginx。
错误:无须任何处理
[root@shuai-02 ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
处理方式在这片博文上
http://blog.csdn.net/lnboxue/article/details/74783885
配置keepalived
master:
将下面的配置文件写入/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组ID
}
vrrp_script chk_nginx { #定义监控脚本
script "/usr/local/sbin/check_ng.sh" #指定服务健康检测(check)脚本
interval 3 #检测时间间隔
}
vrrp_instance VI_1 {
state MASTER #定义该服务的角色
interface ens33 #定义在本机中监听VIP的网卡
virtual_router_id 51 #虚拟路由id(同组中的服务器保持该id一致)
priority 100 #指定本机权重(决定优先级)
advert_int 1 #心跳间隔
authentication { #定义认证相关信息
auth_type PASS #认证类型为密码形式
auth_pass 111111 #定义认证密码
}
virtual_ipaddress { #定义VIP
192.168.176.100
}
track_script { #加载监控服务(脚本)
chk_nginx #注意此处服务名称要与上面监控脚本名称一致
}
}
创建监控脚本(脚本名,自己在配置文件中定义了):
[root@shuai-01 ~]# 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
sleep 5
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 #在此停止Keepalived服务是为了避免发生脑裂
fi
fi
保存退出
“脑裂”,即当master宕机后仍然未释放VIP,同时backup接替master提供服务要使用同一VIP,因而导致两台机器争占同一VIP导致服务紊乱,所以当master宕机后需要关闭其Keepalived服务来避免脑裂现象发生。Keepalived服务的日志位置:/var/log/messages。
写完脚本之后,还要给脚本变更权限
[root@shuai-01 ~]# chmod 755 /usr/local/sbin/check_ng.sh
启动keepalived服务:
[root@shuai-01 ~]# systemctl start keepalived
[root@shuai-01 ~]# ps aux |grep keep
root 5114 0.0 0.1 120720 1484 ? Ss 21:23 0:00 /usr/sbin/keepalived -D
root 5115 0.3 0.3 127460 3292 ? S 21:23 0:00 /usr/sbin/keepalived -D
root 5126 0.0 0.0 112680 976 pts/0 R+ 21:23 0:00 grep --color=auto keep
查看Nginx服务
[root@shuai-01 ~]# ps aux |grep nginx
root 1846 0.0 0.1 45996 1272 ? Ss 13:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 1854 0.0 0.3 48484 3920 ? S 13:07 0:00 nginx: worker process
nobody 1855 0.0 0.3 48484 3920 ? S 13:07 0:00 nginx: worker process
root 5159 0.0 0.0 112684 972 pts/0 R+ 21:26 0:00 grep --color=auto nginx
将Nginx停掉
[root@shuai-01 ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl): [ 确定 ]
[root@shuai-01 ~]# ps aux |grep nginx
root 5190 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@shuai-01 ~]# ps aux |grep nginx
root 5193 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@shuai-01 ~]# ps aux |grep nginx
root 5198 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@shuai-01 ~]# ps aux |grep nginx
root 5202 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
停掉Nginx服务后,keepalived会自动启动Nginx服务
vip只能用ip add 查看
问题:
开启keepalived后 ,用ip add 查看发现VIP没有。查看配置文件,没错,查看脚本,没错。看日志,就是没启动起来,像这样
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:0e:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.176.135/24 brd 192.168.176.255 scope global dynamic ens33
valid_lft 1131sec preferred_lft 1131sec
inet 192.168.176.150/24 brd 192.168.176.255 scope global secondary ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::4f59:7251:18f1:8716/64 scope link
valid_lft forever preferred_lft forever
解决方法:
查看iptables规则,关闭。
[root@shuai-01 ~]# 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
查看selinux,
[root@shuai-01 ~]# getenforce
Enforcing
关闭后,VIP出来了。
[root@shuai-01 ~]# setenforce 0
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:0e:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.176.135/24 brd 192.168.176.255 scope global dynamic ens33
valid_lft 1048sec preferred_lft 1048sec
inet 192.168.176.100/32 scope global ens33
valid_lft forever preferred_lft forever
backup:
关掉防火墙
[root@shuai-02 ~]# systemctl stop firewalld
[root@shuai-02 ~]# setenforce 0
keepalived配置:
[root@shuai-02 ~]# vim /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 { #只有该部分与master有区别
state BACKUP #角色
interface ens33
virtual_router_id 51
priority 90 #权重
advert_int 1
authentication {
auth_type PASS
auth_pass 111111
}
virtual_ipaddress {
192.168.176.100
}
track_script {
chk_nginx
}
}
保存退出
创建监控脚本
[root@shuai-02 ~]# 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
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
修改权限
[root@shuai-02 ~]# chmod 755 !$
chmod 755 /usr/local/sbin/check_ng.sh
启动keepalived
[root@shuai-02 ~]# systemctl start keepalived
测试:
master宕机前
访问master的ip:
访问VIP:
master宕机后:
[root@shuai-01 ~]# systemctl stop keepalived
master的ip:
backup的ip:
VIP的ip:
这时,查看ip addr ,VIP在backup下。