nginx+keepalived+tomcat实现的高可用

 

 

 

 

环境准备

 172.16.119.100:nginx + keepalived   master

 172.16.119.101:nginx + keepalived   backup

 172.16.119.102:tomcat

 172.16.119.103:tomcat

 虚拟ip(VIP):172.16.119.200,对外提供服务的ip,也可称作浮动ip

 各个组件之间的关系图如下:

tomcat做应用服务器

   将172.16.119.102、172.16.119.103上的tomcat启动起来

   上传apache-tomcat-8.5.23.tar.gz到172.16.119.102

   解压:tar -zxf apache-tomcat-8.5.23.tar.gz 

  

  

  情况webapp文件夹:rm -rf *

   

  上传ROOT项目

    

  访问:http://172.16.119.102:8080/

  

  

  修改index.jsp页面内容为当前服务器IP

  

   JSP不需要编译直接刷新页面看效果

  

  现在直接复制tomcat文件夹到172.16.119.103服务器

   执行:scp -r apache-tomcat-8.5.23/ [email protected]:/usr/local/

  修改index.jsp页面内容启动

  启动:./startup.sh  

  

  

172.16.119.102安装nginx服务

准备nginx-1.8.1.tar.gz,并解压到当前目录,命令tar -zxf nginx-1.8.1.tar.gz

nginx依赖包安装

  nginx安装有环境要求,nginx依赖下面3个包

      a. gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )

      b. rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )

      c. ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ )

           这里我就不用源码包方式来安装了,直接一键式安装:yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

nginx安装

    cd nginx-1.8.1 

    ./configure --prefix=/home/hadoop/apps/nginx 

    make

    make install

    安装完成之后,检查nginx的配置文件是否正确

    cd /home/hadoop/apps/nginx/sbin/

    ./nginx -t

说明配置文件正确,那么nginx安装成功!

nginx启动

cd /home/hadoop/apps/nginx/sbin/

./nginx

 注意如果访问是403解决:修改cd /home/hadoop/apps/nginx/conf   vi nginx.conf

nginx负载均衡 

修改:vim /home/hadoop/apps/nginx/conf/nginx.conf

172.16.119.100配置

user nobody;

worker_processes 2;

events{
    worker_connections 1024;
}

http{
    #设置默认类型为二进制流
    default_type    application/octet-stream;

    server_names_hash_bucket_size   128;
    #指定来自client请求头的headerbuffer大小。设置为32KB
    client_header_buffer_size   32k;
    #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
    large_client_header_buffers 4 32k;
    #上传文件大小
    client_max_body_size 356m;
    #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    #access日志存在未知
    access_log  /home/hadoop/apps/nginx/logs/access.log    access;
    #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    #设置client连接保持活动的超时时间
    keepalive_timeout   65;
    server_tokens   off;
    #client请求主体读取缓存
    client_body_buffer_size 512k;
    proxy_connect_timeout   5;
    proxy_send_timeout      60;
    proxy_read_timeout      5;
    proxy_buffer_size       16k;
    proxy_buffers           4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;

    #fastcgi_connect_timeout 300;
    #fastcgi_send_timeout   300;
    #fastcgi_read_timeout   300;
    #fastcgi_buffer_timeout 300;
    #fastcgi_buffers 4 64k;
    #fastcgi_busy_buffers_size 128k;
    #fastcgi_temp_file_write_size 128k;

    #开启gzip
    gzip    on;
    #同意压缩的最小字节数
    gzip_min_length 1k;
    #4个单位为16k的内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #设置识别HTTP协议版本号,默认是1.1
    gzip_http_version 1.1;
    #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU
    gzip_comp_level 2;
    #压缩的类型
    gzip_types text/plain application/x-javascript text/css application/xml;
    #让前端的缓存server混村经过的gzip压缩的页面
    gzip_vary   on;

    upstream mycluster{
        server 172.16.119.102:8080 weight=1;
        server 172.16.119.103:8080 weight=1;
    }

    server{
        listen 8089;
        server_name 172.16.119.100;
        charset    utf-8; #设置编码为utf-8
        #root   html;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #location ~ .*\.(jsp|do|action)$
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_pass http://mycluster;
            # 真实的clientIP
            proxy_set_header   X-Real-IP        $remote_addr;
            # 请求头中Host信息
            proxy_set_header   Host             $host;
            # 代理路由信息。此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户訪问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
        #静态文件交给nginx处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 30d;
        }
        #静态文件交给nginx处理
        location ~ .*\.(js|css)?
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 1h;
        }
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   html;
        }

    }

172.16.119.101配置

user nobody;

worker_processes 2;

events{
    worker_connections 1024;
}

http{
    #设置默认类型为二进制流
    default_type    application/octet-stream;

    server_names_hash_bucket_size   128;
    #指定来自client请求头的headerbuffer大小。设置为32KB
    client_header_buffer_size   32k;
    #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
    large_client_header_buffers 4 32k;
    #上传文件大小
    client_max_body_size 356m;
    #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    #access日志存在未知
    access_log  /home/hadoop/apps/nginx/logs/access.log    access;
    #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。

    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    #设置client连接保持活动的超时时间
    keepalive_timeout   65;
    server_tokens   off;
    #client请求主体读取缓存
    client_body_buffer_size 512k;
    proxy_connect_timeout   5;
    proxy_send_timeout      60;
    proxy_read_timeout      5;
    proxy_buffer_size       16k;
    proxy_buffers           4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;

    #fastcgi_connect_timeout 300;
    #fastcgi_send_timeout   300;
    #fastcgi_read_timeout   300;
    #fastcgi_buffer_timeout 300;
    #fastcgi_buffers 4 64k;
    #fastcgi_busy_buffers_size 128k;
    #fastcgi_temp_file_write_size 128k;

    #开启gzip
    gzip    on;
    #同意压缩的最小字节数
    gzip_min_length 1k;
    #4个单位为16k的内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #设置识别HTTP协议版本号,默认是1.1
    gzip_http_version 1.1;
    #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU
    gzip_comp_level 2;
    #压缩的类型
    gzip_types text/plain application/x-javascript text/css application/xml;
    #让前端的缓存server混村经过的gzip压缩的页面
    gzip_vary   on;

    upstream mycluster{
        server 172.16.119.102:8080 weight=1;
        server 172.16.119.103:8080 weight=1;
    }

    server{
        listen 8089;
        server_name 172.16.119.101;
        charset    utf-8; #设置编码为utf-8
        #root   html;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #location ~ .*\.(jsp|do|action)$
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_pass http://mycluster;
            # 真实的clientIP
            proxy_set_header   X-Real-IP        $remote_addr;
            # 请求头中Host信息
            proxy_set_header   Host             $host;
            # 代理路由信息。此处取IP有安全隐患
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            # 真实的用户訪问协议
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
        #静态文件交给nginx处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 30d;
        }
        #静态文件交给nginx处理
        location ~ .*\.(js|css)?
        {
            root /usr/local/apache-tomcat-8.5.23/webapps;
            expires 1h;
        }
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   html;
        }

    }

  

 启动:访问http://172.16.119.100:8089/测试

安装Keepalived

下载keepalived-1.4.5.tar.gz

  

在/home/hadoop/apps/keepalived-1.4.5目录下,添加check_nginx.sh(检查nginx存活的shell脚本)和keepalived.conf(keepalived配置文件)

check_nginx.sh

#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
 /etc/init.d/nginx start
 sleep 3
 if [ `ps -C nginx --no-header |wc -l`-eq 0 ];then
  killall keepalived
 fi
fi

安装编译:./configure --prefix=/usr/app/keepalived && make && make install

安装好了之后,你就会看到如下的内容,那就恭喜你,安装成功了。

Keepalived configuration
------------------------
Keepalived version       : 1.4.2
Compiler                 : gcc
Preprocessor flags       : 
Compiler flags           : -Wall -Wunused -Wstrict-prototypes -Wextra -g -O2 -fPIE -D_GNU_SOURCE
Linker flags             : -pie
Extra Lib                :  -lcrypto  -lssl 
Use IPVS Framework       : Yes
IPVS use libnl           : No
IPVS syncd attributes    : No
IPVS 64 bit stats        : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
Use VRRP authentication  : Yes
With ip rules/routes     : Yes
SNMP vrrp support        : No
SNMP checker support     : No
SNMP RFCv2 support       : No
SNMP RFCv3 support       : No
DBUS support             : No
SHA1 support             : No
Use Debug flags          : No
smtp-alert debugging     : No
Use Json output          : No
Stacktrace support       : No
Memory alloc check       : No
libnl version            : None
Use IPv4 devconf         : No
Use libiptc              : No
Use libipset             : No
init type                : systemd
Build genhash            : Yes
Build documentation      : No

安装好了之后,在/home/hadoop/apps/keepalived/etc/keepalived目录下有一个keepalived.conf文件,现在你要做的事情就是

    将它copy到/etc/keepalived文件夹下就可以了。

mkdir -p /etc/keepalived
cp /home/hadoop/apps/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived

接下来我们改一下配置文件。

   在

172.16.119.100

机器中的配置文件,修改如下:

vim /etc/keepalived/keepalived.conf

Master(172.16.119.100)中的keepalived.conf配置如下

vrrp_script chk_nginx {  
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh" //检测nginx进程的脚本  
 interval 2  
 weight -20  
}  

global_defs {  
 notification_email {  
      //可以添加邮件提醒  
 }  
}  
vrrp_instance VI_1 {  
 state MASTER //主服务器  
 interface et  
 virtual_router_id 51   
 mcast_src_ip 172.16.119.100  
 priority 250   
 advert_int 1  

 authentication {  
        auth_type PASS  
        auth_pass 123456  
 }  
 track_script {  
        chk_nginx  
 }  
 virtual_ipaddress {  
        172.16.119.200  
 }  
}  

关于keepalived配置的几点说明 
- state - 主服务器需配成MASTER,从服务器需配成BACKUP 
- interface - 这个是网卡名,可以通过ifconfig查询到
- mcast_src_ip - 配置各自的实际IP地址 
- priority - 主服务器的优先级必须比从服务器的高,这里主服务器配置成250,从服务器配置成240 
- virtual_ipaddress - 配置虚拟IP(172.16.119.200) 
- authentication - auth_pass主从服务器必须一致,keepalived靠这个来通信 
- virtual_router_id - 主从服务器必须保持一致

执行pkill keepalived来关闭keepalived

启动:命令

cd /home/hadoop/apps/keepalived/sbin
./keepalived -D

查询进程:

如果查不到进程查看启动日志:tail -f  /var/log/messages

查看虚拟IP:

 

部署172.16.119.101

 scp -r /home/hadoop/apps/keepalived/ root@hadoop2:/home/hadoop/apps/

 scp /etc/keepalived/keepalived.conf root@hadoop2:/etc/keepalived/

 修改配置

Backup(172.16.119.101)中的keepalived.conf配置如下

vrrp_script chk_nginx {  
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh" //检测nginx进程的脚本  
 interval 2  
 weight -20  
}  

global_defs {  
 notification_email {  
      //可以添加邮件提醒  
 }  
}  
vrrp_instance VI_1 {  
 state BACKUP //从服务器  
 interface eth1
 virtual_router_id 51 mcast_src_ip 172.16.119.101 priority 240 advert_int 1 authentication { auth_type PASS auth_pass 123456 } track_script { chk_nginx } virtual_ipaddress { 172.16.119.200 } } 

配置完启动 

这个时候发现虚拟IP并没有绑定在101服务器上,现在关闭100服务器看虚拟IP会不会偏移到101服务器

现在再查看101服务器的虚拟IP

 访问网站也是没有问题的

现在Master恢复正常后,Master继续提供服务,Backup停止服务,并继续等待Master出现故障

 重新启动100会发现虚拟IP会重新被100抢占

Keepalived抢占模式和非抢占模式

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。 
前面的例子中,我们实际上配置的是抢占模式,下面我们再来看看非抢占模式

Master(100)中的keepalived.conf配置如下

vrrp_script chk_nginx {  
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh"//检测nginx进程的脚本  
 interval 2  
 weight -20  
}  

global_defs {  
 notification_email {  
      //可以添加邮件提醒  
 }  
}  
vrrp_instance VI_1 {  
 state BACKUP //主服务器(非抢占模式需要配置成BACKUP)  
 interface eth0  
 virtual_router_id 51   
 mcast_src_ip 172.16.119.100  
 priority 250  
 advert_int 1  
 nopreempt //非抢占模式
 authentication {  
        auth_type PASS  
        auth_pass 123456  
 }  
 track_script {  
        chk_nginx  
 }  
 virtual_ipaddress {  
        172.16.119.200  
 }  
}  

Master(101)中的keepalived.conf配置如下

vrrp_script chk_nginx {  
 script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh"//检测nginx进程的脚本  
 interval 2  
 weight -20  
}  

global_defs {  
 notification_email {  
      //可以添加邮件提醒  
 }  
}  
vrrp_instance VI_1 {  
 state BACKUP //主服务器(非抢占模式需要配置成BACKUP)  
 interface eth1  
 virtual_router_id 51 mcast_src_ip 172.16.119.100 priority 240 advert_int 1 nopreempt //非抢占模式  authentication { auth_type PASS auth_pass 123456 } track_script { chk_nginx } virtual_ipaddress { 172.16.119.200 } } 

 

 

抢占模式配置说明 
和非抢占模式的配置相比,只改了两个地方: 
1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip 
2> 节点的state都为BACKUP 
两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

(非抢占模式)Step-1 Master,Backup都正常,只有Master对外提供服务

配置完成后,先启动Master(100)机器的keepalived和nginx,查看Master的IP信息,可以看到VIP已经被绑定到100机器上了,再启动Backup(101)机器的keepalived和nginx,查看Backup的IP信息,可以看到VIP没有被绑定到101机器上了 
浏览器多次刷新并访问 http://172.16.119.200:8089/
可以看到页面上IP交替显式102和103,并且显示NGINX-1,则表明是Master(100)在转发web请求

(非抢占模式)Step-2 Master挂了,Backup接替Master对外提供服务

接着,我们在Master(100)机器上关闭keepalived和nginx进程来模拟Master服务器挂掉,查看Backup(101)的VIP,发现VIP已经绑定到了Backup(101) 
浏览器多次刷新并访问http://172.16.119.200:8089/
可以看到页面上IP交替显式102和103,并且显示NGINX-2,则表明是Backup(101)在转发web请求,也就是说Master挂掉后,Backup继续接管Master的服务。

(非抢占模式)Step-3 Master恢复正常后,Backup继续对外提供服务,Master不会抢占VIP,而是继续等待Backup出现故障

我们再启动Master(100)机器的keepalived和nginx,查看VIP,发现VIP已经被Master“夺回”了使用权限 
浏览器多次刷新并访问http://172.16.119.200:8089/ 
可以看到页面上IP交替显式102和102,并且显示NGINX-2,则表明是Backup(101)在转发web请求,也就是说Master恢复后,并未接管Backup的服务。

(非抢占模式)Step-4 Backup挂了,Master重新绑定VIP,接替Backup对外提供服务

我们在Backup(101)机器上关闭keepalived和nginx进程来模拟Backup服务器挂掉,查看Master(100)的VIP,发现VIP已经绑定到了Master(100) 
浏览器多次刷新并访问http://172.16.119.200:8089/
可以看到页面上IP交替显式102和103,并且显示NGINX-1,则表明是Master(100)在转发web请求

猜你喜欢

转载自www.cnblogs.com/h-kang/p/11018751.html
今日推荐