zoukankan      html  css  js  c++  java
  • Docker笔记三:基于LVS DR模式构建WEB服务集群

    LVS 支持NAT、TUN、DR、FullNAT四种模式,DR模式只支持IP转发,不支持端口转发,因此VS端口必须与RS端口保持一致。要使用FullNAT版,需安装alibaba/LVS: https://github.com/alibaba/LVS 。

    安装ipvsadm

    1. 先在宿主机上安装并以root来启动ipvsadm,每次要在容器中运行ipvs都需要先在宿主机上启动ipvsadm。如果直接进行2步操作将报出如下错误:

    Can't initialize ipvs: Protocol not available
    Are you sure that IP Virtual Server is built in the kernel or as module?

    2. 实例化一个ipvs容器:

    • dockerfile:这里特别说明下,凡是在CMD和ENTRYPOINT中声明的可执行程序都应该以非daemon的形式去运行永不自动退出,否则会导致容器在程序执行结束后也退出运行,默认CMD是/bin/bash。下文中定义的两个脚本若放在rc.local中,容器启动时不会自动执行,也不能放在CMD和ENTRYPOINT中去声明自动执行,看来只有用crontab来启用任务计划了,或手动执行一次。
      FROM ubuntu
      MAINTAINER cenze <272666745@qq.com>
      
      RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      ADD conf/sources.list /etc/apt/
      ADD conf/rc.ipvs /etc/ RUN apt-get update && apt-get install -y gcc make vim ipvsadm iproute2 keepalived #本机的80端口已经留给其他容器使用了,所以绑定在了89端口上 EXPOSE 89
    • 宿主机上 build 镜像和 run 容器:
      sudo docker build -t cenze/ipvs -f Dockerfile-IPVS .
      sudo docker run -it -p 89:89 --name ipvs --privileged=true cenze/ipvs
    • 容器ipvs中完成均衡策略配置:由于容器启动时不会自动去执行/etc/rc.local,所以需手动执行下。所有需要手动执行的命令都可写进rc.ipvs(需要可执行权限)文档:
      #!/bin/bash
      
      VIP=172.17.100.100
      VPORT=89
      RPORT=89
      RS=("172.17.0.8" "172.17.0.6")
      RSW=("1" "1")
      TYPE=g
      
      addrs() {
          ipvsadm -a -t $VIP:$VPORT -r $1:$RPORT -$TYPE -w $2
          [ $? -eq 0 ] && return 0 || return 1
      }
      #echo 1 > /proc/sys/net/ipv4/ip_forward ip addr add
      $VIP broadcast $VIP label eth0:0 dev eth0 ipvsadm -A -t $VIP:$VPORT -s wlc COUNT=0 for I in ${RS[*]}; do addrs $I ${RSW[$COUNT]} let COUNT++ done
      Director需要开启IP转发功能,如果默认未开启,则echo 1 > /proc/sys/net/ipv4/ip_forward。然后一次手动执行完,执行完后不能退出容器,窗口不能关闭;否则ipvsadm也将退出,上述配置信息将失效:
      root@7a375abcd343:/# /etc/rc.ipvs

    配置RS-172.17.0.6和RS-172.17.0.8

    1. 与ipvs容器一样,需要手动执行一些配置命令,将其写进/etc/rc.rs(需要可执行权限):

    #!/bin/bash

    ip addr add 172.17.100.100 broadcast 172.17.100.100 label lo:0 dev lo echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

    172.17.100.100被称为VIP,需要在Director(ipvs容器)和Real Server(RS-172.17.0.6和RS-172.17.0.8都要新建一张地址为172.17.100.100的虚拟网卡出来)上同时部署。上述关于arp的设置不明白的,可去看这篇文章 Linux内核参数之arp_ignore和arp_announce。一次手动执行完:

    root@203ffab2138f:/usr/local/pkgs/nginx-1.10.2# /etc/rc.rs

    2. 为RS-172.17.0.8和RS-172.17.0.6添加不同的index.html:

    <html>
    <head>
    <title>Welcome to RS-172.17.0.8(6)!</title>
    </head>
    <body>
    <h1>Welcome to RS-172.17.0.8(6)!</h1>
    </body>
    </html>

    3. WEB服务器的监听端口改为89。

    测试集群负载均衡效果

    从多个浏览器访问172.17.100.100:89:

    1)不能从同一个浏览器开启多个标签去测试,否则将得到同一台WEB服务器的响应,刷新也没用,这可能与持久连接有关。

    2)不能通过localhost:89去访问,否则将无法与WEB服务器群建立起连接。

    3)不使用浏览器,而使用curl来发送多个请求也是可行的。

     1. Chrome访问172.17.100.100:89: 

    Welcome to 172.17.0.8!

    2. FireFox访问172.17.100.100:89: 

    Welcome to 172.17.0.6!

    LVS的十种调度算法

    四种静态算法,不考虑后端服务器实际负载情况

        1、RR

        依次论询,不考虑RS的性能。

        2、WRR

        加权轮询,加入了weight(权重),RS权重越大性能越好。

        3、DH

        目标hash,对同一个资源的请求发往同一台服务器,常用于缓存服务器的场景。

        4、SH

        源地址hash。

    六种动态算法,考虑后端服务器当前负载后再进行分配

        1、LC

        Least Connection,拥有最少连接的RS响应客户端请求。计算Overhead = active * 256 + inactive,如果相同则依次往下选择RS,不考虑RS性能。

        2、WLC

        RS加权的LC,考虑了RS的性能。如果Overhead = (active * 256 + inactive) / weight相同,则由上而下选择RS。

        3、SED

        最短期望延迟,就是对WLC的情况的补充,Overhead = (active + 1) * 256 / weight,+1就是为了让其能够比较出大小。

        4、NQ

        Never Queue 基本和SED相同,避免了SED当中的性能差的服务器长时间被空闲的弊端,第一个请求给性能好的服务器,第二个请求给空闲的服务器不论性能的好坏,以后还是会把请求给性能好的服务器。

        5、LBLC

        动态DH和LC的组合,适用于Cache群,对于从来没有过的新请求会给当前连接数少的那台服务器。

        6、LBLCR

        带有复制功能的LBLC,第一次访问RS1的5个请求第二次又来了,Director会将它们都交给RS1吗?此时RS2可是非常闲的,所以最好可以将这5个请求分别交给RS1和RS2,但需要把客户端第一次请求的资源复制下来。

  • 相关阅读:
    【ThreadLocal】使用ThreadLocal实现线程安全
    【Https】Spring RestTemplete支持Https安全请求
    【MySql】Windows手动注册、启动、数据拷贝
    【技术问题】时空大数据0001---基本知识
    【NodeJS】Vue-d2Admin
    【Oracle】Windows启动
    【三维地质】角点网格
    技术总结
    【Sqlite】C#不同支持
    【Java】Spring
  • 原文地址:https://www.cnblogs.com/XiongMaoMengNan/p/8056211.html
Copyright © 2011-2022 走看看