zoukankan      html  css  js  c++  java
  • Linux操作系统下的集群原理及实战经历

    集群Linux上的集群解决方案

      集群系统(Cluster)主要解决下面几个问题:

      高可靠性(HA)

      利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。

     高性能计算(HP)

      即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析,化学分析等。

      负载平衡

      即把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。

      基于Linux的集群解决方案可谓百花齐放。在实际应用中,最常见的情况是利用集群解决负载平衡问题,比如用于提供WWW服务。在这里主要展示如何使用LVS(Linux Virtial Server)来实现实用的WWW负载平衡集群系统。

      二 LVS简介

      LVS是章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,比如RedHat的Piranha,TurboLinux公司的Turbo Cluster等,都是基于LVS的核心代码的。在现实的应用中,LVS得到了大量的部署,请参考http://www.linuxvirtualserver.org/deployment.html。关于Linux LVS的工作原理和更详细的信息,请参考http://www.linuxvirtualserver.org。

      三 LVS配置实例

      通过Linux LVS,实现WWW,Telnet服务的负载平衡。这里实现Telnet集群服务仅为了测试上的方便。

      LVS有三种负载平衡方式,NAT(Network Address Translation),DR(Direct Routing),IP Tunneling。其中,最为常用的是DR方式,因此这里只说明DR(Direct Routing)方式的LVS负载平衡。为测试方便,4台机器处于同一网段内,通过一交换机或者集线器相连。实际的应用中,最好能将虚拟服务器vs1和真实服务器rs1, rs2置于于不同的网段上,即提高了性能,也加强了整个集群系统的安全性。

      服务器的软硬件配置

      首先说明,虽然本文的测试环境中用的是3台相同配置的服务器,但LVS并不要求集群中的服务器规格划一,相反,可以根据服务器的不同配置和负载情况,调整负载分配策略,充分利用集群环境中的每一台服务器。

      这3台服务器中,vs1作为虚拟服务器(即负载平衡服务器),负责将用户的访问请求转发到集群内部的rs1,rs2,然后由rs1,rs2分别处理。client为客户端测试机器,可以为任意操作系统。 4台服务器的操作系统和网络配置分别为:

    vs1: RedHat 6.2, Kernel 2.2.19  
    vs1: eth0 192.168.0.1  
    vs1: eth0:101 192.168.0.101  
    rs1: RedHat 6.2, Kernel 2.2.14  
    rs1: eth0 192.168.0.3  
    rs1: dummy0 192.168.0.101  
    rs2: RedHat 6.2, Kernel 2.2.14  
    rs2: eth0 192.168.0.4  
    rs2: dummy0 192.168.0.101  
    client: Windows 2000  
    client: eth0 192.168.0.200

      其中,192.168.0.101是允许用户访问的IP。
    虚拟服务器集群配置

      大部分的集群配置工作都在虚拟服务器vs1上面,需要下面的几个步骤:

      重新编译内核。

      首先,下载最新的Linux内核,版本号为2.2.19,下载地址为:http://www.kernel.org/,解压缩后置于/usr/src/linux目录下。

      其次需要下载LVS的内核补丁,地址为:http://www.linuxvirtualserver.org/software/ipvs-1.0.6-2.2.19.tar.gz。这里注意,如果你用的Linux内核不是2.2.19版本的,请下载相应版本的LVS内核补丁。将ipvs-1.0.6-2.2.19.tar.gz解压缩后置于/usr/src/linux目录下。

      然后,对内核打补丁,如下操作:

    [root@vs2 /root]# cd /usr/src/linux  
    [root@vs2 linux]# patch -p1 < ipvs-1.0.6-2.2.19/ipvs-1.0.6-2.2.19.  
    patch

      下面就是重新配置和编译Linux的内核。特别注意以下选项:

    1 Code maturity level options--->  
    * [*]Prompt for development and/or incomplete code/drivers  
    2 Networking部分:  
    [*] Kernel/User netlink socket  
    [*] Routing messages  
    <*> Netlink device emulation  
    * [*] Network firewalls  
    [*] Socket Filtering  
    <*> Unix domain sockets  
    * [*] TCP/IP networking  
    [*] IP: multicasting  
    [*] IP: advanced router  
    [ ] IP: policy routing  
    [ ] IP: equal cost multipath  
    [ ] IP: use TOS value as routing key  
    [ ] IP: verbose route monitoring  
    [ ] IP: large routing tables  
    [ ] IP: kernel level autoconfiguration  
    * [*] IP: firewalling  
    [ ] IP: firewall packet netlink device  
    * [*] IP: transparent proxy support  
    * [*] IP: masquerading  
    --- Protocol-specific masquerading support will be built as modules.  
    * [*] IP: ICMP masquerading  
    --- Protocol-specific masquerading support will be built as modules.  
    * [*] IP: masquerading special modules support  
    * IP: ipautofw masq support (EXPERIMENTAL)(NEW)  
    * IP: ipportfw masq support (EXPERIMENTAL)(NEW)  
    * IP: ip fwmark masq-forwarding support (EXPERIMENTAL)(NEW)  
    * [*] IP: masquerading virtual server support (EXPERIMENTAL)(NEW)  
    [*] IP Virtual Server debugging (NEW) <--最好选择此项,以便观察LVS的调试信息  
    * (12) IP masquerading VS table size (the Nth power of 2) (NEW)  
    * IPVS: round-robin scheduling (NEW)  
    * IPVS: weighted round-robin scheduling (NEW)  
    * IPVS: least-connection scheduling (NEW)  
    * IPVS: weighted least-connection scheduling (NEW)  
    * IPVS: locality-based least-connection scheduling (NEW)  
    * IPVS: locality-based least-connection with replication scheduling  
    (NEW)  
    * [*] IP: optimize as router not host  
    * IP: tunneling  
    IP: GRE tunnels over IP  
    [*] IP: broadcast GRE over IP  
    [*] IP: multicast routing  
    [*] IP: PIM-SM version 1 support  
    [*] IP: PIM-SM version 2 support  
    * [*] IP: aliasing support  
    [ ] IP: ARP daemon support (EXPERIMENTAL)  
    * [*] IP: TCP syncookie support (not enabled per default)  
    --- (it is safe to leave these untouched)  
    < > IP: Reverse ARP  
    [*] IP: Allow large windows (not recommended if <16Mb of memory)  
    < > The IPv6 protocol (EXPERIMENTAL)
    上面,带*号的为必选项。然后就是常规的编译内核过程,不再赘述。

      在这里要注意一点:如果你使用的是RedHat自带的内核或者从RedHat下载的内核版本,已经预先打好了LVS的补丁。这可以通过查看/usr/src/linux/net/目录下有没有几个ipvs开头的文件来判断:如果有,则说明已经打过补丁。

      编写LVS配置文件,实例中的配置文件如下:

    #lvs_dr.conf (C) Joseph Mack mack@ncifcrf.gov  
    LVS_TYPE=VS_DR  
    INITIAL_STATE=on  
    VIP=eth0:101 192.168.0.101 255.255.255.0 192.168.0.0  
    DIRECTOR_INSIDEIP=eth0 192.168.0.1 192.168.0.0 255.255.255.0 192.168.0. 255  
    SERVICE=t telnet rr rs1:telnet rs2:telnet  
    SERVICE=t www rr rs1:www rs2:www  
    SERVER_VIP_DEVICE=dummy0  
    SERVER_NET_DEVICE=eth0  
    #----------end lvs_dr.conf------------------------------------

      将该文件置于/etc/lvs目录下。

      使用LVS的配置脚本产生lvs.conf文件。该配置脚本可以从http://www.linuxvirtualserver.org/Joseph.Mack/configure-lvs_0.8.tar.gz 单独下载,在ipvs-1.0.6-2.2.19.tar.gz包中也有包含脚本configure的使用方法:

    [root@vs2 lvs]# configure lvs.conf

      这样会产生几个配置文件,这里我们只使用其中的rc.lvs_dr文件。修改/etc/rc.d/init.d/rc.local,增加如下几行:

    echo 1 > /proc/sys/net/ipv4/ip_forward  
    echo 1 > /proc/sys/net/ipv4/ip_always_defrag  
    # 显示最多调试信息  
    echo 10 > /proc/sys/net/ipv4/vs/debug_level

      配置NFS服务。这一步仅仅是为了方便管理,不是必须的步骤。假设配置文件lvs.conf文件放在/etc/lvs目录下,则/etc/exports文件的内容为:

    /etc/lvs ro(rs1,rs2)

      然后使用exportfs命令输出这个目录:

    [root@vs2 lvs]# exportfs

      如果遇到什么麻烦,可以尝试:

    [root@vs2 lvs]# /etc/rc.d/init.d/nfs restart  
    [root@vs2 lvs]# exportfs

      这样,各个real server可以通过NFS获得rc.lvs_dr文件,方便了集群的配置:你每次修改lvs.conf中的配置选项,都可以即可反映在rs1,rs2的相应目录里。 修改/etc/syslogd.conf,增加如下一行: kern.* /var/log/kernel_log。这样,LVS的一些调试信息就会写入/var/log/kernel_log文件中。

    Real Server的配置

      Real Server的配置相对简单,主要是是以下几点:

      配置telnetWWW服务。telnet服务没有需要特别注意的事项,但是对于www服务,需要修改httpd.conf文件,使得apache在虚拟服务器ip地址上监听,如下所示:

    Listen 192.168.0.101:80

      关闭Real Server上dummy0的arp请求响应能力。这是必须的,具体原因请参见 ARP problem in LVS/TUN and LVS/DR关闭dummy0的arp响应的方式有多种,比较简单地方法是,修改/etc/rc.d/rc.local文件,增加如下几行:

    echo 1 > /proc/sys/net/ipv4/conf/all/hidden  
    ifconfig dummy0 up  
    ifconfig dummy0 192.168.0.101 netmask 255.255.255.0 broadcast 192.168. 0.0 up  
    echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden  
    再次修改/etc/rc.d/rc.local,增加如下一行:(可以和步骤2合并)  
    echo 1 > /proc/sys/net/ipv4/ip_forward

      四 LVS的测试

      好了,经过了上面的配置步骤,现在可以测试LVS了,步骤如下:

      分别在vs1,rs1,rs2上运行/etc/lvs/rc.lvs_dr。注意,rs1,rs2上面的/etc/lvs目录是vs2输出的。如果您的NFS配置没有成功,也可以把vs1上/etc/lvs/rc.lvs_dr复制到rs1,rs2上,然后分别运行。确保rs1,rs2上面的apache已经启动并且允许telnet。

      然后从client运行telnet 192.168.0.101,如果登录后看到如下输出就说明集群已经开始工作了。(假设以guest用户身份登录)

      [guest@rs1 guest]$-----------说明已经登录到服务器rs1上。

      再开启一个telnet窗口,登录后会发现系统提示变为:

      [guest@rs2 guest]$-----------说明已经登录到服务器rs2上。

      然后在vs2上运行如下命令:

    [root@vs2 /root]ipvsadm

      运行结果应该为:

    IP Virtual Server version 1.0.6 (size=4096)  
    Prot LocalAddress:Port Scheduler Flags  
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn  
    TCP 192.168.0.101:telnet rr  
    -> rs2:telnet Route 1 1 0  
    -> rs1:telnet Route 1 1 0  
    TCP 192.168.0.101:www rr  
    -> rs2:www Route 1 0 0  
    -> rs1:www Route 1 0 0

      至此已经验证telnet的LVS正常。然后测试一下WWW是否正常:用你的浏览器查看http://192.168.0.101/是否有什么变化?为了更明确的区别响应来自那个Real Server,可以在rs1,rs2上面分别放置如下的测试页面(test.html):

    我是real server #1 or #2

      然后刷新几次页面(http://192.168.0.101/test.html),如果你看到“我是real server #1”和“我是real server #2”交替出现,说明www的LVS系统已经正常工作了。

      但是由于Internet Explore 或者Netscape本身的缓存机制,你也许总是只能看到其中的一个。不过通过ipvsadm还是可以看出,页面请求已经分配到两个Real Server上了,如下所示:

    IP Virtual Server version 1.0.6 (size=4096) 
    Prot LocalAddress:Port Scheduler Flags 
    -> RemoteAddress:Port       Forward Weight ActiveConn InActConn 
    TCP 192.168.0.101:telnet rr 
    -> rs2:telnet Route 1 0 0 
    -> rs1:telnet Route 1 0 0 
    TCP 192.168.0.101:www rr 
    -> rs2:www Route 1 0 5 
    -> rs1:www Route 1 0 4

      或者,可以采用linux的lynx作为测试客户端,效果更好一些。如下运行命令:

    [root@client /root]while true; do lynx -dump  
    http://10.64.1.56/test.html; sleep 1; done

      这样,每隔1秒钟“我是realserver #1”和“我是realserver #2”就交替出现一次,清楚地表明响应分别来自两个不同的Real Server。

  • 相关阅读:
    系统维护相关问题
    Python环境维护
    哈希表解决字符串问题
    论文笔记二:《A Tutoral on Spectral Clustering》
    论文笔记之哈希学习比较--《Supervised Hashing with Kernels》《Towards Optimal Binary Code Learning via Ordinal Embedding》《Top Rank Supervised Binary Coding for Visual Search》
    Java中String、StringBuffer、StringBuilder的比较与源 代码分析
    浙大pat1040 Longest Symmetric String(25 分)
    浙大pat1039 Course List for Student(25 分)
    浙大pat---1036 Boys vs Girls (25)
    百炼oj-4151:电影节
  • 原文地址:https://www.cnblogs.com/encounter/p/2189166.html
Copyright © 2011-2022 走看看