nginx+keepalived实现负载均衡 (系列二)

nginx+keepalived实现负载均衡 (系列二)

本文介绍nginx+keepalived实现负载均衡的方案
LVS+keepalived实现负载均衡 (系列一);
nginx+keepalived实现负载均衡 (系列二)
HAProxy+keepalived实现负载均衡(系列三)

软件环境

本文是在如下环境进行安装

  • CentOS 6.9
  • JDK 1.7
  • Keepalived v1.2.13 (yum安装,版本随意)
  • apache-tomcat-8.5.39.tar.gz (版本随意,主要用于启动web服务)
  • nginx 1.14.2 (yum安装,版本随意)

服务器规划

可以用虚拟机系统,分别用4台服务器,别名是

  • node1:作为主,安装nginx+keepalived,IP192.168.1.101
  • node2:作为热备,安装nginx+keepalived,IP192.168.1.102
  • web1:作为web服务器,安装Tomcat,IP192.168.1.103
  • web2:同样是web服务器,安装Tomcat,IP192.168.1.104

VIP(虚拟IP)定为192.168.1.200

实验步骤

如无特别说明,使用root帐号操作

一、基础准备工作

四台机器都要按如下操作

  • 绑定静态IP
  • 设置主机名,设置完成后需要重启
  • 修改hosts,方便使用别名访问
vim /etc/hosts,添加如下
192.168.80.101 node1
192.168.80.102 node2
192.168.80.103 web1
192.168.80.104 web2
  • 关闭防火墙,并禁止开机启动
service iptables stop
chkconfig iptables off
二、配置2台 Web 服务器

以下仅针对2台 Web 服务器(web1web2)操作

  • 安装 JDK 并配置环境变量,版本随意,选择7或8都可以
  • 上传 apache-tomcat-8.5.39.tar.gz到服务器,位置随意
  • 解压,保持默认的8080端口,启动Tomcat
  • 检查是否可以访问:curl http://127.0.0.1:8080
  • 修改Tomcat的首页,增加标记,以便访问时可知道落到哪台服务器
vim TOMCAT_HOME/webapps/ROOT/index.jsp
在 
    If you're seeing this, you've successfully installed Tomcat. Congratulations! 

前面添加本机的标识,以便检验负载均衡效果的时候可以区分是什么机器,在这句话前面添加
    web1   或   web2
三、主备服务器安装 Nginx (node1、node2)

对node1和node2操作

  • 安装nginx:本文采用yum安装方式,过程略
  • 配置请求转发至web1和web2
    配置文件,两台机器的nginx配置相同

注意事项备注在代码里了,请仔细查看

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    # 使用yum安装会引入conf.d里的配置,这里将其注释掉避免不必要的麻烦(如配置冲突)
    #include /etc/nginx/conf.d/*.conf;
    
    # 只要配置如下接口,即是一个非常常见的nginx负载均衡配置,
    # 需要注意的是 upstream 的名字不要带下划线(如不要tomcat_pool),有些版本会报错!!!
    # 关键配置 START ------------------------
	upstream tomcats {
        server 192.168.1.244:8080;
        server 192.168.1.248:8080;
    }
    server {
        listen       80;
        server_name  localhost;
    		location / {
            proxy_pass http://tomcats;
	    }

	}
	# 关键配置 END ------------------------
}
四、配置主负载服务器node1的keepalived

只针对node1进行操作

  • 安装 keepalived 相关包:yum install -y keepalived
  • 编辑 keepalived.conf 配置文件:也可以备份原来的配置再修改,vim /etc/keepalived/keepalived.conf,修改内容如下:
vrrp_script chk_http_port {
    script "/etc/keepalived/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行
    interval 2                          #(检测脚本执行的间隔,单位是秒)
    weight 2
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 60        # 虚拟路由编号,主从要一直
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
		chk_http_port            #(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.1.200            # 定义虚拟ip(VIP),可多设,每行一个
    }
}

配置文件说明:

  1. vrrp_script 是keepalived用于检测健康的脚本,脚本放在/etc/keepalived/check_nginx_pid.sh路径
  2. state MASTER 保证是 MASTER 的值
  3. interface eth0 的 eth0,要看你自己的网卡主要是用了什么名字,一般是eth0,有些人可能是eth1,请ifconfig查看
  4. virtual_router_id,虚拟路由编号,主备服务器要一致
  5. priority,优先级,主备配成不一致,主大点,备小点,例如主100,备99,或主101,备100
  6. authentication,不用改,不清楚是什么作用
  7. virtual_ipaddress,改成VIP,如果你不是用本文的VIP,请修改成自己的
  8. 为了避免和上一篇文章《LVS+keepalived实现负载均衡 (系列一)》设置的virtual_router_id相同,可能会出现问题,所以这里改成了不一样的值

注意:网上其他教程贴的配置多global_defs的内容,实际上是不需要的,这样的例子展示出来容易误导人,让人不知道如何修改

global_defs {
    notification_email {
        997914490@qq.com
    }
    notification_email_from sns-lvs@gmail.com
    smtp_server smtp.hysec.com
    smtp_connection_timeout 30
    router_id nginx_backup              # 设置nginx backup的id,在一个网络应该是唯一的
}
  • /etc/keepalived/路径新建check_nginx_pid.sh文件,并chmod 755 check_nginx_pid.sh,文件内容如下
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then                            
    /usr/sbin/nginx                #重启nginx
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败
        exit 1
    else
        exit 0
    fi
else
    exit 0
fi

注意: 检查nginx宕掉并尝试重启的脚本在/usr/sbin/nginx,请确认你自己的安装路径和nginx脚本在这里,有些yum安装的方式可能不在这里,那就必须修改脚本

  • 配置好文件后,启动服务:service keepalived start
五、配置备用负载服务器node2的keepalived

总体跟配置跟node1差不多,主要是配置文件有少许的差别,步骤如下

  • 安装 keepalived 相关包:yum install -y keepalived
  • 编 辑keepalived.conf 配置文件:也可以备份原来的配置再修改,vim /etc/keepalived/keepalived.conf,修改内容如下:
vrrp_script chk_http_port {
    script "/etc/keepalived/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行
    interval 2                          #(检测脚本执行的间隔,单位是秒)
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 60        # 虚拟路由编号,主从要一直
    priority 99            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
		chk_http_port            #(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.1.200            # 定义虚拟ip(VIP),可多设,每行一个
    }
}

跟node1上的keepalived的配置区别是:

  1. state 改成了BACKUP
  2. priority 比主的小一点
  3. 注意virtual_router_id保持一致
  • 跟node1的操作一样,在/etc/keepalived/路径新建check_nginx_pid.sh文件,并chmod 755 check_nginx_pid.sh,文件跟node1的完全一样,注意一下脚本里重启nginx的代码即可

  • 配置好文件后,启动服务:service keepalived start

验证和测试

一、理论验证
  • 检验是否配置正确:在node1使用ip addr查看eth0网卡必须有VIP存在,在node2上则无(这是因为是热备的原因)
# 在node1上查看,看到192.168.1.200,而在node2上查看不到
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:af:d6:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.107/24 brd 192.168.0.255 scope global eth0
    inet 192.168.1.201/32 scope global eth0
    inet6 fe80::20c:29ff:feaf:d61c/64 scope link 
       valid_lft forever preferred_lft forever
  • node1上关闭keepalived:service keepadlived stop再使用ip addr查看,发现node1绑定的VIP没了,而在node2上出现了,说明了主备的架构生效了,实现了备用顶替主的情况

  • 重新在node1上将keepalived启动:service keepalived start,则node1重新抢回了主,这是因为其优先级比较高,恢复后抢回主动权

  • 尝试在宿主机打开命令行窗口,PING 一下VIP:ping 192.168.1.200,应该是能ping通的,如果不通,说明有其他问题,必须解决

二、动手验证
1、在宿主机浏览器上输入VIP

可以观察到浏览器中显示Tomcat的欢迎页面,并且页面轮流转发到web1 和 web2 上

2、当 Web 服务器其中一台发生故障

关闭 web1 或 web2 的 Tomcat,会发现固定得转发请求到正常的机器,当关闭的服务器上线后,可以实现重新加入集群并接受转发

3、当"主"宕机,"备"上线

在"主"的服务器上执行service keepalived stop 模拟宕机,可以看到正常对外提供服务,在"备"的服务器上输入ip addr查看发现接管了VIP

当然也可以从keepalived 的日志看到主备更替,详细查看 tail -f /etc/log/messages,这里显示的主备更替的日志,更加准确反映了实时

4、当nginx进程死掉,会重启

node1或node2上的nginx在死掉时,会自动重启,keepalived会在检测到进程死掉后启动

可以使用nginx -s stop,再查看ps -ef|grep nginx可以看到进程的uptime刷新到当前,说明进程是死掉后刚刚重新被启动的

总结

两台nginx的功能都是实现负载均衡,即将请求转发到web1和web2,两台nginx服务器同时只有一台在工作,另外一台在备用状态

keepalived做的事情就是:

  • 提供VIP作为访问的入口:最终该VIP可能是node1,也可能是node2
  • 提供健康检查、故障切换:是通过周期性执行一段脚本来确定对方是否活着来实现的

参考资料

参考博客:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值