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已经接管过来。

标签: 集群

添加新评论