• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • lvs安裝手冊

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    lvs安裝手冊 RedHat 8.0/9.0 LVS安裝手冊 來源:linuxaid 作者:apile(apilecheng@yahoo.com.tw) 完成日期:2003/08/04 附注:歡迎傳閱轉寄,并希望可以保留原作者名字 1、前言: RedHat在 9.0以后,就將ipvsadm這些套件去除,因此如果想使用LVS(Linux Virtu
    lvs安裝手冊

    RedHat 8.0/9.0 LVS安裝手冊
     
    來源:linuxaid

    作者:apile(apilecheng@yahoo.com.tw)
    完成日期:2003/08/04
    附注:歡迎傳閱轉寄,并希望可以保留原作者名字

    1、前言:

      RedHat在 9.0以后,就將ipvsadm這些套件去除,因此如果想使用LVS(Linux Virtual Server),就得自己重新編譯核心(kernel),而編譯核心是一件窮極無聊的事情,不管是make menuconfig、make xconfig、make config,觸目所及都是一堆不是很懂的驅動程序,本文利用一些技巧,將compile kernel變得比較簡單,但是如果你有一些不常見的硬設備,請自己想辦法Compile,或者利用linux的load module功能自行將該硬件的驅動程序加載進kernel。

      Redhat 8.0選擇完整安裝時,預設已經會支持ipvs,但是他卻不支持-NOARP這個網絡卡設定選項,因為沒有這個-NOARP選項,則LVS無法在同一個網段內設定LVS/DR與LVS/IP Tunnel,會遭遇ARP Problem,所以只好重新編譯核心,順便將kernel更新至比較新的版本,另外RedHat 8.0上比較新的核心,預設不支持ipvs。

      首先簡單介紹一下LVS到底是什么東西,其實他是一種叢集(Cluster)的技術,透過支持IPVS的kernel,來達到LVS/Direct Routing (DR)、LVS/IP Tunnel、LVS/NAT的功能,詳細內容請看LVS官方網站。而這些技術有什么用呢?其實就是拿來當成High Availability軟件,Unix大廠SUN、HP、IBM、SCO等等都有提供這類的軟件,但是都要很多錢,而我們沒什么錢,只好用Open Source,而Open Source的好處,就是可以達到類似的功能,但不需要花錢。?

      以下安裝內容主要參考下述網頁,非常感謝這些提供基本知識的人,如果你不清楚LVS是什么,看看下面文章,可以有個頭緒順便練練基本的功夫,以免后面的內容你完全不曉得我再寫什么。

    http://linux.vbird.idv.tw/ 鳥哥的Linux私房菜(Linux基本常識)
    http://www.adj.idv.tw/server/linux_lvs.php 在RedHat 7.3上架設LVS
    http://www.linuxvirtualserver.org/ LVS的官方網站
    http://www.linuxaid.com.cn/articles/2/0/202490941.shtml LinuxAid說明(上)
    http://www.linuxaid.com.cn/articles/8/0/807154206.shtml LinuxAid說明(下)
    http://mail.incredimail.com/howto/lvs/install/ Alex的網站,重要的patch都從這兒抓取

    附帶一提:

      如果你參考Linux Virtual Server的官方網站上的作法,我在REDHAT 8上編譯了十多次的kernel也作不出來,后來發現是因為RedHat在kernel-2.4.20-19.8的source中將ipvs的程序代碼拿掉,且CIPE版本也不對。

      目前最適合拿來當Linux Virtual Server的RedHat版本為7.3,其它的都不是很stable,有興趣可以用google查查看。

      下列方法適用于2.4的kernel,主要在Redhat 8.0上使用,但是RedHat 9.0應該也差不多。

    PART I :編譯核心

    1、首先安裝RedHat 8.0

      選擇全部安裝。關閉一些不用的Service與并將vsftp激活。即著手進行kernel的重新編譯,此時的kernel版本為2.4.18-18.4。

    2、下載oprofile

      首先上google找尋oprofile版本要大于0.4的,因為在安裝kernel 2.4.20-18.8.rpm的時候會需要這個rpm,如果找不到rpm,就搜尋oprofile-0.4-xx.src.rpm。

    2.1、安裝oprofile


    # rpm -ivh oprofile-0.4-44.8.1.src.rpm
    # cd /usr/src/redhat/SPECS
    # vi oprofile.spec 將(BuildPreReq: kernel-source >=2.4.20)用# mark起來
    # rpmbuild -bb oprofile.spec
    # cd /usr/src/redhat/RPMS/i386/
    # rpm -ivh oprofile-0.4-44.8.1.i386.rpm(安裝oprofile)



    3、安裝內核

      安裝kernel 2.4.20-18.8的kernel,上http://ftp.nsysu.edu.tw/Linux/RedHat/updates/抓取kernel-2.4.20-18.8的rpm核心,因為我測試環境有三部,一部是我的notebook (P4 CPU、512MB RAM),一部是有4GB RAM與兩顆CPU(PIII 700)的機器,一部是有1GB RAM與兩顆有hyper threading P4 CPU的計算機。所以我總共抓了三個RPM,分別是


    kernel-2.4.20-18.8.i686.rpm 02-Jun-2003 23:34 13.3M
    kernel-bigmem-2.4.20-18.8.i686.rpm 02-Jun-2003 23:34 13.9M
    kernel-smp-2.4.20-18.8.i686.rpm 02-Jun-2003 23:34 13.9M



      然后在各部機器上先安裝上述RPM:若不清楚倒底要用那個,可以用uname -r


    2.4.20-18.8bigmem (就用bigmem的版本)
    #rpm -ivh kernel-2.4.20-18.8.i686.rpm



      檢查grub(/boot/grub/grub.conf)或lilo(/etc/lilo.conf)的設定是不是正確?

      如果正確,就重新激活機器(shutdown -i 6 now),用2.4.20-18.8開機,檢查有無錯誤。

    4、安裝內核源碼

      然后上http://www.redhat.com 抓取kernel-source-2.4.20-19.8.i386.rpm這個kernel的核心。利用


    # rpm -ivh kernel-source-2.4.20-19.8.i386.rpm



      安裝,他會建立兩個目錄:


    /usr/src/linux-2.4.20-19.8 (directory)
    /usr/src/linux-2.4->/usr/src/linux-2.4.20-19.8 (Symbolic Link)



      但是我們還要另外建立一個symbolic link


    #ln -s ./linux-2.4.20-19.8 ./linux



      因為等會要上ipvs patch的時候,他一定會link到/usr/src/linux這個目錄,所以要另外建立這個Soft Link。

    5、因為我們先前有安裝過2.4.20-18.8的rpm文件,所以在/boot目錄下,可以找到


    -rw-r--r-- 1 root root 44764 5月 29 19:49 config-2.4.20-18.8



      這個檔案,將這個檔案copy至/usr/src/linux/.config


    # cp /boot/config-2.4.20-18.8 /usr/src/linux/.config



      因為等會我要利用make oldconfig去作…他default會去讀取/usr/src/linux/.config這個file

      注意:這就是我所說的技巧,因為我先前用make config、make menuconfig選取那些modules,但是因為數量實在太多,看得眼花撩亂,而且選完不知道為什么總有一兩地方有問題無法compile成功,無意間被我發現2.4.20-18.8的config檔案與2.4.20-19.8的config檔案一模一樣,加上kernel的README中又有寫make oldconfig會去讀取,.config這個檔案,所以我才會想到用這個方法或許可行,因為2.4.20-18.8都可以正常激活機器了,不可能用相同的config 檔案,2.4.20-19.8就無法激活。其它版本,應該也差不多,先安裝一個差不多版本的kernel,再用他的config去重新compile支持ipvs的kernel。

    6、給kernel的source file上Patch:

    6.1、使用LVS的內核補丁

      上Linux Virtual Server的網頁抓取kernel-2.4.0-20的PATCH檔案下來,我是抓下面這個檔案:

    The IPVS Netfilter module for kernel 2.4 - Version 1.0.9 - May 21, 2003 (http://www.linuxvirtualserver.org/software/kernel-2.4/ipvs-1.0.9.tar.gz)
      取得ipvs-1.0.9.tar.gz 這個檔案

      我試過抓linux-2.4.20-ipvs-1.0.9.patch.gz 這個檔案,但是從來沒有compile成功過,所以放棄。

    6.2、將ipvs-1.09.tar.gz解開,放在/usr/src/source/ipvs-1.0.9這個目錄下,然后在這個目錄下,輸入


    # make patchkernel
    # make installsource



      將IPVS的Patch加載到kernel的source中

    6.3、加載 "hidden"的patch

      可以到http://mail.incredimail.com/howto/lvs/install/src/ 這個目錄中抓取(hidden-2.4.20pre10-1.diff)這個patch檔案,放在/usr/src/linux目錄下,利用:


    # cat hidden-2.4.20pre10-1.diff | patch -p1



      對Kernel進行patch,非常感謝Alex提供上述Patch。

      注意:為什么這里要對kernel進行hidden的patch,因為在使用LVS中的DR與IP Tunnel的時候,會需要有一塊網絡卡要設定兩個IP的情形,但是Linux在2.2.14之后,就將eth0:1的-NOARP這個FLAG關閉。也就是說在kernel 2.2.14以后,eth0:1就視為eth0的別名,任何對eth0:1的設定也同樣作用在eth0,換句話說,我對eth0:1下-NOARP,同樣也會對eth0有作用,這樣會使得整張網絡卡收不到封包。

      在上述兩種模式下,因為我所有的機器都放在同一個網段,當該網段的Router接收到客戶端(Client)對虛擬IP(Virtual IP)的TCP connection要求時,會先在網段中利用Arp request詢問誰有VIP的地址,而包含Director與RealServers上所有的interface(不管Primary還是Subinterface),只要他有那個ip,都會發送arp reply回去,造成網段內所有擁有Virtual IP的interface都會reply給Router,最后結果就是看誰的速度快,Router就將該封包送給誰,如此會造成LVS的Server并無法發揮其效果,因此需要利用hidden這個pattch,將Subinterface上的Virtual IP給隱藏起來,如此他就不會對Arp Request進行Reply,如此就可以解決ARP的問題,而這個NOARP的問題,kernel發展小組認為不重要,所以以后都不會修改,要用請自行編譯。事實上,解法不只一種,我這兒只使用比較簡單的一種。資料來源:(http://www.linuxvirtualserver.org/Joseph.Mack/HOWTO/LVS-HOWTO.arp_problem.html)。

    7、接著安裝cipe 1.5.4的這個版本(如果已經安裝,記得先移除后,改用下面這個rpm),http://mail.incredimail.com/howto/lvs/install/package/ 這個目錄中有。cipe 1.4.5無法使用,因為1.4.5有Bug,所以一定要確定cipe的版本是1.5.4,且一定要安裝cipe否則等一下無法compile ipvs的東西。

      注意:先用rpm -qa |grep cipe查查看是不是已經有cipe存在,如果存在,請用rpm -e cipe 將之移除,再用rpm -ivh cipe-xxx.rpm 安裝。否則編譯kernel的模塊的時候會失敗。

      所有準備工作到此告一段落。接著正式進入compile kernel的重要階段。

    8、開始compile kernel,


    # cd /usr/src/linux
    # make oldconfig
    # (會去讀取.config的資料,并會問你有關ipvs的一些設定,全部用M回答),按下Enter。
    # make dep
    # make modules
    # make bzImage



      這里我順序有點顛倒…可是無所謂…?


    # make modules_install
    # make install



    9、至于最后的make install,如果你用lilo開機,他會給你一個錯誤訊息,但是必要的檔案已經都有了,如果是grub就沒有問題。


    -rw-r--r-- 1 root root 129736 7月 28 15:51
    initrd-2.4.20-19.8custom.img
    lrwxrwxrwx 1 root root 28 7月 28 15:58 System.map ->
    System.map-2.4.20-19.8custom
    -rw-r--r-- 1 root root 519383 7月 28 15:51
    System.map-2.4.20-19.8custom
    -rw-r--r-- 1 root root 1118581 7月 28 15:51
    vmlinuz-2.4.20-19.8custom



    10、如果用lilo開機,修改/etc/lilo.conf如下面格式:


    prompt
    timeout=350
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    message=/boot/message
    lba32
    # optional

    other=/dev/hda1
    optional
    label=WinXP-Home

    image=/boot/vmlinuz-2.4.20-18.8
    label=linux_old
    append="root=LABEL=/"
    read-only
    optional
    initrd=/boot/initrd-2.4.20-18.8.img
    image=/boot/vmlinuz-2.4.20-19.8custom
    label=linux_new
    root=/dev/hda5
    append="devfs=mount"
    read-only
    optional
    initrd=/boot/initrd-2.4.20-19.8custom.img



      因為我的/是mount在/dev/hda5下,所以你只要稍加修改即可。

      如果是用grub開機,他會自動設定好/boot/grub.conf


    default=1
    timeout=10
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz
    title Red Hat Linux (2.4.20-19.8custom)
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.20-19.8custom ro root=LABEL=/
    initrd /boot/initrd-2.4.20-19.8custom.img
    title Red Hat Linux (2.4.20-18.8bigmem)
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.20-18.8bigmem ro root=LABEL=/
    initrd /boot/initrd-2.4.20-18.8bigmem.img
    title Red Hat Linux-smp (2.4.18-14smp)
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.18-14smp ro root=LABEL=/
    initrd /boot/initrd-2.4.18-14smp.img
    title Red Hat Linux-up (2.4.18-14)
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/
    initrd /boot/initrd-2.4.18-14.img



    11、重新開機(shutdown -i 6 now)

    12、選擇linux_new(lilo)或Red Hat Linux (2.4.20-19.8custom)開機,看看開機過程有沒有錯誤發生。然后檢查/proc/sys/net/ipv4/conf/all/hidden是不是存在?

    13、如果都沒有錯誤,安裝下列rpm


    rpm -ivh ipvsadm-1.21-4.i386.rpm



    14、試驗一下 輸入:


    [root@nbaa boot]# ipvsadm
    IP Virtual Server version 1.0.9 (size=65536)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn



      出現上面畫面就是成功啦!!!

    15、后續的動作就依照你的網絡狀態,去作規劃了,后續進行中。

    PART II:LVS設定

    系統架構

    一、簡易設定:

    1、IP Tunnel的設定:


    Load Balance : 10.144.43.175(nb8048)
    Real Server:10.144.43.142(linux142)、10.144.43.187(linux187)
    Virtual IP :10.144.43.185(VIP)



    Nb8048上面的設定:

    1、先建立一個Subinterface


    # ifconfig eth0:0 10.144.43.185 netmask 255.255.255.255 broadcast ||
    10.144.43.185 up



    2、建立IP Tunnel的Rule

    2.1、先打開IP Forwarding


    # echo 1 > /proc/sys/net/ipv4/ip_forward



    2.2、建立IP Tunnel的Rule,先建立Service


    # ipvsadm -A -t 10.144.43.185:23 -s wlc



    2.3、加入兩臺Real Server的IP


    # ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.187 -i
    # ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.142 -i



    linux142與linux187上面的設定:

    1、另外建立一個Tunnel0


    # ifconfig tunl0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185



    2、將host加入routing table


    # route add -host 10.144.43.185 dev tunl0



    3、將接口的hidden屬性打開:


    # echo 1 > /proc/sys/net/ipv4/ip_forward
    # echo 1 > /proc/sys/net/ipv4/conf/all/hidden
    # echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden



    2、Direct Routing的設定


    Load Balance:10.144.43.175
    Virtual IP: 10.144.43.185
    RealServer1:10.144.43.175(nb8048)
    RealServer2:10.144.43.142(linux142)
    RealServer3:10.144.43.187(linux187)



      網絡架構圖如上所示,其中DR與RealServer1、RealServer2在同一個網段,其IP Address配置如附圖,基本設定如下,包含避免ARP Problem的設定:

    DR(Direct Routing Server):


    # ifconfig eth0 10.144.43.175 netmask 255.255.255.0 broadcast 10.144.43.255
    # route add -net 10.144.43.0 dev eth0

    # ifconfig eth0:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
    # echo 1 > /proc/sys/net/ipv4/ip_forward
    # ipvsadm -A -t 10.144.43.185:23 -s rr (用Round Robin方式)
    # ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.175 -g
    # ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.142 -g
    # ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.187 -g



    RealServer1 與RealServer2的設定:


    # ifconfig eth0 10.144.43.142 netmask 255.255.255.0 broadcast 10.144.43.255
    # route add -net 10.144.43.0 dev eth0
    # ifconfig lo:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
    # route add -host 10.144.43.185 dev lo:0
    # echo 1 > /proc/sys/net/ipv4/ip_forward
    # echo 1 > /proc/sys/net/ipv4/conf/all/hidden
    # echo 1 > /proc/sys/net/ipv4/conf/lo/hidden



    測試:

      從10.16.1.16機器上,對10.144.43.185作telnet 測試,三次聯機三次都連到不同的Server,所以測試正常。

    二、進階的設定:

      看完前面的設定,如果你有測試成功的話,一定會發現萬一Real Server死掉了怎么辦?負責轉送封包的DR并不曉得Real Server已經故障無法使用,還是會將封包往故障的Real Server處送,這樣會影響用戶的使用權益,為了解決這個問題在LVS正式網站上有幾種解法,而我安裝過Piranha(RedHat的方法)與「mon、heartbeat、fake、coda」方法,發現piranha-gui需要apache 1.3的rpm檔,而且還需要php 模塊安裝在上面,但是RedHat 8.0預設只提供apache 2.0.40 (httpd-2.0.40),因此在安裝piranha-gui的時候一直安裝不起來,我也試過將apache 1.3安裝上去,但是還另外需要安裝一堆有的沒的RPM,所以我就決定放棄不用piranha,采用「mon、heartbeat、fake、coda」(http://www.linuxvirtualserver.org/HighAvailability.html )的解法。

      那因為我只有三部機器,且只有一部要當Director,所以hearbeat、fake對我的情形來說并不需要,另外我的檔案也不需要全部統一放置在同一個地方,所以coda對我而言并沒有用,最后我只需要安裝mon這個服務(Daemon)。

      Mon的官方網站,在http://www.kernel.org/software/mon/,有興趣可以去看看。廢話不多說,開始進行安裝。

    1、安裝服務

      安裝可以采用tarball或rpm安裝,但是因為tarball安裝需要花比較多時間,為了省時間,所以全部采用RPM安裝,只有perl-Mon模塊采用tarball安裝。

    2、下載源碼

      首先上http://rpmfind.net 搜尋下列檔案,其中Mon-0.11.tar.gz請從Mon的正式網站上抓取。


    fping-2.2b1-2.i386.rpm ------------------------ 可以一次Ping多個ip
    perl-Convert-BER-1.31-3.i386.rpm---------- perl Convert::BER module
    perl-Net-Telnet-3.01-9.i386.rpm-------------- perl Net::Telnet module
    Mon-0.11.tar.gz---------------------------------- perl Mon module
    perl-Period-1.20-9.i386.rpm ------------------ perl Period module
    mon-0.99.2-8.i386.rpm------------------------- mon daemon rpm



      然后


    # rpm -ivh fping-2.2b1-2.i386.rpm
    # rpm -ivh perl-Convert-BER-1.31-3.i386.rpm
    # rpm -ivh perl-Net-Telnet-3.01-9.i386.rpm
    # rpm -ivh perl-Period-1.20-9.i386.rpm
    # gzip -dc Mon-0.11.tar.gz|tar xvf -
    # cd Mon-0.11
    # perl Makefile.PL && make && make test && make install
    # cd ..
    # rpm -ivh -nodeps mon-0.99.2-8.i386.rpm



      用chkconfig -list mon 檢查是否有安裝mon daemon,

    3、就這樣安裝完成了,接著進行mon的設定。

    3.1、配置MON

      Mon的設定檔放在/etc/mon/mon.cf,而在我們的例子中需要針對LVS寫一個(lvs.alert)程序。這個程序主要是用來新增移除Director的Routing Rule,如同在基本配置里面(這次的Director改為10.144.43.142這部機器),我們的設定:


    ipvsadm -A -t 10.144.43.185:23 -s rr
    ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.175 -g
    ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.142 -g
    ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.187 -g



      現在假設10.144.43.175網絡斷線,或機器當機不能正常工作,這時候mon daemon就會自動呼叫lvs.alert,


    ipvsadm -d -t 10.144.43.185 :23 -r 10.144.43.175



      將這筆拿掉,然后持續監控,直到10.144.43.175 又正常工作時,再呼叫lvs.alert將10.144.43.175加入Route中。


    #!/usr/bin/perl
    #
    # lvs.alert - Linux Virtual Server alert for mon
    #
    # It can be activated by mon to remove a real server when the
    # service is down , or add the server when the service is up
    #
    #
    use Getopt::Std;
    getopts("s:g:h:t:l:P:V:R:W:F:u");
    $ipvsadm = "/sbin/ipvsadm";
    $protocol = $opt_P;
    $virtual_services = $opt_V;
    $remote = $opt_R;
    if($opt_u){
    $weight = $opt_W;
    if($opt_F eq "nat"){
    $forwarding = "-m";
    }elsif($opt_F eq "tun"){
    $forwarding = "-i";
    }else{
    $forwarding = "-g";
    }

    if($protocol eq "tcp"){
    system(
    "$ipvsadm -a -t $virtual_services -r $remote -w $weight $forwarding");
    } else {
    system(
    "$ipvsadm -a -u $virtual_services -r $remote -w $weight $forwarding");
    }
    } else {
    if($protocol eq "tcp"){
    system("$ipvsadm -d -t $virtual_services -r $remote");
    } else {
    system("$ipvsadm -d -u $virtual_services -r $remote");
    }
    }



    3.2、mon daemon的設定

      因為我是以telnet的服務為測試范例,我真正上線使用的系統將會是Web server的監測,因此下面的設定只針對telnet來作設定,需要其它Service的請自行更正,并請自己去看mon的一些設定說明,這兒只簡單說明下列的意思。


    #
    # Extremely basic mon.cf file
    # 除了lvs.alert外,事實上還可發送Email,只是我把他拿掉了,
    # 因為我的Server并沒有激活Sendmail..:)
    # global options
    #
    cfbasedir = /etc/mon
    pidfile = /var/run/mon.pid
    statedir = /var/run/mon/state.d
    logdir = /var/run/mon/log.d
    dtlogfile = /var/run/mon/log.d/downtime.log
    alertdir = /usr/lib/mon/alert.d
    mondir = /usr/lib/mon/mon.d
    maxprocs = 20
    histlength = 100
    randstart = 60s
    authtype = userfile
    userfile = /etc/mon/userfile

    #
    # group definitions (hostnames or IP addresses)
    # 要監測的機器,一次可以一部也可以多部
    # 為了減少麻煩,而且我設備也不多,所以我設定一個group只有一個Server
    hostgroup server1 10.144.43.175
    hostgroup server2 10.144.43.187
    # 監測10.144.43.175
    watch server1
    # service 后面的telnet名稱同/etc/services里面的名稱,不是自己亂給的
    service telnet
    # 間隔多久測試一次,這兒設定20秒,也可以設定10m、1h。
    interval 20s
    # 用哪一個monitor程序去作,基本上telnet.monitor是用perl寫的程。
    # 所以如果有自己的monitor程序,也可以比照辦理。
    monitor telnet.monitor
    # 監測的時間
    period wd hr
    # alert:當有聯機失敗時會呼叫這個Event,執行后面lvs.alert程序
    alert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.175 -W 5 -F dr
    # uplaert:當當聯機失敗后,又發現對方活過來時候,會呼叫這個event。
    upalert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.175 -W 5 -F dr -u 1

    watch server2
    service telnet
    interval 20s
    monitor telnet.monitor
    period wd hr
    alert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.187 -W 5 -F dr
    upalert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.187 -W 5 -F dr -u 1
    # See /usr/doc for the original example...



    3.3、修改完成后,就可以用service mon start,激活mon daemon,進行監測。

    4、可以自己作一些測試,例如拔掉網絡線,關掉Realserver上的服務,測試看看哪兒有問題。(呼!總算可以對老板交代了。^_^)

    三、做DR router的Load Balance:

      那如果今天我有一堆機器,而且在上面執行的服務都相當的重要,所以只有一部Director對這些重要工作來說,是非常危險的,萬一這部Director死掉了,那我的服務不就毀了?因此在這兒要介紹「mon+heartbeat+fake+coda」的heartbeat與fake的安裝與設定。

    1、下載安裝文件

      從http://www.linux-ha.org/download/ 抓取下列RPM檔案:


    heartbeat-1.0.3-1.rh.8.0.1.i386.rpm
    heartbeat-1.0.3-1.rh.8.0.1.src.rpm
    heartbeat-ldirectord-1.0.3-1.rh.8.0.1.i386.rpm
    heartbeat-pils-1.0.3-1.rh.8.0.1.i386.rpm
    heartbeat-stonith-1.0.3-1.rh.8.0.1.i386.rpm



      從http://rpmfind.net 抓取下列RPM檔案:


    libnet-1.1.0-1.rh.8.0.um.1.i386.rpm
    perl-Authen-SASL-2.03-1.rh.8.0.um.1.noarch.rpm
    perl-Convert-ASN1-0.16-2.rh.8.0.um.1.noarch.rpm
    perl-IO-Socket-SSL-0.92-1.rh.8.0.um.1.noarch.rpm
    perl-Mail-IMAPClient-2.2.7-1.rh.8.0.um.1.noarch.rpm
    perl-Net-SSLeay-1.22-1.rh.8.0.um.1.i386.rpm
    perl-Parse-RecDescent-1.80-8.noarch.rpm
    perl-XML-NamespaceSupport-1.08-2.noarch.rpm
    perl-XML-SAX-0.12-1.rh.8.0.um.1.noarch.rpm



      從http://search.cpan.org抓取下列perl-ldap檔案,目前最新版本是0.27版本,其實都無所謂,可以用就好了。


    perl-ldap-0.25.tar.gz (我這兒用以前我抓的tar.gz檔)



    2、開始依照下列順序安裝:


    # rpm -ivh perl-Convert-ASNI-0.16.2.rh.8.0.um.1.onarch.rpm
    # perl -ivh perl-Authen-SASL-2.03-1.rh.8.0.um.1.noarch.rpm
    # rpm -ivh perl-Net-SSLeay-1.22-1.rh.8.0.um.1.i386.rpm
    # rpm -ivh perl-IO-Socket-SSL-0.92-1.rh.8.0.um.1.noarch.rpm
    # rpm -ivh perl-Mail-IMAPClient-2.2.7-1.rh.8.0.um.1.noarch.rpm
    # rpm -ivh perl-Parse-RecDescent-1.80-8.noarch.rpm
    # rpm -ivh perl- NamespaceSupport-1.08-2.noarch.rpm
    # rpm -ivh perl- XML-SAX-0.12-1.rh.8.0.um.1.noarch.rpm
    # rpm -ivh libnet-1.1.0-1.rh.8.0.um.1.i386.rpm
    # gzip -dc perl-ldap-0.25.tar.gz |tar xvf -
    # cd perl-ldap-0.25
    # perl Makefile
    # make && make test && make install
    # cd ..



      需要的Perl module安裝完畢,開始安裝heartbeat的modules。


    # rpm -ivh heartbeat-pils-1.0.3-1.rh.8.0.1.i386.rpm
    # rpm -ivh heartbeat-stonith-1.0.3-1.rh.8.0.1.i386.rpm
    # rpm -ivh heartbeat-1.0.3-1.rh.8.0.1.i386.rpm



      下面這個module是一個整合所有功能的RPM,heartbeat官方網站有介紹。


    # rpm -ivh --nodeps heartbeat-ldirectord-1.0.3-1.rh.8.0.1.i386.rpm



      從http://www.linux-ha.org/這個網站上可以知道fake已經整合進heartbeat的功能里面,所以我們就不需要安裝fake相關的程序了。

      目前Linux-HA可以應用的方面如下:


    o Web servers
    o LVS director servers
    o Mail servers
    o Database servers
    o Firewalls
    o File servers
    o DNS servers
    o DHCP servers
    o Proxy Caching servers
    o etc.



      我們這里的重點是要做LVS Director Servers的Failover機制,也就是要做HA(High availability)架構。所以對于heartbeat-ldirectord這個套件不作介紹,有興趣的人請自行研究(http://www.linuxvirtualserver.org/HighAvailability.html)一文。

      Linux-HA實驗例子:

      系統架構如同基本設置范例圖形所示,只是這兒設置Primary Director為10.144.43.187 (linux187),而Secondary Director為10.144.43.142(linux142),而10.144.43.175(就是唯一的RealServer,但是事實上10.144.43.142與10.144.43.187上面還是有提供服務。簡單的說就是Director可以互相備援,且Realserver失敗的時候,會自動從Director上面將該筆資料自LVS的Routing Rule中消除。

    1、在Linux142與Linux187上都將Mon與Heartbeat套件安裝完成。且在/etc/rc.local中加入一個設定subinterface的shellscript(/root/conf/data)。

      /root/conf/data 內容如下:


    #!/bin/sh
    # 開機時讀取,設定LVS相關的設定值,此時扮演LVS中的RealServer的角色

    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    export PATH
    ifconfig lo:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
    echo 1 >/proc/sys/net/ipv4/ip_forward
    echo 1 >/proc/sys/net/ipv4/conf/all/hidden
    echo 1 >/proc/sys/net/ipv4/conf/lo/hidden
    route add -host 10.144.43.185 dev lo:0



      /etc/rc.local內容如下:


    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.

    touch /var/lock/subsys/local
    # add subinterface
    /root/conf/data



      作這個動作的目的在于讓Linux142、Linux187在開機的時候將lo:0這個subinterface加入在網絡卡中,同時激活hidden避免ARP問題。記得chmod 755 data。

    2、在Linux142與linux187中,接著設定Mon基本設定,修改/etc/mon/mon.cf,使其對nb8048、Linux187、linux142作監測。因為提供的服務是Port 8080,在/etc/services中的名稱為(webcache)


    #
    # Extremely basic mon.cf file
    #
    #
    # global options
    #
    cfbasedir = /etc/mon
    pidfile = /var/run/mon.pid
    statedir = /var/run/mon/state.d
    logdir = /var/run/mon/log.d
    dtlogfile = /var/run/mon/log.d/downtime.log
    alertdir = /usr/lib/mon/alert.d
    mondir = /usr/lib/mon/mon.d
    maxprocs = 20
    histlength = 100
    randstart = 60s
    authtype = userfile
    userfile = /etc/mon/userfile

    #
    # group definitions (hostnames or IP addresses)
    #
    hostgroup server1 10.144.43.175
    hostgroup server2 10.144.43.142
    hostgroup server3 10.144.43.187

    watch server1
    service webcache
    interval 10s
    monitor http.monitor -p 8080 -t 10
    allow_empty_group
    period wd
    alert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.175 -W 5 -F dr
    alertevery 1h
    upalert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.175
    -W 5 -F dr -u 1

    watch server2
    service webcache
    interval 10s
    monitor http.monitor -p 8080 -t 10
    period wd
    alert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.142 -W 5 -F dr
    alertevery 1h
    upalert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.142
    -W 5 -F dr -u 1
    watch server3
    service webcache
    interval 10s
    monitor http.monitor -p 8080 -t 10
    period wd
    alert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.187 -W 5 -F dr
    alertevery 1h
    upalert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.187
    -W 5 -F dr -u 1



    3、編輯lvs.alert同前面提過的lvs.alert檔案,放在/usr/lib/mon/alert.d/中。記得


    chmod 755 lvs.alert



    4、設定Heartbeat套件(High Availability)。

    4.1、利用rpm -q heartbeat -d 將Heartbeat三個重要的設定檔案(ha.cf、authkeys、haresources),copy到/etc/ha.d目錄下。


    [root@linux142 conf]# rpm -q heartbeat -d
    /usr/share/doc/heartbeat-1.0.3/authkeys
    /usr/share/doc/heartbeat-1.0.3/ha.cf
    /usr/share/doc/heartbeat-1.0.3/haresources
    [root@linux142 conf]#



    4.2 修改/etc/hosts內容如下:


    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1 localhost.localdomain localhost
    10.144.43.142 linux142
    10.144.43.187 Linux187
    10.144.43.175 nb8048



    4.3、修改/etc/ha.d/authkeys內容如下:


    auth 1
    1 sha1 doss123


      其中doss123為重要的key。然后
    # chmod 600 authkeys



    4.4、修改/etc/ha.d/ha.cf內容如下:


    logfacility local0 # 使用syslogd
    keepalive 2 # 每隔幾秒送一次heartbeat訊號
    deadtime 40 # 多長時間就認定Primary Server Dead
    initdead 240
    # hopfudge maximum hop count minus number of nodes in config
    nice_failback on
    # 如果Service轉移到Secondary,就不要再轉移回Primary
    hopfudge 1 # ???
    udpport 1001 # 使用哪一個udp port
    ucast eth0 10.144.43.142
    # Primary用unicast送給Secondary,如果在 Secondary則送給Primary
    node Linux187 # 給定cluster中的節點
    node linux142 # 給定cluster中的節點



    4.5、修改/etc/ha.d/haresources內容如下:


    Linux187 10.144.43.185 lvs mon



      這里設定Linux187在/etc/hosts里面要有設定,否則會找不到。且名稱必須等于「uname -n」的內容。上面的意思是說,當heartbeat兩邊激活時,Linux187與linux142都激活時,會有linux187取得LVS VIP的控制權。而他會激活后面兩個Service,lvs(我們皆下來要寫的激活Daemon 的shell script),而mon則是先前我們已經設定的好的mon daemon。

    4.6、編寫/etc/init.d/lvs(激活lvs daemon)內容如下:


    #!/bin/sh
    # /etc/init.d/lvs
    # 當LVS Server激活時,也就是透過High Availability激活LVS程序時,
    # 1.將Lo的hidden屬性取消
    # 2.將lo:0 down下來,將lo:0刪除
    # 3.設定相關LVS設定檔案
    PATH=/bin:/usr/bin:/sbin:/usr/sbin
    export PATH
    IPVSADM=/sbin/ipvsadm

    case "" in
    start)
    if [ -x $IPVSADM ]
    then
    # 因為我們有設定lo:0的loopbback 的subinterface所以要先將相關設定移除
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo 0 > /proc/sys/net/ipv4/conf/all/hidden
    echo 0 > /proc/sys/net/ipv4/conf/lo/hidden
    route del -host 10.144.43.185 dev lo:0
    ifconfig lo:0 down
    # 建立Subinterface eth0:0
    ifconfig eth0:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
    # 設定LVS/DR相關設定,建立8080 Port的Service
    $IPVSADM -A -t 10.144.43.185:8080 -s rr
    $IPVSADM -a -t 10.144.43.185:8080 -r 10.144.43.175 -w 5 -g
    $IPVSADM -a -t 10.144.43.185:8080 -r 10.144.43.187 -w 5 -g
    $IPVSADM -a -t 10.144.43.185:8080 -r 10.144.43.142 -w 5 -g
    fi
    ;;
    stop)
    if [ -x $IPVSADM ]
    then
    #---- 停止LVS Server,但是依然要回復RealServer的身份
    $IPVSADM -C
    echo 1 >/proc/sys/net/ipv4/conf/all/hidden
    echo 1>/proc/sys/net/ipv4/conf/lo/hidden
    ifconfig lo:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
    route add -host 10.144.43.185 dev lo:0
    fi
    ;;
    *)
    echo "Usage: lvs "
    exit 1
    esac
    exit 0



    4.7、修改/etc/ha.d/resource.d/IPaddr 這個shellscript:

      在add_interface() subrouteing 中新加入下列三行:


    add_interface () {
    ipaddr=""
    ifinfo=""
    iface=""

    #
    # On Linux the Alias is named ethx:y
    # This will remove the "extra" interface Data
    # leaving us with just ethx
    #
    case $SYSTYPE in
    *BSD)
    IFEXTRA=""
    ;;
    *)
    IFEXTRA=`echo "$ifinfo" | cut -f2-`
    ;;
    esac

    case $SYSTYPE in
    SunOS)
    case `uname -r` in
    5.8)
    $IFCONFIG $iface plumb
    CMD="$IFCONFIG $iface inet $ipaddr $IFEXTRA up"
    ;;
    *)
    CMD="$IFCONFIG $iface inet $ipaddr $IFEXTRA up"
    ;;
    esac
    ;;
    *BSD)
    CMD="$IFCONFIG $iface inet $ipaddr netmask 255.255.255.255 alias"
    ;;
    *)
    CMD="$IFCONFIG $iface $ipaddr $IFEXTRA"
    ;;
    esac

    ha_log "info: $CMD"
    $CMD
    # 將subinterface的hidden屬性打開,如此可避免ARP問題
    echo 1 >/proc/sys/net/ipv4/conf/all/hidden
    echo 1 >/proc/sys/net/ipv4/conf/lo/hidden
    # 加入預設到VIP的route
    route add -host $ipaddr dev $iface
    rc=$?

    case $rc in
    0)
    ;;
    *)
    echo "ERROR: $CMD failed."
    ;;
    esac

    return $rc
    }



    4.8、至此有關Heartbeat的設定已經完成,記得上述檔案在Linux187與linux142上都要一模一樣,然后


    # setup



      將heartbeat的服務設定為激活,之后將兩臺機器重新開機。

    5、在linux187上利用ipvsadm -l檢查LVS的Routing Rule,是否如下所示:


    [root@Linux187 root]# ipvsadm -l
    IP Virtual Server version 1.0.9 (size=65536)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    TCP 10.144.43.185:webcache rr
    -> Linux187:webcache Local 5 0 0
    -> linux142:webcache Route 5 0 0
    -> nb8048:webcache Route 5 0 0



      然后作些測試,將187的eth0 利用ifconfig eth0 down,看看有沒有切換到142去。

    6、設定至此看起來都沒問題,但是每次Primary Diretcor設備如果網絡突然斷掉,然后Primary網絡又突然恢復的時候,會造成Primary與Secondary Director上的LVS Server都同時激活。有興趣的人可以在primary Diretcor上用


    # ifconfig eth0 down
    將Primary的網絡卡down下來,等一會約一分鐘,再用
    #ifconfig eth0 up
    #route add -net 0.0.0.0 gw 10.144.43.254



      然后,你再連上linux142與linux187上,輸入ipvsadm -l,就會發現兩邊的LVS/Direct Routing都激活了,這顯然不是我們所希望的結果。

      要解決這個問題,需要利用mon這個dameon,來做到。

      想法如下:

    (1)、每隔一段時間,去ping 10.144.43.254(ping gateway),若發現GATEWAY在連續六次都沒有反應后,就要將lvs的服務關閉(/etc/init.d/lvs stop),此時認定是自己網絡卡已經故障,無法Ping出去。因為即便是Gateway死掉,此時整個網絡對外邊已經沒有作用,激活lvs也沒用,故需要關閉他。

    (2)、若發現Gateway突然又Ping的到了,此時要將heartbeat service給restart(取得主動權)(/sbin/service heartbeat start),如此經過一段時間,Primary的Director將會取得LVS Server的位置,而Slave Director會回復到RealServer與Backup Director的位置。

    7、為了解決LVS server同時激活的困擾,我們需要在mon服務中再加入一個hostgroup,/etc/mon/mon.cf內容如下:


    #
    # Extremely basic mon.cf file
    #
    #
    # global options
    #
    cfbasedir = /etc/mon
    pidfile = /var/run/mon.pid
    statedir = /var/run/mon/state.d
    logdir = /var/run/mon/log.d
    dtlogfile = /var/run/mon/log.d/downtime.log
    alertdir = /usr/lib/mon/alert.d
    mondir = /usr/lib/mon/mon.d
    maxprocs = 20
    histlength = 100
    randstart = 60s
    authtype = userfile
    userfile = /etc/mon/userfile

    #
    # group definitions (hostnames or IP addresses)
    #
    hostgroup server1 10.144.43.175
    hostgroup server2 10.144.43.142
    hostgroup server3 10.144.43.187
    # network gateway
    hostgroup server4 10.144.43.254

    watch server1
    service webcache
    interval 5s
    monitor http.monitor -p 8080 -t 10
    allow_empty_group
    period wd
    alert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.175 -W 5 -F dr
    alertevery 1h
    alertafter 6
    upalert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.175
    -W 5 -F dr -u 1

    watch server2
    service webcache
    interval 5s
    monitor http.monitor -p 8080 -t 10
    period wd
    alert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.142 -W 5 -F dr
    alertafter 6
    alertevery 1h
    upalert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.142
    -W 5 -F dr -u 1

    watch server3
    service webcache
    interval 5s
    monitor http.monitor -p 8080 -t 10
    period wd
    alert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.187 -W 5 -F dr
    alertafter 6
    alertevery 1h
    numalerts 24
    upalert lvs.alert -P tcp -V 10.144.43.185:8080 -R 10.144.43.187
    -W 5 -F dr -u 1

    watch server4
    service ping
    interval 10s
    # 使用哪一個monitor去作測試
    monitor ping.monitor 10.144.43.254
    period wd
    # 每個小時丟一個alert
    alertevery 1h
    # 連續測試六次失敗才丟出第一個alert
    alertafter 6
    # 最多丟12個alert
    numalerts 12
    # alert時呼叫heartbeat.alert
    alert heartbeat.alert
    # upalert時呼叫heartbeat.alert -u
    upalert heartbeat.alert -u
    # See /usr/doc for the original example...



    8、從上面/etc/mon/mon.cf中,可以發現我們要自己寫一個alert發生時被呼叫的script,這里我用perl 寫了一個簡單的Script放在(/usr/lib/mon/alert.d/heartbeat.alert)。


    #!/usr/bin/perl
    # heartbeat.alert - Linux Virtual Server alert for mon
    #
    # It can be activated by mon to remove a real server when the
    # service is down , or add the server when the service is up
    #
    use Getopt::Std;
    getopts("u");
    $service ="/sbin/service";
    $u = $opt_u;
    if($opt_u){
    # 重新激活heartbeat服務
    system("$service heartbeat restart");
    }else{
    # 停止lvs server
    system("/etc/init.d/lvs stop");
    }



    9、測試系統

      確認linux187與linux 142的設定與檔案文件相同,然后兩邊同時重新激活heartbeat service,至此Linux-HA系統正式完成,可以作些測試。例如:拔掉Director的網絡線一段時間,看看Secondary有沒有take over,然后再插回去,看看Primary有沒有回復原本Director的身份,可試著將將Primary reboot,看看Secondary會不會take over,然后master起來的時候,應該還是Secondary Diretcorr在作用。其中或許會有些參數不大對,但是可以自己慢慢修正。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>