Centos7.4使用Nginx+Keepalived实现高可用!

技术分享 2018年09月18日 阅读 342 豆浆大叔

解释为什么用keepalived

主要起到两个作用:实现VIP到本地ip的映射; 以及检测nginx状态。

一、准备工作

两台centos7.4系统:
① IP 192.168.153.128 已安装keepalived

② IP 192.168.153.129 已安装keepalived

③ 主备服务器的VIP 192.168.200.16

二、启动配置文件并修改

① MASTER(192.168.153.128)服务器上的keepalived配置文件,vim /etc/keepalived/keepalived.conf.

lobal_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 nginx_master #设置nginx master的id 
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"  #最后手动执行下此脚本,以确保此脚本能够正常执行
       interval 2  #每2秒检测一次nginx的运行状态
       weight  2  #失败一次,将自己的优先级2
}
vrrp_instance VI_1 {
    state MASTER  # 状态,主节点为MASTER,备份节点为BACKUP
    interface ens33  # 当前进行vrrp通讯的网络接口卡(命令行中  ip addr)
    virtual_router_id 51  # 虚拟路由的ID号,两个节点设置必须相同
    priority 100  # 节点优先级,值范围0~254,MASTER要比BACKUP高,优先级越高 数值越大 获取处理请求优先级越高
    advert_int 1  # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP,主从设置一样 可多个,这里默认
    virtual_ipaddress {
        192.168.200.16 #这里只是设置一个方便测试看
#        192.168.200.17
#        192.168.200.18
    }
    track_script {
       chk_nginx            #(调用检测脚本)
    }
}
}

② BACKUP(192.168.153.129)服务器上的keepalived配置文件,vim /etc/keepalived/keepalived.conf.

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 nginx_bacuk
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"  #最后手动执行下此脚本,以确保此脚本能够正常执行
       interval 2  #每2秒检测一次nginx的运行状态
       weight  2  #失败一次,将自己的优先级2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33 # 当前进行vrrp通讯的网络接口卡(命令行中  ip addr)
    virtual_router_id 51
    priority 90  # 节点优先级,值范围0~254,MASTER要比BACKUP高,优先级越高 数值越大 获取处理请求优先级越高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16 #保持跟主服务器一致
#       192.168.200.17
#       192.168.200.18
    }
}
}

③ 创建nginx服务的检测脚本

分别在master(192.168.153.128)主服务器,备(192.168.153.129)服务器上的/etc/keepalived目录下创建check_nginx.sh 脚本,并且为其添加执行权限:

#创建脚本
vim /etc/keepalived/check_nginx.sh
#添加执行权限
chmod +x /etc/keepalived/check_nginx.sh
#脚本内容
#!/bin/bash #脚本头部
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /opt/nginx/sbin/nginx  #尝试重新启动nginx
    sleep 2   #睡眠2秒
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
    fi
fi

用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备份机器上。

④ 重启keepalived服务(本机已经开启开机启动服务器),强调下:

systemctl restart keepalived

⑤ 查看当前VIP的绑定情况 (主备机分别 ip addr )

#主机情况
[root@test keepalived]# 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:2b:6f:79 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.128/24 brd 192.168.153.255 scope global dynamic ens33
       valid_lft 1277sec preferred_lft 1277sec
    inet 192.168.200.16/32 scope global ens33 #这点注意
       valid_lft forever preferred_lft forever
    inet6 fe80::ca41:37da:280c:c6dd/64 scope link 
       valid_lft forever preferred_lft forever
#备机情况
[root@test keepalived]# 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:9a:4f:a3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.129/24 brd 192.168.153.255 scope global dynamic ens33
       valid_lft 1451sec preferred_lft 1451sec
    inet6 fe80::b52:6cab:cc5d:7de5/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::ca41:37da:280c:c6dd/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

从上面可以看出,VIP地址192.168.200.16绑定在MASTER(192.168.153.128)的ens33网卡上。

三、测试故障转移

① 停掉主机的keepalived服务

systemctl stop keepalived

在看绑定情况:

#主机状况:
[root@test keepalived]# ip addr
    link/ether 00:0c:29:2b:6f:79 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.128/24 brd 192.168.153.255 scope global dynamic ens33
       valid_lft 1461sec preferred_lft 1461sec
    inet6 fe80::ca41:37da:280c:c6dd/64 scope link 
       valid_lft forever preferred_lft forever
备机状况:
[root@test keepalived]# ip addr
    link/ether 00:0c:29:9a:4f:a3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.129/24 brd 192.168.153.255 scope global dynamic ens33
       valid_lft 1453sec preferred_lft 1453sec
    inet 192.168.200.16/32 scope global ens33  #已经绑定在192.168.153.129的备机上面了
       valid_lft forever preferred_lft forever
    inet6 fe80::b52:6cab:cc5d:7de5/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::ca41:37da:280c:c6dd/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

主机在开启keepalived服务:

#主机现在抢占回来:
    link/ether 00:0c:29:2b:6f:79 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.128/24 brd 192.168.153.255 scope global dynamic ens33
       valid_lft 1247sec preferred_lft 1247sec
    inet 192.168.200.16/32 scope global ens33  #现在又抢占回来了
       valid_lft forever preferred_lft forever
    inet6 fe80::ca41:37da:280c:c6dd/64 scope link 
       valid_lft forever preferred_lft forever
#备机:
 link/ether 00:0c:29:9a:4f:a3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.153.129/24 brd 192.168.153.255 scope global dynamic ens33
       valid_lft 1199sec preferred_lft 1199sec
    inet6 fe80::b52:6cab:cc5d:7de5/64 scope link   #没有绑定了
       valid_lft forever preferred_lft forever
    inet6 fe80::ca41:37da:280c:c6dd/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

到这里就已经完成了,nginx+keepalived的高可用。

四、总结

1.关于虚拟IP(VIP)的请求走向。首先keepalived会将请求映射到本地nginx服务,nginx再将请求转发至php-fpm(使用的是PHP环境,也可以tomcat环境)。

举个例子:192.168.200.16被映射成192.168.153.128 ,然后nginx接收到请求以后,会转发给php-fpm去处理。

2.VIP总会在keepalived服务器中的某一台上;VIP绑定的服务器上的nginx就是master,当VIP所在的服务器宕机了,keepalived会将VIP转移到backup上,并将backup提升为master。

豆浆大叔 豆浆大叔 资深PHP工程师@某一线大厂

写了 264486 字,被 3 人关注,共写了 75 篇笔记

(已更名,豆浆大叔)有理想的码农,不应该只探究人性的懒惰面,而是积极的去探索人生道路上的荆棘坎坷,努力提升自己完善自己!
推荐文章:
  • 大数据领域Flink 与 Spark之间的区别?

    学而不思则罔 思而不学则殆,2020年砥砺前行!前言大家都知道已经2020年了,也到了新的一年。作为一个主营电商的公司,年底都会很忙。所以最近的更新进度也停滞不前,本来准备大侃PHP设计模式的,但是因...

    豆浆大叔 16天前 3 吐槽 55 围观 技术分享
  • php如何实现钩子与实践案例

    前言学而不思则罔,思而不学则殆。30则而立,头顶正则脱光!昨天晚上,突然想起了PHP中的钩子如何使用?说实话,像dz,wordpress,TP,CI框架都已经集成了Hook钩子,尽管我不怎么使用框架以...

    豆浆大叔 28天前 0 吐槽 41 围观 技术分享
  • Linux无法显示ip地址的解决办法

    今天想趁着有时间,用虚拟机调试一下lua脚本和其他的功能,结果启动虚拟机使用xshell连接不上,然后使用终端查看IP地址无法查看到,记录一下排查错误流程。查看IP地址使用ip addr 或者 ifc...

    豆浆大叔 1个月前 0 吐槽 87 围观 技术分享
  • 高并发性能指标QPS,TPS,RT,并发数,吞吐量是指什么?

    QPS,每秒查询QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系...

    豆浆大叔 1个月前 0 吐槽 163 围观 技术分享
  • 分享一些PHP常用的小算法

    下面分享一些最常见的算法,用PHP如何实现,拓展下知识面。冒泡排序function bubble_sort($arr) { $n=count($arr); for($i=0;$i<$n-1;$...

    我也庸俗 2个月前 0 吐槽 84 围观 技术分享
表情
  • [:821l1001:]
  • [:821l1002:]
  • [:821l1003:]
  • [:821l1004:]
  • [:821l1005:]
  • [:821l1006:]
  • [:821l1007:]
  • [:821l1008:]
  • [:821l1009:]
  • [:821l1010:]
  • [:821l1011:]
  • [:821l1012:]
  • [:821l1013:]
  • [:821l1014:]
  • [:821l1015:]
  • [:821l1016:]
  • [:821l1017:]
  • [:821l1018:]
  • [:821l1019:]
  • [:821l1020:]
  • [:821l1021:]
  • [:821l1022:]
  • [:821l1023:]
  • [:821l1024:]
  • [:821l1025:]
  • [:821l1026:]
  • [:821l1027:]
  • [:821l1028:]
  • [:821l1029:]
  • [:821l1030:]
  • [:821l1031:]
  • [:821l1032:]
  • [:821l1033:]
  • [:821l1034:]
  • [:821l1035:]
  • [:821l1036:]
  • [:821l1037:]
  • [:821l1038:]
  • [:821l1039:]
  • [:821l1040:]
  • [:821l1041:]
  • [:821l1042:]
  • [:821l1043:]
  • [:821l1044:]
  • [:821l1045:]
  • [:821l1046:]
  • [:821l1047:]
  • [:821l1048:]
  • [:821l1049:]
  • [:anger:]
  • [:applause:]
  • [:awkward:]
  • [:brokenheart:]
  • [:clown:]
  • [:confused:]
  • [:decline:]
  • [:diggingmouth:]
  • [:eyebrows:]
  • [:grinning:]
  • [:haha:]
  • [:ill:]
  • [:kiss:]
  • [:lascivious:]
  • [:laugh:]
  • [:love:]
  • [:lovely:]
  • [:rhinorrhea:]
  • [:smile:]
  • [:solid:]
  • [:strong:]
  • [:sweat:]
  • [:tearcollapse:]
  • [:tongue:]
  • [:uncomfortable:]
  • [:weak:]
  • [:worry:]
Tips:支持Markdown语法

0 个评论

抢座沙发~~~~
资深PHP工程师 @ 某一线大厂

登录

第三方账号登录:
GitHub
微信
微博