Nginx+Keepalived 实现主备切换

安装 Nginx

1、安装环境与版本:

3个CentOS 7 虚拟机

3个Nginx实例

centos-100 centos-101 centos-102
192.168.200.100 192.168.200.101 192.168.200.102

设置keepalived虚拟ip为192.168.200.99

2、改nginx首页

$ cd /usr/java/nginx/html/
$ vi index.html
分别在首页上加上各主机ip,能在网页上访问,以便于后面测试ip

3、安装keepalived

$ mkdir -p /usr/java && cd /usr/java
$ wget http://www.keepalived.org/software/keepalived-2.0.13.tar.gz
$ tar -zxvf keepalived-2.0.13.tar.gz
$ cd keepalived-2.0.13
$ ./configure --prefix=/usr/java/keepalived --sysconf=/etc
$ make && make install

$ cp /usr/java/keepalived-2.0.13/keepalived/etc/init.d/keepalived /etc/init.d
不要执行:$ cp /usr/java/keepalived-2.0.13/keepalived/etc/sysconfig/keepalived /etc/sysconfig/Keepalived 开机启动问题

$ ln -s /usr/java/keepalived/sbin/keepalived /sbin/keepalived
$ ln -s /etc/keepalived /usr/java/keepalived/conf

$ chkconfig --add keepalived
$ chkconfig --level 2345 keepalived on
$ service keepalived start

4、配置keepalived

防火墙对 keepalived 开放
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;
firewall-cmd --reload;

$ cd /etc/keepalived/
$ cp keepalived.conf{,.bak}
$ vi keepalived.conf
主机配置:

! Configuration File for keepalived


vrrp_script check_nginx_alive {  
    script "/etc/keepalived/check_nginx_alive.sh"   #检测nginx心跳,当nginx挂掉,kill掉keepalived,这样从机的keepalived服务就可以被调用
    interval 2   #2秒一次,主备一致
    weight -10   #权重-10,减的是keepalived的权重,当master的权重-20后,master权重小于slave,从而vip漂移到slave,(脚本里把master的keepalived kill了
}  

global_defs { #全局部分设置
   notification_email { #可以添加邮件提醒
     #acassen@firewall.loc #主从切换时发送邮件通知,这里是收件人地址
     #failover@firewall.loc
     #sysadmin@firewall.loc
   }
   #notification_email_from Alexandre.Cassen@firewall.loc #发件人地址
   #smtp_server 192.168.200.1 #邮件服务器地址
   #smtp_connect_timeout 30 #发送邮件超时时间
   router_id LVS_DEVEL_100  #必须全局唯一,主备不同
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

vrrp_instance VI_1 {#实例名称随便取
    state MASTER #指定keepalived的角色,MASTER为主,BACKUP为备
    interface eno16777736 #绑定VIP的网卡,需要和公网正常通信  
    virtual_router_id 51 #master和slave必须一样
    priority 102    #权重级别,大的为master
    advert_int 1    #主备机之间通信间隔,单位秒
    authentication {
        auth_type PASS #主从keepalived进行安全认证的方式,PASS或者AH方式,推荐PASS
        auth_pass 1111 #主从密码要一样
    }
    virtual_ipaddress {
        192.168.200.99  #vip地址,使用这个地址替换了主从的地址,用这个访问。VIP地址最多可以写20个,keepalive启动后会自动配置该处VIP
    }
    track_script {  
        check_nginx_alive  #调用脚本,vrrp_script后面的名称,不是脚本的名称
    } 
}

virtual_server 192.168.200.99 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.200.100 80 { #实际服务器,这个nginx宕掉,马上切换成备机的nginx
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

备机配置:

! Configuration File for keepalived


vrrp_script check_nginx_alive {  
    script "/etc/keepalived/check_nginx_alive.sh"   #检测nginx心跳,当nginx挂掉,kill掉keepalived,这样从机的keepalived服务就可以被调用
    interval 2   #2秒一次,主备一致
    weight -10   #权重-10,减的是keepalived的权重,当master的权重-20后,master权重小于slave,从而vip漂移到slave,(脚本里把master的keepalived kill了
}

global_defs { #全局部分设置
   notification_email { #可以添加邮件提醒
     #acassen@firewall.loc #主从切换时发送邮件通知,这里是收件人地址
     #failover@firewall.loc
     #sysadmin@firewall.loc
   }
   #notification_email_from Alexandre.Cassen@firewall.loc #发件人地址
   #smtp_server 192.168.200.1 #邮件服务器地址
   #smtp_connect_timeout 30 #发送邮件超时时间
   router_id LVS_DEVEL_101  #必须全局唯一,主备不同
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

vrrp_instance VI_1 {#实例名称随便取
    state BACKUP #指定keepalived的角色,MASTER为主,BACKUP为备
    interface eno16777736 #绑定VIP的网卡,需要和公网正常通信  
    virtual_router_id 51 #master和slave必须一样
    priority 101    #权重级别,大的为master
    advert_int 1    #主备机之间通信间隔,单位秒
    authentication {
        auth_type PASS #主从keepalived进行安全认证的方式,PASS或者AH方式,推荐PASS
        auth_pass 1111 #主从密码要一样
    }
    virtual_ipaddress {
        192.168.200.99  #vip地址,使用这个地址替换了主从的地址,用这个访问。VIP地址最多可以写20个,keepalive启动后会自动配置该处VIP
    }
    track_script {  
        check_nginx_alive  #调用脚本,vrrp_script后面的名称,不是脚本的名称
    } 
}

virtual_server 192.168.200.99 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.200.101 80 { #实际服务器,这个nginx宕掉,马上切换成备机的nginx
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

以上主节点的配置, 从节点backup配置和主节点一样,只是state要改成backup, priority 值要比master小点即可,router_id,real_server 。

创建检测脚本:$ vi /etc/keepalived/check_nginx_alive.sh

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
        then
                service keepalived stop
                service nginx start
                sleep 5
                if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" != "" ]
                        then
                                service keepalived start
                fi
fi

$ chmod +x /etc/keepalived/check_nginx_alive.sh

$ service nginx restart && service keepalived restart

5、测试

$ ip addr
网卡eno16777736 已经绑定 192.168.200.99

这时就能用192.168.200.99这个虚拟ip访问了,这时访问的是主机centos-100

kill掉主机的nginx$ service nginx stop
再访问192.168.200.99,已经跳到centos-101主机了

101.PNG

如果发现有错误的话可以查看系统日志,$ tail -f /var/log/messages

6、抢占模式和非抢占模式

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。

非抢占模式配置:

  1. 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip
  2. 节点的state都为BACKUP
    两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

keepalived实现nginx的高可用
keepalived设置为公网IP

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容