LNMP 分布式集群(六):keepalived 高可用方案

1,753 阅读4分钟

前言

LNMP 分布式集群的部署实践 系列文章:

衡量一个集群的高可用性在于没有单点故障,即其中任何一台服务器宕机都不会造成整个服务中断。 之前的LNMP分布式集群的实践中,显然在将Nginx作为负载均衡服务器时,upstream机制能检测出后端服务器是否可用,如果其中一台服务器宕机,Nginx能自动转移到后端正常的服务器中,以保持系统持续可用。 但现在只有一台负载均衡服务器,一旦该服务器发生故障,就会造成整个集群服务中断,为此,使用 keepalived 部署备用服务器,实现故障转移。 Keepalived 内置了 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)功能,用于解决静态路由出现的单点故障问题,它通过IP多播的方式通信,当发现路由故障时,通过选举策略将备用路由更换为主路由,从而继续提供服务。 Keepalived 实现了将提供对外访问的IP地址(Virtual IP)自动在主服务器(Master)和备用服务器(Backup)之间切换,正常情况下用Master,当它故障了那么监控它的Backup会通过优先级机制竞争接管Virtual IP继续对外服务,其他落选的就继续监控当前使用的 Virtual IP 服务器。

高可用环境中的服务器:

角色 Real IP(RIP) Virtual IP(VIP) 说明
Master 192.168.177.21 192.168.177.11 Nginx + Keepalived
Backup 192.168.177.22 192.168.177.11 Nginx + Keepalived
- 192.168.177.1X - 后端服务器集群

然后我们对之前的LNMP分布式集群架构做出更改:

单数代表IP:192.168.177.1X,双数代表IP:192.168.177.XX

这就是LNMP高可用分布式集群!

但是为了演示我们不加入集群,使用两个简单的后端服务器,RIP分别为192.168.177.23和192.168.177.24,Keepalived 服务的虚拟IP改为192.168.177.20:

角色 Real IP(RIP) Virtual IP(VIP) 说明
Master 192.168.177.21 192.168.177.20 Nginx + Keepalived
Backup 192.168.177.22 192.168.177.20 Nginx + Keepalived
- 192.168.177.23 - 后端服务器1
- 192.168.177.24 - 后端服务器2

部署

安装和配置 keepalived 服务

部署和配置主服务器

cd /usr/local/nginx/html
echo 'This is Master' > index.html
curl http://localhost

tar -zxvf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure
make && make install && cd ..
cd /usr/local/etc/rc.d/init.d
cp keepalived /etc/init.d/keepalived
chmod +x /etc/init.d/keepalived
chkconfig keepalived on
cd /usr/local/etc/sysconfig
ln -s `pwd`/keepalived /etc/sysconfig/keepalived
cd /usr/local/sbin
ln -s `pwd`/keepalived /usr/sbin/keepalived

# 配置主服务器的 keepalived

less /usr/local/etc/keepalived/keepalived.conf  # 查看配置文件模板
mkdir /etc/keepalived  # 手动创建默认加载的配置文件
vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {  # 配置一个虚拟路由
    state MASTER
    interface ens33 # 指定监测的网卡
    virtual_router_id 21  #虚拟路由的标识,同一个 VRRP 的 Master 和 Backup 应一致
    mcast_src_ip 192.168.177.21 # 设置 real IP,可省略,有默认自动使用主IP
    priority 100  # 优先级、权重(权重最高的主机将接管 Virtual IP),范围0-254
    advert_int 1  # MASTER 和 BACKUP 之间同步检查的时间间隔,单位秒
    authentication {
        auth_type PASS  # 验证类型,PASS表示密码验证
        auth_pass 123456  # 设置密码
    }
    virtual_ipaddress {  # 配置 虚拟IP地址池,每行一个
        192.168.177.20  # 为 MASTER 和 Backup 设置相同的虚拟IP
    }
}

# 启动 keepalived 服务 
service keepalived start
ps aux | grep keepalived
ip a | grep 192.168.177.20

#### 配置备用服务器的 keepalived

基于主服务器克隆出一台备用服务器,IP为192.168.177.22。然后打开 keepalived 配置:

```bash
vrrp_instance VI_1 {
    state BACKUP  # 修改身份为 BACKUP
    priority 90  # 修改优先级为90(低于MASTER)
    ……
}
# Master 和 Backup 通过 VRRP 的 112 端口通信
iptables -I INPUT -s192.168.177.21 -p112 -jACCEPT
service iptables save
iptables -I INPUT -s192.168.177.22 -p112 -jACCEPT
service iptables save

service keepalived start # 启动 Backup服务器的 Keepalived 服务

# 区分当前访问的是哪一台服务器
cd /usr/local/nginx/html
echo 'This is Backup' > index.html

# 测试,访问192.168.177.20
service network stop
service network start

至此就部署完毕了。

使用Keepalived 监控本机服务

除了可以监控其他服务器中的Keepalived是否正常,也可以监控本机中的某个服务是否正常:

监控本机Nginx服务

vrrp_script chk_nginx {
    script "/chk_nginx.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 { 
   ……
   track_script {
        chk_nginx
    }
}

vi /chk_nginx.sh  # 创建监控脚本

# !/bin/bash
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    service nginx start
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        service keepalived stop
    fi
fi

chmod +x /chk_nginx.sh
service keepalived reload

高可用测试

service nginx stop  # 手动停用
ps -C nginx --no-header  # 等待2秒,查看是否恢复启动

# 创建停止 Nginx 服务并立即取消 Nginx 程序执行权限的脚本
cd /usr/local/nginx/sbin
vi test.sh

#! /bin/bash
service nginx stop
chmod -x nginx

chmod +x test.sh
./test.sh
# 看是否自动切换到备用服务器

LNMP 分布式集群的部署实践 系列文章:


dfface 的版权声明:所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处,严禁商业用途!