LVS+Keepalived+Nginx+Tomcat搭建高可用双机主从热备集群

1.前言

LVS作用:
LVS是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
Keepalived作用:
LVS可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 keepalive 就是为 LVS 而生的。
双机主从热备作用:
可以两台机子互为热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性,从而保证服务器7*24小时运行。
注意:阿里云云服务器不支持再单独购买 IP,无法安装配置 keepalived,进行负载均衡。如果需要配置负载均衡,可以直接购买负载均衡,进行负载均衡配置。

2.环境

1.由于项目部署是springboot2.0,所以用jdk1.8
2.Centos7

服务器名称 ip
nginx+LVS_master 192.168.8.148
nginx+LVS_backup 192.168.8.84
tomcat_master_group1 192.168.8.115:8081
tomcat_backup_group1 192.168.8.89:8082
tomcat_master_group2 192.168.8.68:8083
tomcat_backup_group2 192.168.8.64:8084
VIP(虚拟ip) 192.168.8.145

LVS+Keepalived+Nginx+Tomcat搭建高可用双机主从热备集群_第1张图片

3.keepalived搭建

3.1keepalived安装

命令1:

yum -y install wget

命令2(下载):

wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

命令3(下载插件openssl):

yum install -y openssl openssl-devel

命令4(安装popt的开发包):

yum install popt-devel

命令5(安装gcc):

yum install gcc-c ++

命令6(编译):

cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived

命令7(安装):

make && make install

3.2keepalived安装成Linux系统服务

将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:

命令1:

mkdir /etc/keepalived

命令2:

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

命令3:

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

命令4:

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

命令5:

ln -s /usr/local/sbin/keepalived /usr/sbin/

命令6:

ln -s /usr/local/keepalived/sbin/keepalived /sbin/

命令7:

chkconfig keepalived on

3.3keepalived 启动、停止、重启命令

service keepalived start
service keepalived stop
service keepalived restart

3.4添加nginx宕机重启脚本

在目录/etc/keepalived/下添加nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

注意该脚本一定要授权
chmod 777 nginx_check.sh

3.5修改主keepalived配置

命令1:

vi /etc/keepalived/keepalived.conf

配置信息如下:

! Configuration File for keepalived

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state MASTER #来决定主从
    interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.8.148 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }

    virtual_ipaddress {
        192.168.8.145 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
    }
}

3.6修改备keepalived配置

命令1:

vi /etc/keepalived/keepalived.conf

配置信息如下:

! Configuration File for keepalived

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP #来决定主从
    interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.212.84 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }

    virtual_ipaddress {
        192.168.8.145 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
    }
}

4.Nginx搭建

4.1Nginx安装

可以参考以下链接:
https://blog.csdn.net/dsen726/article/details/79637519

4.2Nginx主配置修改

命令1:

vi /usr/local/nginx/conf/nginx.conf

配置信息如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

	upstream testproxy {
      server 192.168.8.115:8081;
      server 192.168.8.84:8082 backup;
    }
	
	server {
        listen       80;
        server_name  localhost;

    

        location / {
            proxy_pass   http://testproxy;
            index  index.html index.htm;
        }
	     ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
	      proxy_connect_timeout 1s;
		 ###nginx发送给上游服务器(真实访问的服务器)超时时间
         proxy_send_timeout 1s;
	      ### nginx接受上游服务器(真实访问的服务器)超时时间
         proxy_read_timeout 1s;

    }

}

4.3Nginx备配置修改

命令1:

vi /usr/local/nginx/conf/nginx.conf

配置信息如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

	upstream testproxy {
      server 192.168.8.68:8083;
      server 192.168.8.64:8084 backup;
    }
	
	server {
        listen       80;
        server_name  localhost;

    

        location / {
            proxy_pass   http://testproxy;
            index  index.html index.htm;
        }
	     ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
	      proxy_connect_timeout 1s;
		 ###nginx发送给上游服务器(真实访问的服务器)超时时间
         proxy_send_timeout 1s;
	      ### nginx接受上游服务器(真实访问的服务器)超时时间
         proxy_read_timeout 1s;

    }

}

5.项目部署

搭建了简单的springboot2.0项目

@RestController
public class TestController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/")
    public String test(){
        return "SpringBoot2.0:" + port;
    }
}

pom文件信息



    4.0.0

    com.wms
    springboot
    1.0-SNAPSHOT
    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.0.RELEASE
    
    
    
    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

打jar包,启动:java -jar springboot-1.0-SNAPSHOT.jar

6.测试:

注意:记得所有服务器防火关掉
命令:

systemctl stop firewalld

先两台安装keepalived服务器都启动,然后再停掉master的演示效果如下:
LVS+Keepalived+Nginx+Tomcat搭建高可用双机主从热备集群_第2张图片

你可能感兴趣的:(LVS+Keepalived+Nginx+Tomcat搭建高可用双机主从热备集群)