专栏首页Laoqi's Linux运维专列keepalived配置高可用集群

keepalived配置高可用集群

一、实验环境:

机器IP (hostname)

作用

192.168.59.130 (zhdy-02)

master

192.168.59.131 (zhdy-03)

backup

192.168.59.100

vip

1.2 安装keepalived 两台测试机器分别安装keepalived服务:

yum install -y keepalived

1.3 两台机器的环境

两台机器都安装nginx,其中131上已经编译安装过nginx,130上需要yum安装nginx:

yum install -y nginx

二、主zhdy-02配置

2.1 编辑zhdy-02 130上keepalived配置文件:

[root@zhdy-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 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux>com
    }
    virtual_ipaddress {
        192.168.59.100
    }
    track_script {
        chk_nginx
    }
}

详解:

notification_email  //出现问题后接收提示的邮箱
notification_email_from    //发件人
smtp_server 127.0.0.1    //邮件服务器
smtp_connect_timeout 30   //延时

vrrp_script chk_nginx   //检查服务状态

vrrp_instance VI_1      //定义master相关的配置
state MASTER    //设定角色
    interface ens33     //指定ens33这块网卡,通过vrrp协议去发广播
    virtual_router_id 51    //定义虚拟路由器的ID,一定要和从保持一致
    priority 100    //优先级,数字越大优先级越高
    advert_int 1
authentication {    //认证相关的信息
auth_type PASS      //认证类型,PASS
auth_pass zhangduanya   //密码为:
        
virtual_ipaddress   //VIP,当我们有主从两台机器,我们需要绑定域名到指定的IP,如果绑定在主上面。如果主宕机,我们就无法提供服务,所以Vitrual IP就起到了关键性作用,默认配置在主服务器上面,但是一旦宕机,从服务器就会立即启动,并且把这个IP绑定在从上面从而不会影响业务的状态!

chk_nginx   //加载定义的chk_nginx脚本

2.2 zhdy-02 59.130编辑监控脚本

[root@zhdy-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
        /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
        fi
fi

脚本的大概意思是:

如果进程里面没发现nginx那就代表着服务宕机了,然后脚本自动的再次启动nginx服务。 如果服务还是不可以启动,就把启动报错日志输入到指定的位置,然后把keepalived也关闭。

为什么需要关闭keepalived呢? 行业里面有个名词叫做“脑裂”,如果主服务宕机,从服务势必会马上启动顶替主服务再次服务,如果主服务的keepalived没有关闭,一定会造成混乱,两台机器都争抢服务。

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏

这是绝对不可以发生的脑裂问题!

2.3 授权

[[email protected]02 ~]# chmod 755 /usr/local/sbin/check_ng.sh

2.4 启动服务

[[email protected]02 ~]# systemctl start  keepalived 
[[email protected]02 ~]# ps aux | grep keep
root       4303  0.0  0.1 111708  1300 ?        Ss   17:23   0:00 /usr/sbin/keepalived -D
root       4304  0.0  0.2 111708  2544 ?        S    17:23   0:00 /usr/sbin/keepalived -D
root       4305  0.0  0.1 111708  1520 ?        S    17:23   0:00 /usr/sbin/keepalived -D
root       4319  0.0  0.0 112664   972 pts/0    R+   17:23   0:00 grep --color=auto keep

2.5 查看日志:

less /var/log/messages

2.6 查看虚拟IP地址

[[email protected]02 ~]# ip addr

inet 192.168.59.100/32 scope global ens33

2.7 关闭防火墙: 在配置从之前,我们一定需要检查防火墙的状态以及selinux。

[root@zhdy-02 ~]# systemctl stop firewalld
[root@zhdy-02 ~]# systemctl disable firewalld
[root@zhdy-02 ~]# setenforce 0
setenforce: SELinux is disabled

注意:

  1. 在启动前,一定要把nginx服务启动,不然keepalived是不可以启动的!
  2. 假如nginx服务是通过yum安装的,在vim /usr/local/sbin/check_ng.sh配置中一定要写:systemctl start nginx

二、从zhdy-03配置

趁热打铁,先关闭防火墙:

[root@zhdy-03 ~]# systemctl stop firewalld
[root@zhdy-03 ~]# systemctl disable firewalld
[root@zhdy-03 ~]# setenforce 0
setenforce: SELinux is disabled

2.2 配置

[root@zhdy-03 ~]# 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 {
    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.59.100
    }
    track_script {
        chk_nginx
    }
}

需要注意的配置的地方:

state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90

2.3 编写启动脚本

[root@zhdy-03 ~]# vim /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

2.4 授权

[[email protected]03 ~]# chmod 755 /usr/local/sbin/check_ng.sh

2.5 启动服务:

[[email protected]03 ~]# systemctl start keepalived
[[email protected]03 ~]# ps aux | grep keep
root       3224  0.0  0.1 111708  1304 ?        Ss   17:49   0:00 /usr/sbin/keepalived -D
root       3225  0.0  0.2 111708  2552 ?        S    17:49   0:00 /usr/sbin/keepalived -D
root       3226  0.0  0.1 111708  1524 ?        S    17:49   0:00 /usr/sbin/keepalived -D

三、测试高可用

为了测试简单明了,修改主上面的主页为:

[root@zhdy-02 ~]# vim /usr/share/nginx/html/index.html 

this is master server!

修改从上面的主页为(因为之前已经做过了LNMP所以)配置文件为:

[root@zhdy-03 ~]# vim /data/wwwroot/www.haha.com/index.html

this is backup server!

页面配置好了,但真实的环境我们需要绑定59.100为访问IP地址。如果成功的话,现在如果我们访问192.168.59.100会自动跳转到主server上去!

看来是正常的!

3.2 如果把master 的keepalived服务停掉,也就是模拟宕机的情况,是不是服务就会转移到backup呢?

停掉keepalived服务:

[root@zhdy-02 ~]# systemctl stop keepalived

发现192.168.59.100已经被释放掉了。

[[email protected]02 ~]# ip addr
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:50:b7:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.59.130/24 brd 192.168.59.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::855:2a0f:94b6:3066/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::bf95:da75:15e3:78ca/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

查看zhdy-03上面是否已经加载了VIP地址:

[[email protected]03 ~]# ip addr
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:75:98:c1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.59.131/24 brd 192.168.59.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.59.100/32 scope global ens33

再次访问192.168.59.100 结果可想而知:

从服务器(zhdy-03)已经成启动并开始服务!

如果再次把主的keepalived服务启动呢?

那答案必须是主服务器接替从继续服务呗!

如果现实环境中有多台backup呢?我们需要什么呢?

只需要调节优先级即可,调节一个适当的值,取决于现场的需求!

vim /etc/keepalived/keepalived.conf 

priority 90

除了配置nginx的高可用,我们当然也可以配置mysql的高可用,前提是一定要保证双方的数据是一致的。如果主mysql宕机,从mysql的数据一定会和主不一致。我们需要想到这一点!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LNMP环境下Nginx中php-fpm的配置文件讲解

    老七Linux
  • LNMP搭建多个虚拟主机(wordpress+discuz+dedecms)

    老七Linux
  • Ansible自动化编译安装Nginx服务

    老七Linux
  • Keepalived+Nginx+Apache主备及双活搭建测试

          keepalived+nginx高可用有主备和双活两种方式。主备方式下对外提供一个vip,同时只有一台服务器工作,另一台作备机;双活方式下对外提供两...

    loong576
  • 一种绕过Android P对非SDK接口限制的简单方法

    众所周知,Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制。这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次...

    weishu
  • 验证和物联网

    英特尔软件服务集团外部客户加速总监Christopher Lawless与半导体工程部门坐下来讨论物联网对设计周期的影响。 Hewlett Packard En...

    首席架构师智库
  • 网易云音乐热评的规律,44万条数据告诉你

    我们爬取了网易云音乐歌单中48400首歌的444054条热评,来看看网易云的热门评论里,有怎样的规律。

    数据森麟
  • Material Design — 分隔线(Dividers)

    霖酱
  • 你的人生还剩多少天?这 4 个小程序,让你再也不敢浪费时间

    今天,知晓程序(zxcx0101)就从中选出了 4 个特别适合「思考人生」的小程序,它们看似主题相仿,却脱胎于各不相同的立意。

    知晓君
  • 小程序支付

    小程序请求后台提供的下单接口 传递商品id,商品描述body,总金额total_fee等

    达达前端

扫码关注云+社区

领取腾讯云代金券