• LVS的DR模式测试案例<仅个人记录>


    1. 初始概念
    大家都知道LVS,是章文嵩博士创建的,所以首先推一下主站吧!http://zh.linuxvirtualserver.org/
    LVS集群分为三层结构:
    • 负载调度器(load balancer):它是在整个LVS集群对外服务器的前端机器,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
    • 服务器池(server pool):一组真正执行client请求的服务器,web,ftp,mail,dns等等
    • 共享存储(shared stored):它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。(常见有搭建NFS/CIFS服务器,但是一般只可以支持3~6个繁忙的服务器结点)
     
    分布式文件系统,常见的有AFS,GFS,Coda,Intermezzo等
     
    理解了上面的基础概念,然后再来看一下这个DR模式的体系结构图一下。
     
     
    其实,开始的时候不用想得那么复杂,可以想简单一些,其实就是简单的,先直接访问一台服务器(负载调度器)然后再决定这次的访问到底访问那台服务器(服务器池中的那台),就可以了。至于这台服务器是怎么搭建的之类的,其实并不在这个范围内的,但是一般也会带上,就是挂存储之类的了。
     
    先准备三台机器,分别是:
    1. 负载调度器
      1. 192.168.1.191
    2. 服务器池
      1. 192.168.1.189
      2. 192.168.1.213
     
    配置负载调度器:
    #yum install -y ipvsadm
    <这步包含在脚本中了,但是是每次都会进行配置,以下步骤是进行配置一次>
    #配置负载调度器服务器的虚拟IP:
    #ifconfig eth0:0 192.168.1.192 netmask 255.255.255.0 up
    上面的这个只是临时的配置的办法,具体的可以按以下操作一下:
    # cd /etc/sysconfig/network-scripts/
    # cp ifcfg-eth0 ifcfg-eth0:1
    然后再修改一下 ifcfg-eth0:1 文件中的IP地址即可
    #cd /usr/local/sbin
    #vim lvs_dr.sh
    #将下面sh的内容粘贴到sh文件中
    #! /bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    ipv=/sbin/ipvsadm
    vip=192.168.1.192
    rs1=192.168.1.213
    rs2=192.168.1.189
    ifconfig eth0:0 down
    ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
    route add -host $vip dev eth0:0
    $ipv -C
    $ipv -A -t $vip:80 -s rr
    $ipv -a -t $vip:80 -r $rs1:80 -g -w 3
    $ipv -a -t $vip:80 -r $rs2:80 -g -w 1
     
    $ipv -A -t $vip:25 -s rr
    $ipv -a -t $vip:25 -r $rs1:25 -g -w 3
    $ipv -a -t $vip:25 -r $rs2:25 -g -w 1
     
    将上面的一些地址改一下,vip是虚拟IP地址,rs1、rs2分别是服务器池中服务器的IP地址,然后下面就是配置虚拟IP及其利用ipvsadm相关的配置命令,其中可以看到有建两条,一条是80端口,一条是25端口。
    可能命令相关的会有些问题,不太懂,没有关系,下面再看一下命令详解,就清楚是为什么会这么写上面的这些命令了。其中的rr 表示相关的模式,这个下面也直接引用,我自认不比这个讲得更好,但是上面为了测试,将其设置为rr, 就是轮询模式,但是这个25端口,一般是需要进行相关的验证,所以在此建议,25或者需要一些需要验证的服务,不要设置为rr轮询模式。

    引用:ipvsadmin工具命令详解
    ipvsadm 参数详解
    
        -A (--add-service) 在内核的虚拟服务器列表中添加一条新的虚拟IP记录。也就是增加一台新的虚拟服务器。虚拟IP也就是虚拟服务器的IP地址。
        -E (--edit-service) 编辑内核虚拟服务器列表中的一条虚拟服务器记录
        -D (--delete-service) 删除内核虚拟服务器列表中的一条虚拟服务器记录
        -C (--clear) 清除内核虚拟服务器列表中的所有规则
        -R (--restore) 恢复虚拟服务器规则
        -S (--save) 保存虚拟服务器规则,输出为-R 选项可读的格式
        -a (--add-server) 在内核虚拟服务器列表的一条记录里添加一条新的Real Server记录。也就是在一个虚拟服务器中增加一台新的Real Server
        -e (--edit-server) 编辑一条虚拟服务器记录中的某条Real Server记录
        -d (--delete-server) 删除一条虚拟服务器记录中的某条Real Server记录
        -L|-l –list 显示内核中虚拟服务器列表
        -Z (--zero) 虚拟服务器列表计数器清零(清空当前的连接数量等)
        --set tcp tcpfin udp 设置连接超时值
        -t 说明虚拟服务器提供的是tcp服务,此选项后面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
        -u 说明虚拟服务器提供的是udp服务,此选项后面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
        -f  fwmark 说明是经过iptables标记过的服务类型
        -s  此选项后面跟LVS使用的调度算法,有这样几个选项: rr|wrr|lc|wlc|lblc|lblcr|dh|sh,默认的调度算法是: wlc
        -p  [timeout] 在某个Real Server上持续的服务时间。也就是说来自同一个用户的多次请求,将被同一个Real Server处理。此参数一般用于有动态请求的操作中,timeout 的默认值为360 分钟。例如:-p 600,表示持续服务时间为600分钟。
        -r 指定Real Server的IP地址,此选项后面跟格式: [real-server-ip:port]
        -g (--gatewaying) 指定LVS 的工作模式为直接路由模式(此模式是LVS 默认工作模式)
        -i (-ipip) 指定LVS 的工作模式为隧道模式
        -m (--masquerading) 指定LVS 的工作模式为NAT模式
        -w (--weight) weight 指定Real Server的权值
        -c (--connection) 显示LVS目前的连接信息 如:ipvsadm -L -c
        -L --timeout 显示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
        -L --daemon 显示同步守护进程状态,例如:ipvsadm -L –daemon
        -L  --stats 显示统计信息,例如:ipvsadm -L –stats
        -L  --rate 显示速率信息,例如:ipvsadm -L  --rate
        -L  --sort 对虚拟服务器和真实服务器排序输出,例如:ipvsadm -L --sort
    
    保存添加的虚拟ip记录和ipvsadm的规则可以使用service ipvsadm save,还可以用-S或--save。清除所有记录和规则除了使用-C,还以使用--clear。
     
    示例:
    查看记录和规则
    #ipvsadm -L -n
    选项是统计自该条转发规则生效以来的包
    #ipvsadm -L --stats
    显示速率信息
    #ipvsadm -L --rate
    View Code

    lvs中的集中调试模式
     
    1、rr(round robin:轮询。  --在服务器池中无穷的循环遍历。
    2、wrr(weighted round robin):权重轮询法。  --根据权重值,来分配请求连接,处理的请求连接数与权重值的比率一致。
    3、lc(least-connection):最少连接法。  --当请求到达director时,director查看活动和非活动的连接数量,以确定把请求分发给哪个服务器,director将集群节点目前的活动连接数量x256再加上不活动的连接数量,得到借点的开销值。最低开销值的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中)。
    4、wlc(weighted least-connection):带权重的最少连接法。  --先如lc算出集群节点的开销值,然后除以分配给其的权重值,最小值节点胜出,将入站请求分发给它。
    5、lblc(locality-based least-connection):基于本地的最少连接法。  --基于局部的最小连接,当realserver是缓存服务器的时候用的比较多。
    6、lblcr(locality-based least-connection with replication):带复制的基于局部的最小连接。  --当realserver是缓存服务器的时候用的比较多。
    7、dh(destination hashing):目标散列法
    8sh(source hashing):源散列法。  --同一个ip的客户端总是分发给同一个realserver。相当于有客户粘性,与nginx中的iphash一致。
    9sed(shortest expected delay):最短预期延迟法。  --最短延时预测(ci+1)/ui,ci是连接数,ui是权重值。在wlc方法上做啦轻微改进,这些服务使用tcp,而且当群节点在处理每个请求时保持在活动状态。计算方法:每个集群节点的的开销值是通过将活动的连接数+1计算的。然后开销值除以分配权重值,得到的就是sed值,值少的集群节点胜出。
    10、nq(never queue):永不排队法。  --没有队列,分配请求给空闲的服务器,没有空闲的服务器就找响应最快的。
    View Code

    配置服务器池中的服务器
     
    以下两条服务器的配置均一样的
    192.168.1.189
    先配置回环接口,这个也是临时配置的,如果需要,也可以直接去复制编辑ifcfg-lo的配置文件为ifcfg-lo:1一份。然后再添加一条route路由。然后再配置进行回应
    [root@bogon sbin]# cat /usr/local/sbin/lvs_dr_rs.sh
    #! /bin/bash
    vip=192.168.1.192
    ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
    route add -host $vip lo:0
    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
    [root@bogon sbin]#
     
    192.168.1.213
    [root@localhost sbin]# cat /usr/local/sbin/lvs_dr_rs.sh
    #! /bin/bash
    vip=192.168.1.192
    ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
    route add -host $vip lo:0
    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
    [root@localhost sbin]#
     

    理解arp_ignore与arp_announce参数详细
    arp响应限制arp_ignore:
    
        0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
        1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
        2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
        3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
        4-7 - 保留未使用
        8 -不回应所有(本地地址)的arp查询 
    
    arp响应限制arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
    
        0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
        1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
        2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
    
    在dr模式中我们的realserver配置arp_ignore为1:意思是不是eno16777736所在ip的请求,我不与应答。arp_announce为2:意思是我不对外公布我有出来eno16777736所在ip之外的任何ip,避免主动宣告ip使arp广播包发送过来,做出应答。
    View Code

     
    至此,配置已经配置好了,可以测试一下,看一下效果:《这是在一台测试机器上面测试的》
    我测试了两次25端口,一次端口正常,一次端口不正常。
     
    192.168.1.189提供的服务中有25:
     
    192.168.1.213服务器并没有提供25服务:
     
     
    所以至此,测试完成。这是DR+轮询模式。下面也再补上一点,telnet到192.168.1.189服务器上面服务器的IP地址显示的问题。显示的还是来源地址。
     
     
     
    谢谢,张总的博客,里面有不少干货。在此贴上相关的链接:
    还有《肖邦linux》兄弟的博客,写得很好。
    http://www.cnblogs.com/liwei0526vip/p/6370103.html
     
  • 相关阅读:
    JSON格式解析和libjson使用简介(关于cjson的使用示例)
    我还没死!!微信公众号——自媒体的营销之路
    android应用开发-从设计到实现 3-4 静态原型的状态栏
    一种绝对提高开发水平的方法
    年近30------职业回想与思考
    LeetCode Populating Next Right Pointers in Each Node
    uploadify在火狐下上传不了的解决方式,java版(Spring+SpringMVC+MyBatis)具体解决方式
    struct和typedef struct
    奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
    Floyd算法解说
  • 原文地址:https://www.cnblogs.com/drgcaosheng/p/9435294.html
Copyright © 2020-2023  润新知