美文网首页
高并发和负载均衡(一)

高并发和负载均衡(一)

作者: Robin92 | 来源:发表于2020-03-30 22:44 被阅读0次

    网络协议原理

    TCP/IP 协议

    • 协议是同层间交互的约定;
    • 接口是邻层间交互的约定。

    不用任何高层协议去取 baidu 主页

    exec 8<> /dev/tcp/www.baidu.com/80 # 建立一个 socket 连接
    cd /proc/$$/fd # 进入到此进程的文件目录(一切皆文件)
    ls # 看到 8 文件描述符,这是一个套接字,连接了百度
    echo -e 'GET / HTTP/1.0\n' >& 8 # 发送请求头;& 8 代表 8 是个 socket 而不是文件
    cat 0<& 8 # 将 socket 8 上的 resp 返回到标准输出(需要很快执行)
    

    网络模型

    网络模型.jpg

    传输控制层:负责建立连接

    注意:高层的连接也是要走底层的,比如三次握手一端准好将数据发送到网络层及以下进行传输直到服务端传输控制层收到来做握手。

    • 一台主机的 socket (一个 socket 一个端口)数量有限,最多 65535 个。所以开辟了之后要及时回收。
    • TCP 是面向连接的 可靠 的协议,因为要可靠,所以有“三次握手”和“四次挥手”

    高并发的场景要解决的问题:

    • 三次握手 - 数据传输 - 四次挥手 不可分割。
    netstat -natp # 输出 socket 连接详情:协议、地址:端口、状态、哪个程序
    # n: 用 ip 地址显示,a:所有,t:tcp,p:PID
    

    最近服务比较火的有三个概念

    • 微服务
    • 中台,如数据中台、服务中台、数据云、服务云
    • service mesh

    网络层:负责路由

    负责路由,找到网络

    下一跳机制:只记录下一个网络的位置(临近的路由器),由下一个网络再去找网络(每一个计算机不需要存全部数据)。(刚提出来有争议,有过实验保证传输)

    有一篇文章可参考

    cat /etc/sysconfig/network-scripts/ifcfg-eth0 # 查看网络设置信息
    route -n # 查看路由表
    ping # DNS 转换,工作在网络层
    

    ifcfg-eth
    if: interface
    cfg: config
    eth: Ethernet 以太网

    实现:

    • 从 DNS 拿到 IP,将其与路由表网关掩码(Genmask)按位与来匹配(Destination),匹配中的得到 下一跳 的默认网关(Gateway)。
    • Gateway 为 四个 0 表示网络直连,不需要下一跳。
    route 过程

    链路层

    功能:拼接数据包(帧),数据在网络上即以帧的形式传播。

    负责加上网卡信息。

    有一个 arp 表,记录了 IP 与物理网卡 MAC 号的映射。

    DNS 解析域名和 IP 的映射,arp 会解析 IP 地址与物理网卡的映射;
    DNS 是全网的,arp 是局域网的。

    ARP 连接了两层,不确定它具体工作在哪个层。

    arp -a # 可以看到网络层中网关对应的物理网卡信息
    
    网络的通信

    负载均衡

    所以如上,有上面三层(传输层、网络层、数据链路层)就可以找到一台主机。
    如果一项服务要解决高并发问题,就需要增加机器,就需要处理网络的通信。
    但上述三层中可见网络是需要用 IP 来控制的,同一网络中 IP 不能重复出现,所以需要一种服务来将数据请求分发到不同的服务器上。
    而且要越快越好,就像 Tomcat 和 Nginx 他们也算是这个功能,但他们工作在第七层的,所以不够快。

    所以这就引出了负载均衡服务器。它就像工作在三层以上,四层以下:它有自己的 IP (三层以上),能看到请求过来的端口(四层),但又不进行三次握手(四层以下)。

    所以也就一定要让服务端是 镜像,即每一个服务的功能都一样。

    负载均衡 负载均衡技术

    补充知识

    NAT

    地址转换技术,工作在二层。是路由器上使用的一种技术,将外网与内网分开,支持将内网地址转换为外网地址,这样就支持内网连接多个主机。(可以解决 IP 地址不够用的问题)

    如果数据进来和返回都经过负载均衡,负载均衡器就需要来回地计算映射,就造成了计算上的浪费。所以最好 有一种机制可以让服务端不经过负载均衡而返回给客户端

    DR

    DR 模型叫 Direct Route。它实现了直接将数据返回给客户端,而未再经过 NAT。

    实现方式:

    • 是在服务器上隐藏一个 负载均衡的 IP,这样它才可以直接将数据返回给去。
    • 在负载均衡上拼上此服务器的 MAC 地址。

    这就是在服务器上 伪造 出了 客户端与负载均衡 通信的数据包。

    它的原理是动了 链路层:MAC 地址欺骗。一个 IP (负载均衡的)对应到另一个机器上的 MAC(服务机的),而服务器上隐藏下负载均衡的 IP,这样就可以实现 负载均衡器接收通信,而服务端返回通信。

    由于动了二层,未经过第三层,所以速度足够快。但唯一的限制是需要 负载均衡 和 服务器在内网中。

    DR 模型

    IP 隧道

    负载均衡和服务端之间直接开通一个隧道,直接通信。

    具体实现是在 IP 包的首部添加另一个 IP 包的首部。

    这样我就可以用 IP 隧道技术在负载均衡端将数据包封装一下传给服务端,这就解决了 DR 中只允许内网连接的方式。

    负载均衡技术 LVS

    DR 模型

    上面讲到 DR 模型就是:

    • 网卡 A 到网卡 B 走 MAC 欺骗;
    • 对外在网卡 A 上暴露 B 的 IP,在网卡 B 上隐藏 B 自己真实的 IP;

    系统中有两个参数,是内核用的,内核将它映射在文件系统中,即下图中 arp_ignore,arp_announce。

    注意,这个文件不可以用 vi 命令打开,因为 vi 命令会在系统上创建一个隐藏的临时文件,而创建操作是受限制的,所以不能成功。只能用 echo 或其他不创建临时文件的命令。

    image.png

    其流程就是:

    • arp_ignore:定义 arp 的响应级别;1 表示网卡只接收到自己这块网卡的请求,这个设置可以隐藏本地另一个网卡的地址。(家中藏着人不对外说)
    • arp_announce:定义 arp 的通告级别;解释一下 2,因为本地一个网卡可以设置多个 IP,IP 区分出多个网络,设置 2 就表示对 1 网络只通告给外我的同样在 1 网络的 IP_1,对 2 网络只对外通告我的同样在 2 网络的 IP。(一个人有两个手机,用于不同人群)
    • 将 IP (虚拟 IP) 配在环回接口上(只在本地用)。

    TIPS(常识):
    本地可以有多块网卡,可以给不同网上配不同的地址;
    每个网卡上可以配多个 IP 地址。

    temp (5).jpg

    LVS 偷窥到客户端与服务端的通信,三次握手后给连接数加 1;四次挥手后给连接数减 1。

    LVS 已默认封装在 Linux 内核中的 ipvs 模块中。
    但要想访问控制它,需要安装 ipvsadm 工具:yum install ipvsadm

    资料地址

    相关文章

      网友评论

          本文标题:高并发和负载均衡(一)

          本文链接:https://www.haomeiwen.com/subject/utomuhtx.html