设为首页 收藏本站
查看: 1910|回复: 0

[经验分享] 第33天 大规模站点构建、LVS三种模式及LXC虚拟化

[复制链接]

尚未签到

发表于 2019-1-6 11:49:42 | 显示全部楼层 |阅读模式
  一、大规模站点构建框架。
  二、LVS的基础原理及概念

  目前互联网流行的群集架构无非是 负载均衡、高可用、高性能计算这三种。
       负载均衡 LB: (应用层、传输层)
               软件: lvs(传输层)  haproxy, nginx (应用层)
               硬件: F5 BIG-IP、 Citrix Netscaler、A10 A10、Array、 Redware
        高可用 HA: heartbeat、keepalived、corosync + pacemaker、RHCS: cman + rgmanager、
        高性能计算HP:hadoop

        LVS: Linux Virtual Server 中国淘宝网章文嵩博士研发。
             四层路由,四层交换:根据目标地址和目标端口实现请求转发,lvs工作在内核中并监听在input链上,访问请求到达本机后prerouting转到input链。lvs查看是否是自己监听的ip:port,如果是就强行转发到postrouting把访问请求转发到后台真实主机上。
             iptables/netfilter
                     netfiler: PREROUTING --> INPUT --> FORWARD --> OUTPUT --> POSTROUTING
             lvs: ipvsadm/ipvs
                     ipvs: netfilter
             集群服务:tcp、udp。IP:PORT

  
注:lvs的后端可以采用轮询机制、也可以指定条件判断后端服务器的忙闲来选择分配后端服务器,而后端服务器down机(或开机重新上线),lvs是否还会向故障服务器分配任务,这就需要lvs实时监测后端服务器的健康状况,而lvs本身不具备监测后端健康状况的功能,故一般lvs都搭配keepalive的使用,keepalived有监测后端服务器健康状况的功能弥补了lvs的缺陷,也提供lvs的高可用服务。


lvs其实是由2段代码组成,一段工作在内核空间叫ipvs,是真正调度的代码,另一段工作在用户空间叫ipvsadm,负责为lpvs内核框架来编写规则,定义谁是集群服务、有哪些real server,所以我们用ipvsadm编写规则定义集群服务告诉lvs用哪些规则去调度real server。
          LVS的术语:
                  Director、
Real server、VIP:Virtual IP、 DIP: Director IP 、 RIP: Real Server IP、CIP:Client IP

          LVS的类型:
                  lvs-nat: Network Address Translation(网络地址转换)
                  lvs-dr:   Direct Routing(直接路由)
                  lvs-tun: Tunneling(隧道)
           NAT类型的特性:
                  RS应用使用私有地址;RS的网关必须指向DIP,RIP和DIP必须在同一个网段内;
                  请求和响应都要经过Director;高负载场景中,Director易成为性能瓶颈;
                  支持端口映射;
                  RS可以使用任意OS;
                  最少2块网卡
          DR
类型的特性:
                    保证前端路由将目标地址为VIP的报文统统发往Directory,而不能是RS;
                  修改RS上内核参数,将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求;
                  RS可以使用私有地址;但也可以使用公网地址,此时可通过互联网通过RIP对其直接访问;
                  RS跟Directory必须在同一物理网络中;
                  请求报文经由Director,但响应报文必须不能经过Director;
                  不支持端口映射;
                  RS可以是大多数常见的OS;
                  RS的网关绝不允许指向DIP;
                  一块网卡即可
          TUN类型的特性:
                  RIP、VIP、DIP全部是公网地址;
                  RS的网关不会也不可能指向DIP;
                  请求报文经由Director,但响应报文必须不能经过Director;
                  不支持端口映射;
                  RS的OS必须支持隧道功能;

       

三、lvs调度算法及NAT实现
lvs scheduler(调度):
        查看调度算法# grep -i 'VS' /boot/config-VERSION  (10种)
        静态方法:仅根据调度算法本身进行调度,不考虑后端服务器负载。
                rr: round robin,轮流,轮询,轮叫
                wrr: weighted round robin, 加权轮询
                sh: source hashing,源地址hash,表示来源于同一个CIP的请求将始终被定向至同一个RS;能实现SESSION保持;
                dh: destination hashing, 目标地址hash,
        动态方法:根据算法及各RS当前的负载状况进行调度
                lc: least connection,最少连接
                Overhead=Active*256+Inactive
                wlc: weighted lc
                Overhead=(Active*256+Inactive)/weight
                A: 1,
                B: 5,
                sed: shortest expection delay
                Overhead=(Active+1)*256/weight
                1: B
                2: B
                3: B
                4: B
                nq: Never Queue
                lblc: Locality-Based Least Connection(基于本地的最少链接)
                lblcr:Replicated lblc(带复制的本地最少链接)
配置director:
    1)定义集群服务
    2)为集群添加各RS
    例如:1、  2台Real Sserver分别定义网页启动httpd服务,配置RIP(10.0.0.8\10.0.0.9),网关指向DIP(10.0.0.1)
              2、  配置调度器双网卡(172.16.100.7\10.0.0.1)安装 ipvsadm(yum -y install ipvsadm)
    ipvsadm:   #ipvsadm -h 查看命令
            (1)添加一个集群服务:
            ipvsadm -A|E -t|u|f service-address [-s scheduler]
                    service-address:
                    -t|u: VIP:Port
                    -f: #
                    说明:-A|E 添加|修改群集服务;-t|u|f :tcp|udp|firewall标记;[-s scheduler]调度算法
                    如: ipvsadm -A -t 172.16.100.7:80 -s rr
            (2)向一个已经存在集群服务添加一个RS:
                    ipvsadm -a|e -t|u|f service-address -r server-address [options]
                        -r RS-ADDR
                        -w weight
                        --gatewaying   -g       gatewaying (direct routing) (default)
                        --ipip         -i       ipip encapsulation (tunneling)
                        --masquerading -m       masquerading (NAT)
                        说明: -a|e 添加修改real server;-r 指定real server
                        如:ipvsadm -a -t 172.16.100.7:80 -r 10.0.0.8 -m
                                ipvsadm -a -t 172.16.100.7:80 -r 10.0.0.9 -m
            好了,客户端172.16.100.8 访问172.16.100.7 测试,访问无响应,打开转发功能命令如下:
            #echo 1 > /proc/sys/net/ipv4/ip_forward  再试OK!
     查看已经定义的集群服务及RS:
             ipvsadm -L -n
             -c: 查看各连接
             --stats: 统计数据
             --rate: 速率
             --exact: 精确值
    修改加权轮询
            #ipvsadm -E -t 172.16.100.7:80 -s wrr
            #ipvsadm -L -n
            #ipvsadm -e -t 172.16.100.7:80 -r 10.0.0.8 -m -w 2
            #ipvsadm -L -n
  从集群服务中删除RS:
         ipvsadm -d -t|u|f service-address -r server-address
     删除集群服务:
         ipvsadm -D -t|u|f service-address
     清空所有的集群服务:
         ipvsadm -C
     保存集群服务定义:
         ipvsadm -S > /path/to/some_rule_file
         ipvsadm-save > /path/to/some_rule_file
     让规则文件中的规则生效:
         ipvsadm -R < /path/from/some_rule_file
         ipvsadm-restore < /path/from/some_rule_file
    例如:ipvsadm -S 保存规则后,重启服务(service ipvsadm save,默认保存至/etc/sysconfig/ipvsadm)
     #ipvsadm -S > /etc/sysconfig/ipvsadm.2 保存
     #ipvsadm -C 删除集群,查看 #ipvsadm -L -n
     #ipvsadm -R < /etc/sysconfig/ipvsadm.2 恢复集群


四、LVS_DR模式及lxc虚拟机
Session持久机制:
     1、session绑定:始终将来自同一个源IP的请求定向至同一个RS;没有容错能力;有损均衡效果;
     2、session复制:在RS之间同步session,每个RS拥有集群中的所有的session;对规模集群不适用;
     3、session服务器:利用单独部署的服务器来统一管理集群中的session;
     博客:lvs-nat部署discuz;
RS: 配置内核参数
         arp_ignore: 如何响应接收ARP地址请求;默认0;1表示仅在请求的地址配置在请求报文的接口进行响应;
         arp_announce: 如何通告本地地址;默认0;2表示仅通过网络直连的接口的地址;
RS:首先配置内核参数
         配置VIP时使用:
         ifconfig lo:0 VIP netmask 255.255.255.255 broadcast VIP up
         route add -host VIP dev lo:0


Director脚本:
#!/bin/bash
# LVS script for VS/DR
. /etc/rc.d/init.d/functions
VIP=192.168.0.210
RIP1=192.168.0.221
RIP2=192.168.0.222
PORT=80
case "$1" in
start)           
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
/sbin/ipvsadm -C
# Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe, we will use the round-robin scheduling method.
# In production, however, you should use a weighted, dynamic scheduling method.
/sbin/ipvsadm -A -t $VIP:80 -s wlc
# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
# Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
/sbin/ifconfig eth0:1 down
/sbin/route del $VIP
/bin/rm -f /var/lock/subsys/ipvsadm
echo "ipvs is stopped..."
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ]; then
   echo "ipvsadm is stopped ..."
else
   echo "ipvs is running ..."
   ipvsadm -L -n
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
;;
esac


RealServer脚本:
#!/bin/bash
# Script to start LVS DR real server.
# description: LVS DR real server
.  /etc/rc.d/init.d/functions
VIP=192.168.0.219
host=`/bin/hostname`
case "$1" in
start)
      # Start LVS-DR real server on this machine.
       /sbin/ifconfig lo down
       /sbin/ifconfig lo up
       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


       /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
       /sbin/route add -host $VIP dev lo:0
;;
stop)
       # Stop LVS-DR real server loopback device(s).
       /sbin/ifconfig lo:0 down
       echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
       echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
       echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
       echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
       # Status of LVS-DR real server.
       islothere=`/sbin/ifconfig lo:0 | grep $VIP`
       isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
       if [ ! "$islothere" -o ! "isrothere" ];then
           # Either the route or the lo:0 device
           # not found.
           echo "LVS-DR real server Stopped."
       else
           echo "LVS-DR real server Running."
       fi
;;
*)
           # Invalid entry.
           echo "$0: Usage: $0 {start|status|stop}"
           exit 1
;;
esac


在CentOS 6.5上使用lxc虚拟机(为LVS提供轻量级实验环境):
        原理:宿主机网卡变成交换机,并增加一个虚拟网卡和外部通讯
     1 解决依赖关系
        #service NetworkManager status   #确保NetworkManager服务关闭
        #service network status  #保证network服务开启
        # yum install libcgroup
        # service cgconfig start
    2 提供虚拟网桥接口
        在/etc/sysconfig/network-scripts目录中新建名为ifcfg-br0的配置文件,其内容如下:
        DEVICE=br0
        TYPE=Bridge
        BOOTPROTO=static
        IPADDR=172.16.100.7
        NETMASK=255.255.0.0
        GATEWAY=172.16.0.1
        ONBOOT=yes
        DELAY=0
        NM_CONTROLLED=no
接下将桥接的物理网卡(假设为eth0)关联至前面定义的桥接设备,编辑/etc/sysconfig/network-script/ifcfg-eth0为类似如下内容:
        DEVICE="eth0"
        BOOTPROTO="static"
        NM_CONTROLLED="no"
        ONBOOT="yes"
        TYPE="Ethernet"
        BRIDGE=br0
上述步骤无误后重启network服务即可。另外,还有其它简单的方式来实现桥接设备的创建,例如使用brctl或virsh等,这里不再详述。
    3 安装lxc
    epel源中提供的lxc版本为0.9.0,其未带centos系统模板。因此,这里选择使用目前最新的lxc版本1.0.5。编译安装过程较为简单,按其源码目录中的INSTALL文档中的提示进行即可。我们事先经过测试后已经将lxc-1.0.5制作成了适用于centos 6 x86_64平台的rpm包(通过附件下载),因此,这里将直接使用rpm命令安装。
        # yum install lxc-1.0.5-1.el6.x86_64.rpm  lxc-libs-1.0.5-1.el6.x86_64.rpm
        # rpm -ql lxc
        #yum install libcgroup -y
        #service cgconfig stat
        #chkconfig cfconfig on
    4 检查lxc运行环境
    # lxc-checkconfig
    Kernel configuration not found at /proc/config.gz; searching...
    Kernel configuration found at /boot/config-2.6.32-431.el6.x86_64
    --- Namespaces ---
      Namespaces: enabled  
            ………………………………

        --- Control groups ---
        …………………………

        --- Misc ---
        Veth pair device: enabled
        …………………………
        Note : Before booting a new kernel, you can check its configuration
        usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
    5 创建centos虚拟机
    lxc为创建虚拟机提供了模板文件,它们位于/usr/share/lxc/templates目录中。其中的lxc-centos即为创建lxc centos系统的模板。
    另外,lxc为虚拟机提供的默认配置文件为/etc/lxc/default.conf,其中使用的桥接接口名称为virbr0,此与前面的创建的接口名称不一致,因此需要作出修改。当然,也可以将此文件复制之后进行修改,并以为作为接下来的要创建的centos虚拟机的专用配置文件。修改后的default.conf如下所示。
        lxc.network.type = veth
        lxc.network.link = br0
        lxc.network.flags = up
创建虚拟机centos:
        # lxc-create -n centos -t /usr/share/lxc/templates/lxc-centos
        Host CPE ID from /etc/system-release-cpe: cpe:/o:centos:linux:6:GA
        Checking cache download in /var/cache/lxc/centos/x86_64/6/rootfs ...
    …………
    Complete!
    Download complete.
    Expiring password for user root.
    passwd: Success
    Container rootfs and config have been created.
    Edit the config file to check/enable networking setup.
    The temporary root password is stored in:
           '/var/lib/lxc/centos/tmp_root_pass'
    The root password is set up as expired and will require it to be changed
    at first login, which you should do as soon as possible.  If you lose the
    root password or wish to change it without starting the container, you
    can change it from the host by running the following command (which will
    also reset the expired flag):
           chroot /var/lib/lxc/centos/rootfs passwd
    上述输出内容表示系统安装已经成功,可由lxc-start命令启动了。另外,目标系统的root用户的默认密码在/var/lib/lxc/centos/tmp_root_pass文件中。
6 启动目标系统centos:
    启动lxc虚拟机需要使用lxc-start命令。此命令的常用选项有
        -n NAME:要启动的虚拟机的名称
        -d: 在后台运行此虚拟机
        -o /path/to/somefile: 日志文件的保存位置
        -l: 日志级别
    简单的启动命令如下所示:
    # lxc-start -n centos
启动后可直接连接至目标系统的控制台,并在显示登录提示符后登录系统即可。需要注意的是,root用户的默认密码已经被设置为过期,因此第一次登录时需要修改密码后方可使用
也可以在lxc-start的命令后面附加-d选项,让系统运行于后台。如果要停止虚拟机,使用lxc-stop命令即可。
  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-659937-1-1.html 上篇帖子: LVS 的DR直接路由实现负载均衡并实现NAS(网络附加储存技术) 下篇帖子: Linux服务器集群系统: LVS集群中的IP负载均衡技术
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表