Nginx+Keepalived搭建高可用负载均衡集群

Nginx+Keepalived搭建高可用负载均衡集群,第1张

Nginx+Keepalived搭建高可用负载均衡集群

一、环境规划

  • *** 作系统:CentOS6.5x86_64

  • 内核版本:2.6.32-504.el6.x86_64

    Nginx版本:Nginx-1.8.0-1.el6.ngx.x86_64

    keepalive版本:keepalive-1.2.19

    前端双nginx+Keepalived,Nginx反向代理到后端tomcat集群实现负载均衡,Keepalived实现集群的高可用,主用Nginx出现故障后,虚拟IP自动漂移到备用Nginx。

    主nginx:192.168.60.48

    备用nginx:192.168.60.49

    虚拟IP:192.168.60.50

    后端tomcat集群:192.168.60.51,192.168.60.52,192.168.60.53

    每台后端主机开放两个端口提供服务:16915和16916。

    二。安装

    两台前端主机分别安装nginx和keepalived。

    1)编译并安装keepalived

    # 安装依赖 yum install kernel-* gcc make openssl-* # 下载keepalived-1.2.19.tar.gz wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz # 解压 tar xvzf keepalived-1.2.19.tar.gz  cd keepalived-1.2.19 # 配置 ./configure --sysconfdir=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64 # 编译并安装 make && make install # 查看keepalived版本,验证安装成功 keepalived -v # 设置开机自启动 chkconfig keepalived on

    注意:keepalived也可以用yum安装,但是版本低一些。

    2)RPM包安装Nginx

    nginxyum官方来源:

    [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ enabled=1 gpgcheck=0

    设置源之后,您可以直接安装它:

    yum install nginx chkconfig nginx on

    三。配置

    1)前端两台主机nginx的配置完全相同

    # vim /etc/nginx/conf.d/upstream.conf  upstream tomcatclu_16915 {         server 192.168.60.51:16915;         server 192.168.60.52:16915;         server 192.168.60.53:16915;         ip_hash; } upstream tomcatclu_16916 {         server 192.168.60.51:16916;         server 192.168.60.52:16916;         server 192.168.60.53:16916;         ip_hash; } # vim /etc/nginx/conf.d/server.conf server {     listen 16915;     server_name _;     location / {         proxy_pass http://tomcatclu_16915;     }     location /nginx_status{         stub_status on;         access_log off;         allow 127.0.0.1;         # 要允许公司ip访问nginx status         allow 192.168.252.0/24;         deny all;     } } server {     listen 16916;     server_name _;     location / {         proxy_pass http://tomcatclu_16916;     }     location /nginx_status{         stub_status on;         access_log off;         allow 127.0.0.1;         # 要允许公司ip访问nginx status         allow 192.168.252.0/24;         deny all;     } }

    2)保持nginx_master的有效配置

    [root@nginx_master ~]# vim /etc/keepalived/keepalived.conf  ! Configuration File for keepalived global_defs {    router_id nginx-ha1 } vrrp_script check_nginx {     # 检查nginx状态的脚本,文章后面给出     script "/data/script/check_nginx.sh"     # 执行间隔2秒     interval 2 } vrrp_instance VI_1 {     # 两台主机都是BACKUP     state BACKUP     interface eth0     # 同一keepalived集群的virtual_router_id 必须相同,默认51     virtual_router_id 55     # 主的优先级高     priority 100     advert_int 1     # 不抢占:如果集群里已存在MASTER状态的主机,即使优先级高于MASTER也不抢占为MASTER。只在优先级高的主机上设置即可。     nopreempt     authentication {         auth_type PASS         auth_pass 1111     }     virtual_ipaddress {         # 虚拟IP         192.168.60.50     }     track_script {         check_nginx     } }

    3)保持nginx_slave的有效配置

    [root@nginx_slave ~]# vim /etc/keepalived/keepalived.conf  ! Configuration File for keepalived global_defs {    router_id nginx-ha2 } vrrp_script check_nginx {     script "/data/script/check_nginx.sh"     interval 2 } vrrp_instance VI_1 {     state BACKUP     interface eth0     virtual_router_id 55     # 备的优先级低     priority 80     advert_int 1     authentication {         auth_type PASS         auth_pass 1111     }     virtual_ipaddress {         192.168.60.50     }     track_script {         check_nginx     } }

    4)防火墙设置

    # iptables放行组播地址流量: iptables -I INPUT -d 224.0.0.18 -j ACCEPT service iptables save

    VRRP报文通过IP组播发送,组播地址224.0.0.18是VRRP报文的目的地址。
    在本实验中,两台主机都是备份主机。如果同时启动keepalived,VRRP协议将通过选举使优先级高的主机成为主节点。如果防火墙不允许VRRP消息通过,两台备份主机都将成为主主机,您会发现两台主机都启动了虚拟IP。
    5)部署nginx状态检查脚本check_nginx.sh

    /data/script/check_nginx.sh按如下方式检查脚本:

    #!/bin/bash # check nginx server status # http://qicheng0211.blog.51cto.com   # nginx端口 PORTS="16915 16916" function check_ports {     for port in $PORTS;do         nc -z 127.0.0.1 $port | grep -q succeeded         [ "${PIPESTATUS[1]}" -eq 0 ] && mark=${mark}1     done     # 如果mark值为空说明两个端口都不通。     # 如果mark等于1,说明有一个端口是通的。     # 如果mark等于11,说明两个端口都是通的。     echo $mark } ret1=$(check_ports) # 如果nginx端口不通,会尝试重启一次nginx if [ "$ret1" != 11 ];then     /sbin/service nginx stop     /sbin/service nginx start     sleep 1     ret2=$(check_ports)     # 如果还是有端口不通,表示nginx服务不正常,则停掉keepalived,使VIP发生切换     [ "$ret2" != 11 ] && /etc/init.d/keepalived stop fi

    每个人都是根据自己的环境来写nginx状态检查脚本的,不必照搬。

    设置脚本的可执行权限:

    chmod +x /data/script/check_nginx.sh

    补充:如果nginx恢复正常后keepalived不能自动启动,需要写一个脚本来完成这项工作:判断nginx正常后,拉起keepalived。脚本放在cron中,每分钟执行一次。

    6)打开keepalived的日志

    编辑/etc/sysconfig/keepalived:

    KEEPALIVED_OPTIONS="-D -d -S 0"

    Edit/etc/rsyslog.conf:

    # 配置文件最后面加上下面一行 local0.*                                        /var/log/keepalived.log

    重新启动rsyslog:

    service rsyslog restart

    根据上面的配置,keepalived会将日志记录到/var/var/log/keepalived.log

    7)启动服务

    # 先检查nginx配置文件正确性 nginx -t # 启动nginx服务 service nginx start # 同时启动keepalived服务 service keepalived start # 过一会查看虚拟IP是否在nginx_master主机上 ip a

    四。验证

    NGX_MASTER和nginx_slave同时开始保持激活状态。观察log/var/log/keepalived.log,你会发现nginx_master抢占了master,绑定了虚拟IP192.168.60.50。

    nginx_master:

    nginx_slave:

    我们去同网段其他机器上ARP虚IP的mac,发现是nginx_mastereth0的MAC:

    让我们停止或重启nginx_master的keepalived服务,不断ping虚拟IP。在请求超时间隔之后,虚拟IP将漂移到nginx_slave:

    nginx_slave:

    我们再去arping一下虚拟IP的mac,发现变成了nginx_slaveth0的MAC:

    看nginx_slave的日志keepalived.log,nginx_slave在成为主的同时发送了免费ARP(无偿ARP),更新了以太网邻居的ARP缓存:

    VRRP_Instance(VI_1) Entering MASTER STATE VRRP_Instance(VI_1) setting protocol VIPs. VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.60.50

    最后nginx_MASTER的keepalived服务开启,虚拟IP不漂移回nginx_master。这是因为nginx_master开启了非抢占模式,即使优先级高也不会抢占主。

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/779919.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-04
    下一篇 2022-05-04

    发表评论

    登录后才能评论

    评论列表(0条)

    保存