ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程

ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程

lvs+nginx的拓扑结构:

  • 架构说明:
    • lvs01和lvs02分别安装lvs、keepalived,通过keepalived VRRP虚拟路由冗余协议,添加虚拟ip(vip)。当其中一台lvs01机器宕机,lvs02会自动接管vip,即实现服务不中断。
  • 主备模式:
    • lvs02这台机器的资源没有利用到。只有在lvs01宕机或者不可用的时候,才会使用。
  • 主主模式:
    • lvs01和lvs02分别有不同的VIP,分别对应两个出口,添加两个dns,做dns轮询。这样可以实现将lvs01和lvs02充分利用起来。
    • 业务量不大的情况下,lvs+keepalived主从足够用,不必使架构变得复杂。复杂的架构出现事故的几率、不可控因素也会增加。
  • ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第1张图片

环境准备

服务器/虚拟机 作用 主机名 系统
192.168.98.1 lvs,keepalived,nginx,tomcat 主服务器 ubuntu
192.168.98.2 lvs,keepalived,nginx,tomcat 从服务器 ubuntu

安装步骤

  1. 关闭服务器防火墙;

    ufw disable
    
  2. 打开内核转发功能;

    sysctl -w net.ipv4.ip_forward=1
    
  3. 配置ipvs,ipvs无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。ipvsadm是通过命令行管理,而keepalive读取配置文件管理。

    apt-get install ipvsadm
    
    1. 将ipvsadm模块加载进系统中;

      ipvsadm
      lsmod | grep ip_vs
      
  4. 安装keepalived

    apt-get install keepalived
    
    1. keepalived相关配置/etc/keepalived/keepalived.conf

      1. 主服务器:

        global_defs {
           router_id LVS_DEVEL
        }
        
        vrrp_instance VI_1 {               #定义一个实例,keepalived间的高可用只能接管相同实例名称
            state MASTER                   #指定Keepalived的角色,MASTER表示此主机是主服务器 BACKUP表示此主机是备用服务器,所以设置priority时要注意MASTER比BACKUP高。
            interface ens33                #指定监测网络的接口,当LVS接管时,将会把IP地址添加到该网卡上。
            virtual_router_id 51           #虚拟路由标识,同一个vrrp实例使用唯一的标识,同一个vrrp_instance下,MASTER和BACKUP必须一致。
            priority 120                   #指定这个实例优先级
            advert_int 1                   #心跳报文发送间隔
            mcast_src_ip 192.168.98.7
            authentication {
                auth_type PASS             #设置验证类型,主要有PASS和AH两种
                auth_pass 1111             #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信
            }
            virtual_ipaddress {            #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
                192.168.98.100
            }
        }
        
        virtual_server 192.168.98.100 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
            delay_loop 6                   #设置运行情况检查时间,单位是秒
            lb_algo wrr                    #设置负载调试算法,这里设置为wrr即加权论询算法
            lb_kind DR                     #设置LVS实现负载均衡的机制,有NAT,TUN和DR三个模式可选
            persistence_timeout 50         #设置会话保持时间,单位是秒
            protocol TCP                   #指定转发协议类型,有TCP和UDP两种
            real_server 192.168.98.7 80 {  #配置服务节点1,需要指定real server的真实IP地址和端口
                weight 1                   #配置服务节点的权值,
                TCP_CHECK {
                   connect_timeout 8       #表示8秒无响应超时
                   retry 3                 #表示重试次数
                   delay_before_retry 3    #表示重试间隔
                   connect_port 80         #使用80端口进行保活
                }
            }
        
            real_server 192.168.98.14 80 {
                weight 1
                TCP_CHECK {
                   connect_timeout 8
                   retry 3
                   delay_before_retry 3
                   connect_port 80
                }
            }
        }
        
      2. 从服务器:

        global_defs {
           router_id LVS_DEVEL
        }
        
        vrrp_instance VI_1 {               #定义一个实例,keepalived间的高可用只能接管相同实例名称
            state BACKUP                   #指定Keepalived的角色,MASTER表示此主机是主服务器 BACKUP表示此主机是备用服务器,所以设置priority时要注意MASTER比BACKUP高。
            interface ens33                #指定监测网络的接口,当LVS接管时,将会把IP地址添加到该网卡上。
            virtual_router_id 51           #虚拟路由标识,同一个vrrp实例使用唯一的标识,同一个vrrp_instance下,MASTER和BACKUP必须一致。
            priority 100                   #指定这个实例优先级
            advert_int 1                   #心跳报文发送间隔
            mcast_src_ip 192.168.98.7
            authentication {
                auth_type PASS             #设置验证类型,主要有PASS和AH两种
                auth_pass 1111             #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信
            }
            virtual_ipaddress {            #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
                192.168.98.100
            }
        }
        
        virtual_server 192.168.98.100 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
            delay_loop 6                   #设置运行情况检查时间,单位是秒
            lb_algo wrr                    #设置负载调试算法,这里设置为wrr即加权论询算法
            lb_kind DR                     #设置LVS实现负载均衡的机制,有NAT,TUN和DR三个模式可选
            persistence_timeout 50         #设置会话保持时间,单位是秒
            protocol TCP                   #指定转发协议类型,有TCP和UDP两种
            real_server 192.168.98.7 80 {  #配置服务节点1,需要指定real server的真实IP地址和端口
                weight 1                   #配置服务节点的权值,
                TCP_CHECK {
                   connect_timeout 8       #表示8秒无响应超时
                   retry 3                 #表示重试次数
                   delay_before_retry 3    #表示重试间隔
                   connect_port 80         #使用80端口进行保活
                }
            }
        
            real_server 192.168.98.14 80 {
                weight 1
                TCP_CHECK {
                   connect_timeout 8
                   retry 3
                   delay_before_retry 3
                   connect_port 80
                }
            }
        }
        
  5. 安装nginx,两台服务器相同;

    1. 在两台服务器中分别安装nginx;

      apt-get install nginx
      
    2. 启动nginx成功;

      service nginx start
      
    3. 查看nginx是否启动成功;

      ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第2张图片

    4. 编辑nginx默认页面,加上特定信息用于分辨主从服务器,编辑内容自定义即可;

      1. vi /var/www/html/index.nginx-debian.html
        
      2. ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第3张图片

    5. 编写脚本服务;

      1. 给编写的脚本赋予权限;

        chmod u+x realserver.sh
        
      2. 在/home/user/下新建realserver.sh文件,写入以下内容;

        #!/bin/bash
            SNS_VIP=192.168.98.100  #此处ip必须与keepalived中虚拟ip相同
            #. /etc/rc.d/init.d/functions
            case "$1" in
            start)
                ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
                /sbin/route add -host $SNS_VIP dev lo:0
                echo "0" >/proc/sys/net/ipv4/ip_forward
                echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
                echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
                echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
                echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
                sysctl -p >/dev/null 2>&1
                echo "RealServer Start OK"
                ;;
            stop)
                ifconfig lo:0 down
                route del $SNS_VIP >/dev/null 2>&1
                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
                echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
                echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
                echo "RealServer Stoped"
                ;;
            *)
                echo "Usage: $0 {start|stop}"
                exit 1
            esac
            exit 0
        
    6. 在主服务器中的/etc/nginx/conf.d/下新建自定义配置文件nginx.conf,内容为;

      upstream load_banance {
           #负载均衡方法,可选:least_conn,ip_hash等,不填写则为轮询方式;
           #服务器的访问地址,最好使用服务器的私有IP以获得更好的性能和安全性。
           server 192.168.98.7:80 weight=1;
           server 192.168.98.14:80 weight=2;
      }
      server {
           #负载均衡的监听端口
           listen 80;
           #负载均衡服务器的服务名称,没有时填写_
           server_name _;
      
           location / {
               #代理转发,注意这个load_banance要与upstream后的字符串相同
               proxy_pass http://load_banance;
           }
      }
      
      1. 配置完成后重启nginx;
    7. 配置lvs+keepalived+ngixn成功进行测试;

      1. 启动keepalived;

        service keepalived start   #启动命令
        service keepalived stop    #停止命令
        service keepalived restart #重启命令
        service keepalived status  #查看状态
        
      2. 查看虚拟ip,主服务器上有,从服务器没有;

        1. ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第4张图片
      3. 启动nginx;

        service ngixn start
        
      4. 运行realserver.sh脚本;

        /home/user/realserver.sh start   #启动
        /home/user/realserver.sh stop    #停止
        
    8. 负载均衡测试;

      1. 访问虚拟ip,第一次访问与第二次访问的nginx不同,实现了负载均衡效果;

      2. ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第5张图片

      3. ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第6张图片

      4. 如上述效果没有实现可能是因为端口80的问题,可通过以下操作进行修改;

        1. 修改/etc/nginx/sites-enabled/default配置文件,/etc/nginx/sites-available/default配置文件也会同步修改,内容如下

          ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第7张图片

        2. 修改/etc/nginx/conf.d/nginx.conf文件,内容如下

          ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第8张图片

    9. 故障测试;

      1. 模拟主服务器故障情况,关闭主服务器模拟宕机情况,分别查看两台服务器的vip,此时主服务器上的vip漂移到从服务器上;

        ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程_第9张图片

    10. 启动主服务器,分别查看两台服务器的vip,此时vip回到主服务器上;

    11. 在两台服务器上分别安装Tomcat服务;

      1. 在/usr/local文件夹下创建java文件夹;

      2. 下载jdk-8u333-linunx-x64.tar.gz压缩包,上传到服务器/usr/local/java文件夹下并解压;

        tar -zxvf apache-tomcat-8.5.83.tar.gz
        
        1. 修改/etc/profile配置文件,在最后添加环境变量配置

          #java env
          export JAVA_HOME=/usr/local/java/jdk1.8.0_333 #此处为jdk安装位置
          export JRE_HOME=$JAVA_HOME/jre
          export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
          export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
          
        2. 运行以下命令使配置生效;

          source /etc/profile 
          
      3. 在/usr/local文件夹下创建tomcat文件夹;

      4. 下载apache-tomcat-8.5.83.tar.gz压缩包,上传到服务器/usr/local/tomcat下并解压;

        tar -zxvf apache-tomcat-8.5.83.tar.gz
        
      5. 修改/usr/local/tomcat/apacht-tomcat-8.5.83/bin/start.sh配置文件,在最后添加以下内容;

        exec "$PRGDIR"/"$EXECUTABLE" start "$@"
        
        #set java environment
        export JAVA_HOME=/usr/local/java/jdk1.8.0.333  #此处为jdk安装位置
        export JRE_HOME=${JAVA_HOME}/jre
        export CLASSPATH=.:%{JAVA_HOME}/bin:%{JRE_HOME}/lib
        export PATH=${JAVA_HOME}/bin:$PATH
        
        #tomcat
        export TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-8.5.83
        
      6. 启动tomcat成功,可正常访问8080端口;

      7. 在/usr/local/tomcat/apache-tomcat-8.5.83/webapps/下创建test文件夹,在test文件夹下创建index.html文件内容(为了区别不同服务器上的tomcat),内容自定义即可;

      8. 修改/etc/nginx/nginx.conf配置文件,修改内容如下

        在http节点中添加

            upstream tomcat {
                server 192.168.98.7:8080;
                server 192.168.98.14:8080;
            }
            server {
                listen      80;
                server_name 192.168.98.100;
                location / {
                    proxy_pass http://tomcat/test/index.html;
                }
            }
        
      9. 重启nginx;

         server 192.168.98.7:8080;
            server 192.168.98.14:8080;
        }
        server {
            listen      80;
            server_name 192.168.98.100;
            location / {
                proxy_pass http://tomcat/test/index.html;
            }
        }
        
        
        
      10. 重启nginx;

      11. 访问虚拟ip发现nginx将请求转发到tomcat中;

你可能感兴趣的:(ubuntu,nginx,tomcat)