前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >keepalived配置高可用集群

keepalived配置高可用集群

作者头像
老七Linux
发布2018-05-09 16:23:59
7970
发布2018-05-09 16:23:59
举报
文章被收录于专栏:Laoqi's Linux运维专列
一、实验环境:

机器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服务:

代码语言:javascript
复制
yum install -y keepalived

1.3 两台机器的环境

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

代码语言:javascript
复制
yum install -y nginx
二、主zhdy-02配置

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

代码语言:javascript
复制
[root@zhdy-02 ~]# vim /etc/keepalived/keepalived.conf

删除默认的配置,增加如下新配置

代码语言:javascript
复制
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
    }
}

详解:

代码语言:javascript
复制
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编辑监控脚本

代码语言:javascript
复制
[root@zhdy-02 ~]# vim /usr/local/sbin/check_ng.sh

增加如下内容:

代码语言:javascript
复制
#!/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 授权

代码语言:javascript
复制
[[email protected]02 ~]# chmod 755 /usr/local/sbin/check_ng.sh

2.4 启动服务

代码语言:javascript
复制
[[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 查看日志:

代码语言:javascript
复制
less /var/log/messages

2.6 查看虚拟IP地址

代码语言:javascript
复制
[[email protected]02 ~]# ip addr

inet 192.168.59.100/32 scope global ens33

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

代码语言:javascript
复制
[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配置

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

代码语言:javascript
复制
[root@zhdy-03 ~]# systemctl stop firewalld
[root@zhdy-03 ~]# systemctl disable firewalld
[root@zhdy-03 ~]# setenforce 0
setenforce: SELinux is disabled

2.2 配置

代码语言:javascript
复制
[root@zhdy-03 ~]# vim /etc/keepalived/keepalived.conf

增加如下内容:

代码语言:javascript
复制
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
    }
}

需要注意的配置的地方:

代码语言:javascript
复制
state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90

2.3 编写启动脚本

代码语言:javascript
复制
[root@zhdy-03 ~]# vim /usr/local/sbin/check_ng.sh
代码语言:javascript
复制
#时间变量,用于记录日志
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 授权

代码语言:javascript
复制
[[email protected]03 ~]# chmod 755 /usr/local/sbin/check_ng.sh

2.5 启动服务:

代码语言:javascript
复制
[[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

三、测试高可用

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

代码语言:javascript
复制
[root@zhdy-02 ~]# vim /usr/share/nginx/html/index.html 

this is master server!
mark
mark

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

代码语言:javascript
复制
[root@zhdy-03 ~]# vim /data/wwwroot/www.haha.com/index.html

this is backup server!
mark
mark

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

mark
mark

看来是正常的!

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

停掉keepalived服务:

代码语言:javascript
复制
[root@zhdy-02 ~]# systemctl stop keepalived

发现192.168.59.100已经被释放掉了。

代码语言:javascript
复制
[[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地址:

代码语言:javascript
复制
[[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 结果可想而知:

mark
mark

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

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

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

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

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

代码语言:javascript
复制
vim /etc/keepalived/keepalived.conf 

priority 90

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/09/04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实验环境:
  • 二、主zhdy-02配置
  • 注意:
  • 二、从zhdy-03配置
  • 三、测试高可用
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档