起名字什么的太麻烦了

起名字什么的太麻烦了

之前nginx+tomcat集群配置是简单的轮询机制

upstream    servers{
        #server  172.25.67.29:9091 weight=1 max_fails=1 fail_timeout=50;
        server  172.25.67.29:9091;
        server 172.25.67.27:9091;
        server 172.25.67.27:8380;
    }

如上图。这样做的话重启其中一台tomcat没啥问题。但是启动的时候由于服务比较大 加载比较快。然后tomcat又是一启动就初始化端口导致项目启动一半时,如果用户访问就可能造成请求等待响应。

这个时候用户一般都是懵逼的情况。然后估计就打电话说系统慢了。。。搞不好一些关键的请求 例如 支付等等会出现问题。

那么怎么做才能在服务启动的时候让nginx把这台服务down呢?

 upstream    servers{
        #server  172.25.67.29:9091 weight=1 max_fails=1 fail_timeout=50;
        server  172.25.67.29:9091 max_fails=10 fail_timeout=100;
        server 172.25.67.27:9091 max_fails=10 fail_timeout=100;
        server 172.25.67.27:8380 max_fails=10 fail_timeout=100;

#max_fails 表示访问服务出现多少次错误就然后服务down掉 fail_timeout 时间。  这个就是 出现10次错误 就让服务down掉100秒   不配置 默认是1次
#max_fails  究竟哪些错误会算到max_fails 呢  目前试了一个[error] 26726#0: *130141 connect() failed (111: Connection refused) while connecting to upstream。和upstream timed out (110: Connection timed out) while reading response header from upstrea   就是服务停了或者超时  端口访问不到的情况
    }
 location ^~ /servers {
            proxy_pass http://servers;
            proxy_redirect off;
                #       proxy_redirect http:// https://;
            proxy_set_header Host $host:$server_port;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 50m;
            client_body_buffer_size 256k;
            proxy_connect_timeout 300s; #与服务器连接超时。一般内网个的这个都没啥用
            proxy_send_timeout 300s;   #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据 这个一般返回大量数据的时候有用。一般也没啥用
            proxy_read_timeout 100s;  #可以说是后端服务器处理请求的时间。 超过这个时间后端没返回就抛504还是502来着?
            proxy_buffer_size 16k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
            #proxy_next_upstream error timeout http_504 http_500;   不定义重发错误了。没必要 都出现500了  别的服务器也不好说
        }

上面这样做有一个问题 就是 这个重试时间很难定义。 万一服务10s就启动了 那就还得空等90s 。不太好。 还有些请求时间很长超时了 但是服务并没有问题。这样也会将服务down掉。 万一用户瞎搞 不停的点 不停的超时。那就把所有服务都搞挂了。  百度了一堆也没啥解决方案。

nginx解决了。tomcat的问题还没解决。 服务里有很多很慢的请求。那么关闭tomcat 这些请求也就中断了。

百度了一下 都说使用 kill -15  进程号   或者  shutdown.sh  但是 测试过并不好使  。确实优雅 但是  也不会等请求处理完毕了才关闭。没一会服务就会关了。但是会触发事务回滚。 短一点的请求还能返回。长一点的基本没戏。

自己偷偷想了个方案。 用服务器防火墙来弄。 关闭服务的时候把服务端口用防火墙禁用掉。 等启动完成了再将端口放开。。这个方法也是有够麻烦的。

首先需要写shell脚本。 关闭tomcat服务之前先禁用端口。等个60秒 然后再关闭服务,这样基本上就不会有服务停止然后请求中断的问题了。然后服务启动后再开放端口。这样加上nginx用户基本是无感知的

03-09 05:01