腾讯云负载均衡CLB的那些“独门利器”

欢迎你们前往云+社区,获取更多腾讯海量技术实践干货哦~
做者:李想

腾讯人作产品一直是很贴近用户的需求的,腾讯云也不例外。负载均衡器做为公有云上的最基础的网络服务,几乎每家云厂商都会提供,虽然负载均衡的应用场景和基本功能都大同小异,但在具体的技术实现和特性方面也会有一些差别。今天就聊一聊腾讯云的负载均衡提供给客户的那些独有的特性,你们也能够了解下腾讯云负载均衡器的优点所在。git

1.四七层LB自带客户端源IP获取功能

四层负载均衡获取客户端源IP几乎各大云厂商都支持,对于四层LB来说,网络包是一个转发的过程,因此尽管会有隧道封装基本上这个信息不会丢,技术层面实现不难。github

七层负载均衡通用的作法是作反向代理,相似于Nginx的proxy_pass实现方式,后端服务器收到的网络包的三层源地址会变成LB的内网地址,而后经过插入X-Forwarded-For HTTP header来传递客户端源IP,微软Azure包括国内的某些云厂商都是这种实现方式。算法

腾讯云的七层负载均衡器不只支持X-Forwarded-For获取客户端源IP,同时支持三层直接获取客户端源IP,也就是说后端服务器上看到的网络包的源地址就是客户的真实访问地址。后端

下面的截图显示的是从后端服务器的抓包,能够看到X-Forwarded-For记录的地址是我客户端的地址180.xxx.219.15,同时数据包的三层源地址也是180.xxx.219.15。跨域

后端服务器抓包

腾讯云这样作的好处能够极大方便客户来统计客户端的来源,Nginx或者Apache不用作任何特殊配置,直接经过Access log就能统计出客户端来源。安全

以Nginx为例,跑一下"awk '{print $1}' access.log |sort |uniq -c |sort -k1 -nr |head -n10" 就能很容易拿到访问量前10的IP。下图中的前两名的源地址是内部健康检查用的,因此访问量较大,能够忽略。第三名是咱们真实的客户端访问,跟上面提到的我这边测试的客户端IP一致。bash

访问量前10的IP

鉴于腾讯云的实现方式,详细细节能够参考社区文章服务器

https://cloud.tencent.com/developer/article/1004723网络

架构图以下,简单说一下,其本质就是L7 Nginx群集出来的包通过L7.ko内核模块封装为GRE包的时候修改内层源地址仍然为客户端的源IP。架构

腾讯云七层负载均衡实现方式

2.Http/https一键强制跳转

随着你们对网络安全的重视,https的网站已经成为主流,http到https的强制跳转也成为许多客户的基本需求,腾讯云考虑到这个这个现状也是提供了一键强制转换的功能。

实现http到https的跳转自己并不难,最多见的就是利用Nginx的rewrite功能,若是为了防止LB的HTTPS卸载致使的rewrite循环(后端服务器自己只接受http请求),也能够配合检查X-Forwarded-Proto或者X-Client-Proto来判断源是否为https来决定是否须要跳转。

可是这些毕竟仍是须要在后端服务器进行配置,腾讯云提供了一键强制转换的功能,只需在portal进行简单配置添加一条自动重定向配置便可,前提是已经配置好了https和http监听。

一键Http/Https跳转

3.跨地域绑定负载均衡

公网应用型LB支持跨地域绑定云主机的能力,容许客户选取后端服务器的地域类型,跨VPC、跨地域绑定后端实例。该功能经过跨域对等链接来实现,能够实现只在一地部署服务器而在不一样地域部署LB来提高不一样区域用户的体验,实现全球通服的场景。

好比下面的场景,咱们将LB创建在华南,能够经过修改后端云主机的的地域为华东而选择华东区的服务器。注意该功能目前须要经过工单提早申请才能正常使用。

LB实例详情

4.支持QUIC协议

QUIC是由Google提出的基于UDP构建的安全多路并发的传输层协议,表明了快速UDP Internet链接。QUIC经过改进TCP的握手及拥塞算法,重构TLS协议,以及吸取HTTP2的大部分特性可以将弱网络时的速度提高 20% 以上,很是适合一些游戏或者流媒体对速度要求比较高的场景。

腾讯云的解决方案并不须要服务自己支持QUIC协议,CLB会负责处理QUIC协议并转换成HTTP1.1协议发送给后端应用服务器,服务器对用户到CLB的QUIC协议并没有感知。其具体的实现方式以下图所示:

CLB对QUIC实现方式

附QUIC测试方法:

1. 咱们采用goquic的方案进行测试,因此要提早安装好GO环境(Centos为例),这边再也不赘述,开源项目地址以下

https://github.com/devsisters/goquic

2.获取项目文件到本地,并安装GCC,G++

yum -y install gcc
yum -y install gcc-g++
go get -u -d github.com/devsisters/goquic

3.若是没有配置Ninja,修改build_libs.sh文件

修改前:
cd libquic/$BUILD_DIR
cmake -GNinja $OPT ../..
cd -
ninja -Clibquic/$BUILD_DIR
修改后: 

cd libquic/$BUILD_DIR 
cmake $OPT ../.. 
make -j4

4.编译静态库文件

GOQUIC_BUILD=Release ./build_libs.sh

5.编写testquic.go文件放入goquic项目目录下

package main

import (
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"

    "github.com/devsisters/goquic"
    "time"
)

var url string
var logLevel int
var quic bool

func init() {
    flag.StringVar(&url, "url", "http://127.0.0.1:8080/", "host to connect")
    flag.IntVar(&logLevel, "loglevel", -1, "Log level")
    flag.BoolVar(&quic, "QUIC", true, "use QUIC protocol")
}

func main() {
    flag.Parse()
    goquic.SetLogLevel(logLevel)

    client := &http.Client{
        Transport: goquic.NewRoundTripper(false),
    }
    
    var resp *http.Response    
    var err error

    t1 := time.Now()
    if quic == true {
        resp, err = client.Get(url)
    } else {
        resp, err = http.Get(url)
    }
    
    if err != nil {
        panic(err)
    }

    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    fmt.Println("Duration:",time.Now().Sub(t1).Seconds())
    fmt.Println("Body Length:", len(string(b)))
}

6.编译程序并运行

go build testquic.go
./testquic -url https://www.google.com/ -QUIC=true

相关阅读


此文已由做者受权云+社区发布,转载请注明原文出处
相关文章
相关标签/搜索