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

     

     
  • 相关阅读:
    一个简单的knockout.js 和easyui的绑定
    knockoutjs + easyui.treegrid 可编辑的自定义绑定插件
    Knockout自定义绑定my97datepicker
    去除小数后多余的0
    Windows Azure Web Site (15) 取消Azure Web Site默认的IIS ARR
    Azure ARM (1) UI初探
    Azure Redis Cache (3) 创建和使用P级别的Redis Cache
    Windows Azure HandBook (7) 基于Azure Web App的企业官网改造
    Windows Azure Storage (23) 计算Azure VHD实际使用容量
    Windows Azure Virtual Network (11) 创建VNet-to-VNet的连接
  • 原文地址:https://www.cnblogs.com/ruiy/p/12133976.html
Copyright © 2011-2022 走看看