zoukankan      html  css  js  c++  java
  • Nginx socket负载

    Netty Tcp 负载均衡(上)----Nginx

     阅读约 6 分钟

    为什么要负载均衡

    随着设备连接数增多,单台服务器支撑的TCP长连接数有限,这个时候程序架构就需要改变,一般都会采取横向扩展,增加多台服务器程序。怎么将TCP长连接均衡的路由到不同的服务器,这个时候就需要实现负载均衡了。

    两种不同的场景和方案

    目前笔者想到的两种应用场景是:

    1. 客户端实现比较简单,所有客户端都会连接同一个ip域名和端口。客户端不会去请求可用服务器列表,然后去根据具列表选择不同的服务器。比如说一些DTU等硬件设备或者因为前期没有考虑负载均衡而导致的遗留老项目。
      解决方案:
      在目标服务器上做TCP负载均衡,转发到不同的服务器上,但是这种方案需要解决负载均衡服务器的单点故障。例如可以通过Nginx开启TCP负载均衡功能来实现。
    2. 客户端本身就实现了请求可用服务器列表,然后根据列表去连接不同的服务器。

    方案一:Nginx实现负载均衡

    1. 安装Nginx
    参考的资料:https://my.oschina.net/ouyush...
    参考的资料:http://www.jiagoumi.com/work/...
    (0)安装依赖的软件

    (1)下载:wget http://nginx.org/download/ngi...

    (2)解压:执行指令

    tar -xzvf nginx-1.12.2.tar.gz -C 你的目录
    

    (3)配置: 需要添加 with-stream参数 nginx tcp负载均衡需要

     ./configure --prefix=/opt/nginx-1.9.3 --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-pcre --with-http_realip_module --with-stream

    (4)make

    (5)make install
    nginx会安装到特定的文件夹 /opt,如果一开始把源码包下载到改目录,编译安装时会提示类似错误

    clipboard.png

    把源码包移到其它目录就能解决。

    2.修改nginx.conf添加负载均衡配置
    官方样例:

    worker_processes auto;
    
    error_log /var/log/nginx/error.log info;
    
    events {
        worker_connections  1024;
    }
    
    stream {
        upstream backend {
            hash $remote_addr consistent;
    
            server backend1.example.com:12345 weight=5;
            server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
            server unix:/tmp/backend3;
        }
    
        upstream dns {
           server 192.168.0.1:53535;
           server dns.example.com:53;
        }
    
        server {
            listen 12345;
            proxy_connect_timeout 1s;
            proxy_timeout 3s;
            proxy_pass backend;
        }
    
        server {
            listen 127.0.0.1:53 udp;
            proxy_responses 1;
            proxy_timeout 20s;
            proxy_pass dns;
        }
    
        server {
            listen [::1]:12345;
            proxy_pass unix:/tmp/stream.socket;
        }
    }

    自定义测试配置为:

    #tcp load balance
    stream{
            #更多更详细的参数,查看文档或网络
            upstream netty_test{
                    server 192.168.0.26:6666 weight=1;
                    server 192.168.0.26:6667 weight=1;
            }
    
            server{
                    listen 6665;
                    proxy_pass netty_test;
            }
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        ...
    

    以上配置只是为了方便测试,因此配置的较为简陋,生产环境中,详细配置请看官方样例。
    相关端口不要忘记开放,会存在防火墙导致无法连接的情况。

    3.连接测试
    启动两个netty服务器程序,在生产环境中会部署到不同的服务器,这里测试,在同一台PC上启动两个netty程序,端口分别为6666和6667。使用客户端连接192.168.0.26:6665,当建立4个连接时,客户端会被平均路由到 192.168.0.26:6666和6667两个server

     

     
  • 相关阅读:
    知者不言,言者不知:论华人工程师之领导力
    vscode: Visual Studio Code 常用快捷键
    工作10年的我却没拼过刚毕业的美国女孩,亚裔们到底输在哪儿?
    不要再学习框架了!
    托福100分什么水平
    (转)Eclipse中快速输入System.out.println()的快捷键
    人生不相见,动如参与商
    Amazon onsite behavior question
    Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
    浅谈volatile与automicInteger
  • 原文地址:https://www.cnblogs.com/ruiy/p/12133976.html
Copyright © 2011-2022 走看看