• docker及lvs负载


    1、分别使用lxc容器和docker容器搭建nginx服务,能够正常访问到容器内的web服务 

    下载docker-ceyum仓库至 /etc/yum.repos.d/目录中,使用yum安装docker-ce

    使用阿里镜像仓库地址:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    cd /etc/yum.repos.d/

    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    yum install docker-ce

    使用阿里的容器镜像加速服务(需要登录阿里云)


     

    创建/etc/docker/daemon.json配置文件填入以下代码

    sudo mkdir -p /etc/docker

    sudo tee /etc/docker/daemon.json <<-'EOF'

    {

      "registry-mirrors": ["https://xoqam0c8.mirror.aliyuncs.com"]

    }

    EOF

    sudo systemctl daemon-reload #重新加载配置文件

    sudo systemctl restart docker #重启服务

    docker version  # 查看版本

    Client: Docker Engine - Community

    Version:          19.03.1

    API version:      1.40

    Go version:        go1.12.5

    Git commit:        74b1e89

    Built:            Thu Jul 25 21:21:07 2019

    OS/Arch:          linux/amd64

    Experimental:      false

    Server: Docker Engine - Community

    Engine:

      Version:          19.03.1

      API version:      1.40 (minimum version 1.12)

      Go version:      go1.12.5

      Git commit:      74b1e89

      Built:            Thu Jul 25 21:19:36 2019

      OS/Arch:          linux/amd64

      Experimental:    false

    containerd:

      Version:          1.2.6

      GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb

    runc:

      Version:          1.0.0-rc8

      GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f

    docker-init:

      Version:          0.18.0

      GitCommit:        fec3683


    查看容器基本信息

    docker pull nginx:stable-alpine  #从dockerhub中拉取镜像至本地

    docker image ls #查看本地镜像

    [root@centos7 yum.repos.d]# docker image ls

        REPOSITORY          TAG                IMAGE ID            CREATED            SIZE

        nginx              stable-alpine      8587e8f26fc1        6 days ago          21.2MB

    docker image inspect nginx:stable-alpine #查看镜像的详细信息,以xml格式


     

    docker run --name nginx nginx:stable-alpine 创建并启动拖下来的镜像

    [root@centos7 ~]# docker container exec nginx1 ifconfig   #连接至容器并且查看ip地址

    eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02 

              inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0

              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

              RX packets:85 errors:0 dropped:0 overruns:0 frame:0

              TX packets:54 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:0

              RX bytes:6892 (6.7 KiB)  TX bytes:4326 (4.2 KiB)

    lo        Link encap:Local Loopback 

              inet addr:127.0.0.1  Mask:255.0.0.0

              UP LOOPBACK RUNNING  MTU:65536  Metric:1

              RX packets:0 errors:0 dropped:0 overruns:0 frame:0

              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:1

              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


    查看容器IP地址

    在外部访问容器内nginx服务

    docker container exec -it nginx1 /bin/sh  连接至容器可以查看容器内部运行方式


    容器内进程第一个为nginx

    docker stop nginx1  #停止容器

    docker run --name web -it --rm nginx:stable-alpine # --rm可以指定退出容器时就删除容器 ,-it指定交互式接口运行方式,这里指运行在前台,-d可以指定运行在后台,无法与rm同时使用,

    docker container logs name 查看容器中进程的日志

    docker search #搜索镜像

    docker pull 拖去镜像

    docker images 显示镜像列表

    docker create 创建容器

    docker start 启动容器

    docker run 创建并启动容器

    docker container commit b1  registry/name:version 制作镜像

    docker push 推送镜像

    2、简述docker网络模型,并实现桥接模式下不同宿主机之间的docker网络互通 

    docker提供四种可用网络

    1,桥网络 默认docker0 的nat桥,可以自行定义

    2,共享桥网络(联盟式),共享名称空间的IPC,NET,UTS。隔离文件系统,用户,以及进程,容器可用通信接口通信,也可以使用同一个主机名对外提供服务

    docker run --name box -it --rm --network bridge busybox 开启一个容器指定桥网络


     

    docker run --name boxv1-it --rm --network container:box busybox #新起一台容器 指定加入box网络,即是共享式网络


    ip地址与box容器ip地址一样

    3,共享宿主机网络,容器直接使用宿主机网络,进程监听在宿主机的网卡某端口

    docker run --name box -it --rm --network host busybox 指定网络连接使用宿主机的网络,

    显示网卡信息都为宿主机的网络


     

    4,none网络,空网络无网卡

    [root@centos7 ~]# docker run --name box -it --rm --network none busybox 指定--network none 为none 进入交互式接口容器,网络为空网络

    / # ifconfig

    lo        Link encap:Local Loopback 

              inet addr:127.0.0.1  Mask:255.0.0.0

              UP LOOPBACK RUNNING  MTU:65536  Metric:1

              RX packets:0 errors:0 dropped:0 overruns:0 frame:0

              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:1

              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    / #

    docker run --name nginx -p 80:80 nginx:stable-alpine #使用-p选项将容器内80端口绑定至宿主机80端口中,实现dnat转发功能转发至容器内nginx服务


     

    在192.168.196启动的容器中访问195主机80端口


     

     

    docker run --name nginx -p 192.168.1.195::80 nginx:stable-alpine 也可将宿主机的ip随机端口绑定至容器内80端口


    随机端口为32768

     

     

    [root@centos7 ~]# docker container port nginx  查看容器内映射端口

    80/tcp -> 192.168.1.195:32768

    docker run --name nginx -p 80 -p 443 nginx:stable-alpine #-p选项也可指定多端口监听

    [root@centos7 ~]# docker container port nginx 

    443/tcp -> 0.0.0.0:32778

    80/tcp -> 0.0.0.0:32779

    [root@centos7 ~]#

    [root@centos7 yum.repos.d]# docker network create --subnet 10.10.0.0/24 mybr0 创建一个网络 并指定子网地址(默认为桥接网络)

    aa20a2b9f3ba96a80812e0141de2db8fd22c44b8e767a13b75c4b40f9f10c1b6

    [root@centos7 yum.repos.d]# docker network ls

    NETWORK ID          NAME                DRIVER              SCOPE

    3328bee523d5        bridge              bridge              local

    377db5bdc7d8        host                host                local

    aa20a2b9f3ba        mybr0              bridge              local

    3d855d221162        none                null                local

    [root@centos7 yum.repos.d]# docker run --name nginx --network mybr0  nginx:stable-alpine


     

    加入网络之后docker默认会创建iptables规则

    [root@centos7 ~]# docker network connect bridge nginx  ##将nginx容器加入bridge网络

    [root@centos7 ~]# docker container exec nginx ifconfig 

    eth0      Link encap:Ethernet  HWaddr 02:42:0A:0A:00:02 

              inet addr:10.10.0.2  Bcast:10.10.0.255  Mask:255.255.255.0

              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

              RX packets:22 errors:0 dropped:0 overruns:0 frame:0

              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:0

              RX bytes:2430 (2.3 KiB)  TX bytes:0 (0.0 B)

    eth1      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02 

              inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0

              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

              RX packets:8 errors:0 dropped:0 overruns:0 frame:0

              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:0

              RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)

    lo        Link encap:Local Loopback 

              inet addr:127.0.0.1  Mask:255.0.0.0

              UP LOOPBACK RUNNING  MTU:65536  Metric:1

              RX packets:0 errors:0 dropped:0 overruns:0 frame:0

              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

              collisions:0 txqueuelen:1

              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    docker run --name box -it --rm -v mydata busybox /bin/sh # -v选项指定在容器创建一个目录mydata此目录会关联至宿主机一个目录

    docker container inspect box  查看关联的目录


     

    进入  /var/lib/docker/volumes/var/lib/docker/volumes/8b79efb35c2ab0231d12795200625843a8d3ae00f7d7a24da896f77667c60382/_data 创建文件则会被关联至容器中mydata目录中,即使容器被删除宿主机的文件也不会删除

    docker run --name box1 -it --rm -v /data/volumes/v1:/mydata busybox #将容器与宿主机指定的目录中建立关联关系,

    docker run --name box2 -it --rm --volumes-from box1 busybox /bin/sh  #可直接复制另一个容器的卷,可共享同一个存储卷

    / # ls

    bin    dev    etc    home    mydata  proc    root    sys    tmp    usr    var

    / # ls /mydata/

    hello.txt

    使用docker file制作镜像

    mkdir workship  #在宿主机创建一个目录,在此目录中创建dockerfile文件(文件名必须为Dockerfile)

    [root@centos7 ~]# vim workship/Dockerfile

    FROM busybox:latest # 指定初始镜像在此镜像中修改容器的配置或者安装软件

    LABEL zuozhe="stephenzhong" mail="stephenzhong@mail.com" #指定此描述

    COPY index.html /data/web/html/ # 从宿主机复制index.html文件到 /data/web/html容器的目录中入目标文件不存在则会自动创建此目录

    docker image build /root/workship -t myimg:v0.1  #利用dockerfile构建新镜像 -t指定名称标签需要使用dockerfile 构建镜像,需要创建一个目录,存放Dockerfile这个文件,且复制时以dockerfile文件的父目录为起始点。

    docker file 的常见命令 

    ADD:可从互联网上下载包,并且复制到指定目录。如果是本地tar格式文件则会被复制到指定目录并且被展开

    WORKDIR :  指定容器内工作目录,可出现多次,生效范围为workdir 到下个workdir命令之间

    VOLUME:在镜像中创建一个挂载点目录,但仍然需要启动容器时指定-v 来绑定需要的自己指定某个路径来关联,否则则默认为关联至/var/lib/docker/image的目录中关联

    EXPOSE 用于为容器打开指定要监听的端口以实现与外部通信 EXPOSE 1111 /tcp|udp 即可,需要在启动容器时加上-P选项,且只能以动态方式暴露端口

    ENV:用于为镜像定义所需要的环境变量,并可被dockerfile 文件中位于其后的其他指令 ENV,ADD,COPY等 ENV key=value

    ARG:可以替换dockerfile中定义的env变量参数 ,在docker build 可直接在命令行中传值使用 --build-arg "参数" 

    RUN:在构建镜像的时候可以执行shell命令

    CMD:在构建好的镜像中,在开启容器之前使用的命令设定默认需要运行的cmd,只有最有一个cmd生效

    ENTRYPOINT:与CMD相似,如果与CMD混用,则ENTRYPOINT指定的程序,CMD指定的则为ENTRYPOINT command 的参数

    3、制作一个docker镜像,实现sshd服务、nginx服务的正常使用

    docker run -it --name=c1 centos /bin/bash #以交互式方式进入centos的镜像源

    yum install openssh-server #在容器中安装ssh服务

    ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key #生成秘钥对容器中进行


     

    ssh-keygen -#宿主机生成秘钥,并且将公钥拷贝至容器中/root/.ssh/authorized_keys文件中

    echo "root:123456"|chpasswd #在容器中生成root口令

    /usr/sbin/sshd -D #以后台方式运行sshd服务

    docker commit c1 ssh:centos #将安装好的软件制作成镜像ssh:centos


     

    测试连接成功

    ssh连接至容器,并且安装nginx服务

    docker run -p 22022:22 -d ssh:centos /usr/sbin/sshd -D #启动制作好的镜像,并且默认运行的/bin/bash替换成/usr/sbin/sshd服务。并且将22端口暴露至宿主机22022端口

    ssh 127.0.0.1 -p 22022 #远程连接至容器

    yum install nginx #

    echo "daemon off;" >> /etc/nginx/nginx.conf #以前台方式运行nginx

    cat >> /root/bin/run.sh <<EOF

    #!/bin/bash

    /usr/sbin/sshd  && /usr/sbin/nginx 

    EOF


     

    docker commit 228e3e67e9d2 nginx:centos #将制作好的镜像保存至nginx:centos镜像


     

    docker run --name nginx1 -p22022:22 -p 8080:80 -d nginx:centos /root/bin/run.sh #启动新建的容器。并且将端口暴露至宿主机端口


     

    在宿主机之外连接容器成功

     

    使用dockerfile文件建立

    vim /root/Dockerfile

    FROM ssh:centos                                                                ##FROM 从sshd:centos镜像基础上面创建

    RUN yum install nginx   -y                                              ##RUN 运行shell命令                 

    ADD run.sh  /root/bin/                                       ##ADD 相当于cp的动能将run.sh放置在目标目录/root/bin下但run.sh脚本必须在dockerfile文件的父目录中,

    WORKDIR /root/bin/                                       ##WORKDIR  这个相当于cd命令    

    RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf   && chmod 755 /usr/local/sbin/run.sh        ##修改配置文件以非守护进程启动修改脚本权限

    EXPOSE 80                                                            开放80 22 端口

    EXPOSE 22

    CMD ["/usr/local/sbin/run.sh"]                            ##CMD是要运行的命令,一个Dockerfile里面只能有一个CMD,如果有好几个,那么只会运行最后一个 如果以中括号括起来则表示不以shell -c方式运行而独立运行

    docker . build -t webdockerfile:centos #基于dockerfile文件构建镜像

    docker run -d -p 12345:22 -p 9527:80  webdockerfile:centos /usr/local/sbin/run.sh ##启动镜像

    docker image save imagename -o name.tar#将制作好的镜像变成打包文件

    docker image load imagename.tar

    4、简述lvs-nat、lvs-dr、lvs-tun、lvs-fullnat优点及使用场景

    lvs :linux virtual server 在内核中实现调度。

    ipvs。内核中实现调度功能的框架模块 ipvsadmin属于ipvs的管理端,负责生产规则发送给内核ipvs处理

    ipvs调度算法:静态算法以及动态算法

    静态算法:仅根据算法本身和请求报文特征进行调度

    rr算法:round-robin 轮询算法,调度器将请求按照顺序发往real server 

    wrr算法:weighted rr 加权轮询算法,将服务器加权,实现能者多劳的目的,性能好的机器权重高,分配的请求就多。

    sh:源地址哈希算法 将源ip地址做哈希,在对服务器数量去模,如果余出来的数字对应服务器的号码。则发往那台服务器,如果请求来自同一台ip地址,则发往同一台服务器,如果服务器有权重,则对权重取模,余几则调度到第几号服务器。

    dh:目标地址哈希算法,对同一个地址的访问则由同一台服务器代理缓存。

    动态算法:根据算法本身和请求报文特征,还要考虑后端real server的负载状态进行调度

    lc:least connections 最少连接算法,后端服务器谁的连接最少则调度给谁

    weighted lc:wlc加权最少连接。 对服务器加权。负债计算后对权重取模,权重大的负载少

    LVS类型:NAT类型,DR类型,TUN类型,FULLNAT类型

    NAT:基于NAT(多目标DNAT)方式调度,通过修改请求报文的目标ip和端口为调度算法挑选出的某后端的RS的real server ip和port;

    调度器一块网卡面向公网接受请求,一块网卡转发请求至私网的后端服务器,且在同一网段

    real 服务器网关要指向调度器的私有网卡ip

    多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;

    (1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;

    (2)请求报文和响应报文都必须经由调度器转发;调度器易于成为系统瓶颈;

    (3)支持端口映射,可修改请求报文的目标PORT;

    (4)vs必须是Linux系统,rs可以是任意系统;

    vip=调度器公网ip,dip=调度器私网ip,rip=后端服务器ip,cip=客户端ip

    DR:报文首部不变,在原ip报文外封装一层以太网帧守护(源MAC,目标MAC)完成调度,有调度算法挑选出的后端服务器ip的mac地址;所以必须在同一个以太网中。

    Direct Routing,直接路由;

    通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;

    Director和各RS都得配置使用VIP;

    (1) 确保前端路由器将目标IP为VIP的请求报文发往Director:

    (a) 在前端网关做静态绑定;

    (b) 在RS上使用arptables;

    (c) 在RS上修改内核参数以限制arp通告及应答级别;

    arp_announce

    arp_ignore

    (2) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;

    (3) RS跟Director要在同一个物理网络;

    (4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;

    (5) 不支持端口映射;

    TUN:在源ip报文之外再封装一个新IP首部,用ip报文发另外一个ip报文。新报文中源ip为调度器ip目标ip则为real ip。可以实现异地调度

    lvs-tun:

    转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP);

    (1) DIP, VIP, RIP都应该是公网地址;

    (2) RS的网关不能,也不可能指向DIP;

    (3) 请求报文要经由Director,但响应不能经由Director;

    (4) 不支持端口映射;

    (5) RS的OS得支持隧道功能;

    FULLNAT:通过修改请求报文的源ip(客户ip到调度ip)和目标ip(调度ip和real ip)完成调度

    通过同时修改请求报文的源IP地址和目标IP地址进行转发;

    CIP <--> DIP

    VIP <--> RIP

    (1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;

    (2) RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client;

    (3) 请求和响应报文都经由Director;

    (4) 支持端口映射;

    注意:此类型默认不支持;

    5、实现LVS-DT模型的集群,并采用加权轮询的算法 

    实现nat模型

    安装ip_vs的前端管理工具 ipvsadm

    yum install ipvsadm

    ##################################################################

    ipvsadm命令:

    核心功能:

    集群服务管理:增、删、改;

    集群服务的RS管理:增、删、改;

    查看:

    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

    ipvsadm -D -t|u|f service-address

    ipvsadm -C

    ipvsadm -R

    ipvsadm -S [-n]

    ipvsadm -a|e -t|u|f service-address -r server-address [options]

    ipvsadm -d -t|u|f service-address -r server-address

    ipvsadm -L|l [options]

    ipvsadm -Z [-t|u|f service-address]

    管理集群服务:增、改、删;

    增、改:

    ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

    删:

    ipvsadm -D -t|u|f service-address

    service-address:

    -t|u|f:

    -t: TCP协议的端口,VIP:TCP_PORT

    -u: UDP协议的端口,VIP:UDP_PORT

    -f:firewall MARK,是一个数字;

    [-s scheduler]:指定集群的调度算法,默认为wlc;

    管理集群上的RS:增、改、删;

    增、改:

    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

    删:

    ipvsadm -d -t|u|f service-address -r server-address

    server-address:

    rip[:port]

    选项:

    lvs类型:

    -g: gateway, dr类型

    -i: ipip, tun类型

    -m: masquerade, nat类型

    -w weight:权重;

    清空定义的所有内容:

    ipvsadm -C

    查看:

    ipvsadm -L|l [options]

    --numeric, -n:numeric output of addresses and ports

    --exact:expand numbers (display exact values)

    --connection, -c:output of current IPVS connections

    --stats:output of statistics information

    --rate :output of rate information

    保存和重载:

    ipvsadm -S = ipvsadm-save

    ipvsadm -R = ipvsadm-restore

    #########################################################################

    使用docker容器做后端real server 用宿主机当调度器实现nat

    docker image pull busybox #使用busybox镜像,内置有http进程

    docker run --name rs1 -it --network bridge -v /vols/rs1:/data/web/html busybox #启动容器绑定挂载卷,如果路径不存在则会自动创建

    echo hello world rs1 > /vols/rs1/index.html #创建测试页面

    httpd -h /data/web/html/ # 在容器内启动httpd服务。

    docker run --name rs2 -it --network bridge -v /vols/rs2/:/data/web/html busybox  #启动第二个容器,并且创建测试页面

    echo hello world rs2 > /vols/rs1/index.html #创建测试页面

    httpd -h /data/web/html/ #在容器中启动httpd服务


    宿主机访问成功

    默认开启docker之后在iptables规则中禁止转发,为了避免转发至后端服务器失败,需要设置一下docker.server文件加入ExecStart=/usr/sbin/iptables -P FORWARD ACCEPT 一行表示启动docker时开启FORWARD转发功能


     

     

    iptables -P FORWARD ACCEPT #手动启动一下转发

    ipvsadm -A -t 192.168.1.196:80 -s wrr #定义集群服务。-t表示tcp。将自己的ip作为对外提供服务。-s指定算法

    [root@centos7 ~]# ipvsadm -L -n #查看集群服务

    IP Virtual Server version 1.2.1 (size=4096)

    Prot LocalAddress:Port Scheduler Flags

      -> RemoteAddress:Port          Forward Weight ActiveConn InActConn

    TCP  192.168.1.196:80 wrr

    ipvsadm -a -t 192.168.1.196:80 -r 172.17.0.2:80 -m -w 1 #向集群192.168.1.196服务中添加后端第一台real server 172.17.0.2并且指定端口,-m表示nat类型-g表示dr-i表示tun隧道,-w指定权重为1

    ipvsadm -a -t 192.168.1.196:80 -r 172.17.0.3:80 -m -w 1


     

     

    如访问不了需要打开核心转发echo 1 > /proc/sys/net/ipv4/ip_forward

    dr类型

    使用两台虚拟机real server 地址为192.168.1.0与调度器在同以网段

    yum install httpd -y 

    echo hello world rs1/2 >> /var/www/html/index.html

    systemctl restart htt

    fconfig ens32:0 172.17.0.10 netmask 255.255.255.255 broadcast 172.17.0.10 up #在调度器上配置一个供客户端访问的vip地址,设置广播地址为本机

    #!/bin/bash 写脚本配置网卡信息及arp的报文的回应参数

    vip=172.17.0.70

    mask=255.255.255.255

    interface="lo:0"

    case $1 in

    start)

            echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

            echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

            echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

            echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

            systemctl stop firewalld

            ifconfig $interface $vip netmask $mask $vip up

            route add -host $vip dev lo:0

            ;;

    stop)

            ifconfig $interface down

            echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

            echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

            echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

            echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

            ;;

    *)

            echo "arg error"

            ;;

    esac

    [root@centos7 ~]# ipvsadm -A -t 172.17.0.10:80 -s wrr #在调度机器上设置集群

    [root@centos7 ~]# ipvsadm -a -t 172.17.0.10:80 -r 192.168.1.196 -g -w 2 #将后端机器加入集群

    [root@centos7 ~]# ipvsadm -a -t 172.17.0.10:80 -r 192.168.1.197 -g -w 1

    [root@centos7 ~]# ipvsadm -Ln

    搭建完成

    ipvsadm -E -t 172.17.0.10:80 -s sh 修改集群算法为长连接算法sh

    6、利用LVS-FW方式实现LVS的affinity应用

    防火墙标记:可将后端提供的服务打一个标签,按标签来调度请求。

    在两台real server中 定义一个虚拟主机

     vim /etc/httpd/conf.d/myhost.conf

        Listen 8080

        <VirtualHost *:80>

        ServerName 192.168.1.196

        DocumentRoot "/var/www/html"

        <Directory "/var/www1/html">

            Options none

            AllowOverride none

            Require all granted

            </Directory>

    </VirtualHost>

      <VirtualHost *:8080>

    ServerName 192.168.1.196

    DocumentRoot "/var/www2/html"

    Options none

    AllowOverride none

    Require all granted

            </Directory>

    </VirtualHost>

    mkdir -pv /www{1,2}/html  #创建网页文件目录

    echo hello worl 80 >  /www1/html/index.html

    echo hello worl 8080 >  /www2/html/index.html

    scp  /etc/httpd/conf.d/myhost.conf 192.168.1.197:/httpd/conf.d/myhost.conf #拷贝至另一台real server 中修改配置文件虚拟主机地址为192.168.1.197

    iptables -t -mangle -A  PREROUTING -d 172.17.0.10 -p tcp  -m multiport --dports 80,8080 -j MARK 7 #将请求至调度器的80,8080端口标记为7号标签

    ipvsadm -A -f 7 -s wrr #添加标记7为集群地址

    ipvsadm -a -f 7 -r 192.168.1.196 -g -w 1 #将后端地址添加至7号标签地址

    ipvsadm -a -f 7 -r 192.168.1.197 -g -w 1

    搭建完成

    redis统一访问

    yum install redis

    vim /etc/redis.conf

    bind 0.0.0.0  #修改redis的配置文件修改ip地址监听所有端口

    ipvsadm -A -t 172.17.0.10:0 -s wrr -p  定义0号端口。客户端访问80或者6379或者其他端口则会被调度到后端对应提供端口的服务

    ipvsadm -a -t 172.18.0.70:0 -r 192.168.1.196 -g -w 1

    ipvsadm -a -t 172.18.0.70:0 -r 192.168.1.197 -g -w 1

    定义两组集群,一组访问80以及8080使用长连接连接web服务

    一组集群定义固定访问redis

    ipvsadm -E -f 7 -s wrr -p 1200 定义防火墙标记,持久连接1200秒 

    ipvsadm -a -f 7 -r 192.168.1.196 -g -w 1 将real server 加入标签7

    ipvsadm -a -f 7 -r 192.168.1.197 -g -w 1

    ipvsadm -A -t 172.17.0.10:6379 -s wrr 另一组集群访问6379则会使用短连接访问redis

    ipvsadm -a -t 172.168.0.10:6379 -r 192.168.1.196 -g -w 1

    ipvsadm -a -t 172.168.0.10:6379 -r 192.168.1.197 -g -w 1

  • 相关阅读:
    Oracle存储过程(Stored Procedure)使用自定义类实体参数
    RTF格式富文本图片文本导出到Excel
    将EXCEL表格文字图片信息转成RTF格式写入数据库BLOB字段
    C# 阿拉伯数字转换为中文数字/中文数字转换为阿拉伯数字
    JavaScript操作select下拉框
    JavaScript操作浏览器一直往下滚动
    Microsoft Office 2003 Web Components 自动计数/自动求和
    SQLite递归
    WPF获取验证码倒计时
    System.UnauthorizedAccessException: 对路径“***”的访问被拒绝。
  • 原文地址:https://www.cnblogs.com/woaiyitiaochai/p/11757975.html
Copyright © 2020-2023  润新知