Linux集群架构(一)keepalived高可用
一、服务器集群介绍
服务器架构通过功能可分为高可用、负载均衡两大类。
高可用一般软件有heartbeat、keepalived。
这两个软件的核心原理都是通过心跳线连接两台服务器,一台宕机另一台接管服务。
heartbeat只支持两个节点,并且在centos6上面有一些问题,比如说切换的时候不是很及时,最重要的是它早已停止更新。
负载均衡可以实现大量的访问,硬件环境在前端需要一台服务器作为分发器,负责把用户请求分发给后端服务器,后端的数量至少为2。
开源软件有LVS、keepalived、haproxy、Nginx。
商业的有F5、netscaler
二、keepalived介绍
keepalived通过VRRP(Virtual Router Redundancy Protocl虚拟路由冗余器)协议来实现高可用,在协议里会将多台功能相同的服务器组成小组,其中会有1个master和N个backup。也就是说,基于keepalived的高可用服务器至少要有两台。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机,此时就会根据backup的优先级来决定新的master服务器。
Keepalived要有三个模块,分别是core、check和vrrp。
其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
三、keepallived搭建和配置
这里实验准备的是Nginx来作为高可用的服务。
1. 前期准备
IP地址:
192.168.237.6
192.168.237.12
两台服务器上都要安装:
yum install -y keepalived
yum install -y epel-release
yum install -y nginx
2. 主上配置
在配置文件/etc/keepalived/keepalived.conf中:
# 全局定义,定义发邮件(可以忽略)
global_defs {
notification_email {
123@123.com
}
notification_email_from root@123.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
}
# 定义master或者backup相关
vrrp_instance VI_1 {
# 定义主服务器
state MASTER
interface ens33
# 定义虚拟路由的ID,两台服务器必须定义相同
virtual_router_id 51
# 权重
priority 100
# VRRP Multicast 广播周期秒数
advert_int 1
# 主从之间的认证
authentication {
auth_type PASS
auth_pass 123456
}
# 定义VIP,主和从的共有IP,主宕机后由从接管这个IP,对外提供服务。
virtual_ipaddress {
192.168.237.100
}
# 加载nginx启动脚本
track_script {
chk_nginx
}
}
3. 从上配置
同样是在配置文件/etc/keepalived/keepalived.conf中:
……省略一些配置……
# 其它地方配置和主服务器相同,不同的地方在与下面两个地方。
vrrp_instance VI_1 {
# 定义从服务器
state BACKUP
interface ens33
virtual_router_id 51
# 权重
priority 90
advert_int 1
……省略一些配置……
4. 定义监控脚本
两台服务器上都要定义监控脚本,用以监控Nginx服务是否正常:
#! /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
# 这里需要注意Nginx的启动命令因安装方式而异
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
保存后,将脚本放到/usr/local/sbin/目录下,并配置可执行权限。
四、测试Keepalived
1. 主服务器
启动Keepalived服务:
systemctl start keepalived
查看网卡信息:
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:63:72:f1 brd ff:ff:ff:ff:ff:ff
inet 192.168.237.6/24 brd 192.168.237.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.237.100/32 scope global ens33
valid_lft forever preferred_lft forever
可以看到已经成功配置了VIP,然后查看Nginx是否启动成功:
netstat -lnpt |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1747/nginx: master
tcp6 0 0 :::80 :::* LISTEN 1747/nginx: master
已经成功的把Nginx服务带起来了。
2. 从服务器
启动Keepalived服务:
systemctl start keepalived
Nginx也是启动了。
netstat -lnpt |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1747/nginx: master
tcp6 0 0 :::80 :::* LISTEN 1747/nginx: master
查看网卡信息,并没有100。
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:3c:65:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.237.12/24 brd 192.168.237.255 scope global eth0
inet6 fe80::20c:29ff:fe3c:65bb/64 scope link
valid_lft forever preferred_lft forever
3. 测试
测试方法有很多种,这里选择最暴力的,直接将主服务器上的keepalived服务停掉,然后分别观察网卡信息:
主服务器上:
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:63:72:f1 brd ff:ff:ff:ff:ff:ff
inet 192.168.237.6/24 brd 192.168.237.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe63:72f1/64 scope link
valid_lft forever preferred_lft forever
可以看到已经释放掉了VIP 100。
在从服务器上:
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:3c:65:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.237.12/24 brd 192.168.237.255 scope global eth0
inet 192.168.237.100/32 scope global eth0
inet6 fe80::20c:29ff:fe3c:65bb/64 scope link
valid_lft forever preferred_lft forever
VIP已经接管过来。