ºÎÇϺлê Ŭ·¯½ºÅÍ Á¦ÀÛ°ú Fail Over

½Å¼øö scshin@mail.suwon.ac.kr

 

     

    ¸ñÂ÷

    0. µé¾î°¡±â¿¡ ¾Õ¼­
    1. MEDUSA Ŭ·¯½ºÅÍ
    2. Ŭ·¯½ºÅÍÀÇ ÀÛµ¿ ¹æ½Ä
    3. Fail Over
    4. source
    5. MMD ÇÁ·ÎÁ§Æ®

 

0. µé¾î°¡±â¿¡ ¾Õ¼­

    ´ë±Ô¸ð À¥¼­ºñ½º¸¦ Á¦°øÇϱâ À§ÇÑ ¼Ö·ç¼ÇÀÎ ºÎÇϺλêŬ·¯½ºÅ͸¦ Á¦ÀÛÇÏ°í À̸¦ °ü¸®Çϱâ À§ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥À» Á¦ÀÛÇÏ¿´À¸¸ç º» ¹®¼­¿¡¼­´Â ÀÌ ¹æ¹ýÀ» ¼³¸íÇÏ°íÀÚ ÇÑ´Ù. Ŭ·¯½ºÅÍ´Â ÇöÀç ³Î¸® ¾Ë·ÁÁø ¹æ¹ýÀÎ LVS(LinuxVirtualServer)¿¡¼­µµ NAT ¹æ½ÄÀ» ÀÌ¿ëÇؼ­ Á¦ÀÛÇÏ¿´À¸¸ç, ¸®¾ó¼­¹öÀÇ Fail Over ´Â Á÷Á¢ ÀÛ¼ºÇÑ MiniMMD ¶ó´Â ÇÁ·Î±×·¥¿¡ ÀÇÇØ ÀÌ·ç¾îÁö°í ÀÖÀ¸¸ç ·Îµå¹ë·±¼­ÀÇ fail over´Â ¾ÆÁ÷ ±¸ÇöµÇÁö ¾ÊÀº »óÅÂÀÌ´Ù. ¹°·Ð ha-linux.org¿¡¼­ Á¦°øÇÏ´Â ¹æ¹ýÀ¸·Î ¶Ç´Â ·¹µåÇÞ ÆÐÅ°ÁöÀÎ piranha ·Î ±¸ÇöÇÒ ¼ö ÀÖÁö¸¸ ÇÊÀÚ´Â ±¸Çö¿¡ ÇÊ¿äÇÑ ¿©·¯ °³ÀÇ ¾ÆÀÌÇÇ°¡ ¾ø¾î¼­ º¸·ùÇصР»óÅÂÀÌ´Ù. ±×¸®°í ÀÌ ¹æ¹ýÀº ¿ÏÀüÇÑ fail over¸¦ Á¦°øÇÏÁö ¸øÇÏ´Â ´ÜÁ¡°ú ³ëµåÀÇ ³¶ºñ¶ó´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.

    ÇöÀç ¸ÅµÎ»ç´Â http://www.moo.pe.kr/ http://medusa.linuxchannel.net/ ¿¡¼­ ¼­ºñ½ºµÇ°í ÀÖ´Ù. ÇÏÁö¸¸ ¸¹Àº °ÍÀ» ±â´ëÇÏÁö´Â ¸»¶ó. Çб³ÀÇ ³×Æ®¿öÅ© ¼º´É°ú ¸ÅµÎ»çÀÇ ¼º´ÉÀ¸·Î ÀÎÇØ ¸¹Àº °æ¿ì ¸Å¿ì ´À¸®°Ô ¶á´Ù. ¹°·Ð Çб³ ¾È¿¡¼­´Â ¸Å¿ì ºü¸£°Ô ¶á´Ù. ¶ÇÇÑ Çб³ ³»¿¡ ÀÖÀ¸¹Ç·Î Á¤Àü, Å×½ºÆ® µîÀÇ ÀÌÀ¯·Î Á¾Á¾ Á¢¼ÓÀÌ ¾ÈµÇ°ï ÇÑ´Ù.

    ºÎÇϺлê Ŭ·¯½ºÅÍ È¨ÆäÀÌÁö  http://www.linuxvirtualserver.org/

    °í°¡¿ë¼º ¼Ö·ù¼Ç  http://www.linuxvirtualserver.org/HighAvailability.html

 

1. MEDUSA Ŭ·¯½ºÅÍ

    Ŭ·¯½ºÅ͸¦ ¾Æ·¡¿Í °°Àº »ç¾çÀ¸·Î ±¸¼ºÇÑ ÀÌÀ¯´Â ¾Æ·¡ÀÇ °ÍµéÀÌ ±¸ÇÒ ¼ö ÀÖ´Â ÀüºÎ¿´±â ¶§¹®ÀÌ´Ù.

    ³ëµå»ç¾ç : Pentium 150~120Mhz
                   Memory (routor 72M, real server 32~24M)
                   HDD (master 2G, slave no)
    kernel     : 2.2.14(nfs_patch,ipvs_patch)
    ³ëµå ¼ö   : 4 nodes
    Åë½Åȯ°æ : 10M Ethernet & Dummy Hub & ¼­ºê³×Æ®¿öÅ©·Î ±¸¼º
    ¿ëµµ       : ºÎÇϺлê À¥¼­¹ö

 

2. Ŭ·¯½ºÅÍÀÇ ÀÛµ¿ ¹æ½Ä

    1. ÀÎÅͳݿ¡¼­ ÆäÀÌÁö¿äûÀÌ medusa¿¡°Ô µé¾î¿Â´Ù.
        ÀÎÅͳݿ¡ ÀÖ´Â È«±æµ¿À̶ó´Â ÄÄÇ»ÅͷκÎÅÍ À¥ÆäÀÌÁö ¿äûÀÌ µé¾î¿ÔÀ» °æ¿ìÀÌ´Ù.
        ´ÙÀ½Àº ÆÐŶ¿¡ Æ÷ÇÔµÅÀÖ´Â Á¤º¸ÀÌ´Ù (ÆÐŶ: source=È«±æµ¿, dest=medusa)
    2. ¸ÅµÎ»ç´Â ¿äûÆÐŶÀ» ½ºÄÉÁ층 ¾Ë°í¸®Áò¿¡ µû¶ó ¼±ÅÃµÈ ¸®¾ó¼­¹ö¿¡°Ô Àü¼ÛÇÑ´Ù.
        (ÆÐŶ: source=È«±æµ¿, dest=¸®¾ó¼­¹ö)
        À̶§ ¾î¶² ¸®¾ó¼­¹ö°¡ ¼±ÅõÉÁö´Â ¸ð¸¥´Ù. ´Ù¸¸ °ü¸®ÀÚ´Â ¾î¶² ¾Ë°í¸®Áò¿¡ ÀÇÇؼ­
        ¸®¾ó¼­¹ö¸¦ ¼±ÅÃÇ϶ó´Â °ÍÀ» Á¤ÇØÁÙ ¼ö ÀÖ´Ù.
    3. ¸®¾ó¼­¹ö´Â Àû´çÇÑ ÀÀ´äÀ» medusa ¿¡°Ô º¸³½´Ù.(ÆÐŶ: source=¸®¾ó¼­¹ö, dest=È«±æµ¿)
        È«±æµ¿ÀÌ ¿äûÇÑ ÆäÀÌÁö¸¦ ÀÚ½ÅÀÇ µðÆúÆ® °ÔÀÌÆ®¿þÀÌÀÎ ¸ÅµÎ»ç¿¡°Ô º¸³½´Ù.
    4. ¸ÅµÎ»ç´Â ÀÀ´äÀ» ÀÎÅͳÝÀÇ ´©±º°¡¿¡°Ô º¸³»ÁØ´Ù.(ÆÐŶ: source=medusa, dest=È«±æµ¿)

    ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î 󸮸¦ ÇÔÀ¸·Î½á ¸ðµç ¿äûÀ» ·Îµå¹ë·±¼­(medusa)°¡ ó¸®ÇØÁÖ´Â °Íó·³ º¸¿©Áø´Ù. º¸´Ù½ÃÇÇ ÀÌ·¸°Ô ÆÐŶÀ» º¯°æ½ÃÅ°´Â ´É·ÂÀ» ·Îµå¹ë·±¼­ÀÇ Ä¿³Î¿¡ ÀûÀç½ÃÄÑ¾ß Çϸç ÀÌ°ÍÀ» µÚ¿¡¼­ ´ëÃæ(^^)¼³¸íÇÏ°Ú´Ù.

 

3. Á¦ÀÛ ¹æ¹ý

    LVS¿¡¼­ Á¦°øÇÏ´Â ¹æ½ÄÀº Å©°Ô ´ÙÀ½ÀÇ 3°¡Áö°¡ ÀÖ´Ù.
    NAT(Network Address Transation)Àº TCP/IP¸¦ »ç¿ëÇϹǷΠŬ·¯½ºÅÍÀÇ ³ëµåµéÀÌ ¾î¶² OSÀÎÁö »ó°ü¾øÀÌ ºÎÇϺлêÀ» ÇØÁÙ ¼ö ÀÖÀ¸¸ç, ÇϳªÀÇ ¶ó¿ìÅÍ´Â º¸Åë 20°³ÀÌÇÏÀÇ Å¬·¯½ºÅÍ¿¡¼­ ¶ó¿ìÅÍÀÇ º´¸ñÇö»ó¾øÀÌ ¼­ºñ½º°¡ Á¦°øµÈ´Ù.

    IP Tunneling ¹æ½ÄÀº ¼­ºñ½º ¿äûÀÌ µé¾î¿À¸é ¿äûÆÐŶÀ» ĸ½¶È­Çؼ­ Ŭ·¯½ºÅͳ»ÀÇ ³ëµåµé¿¡°Ô Àü¼ÛÇØÁØ´Ù. ÀÌ°ÍÀº ÀÀ´äÀÌ ¶ó¿ìÅ͸¦ °ÅÃļ­ ³ª°¡Áö ¾ÊÀ¸¹Ç·Î ÇϳªÀÇ ¶ó¿ìÅÍ°¡ ¸Å¿ì ¸¹Àº ³ëµåµéÀ» °Å´À¸± ¼ö°¡ ÀÖ´Ù. ±×·¯³ª ´ÜÁ¡Àº Ŭ·¯½ºÅͳ»ÀÇ ³ëµåµéÀÌ Ä¸½¶È­µÈ ÆÐŶÀ» Çؼ®ÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷΠÇöÀç´Â ¸®´ª½º¿¡¼­¸¸ °¡´ÉÇÏ´Ù. ¶ÇÇÑ ¸®¾ó¼­¹öµéÀº ¶ó¿ìÅ͸¦ °ÔÀÌÆ®¿þÀÌ·Î »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î ´Ù¸¥ °ÔÀÌÆ®¿þ°¡ ÇÊ¿äÇϰųª °ø½ÄIP¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù

    DR(Direct Routing)¹æ½ÄÀº Ŭ·¯½ºÅÍÀÇ È®À强À» ³ôÀ̱â À§ÇØ IP NAT ¹æ½Ä°ú IP tunneling¹æ½ÄÀÇ ÀåÁ¡¸¸À» °¡Á®¿Â ¹æ½ÄÀÌ´Ù. Áï ¼­ºñ½º¿äûÀÌ µé¾î¿À¸é ÆÐŶÀ» ÃÖ¼ÒÇÑÀ¸·Î »¡¸® °¡°øÇÏ¿© ¸®¾ó¼­¹ö¿¡°Ô º¸³»¸é ¸®¾ó¼­¹ö´Â ´Ù¸¥ ·çÆ®¸¦ ÅëÇÏ¿© ÀÀ´äÀ» º¸³»´Â °ÍÀÌ´Ù. ¶ó¿ìÅÍ°¡ ¿äûÆÐŶ¿¡ MAC ¾îµå·¹½º¸¦ Ãß°¡ÇÑ´Ù. ÀÌ°ÍÀº À¯ÀÏÇÑ ¸®¾ó¼­¹ö¸¦ °áÁ¤ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÌ°ÍÀ» À§Çؼ­´Â ¸ðµç ³ëµåµéÀÌ ´ÜÀÏ segment¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù

    ÀÌ ¹®¼­¿¡¼­ ¼³¸íÇÏ´Â NATÀÇ °æ¿ì´Â  node2, node3, node4 ´Â ¹Ýµå½Ã ¸®´ª½ºÀÏ ÇÊ¿ä°¡ ¾ø´Ù. NAT ¹æ½ÄÀº TCP°¡ Áö¿øµÇ´Â OSÀ̱⸸ ÇÏ¸é µÇ±â ¶§¹®ÀÌ´Ù. Áï NT,window2000,OS/2 µîÀÌ ¸ðµÎ °¡´ÉÇÏ¸ç ¼³Ä¡ ¹ýÀº ÀÏ¹Ý ¸®´ª½º ¹Ú½º¿Í °ÅÀÇ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ ¸®¾ó¼­¹öÀÇ °ÔÀÌÆ®¿þÀÌ´Â medusa °¡ µÇ¾î¾ß Çϸç, ¸®¾ó¼­¹öµéÀÇ ¾ÆÀÌÇÇ´Â ³» ¸¶À½´ë·Î Á¤ÇØÁ־ µÈ´Ù´Â °ÍÀÌ ´Ù¸£´Ù¸é ´Ù¸¥ °ÍÀÌ´Ù.

    ¿ì¸®´Â medusa ¶ó°í ¸í¸íµÈ ¶ó¿ìÅÍ(·Îµå¹ë·±¼­)·Î »ç¿ëµÉ ¸Ó½ÅÀ» Àû´çÈ÷ Æ©´×ÇÏ´Â °ÍÀ¸·Î½á Ŭ·¯½ºÅ͸¦ ±¸¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ ±ÛÀ» Àд ºÐÀÌ Ä¿³ÎÆÐÄ¡¿Í ÄÄÆÄÀÏ °æÇèÀÌ ÀÖ´Ù¸é Ŭ·¯½ºÅÍ Á¦ÀÛÀº ¸Å¿ì ½¬¿ì¹Ç·Î ÀÌ ¹®¼­¿¡¼­´Â ¼³Ä¡¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×¸®°í Ä¿³ÎÆÐÄ¡¿Í ÄÄÆÄÀÏ °æÇèÀÌ ¾ø´Â ºÐµéÀº Ä¿³Î ÄÄÆÄÀÏ¿¡ ´ëÇÑ ¾à°£ÀÇ °øºÎ¸¦ ÇÏ¸é µÈ´Ù. (Ä¿³ÎÆÐÄ¡¿Í ÄÄÆÄÀÏ ¿ª½Ã ½±´Ù ^^; Ä¿³Î ÆÐÄ¡´Â ÀϹÝÀûÀ¸·Î cat patch-file | patch -p1 °ú °°Àº ¸í·ÉÀ¸·Î ÀÌ·ç¾îÁö¸ç Á¤È®ÇÑ °ÍÀº Á¦°øµÇ´Â ÆÐÄ¡ÆÄÀÏÀÇ ¼³¸í¼­¿¡ Á¦°øµÉ °ÍÀÌ´Ù. Ä¿³Î ÄÄÆÄÀÏÀ» Çϴµ¥´Â http://kldp.org/KoreanDoc/Kernel_Compile-KLDP ¹®¼­¸é ÃæºÐÇÏ´Ù)

    ÀÏ´Ü °£´ÜÇÑ Á¦ÀÛ ¼ø¼­´Â http://www.linuxvirtualserver.org/software/index.html ¿¡¼­ ÃÖ½ÅÀÇ ÆÐÄ¡¸¦ ¹Þ¾Æ¿Â ÈÄ Ä¿³ÎÆÐÄ¡¸¦ ÇÏ°í Àû´çÈ÷ ÄÄÆÄÀÏÇÑ´Ù ±×¸®°í ÇÁ·ÒÇÁÆ® »ó¿¡¼­ ¸î °³ÀÇ ¸í·ÉÀ» ÀÔ·ÂÇÏ´Â °ÍÀ¸·Î ¸ðµç ¼³Ä¡°¡ ³¡³­´Ù. ±×¸®°í Àç ºÎÆýà ¼³Á¤ÀÌ Áö¿öÁö¹Ç·Î  /etc/rc.d/rc.local ¶Ç´Â ·¹µåÇÞÀÇ °æ¿ì /etc/rc.d/rc.local.mine ¿¡ µ¿ÀÏÇÑ ¸í·ÉÀ» ³Ö¾îÁÖ¸é µÈ´Ù. ÀÌ°Í¿¡ ´ëÇÑ ¼³¸íÀº http://www.linuxvirtualserver.org/VS-NAT.html ¿¡ ÀÚ¼¼È÷ ³ª¿ÍÀÖ´Ù. ¿µ¹®ÀÌ ºÎ´ã½º·´´Ù¸é http://tunelinux.pe.kr/virtual/ ¿¡ ¹ø¿ªÆÇÀÌ ÀÖÀ¸¸ç, kldp.org ¿¡µµ ¹ø¿ªÆÇÀÌ ÀÖ´Ù.

 

4. Fail Over

    ÇÊÀÚÀÇ ¸ÅµÎ»ç Ŭ·¯½ºÅÍ´Â ¸î¸îÀÇ ¸®¾ó¼­¹ö°¡ ´Ù¿î‰çÀ» ¶§ ½É°¢ÇÑ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î node3 ÀÌ ´Ù¿îµÇ¾ú´Ù¸é node2·ÎºÎÅÍ Á¦°øµÇ´Â ÆäÀÌÁöµéµµ Á¦´ë·Î Ç¥½ÃµÇÁö ¾Ê´Â °ÍÀ» º»ÀûÀÌ ÀÖ´Ù. ¾î·µç ¾ÈÁ¤ÀûÀÎ ¼­ºñ½º¸¦ À§Çؼ­ fail over´Â ¹Ýµå½Ã ÀÌ·ç¾îÁ®¾ß ÇÑ´Ù.

    fail over¿¡´Â µÎ °¡Áö°¡ ÀÖ´Ù Çϳª´Â ¸®¾ó¼­¹öÀÇ fail over ¿Í Çϳª´Â ·Îµå¹ë·±¼­ÀÇ fail over ÀÌ´Ù. ¸®¾ó¼­¹öÀÇ fail over´Â °£´ÜÇÑ ¹®Á¦ÀÌ´Ù. ÇÏÁö¸¸ ·Îµå¹ë·±¼­ÀÇ fail over´Â °£´ÜÇÏÁö ¾Ê´Ù. º»¹®¼­¿¡¼­´Â ¸®¾ó¼­¹öÀÇ fail over¸¦ À§ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ ¼Ò½º¿Í ÇÔ²² ¼³¸íÀ» ÇÒ °ÍÀÌ´Ù. ±Û°í ·Îµå¹ë·±¼­ÀÇ fail over ´Â '0. µé¾î°¡±â¿¡ ¾Õ¼­' ¶õ¿¡ ÀÖ´Â °í°¡¿ë¼º ¼Ö·ç¼ÇÀ» Âü°í Çϱ⠹ٶõ´Ù.

    ¸®¾ó¼­¹öÀÇ ±âº» ¾ÆÀ̵ð¾î´Â ÁÖ±âÀûÀ¸·Î ¸®¾ó¼­¹ö¿¡°Ô À¥ÆäÀÌÁö ¿äûÀ» ÇÏ¿© Á¦´ë·Î ÀÀ´äÀ» ÇÏ´ÂÁö¸¦ üũÇÏ°í ÀÀ´äÀÌ ¾øÀ¸¸é ÇØ´ç ¸®¾ó¼­¹ö°¡ fail µÇ¾úÀ½À¸·Î ¾ÕÀ¸·Î µé¾î¿À´Â ¿äûÀ» ±×°÷À¸·Î Àü¼Û(transation)ÇÏÁö ¾Êµµ·Ï ÇØÁÖ´Â °ÍÀÌ´Ù. ÀÌ °ÍÀº ¸®¾ó¼­¹ö°¡ fail ‰çÀ» ¶§ °ü¸®ÀÚ°¡ Äֻܼ󿡼­ ÇØÁÖ´Â Çൿ°ú ÀÏÄ¡ÇÏ¸ç ´Ù¸¸ À̸¦ ÇÁ·Î±×·¥È­ ÇÑ °Í»ÓÀÌ´Ù.

    ¿¹¸¦ µé¾î wget http://node3/ ¸í·ÉÀ¸·Î node3 À¸·ÎºÎÅÍ À¥ÆäÀÌÁö¸¦ °¡Á®¿À·Á°í ÇßÀ¸³ª ½ÇÆÐÇß´Ù¸é °ü¸®ÀÚ´Â ipvsadm -d -t medusa:80 -R node3:80 °ú °°Àº ¸í·ÉÀ¸·Î ´õ ÀÌ»ó ¸ÞµÎ»ç·Î ¿À´Â ¿äûÀ» node3 À¸·Î º¸³»Áö ¸øÇϵµ·Ï ÇÒ °ÍÀÌ´Ù.

    ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î Àüü ¾Ë°í¸®ÁòÀ» ¼³°èÇغ¸¸é ¾Æ·¡¿Í °°´Ù.
     

    while(1) {
       for (i=0; i<node_numbers; I++) {
           state = IsAlive(node[i]);        // ³ëµå°¡ »ì¾ÆÀÖ´ÂÁö °Ë»ç
           if(before_stat[i] == state) continue;    // ³ëµå »óÅ¿¡ º¯È­°¡ ¾øÀ¸¸é
           if(state == TRUE)                // ³ëµå°¡ Á×¾ú´Ù°¡ »ì¾Æ³µÀ¸¸é
              ServerOff( node[i] ); // ipvsadm -d -t medusa:80 -R node[i]:80 -m -w 1 ½ÇÇà
           else                     // ³ëµå°¡ »ì¾Ò´Ù°¡ Á×¾úÀ¸¸é
              ServerOn( node[i] );  // ipvsadm -a -t medusa:80 -R node[1]:80 -m -w 1 ½ÇÇà
          before_state[i] = sta

    te;
       }
       sleep(delay_time);           // ¸î Ãʸ¶´Ù üũÇÒ °ÍÀÎÁö
    }

 

5. source

    ´ÙÀ½Àº ½ÇÁ¦ ¸®¾ó¼­¹öÀÇ fail over¸¦ Áö¿øÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. C ¾ð¾î¿¡ ´É¼÷ÇÏ´Ù¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×¸®°í ±×·¸Áö ¾Ê´ÙÇصµ ¸ÞÀκκÐÀº ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ¸ç ¸ÞÀÎ ºÎºÐÀÇ º¯°æ¸¸À¸·Î ÀÚ½ÅÀÇ Å¬·¯½ºÅÍ¿¡ Àû¿ëÇÒ ¼ö ÀÖ´Ù. ÇöÀç ÇÁ·Î±×·¥Àº 3°³ÀÇ ¸®¾ó¼­¹ö(node1, node3, node4)¸¦ °¡Áö°í ÀÖ´Â °æ¿ìÀÌ¸ç °ÔÀ¸¸¥ ºÐÀº ±½Àº ±Û¾¾·Î µÈ ºÎºÐÀ» Àû´çÈ÷ °íÃļ­ »ç¿ëÇÏ¸é µÈ´Ù.

    ±×¸®°í ³²ÀÇ ÇÁ·Î±×·¥À» ºÐ¼®ÇÏ´Â °ÍÀº ¼Ò½º°¡ ÀÛ´õ¶óµµ ¸Å¿ì Àç¹Ì¾ø´Â °æ¿ì°¡ ¸¹´Ù. ƯÈ÷ ÇÊÀÚÀÇ ÇãÁ¢ÇÑ Äڵ忡 Â¥ÁõÀÌ ³¯ ¼öµµ ÀÖ´Ù. ÀÌ·± ºÐµéÀº TcpConnect() ¸¸ µû¼­ Á÷Á¢ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÌ´Ù. À§ÀÇ ¾Ë°í¸®Áò¿¡¼­ IsAlive() ¿¡ ÇØ´çÇÏ´Â ·çƾÀÌ´Ù. ±×¸®°í Âü°í·Î TcpConnect() ¿¡¼­ TcpSend() ¿Í TcpRecv()¸¦ È£ÃâÇϹǷΠ3°³ÀÇ ·çƾÀ» º¹»çÇؼ­ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.

     

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define DATALENG 1024
#define PORT                    80      /* À¥¼­ºñ½º Æ÷Æ® */
#define SERVERNUM          3       /* ¸®¾ó¼­¹öÀÇ ¼ýÀÚ */
#define INTERVAL 5                    /* ¸®¾ó¼­¹ö °Ë»ç ÁÖ±â(ÃÊ ´ÜÀ§) */

int TcpSend(int sockfd,char *send_buf)
{   

    if (send(sockfd, send_buf, strlen(send_buf), 0) == -1)
    {   perror("TCP send");
        exit(1);
    }
    return 1;
}

int TcpRecv(int sockfd,char *recv_buf)
{
        int recv_num;

    if((recv_num=recv(sockfd,recv_buf,DATALENG,0))==-1)
    {   perror("TCP recv");
        exit(1);
    }
    return 1;
}

int TcpConnect(char *host,int port,char *send_buf, char *recv_buf)
{
    int sockfd;
    struct hostent *he;
    struct sockaddr_in their_addr;

    if ((he=gethostbyname(host)) == NULL) {  /* get the host info */
        herror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("TCP socket");
        exit(1);
    }

    their_addr.sin_family = AF_INET;
    their_addr.sin_port = htons(port);
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero), 8);

/* ¸®¾ó¼­¹ö°¡ fail ‰çÀ¸¸é ´ÙÀ½ÀÇ if ¹®¿¡¼­ °É·Á¼­ ¸®ÅÏµÇ°Ô µÈ´Ù °íÄ¥ ÇÊ¿ä¾ø´Ù*/
    if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1) {
        close(sockfd);
        return 0;
    }

    TcpSend(sockfd,send_buf);
    TcpRecv(sockfd,recv_buf);
    close(sockfd);
    return 1;
}

/***** MAIN START ****/
int main()
{
    char send_buf[100], recv_buf[DATALENG];
    char OffCommand[SERVERNUM][100];
    char OnCommand[SERVERNUM][100];
    char addr[SERVERNUM][15];
    int ServerOn[SERVERNUM],temp,i;

/* À¥¼­¹ö¿¡°Ô ÆäÀÌÁö¸¦ ¿äûÇÏ´Â ¹®ÀåÀÌ´Ù
GET /index.html Àº ¿äûÇÏ´Â ÆäÀÌÁöÀÇÀ̸§ÀÌ´Ù. ´Ù¸¥ À̸§°ú °æ·Î·Î ¹Ù²Ù¾î Àû¾îÁ־ ¹«¹æÇÏ´Ù.
User-Agent: ´Â ¿äûÇÁ·Î±×·¥À» Àû¾îÁÖ´Â ºÎºÐÀ¸·Î Àû´çÈ÷ Àû¾îÁÖ¸é µÈ´Ù.
ÇÊÀÚÀÇ °æ¿ì ÀÌ ÇÁ·Î±×·¥À» MMD ÇÁ·ÎÁ§Æ®ÀÇ Äڵ忡¼­ µû¿Â °ÍÀ̹ǷΠ¹Ì´Ï MMD ¶ó°í Àû¾ú´Ù.
Host: ºÎºÐÀº ¿äûÇÏ´Â ¸Ó½ÅÀÇ À̸§ÀÌ´Ù ÀϹÝÀûÀ¸·Î ·Îµå¹ë¼±¼­ÀÇ º°¸íÀ» ÀûÀ¸¸é µÈ´Ù*/
strcpy(send_buf,"GET /index.html HTTP/1.0¡¬nUser-Agent: MiniMMD¡¬nHost: medusa¡¬nAccept: */*¡¬n¡¬n");

/* ¸®¾ó¼­¹ö¿¡ ´ëÇÑ Á¤º¸¸¦ Çϳª¾¿ Àû¾îÁØ´Ù.
addr Àº ¸®¾ó¼­¹öÀÇ À̸§À̸ç, OffCommand ´Â ¸®¾ó¼­¹ö°¡ ÀÀ´äÀÌ ¾øÀ» ¶§ ¼öÇàÇØÁÙ ¸í·ÉÀÌ´Ù.
ÀÌ ¸í·ÉÀº 210.123.54.230:80 À¸·Î µé¾î¿Â À¥¼­ºñ½º ¿äûÀ» 192.168.1.1:80 ·Î Àü¼ÛÇÏÁö ¾Ê°Ô ÇØÁØ´Ù.
OnCommand ´Â ¸®¾ó¼­¹ö°¡ ´Ù½Ã »ì¾Æ³ª¸é ¼öÇàÇØÁÙ ¸í·ÉÀÌ´Ù.*/
/* real server 192.168.1.1 */
strcpy(addr[0],"node1");
strcpy(OffCommand[0],"/sbin/ipvsadm -d -t 210.123.54.230:80 -R 192.168.1.1:80");
strcpy(OnCommand[0],"/sbin/ipvsadm -a -t 210.123.54.230:80 -R 192.168.1.1:80");
ServerOn[0]=1;

/* real server 192.168.1.3 */
strcpy(addr[1],"node3");
strcpy(OffCommand[1],"/sbin/ipvsadm -d -t 210.123.54.230:80 -R 192.168.1.3:80");
strcpy(OnCommand[1],"/sbin/ipvsadm -a -t 210.123.54.230:80 -R 192.168.1.3:80");
ServerOn[1]=1;

/* real server 192.168.1.4 */
strcpy(addr[2],"node4");
strcpy(OffCommand[2],"/sbin/ipvsadm -d -t 210.123.54.230:80 -R 192.168.1.4:80");
strcpy(OnCommand[2],"/sbin/ipvsadm -a -t 210.123.54.230:80 -R 192.168.1.4:80");
ServerOn[2]=1;

while(1) {
   /* ¸ðµç ¸®¾ó¼­¹ö¿¡ ´ëÇؼ­ ¿ëûÀ» º¸³»°í ÀÀ´äÀ» ¹Þ±â À§ÇÑ ½Ãµµ¸¦ ÇÑ´Ù */
   for(i=0; i<SERVERNUM ; i++) {
      printf("%s checking.... ",addr[i]);
      fflush(stdout);
      /* send_buf ÀÇ ³»¿ë(À¥ÆäÀÌÁö ¿äû)À» ÁÖ¾îÁø ÁÖ¼Ò(addr[i] port) ·Î º¸³»°í ÀÀ´äÀ»
          recv_buf ¿¡ ¹Þ´Â´Ù */
      temp=TcpConnect(addr[i],PORT,send_buf,recv_buf);
      if(temp == 0) /* real server fail */
      {   printf(" Fail¡¬n");
          fflush(stdout);
          if(ServerOn[i] == 1)
          {   ServerOn[i]=temp;
              /* ¸®¾ó¼­¹ö°¡ Á×¾úÀ¸¸é ´õÀÌ»ó ¸®¾ó¼­¹ö·Î À¥ÆäÀÌÁö ¿äûÀ» º¸³»Áö ¾Êµµ·Ï ¸í·ÉÀ»
                  ¼öÇàÇÑ´Ù */
              system(OffCommand[i]);
          }
      }
      else
      {   printf(" OK!!¡¬n");
       fflush(stdout);
if(ServerOn[i] == 0)
{   ServerOn[i]=temp;
/* ¸®¾ó¼­¹ö°¡ »ì¾Æ³µÀ¸¸é ¸®¾ó¼­¹ö·Î À¥ÆäÀÌÁö ¿äûÀ» ´Ù½Ã º¸³»µµ·Ï ¸í·ÉÀ» ¼öÇàÇÑ´Ù */
system(OnCommand[i]);
}
}
}       
/* Àû´çÇÑ ½Ã°£¸¶´Ù ¸®¾ó¼­¹ö¸¦ üũÇÑ´Ù */
sleep(INTERVAL);
}
return 0;
}


 

5. MMD ÇÁ·ÎÁ§Æ®

    °³ÀÎÀûÀ¸·Î Ŭ·¯½ºÅÍÀÇ ¿©·¯ µ¥¸óÀÇ ¸ð´ÏÅ͸µ°ú fail over¸¦ À§ÇÑ ÇÁ·Î±×·¥À» Á¦ÀÛÇÏ´Â ÇÁ·ÎÁ§Æ®ÀÌ´Ù. ¾ÆÁ÷Àº ½ÃÀÛ´Ü°èÀ̸ç, Ãʱ⠹öÀüµµ ¿Ï¼ºµÇÁö ¾ÊÀº »óÅÂÀÌ´Ù.
    ÇöÀç ¿©·¯ µ¥¸óÀÇ ¸ð´ÏÅ͸µ°ú ¸®¾ó¼­¹öÀÇ fail over °¡ ±¸ÇöµÇ¾úÀ¸¸ç, ¶ó¿ìÅÍÀÇ fail over ´Â ±¸ÇöµÇÁö ¾ÊÀº »óÅÂÀÌ´Ù. º¸´Ù ÀÚ¼¼ÇÑ ¼³¸íÀº http://www.moo.pe.kr/mmd/intro.htm¿¡¼­ º¼ ¼ö ÀÖ´Ù. ¶ÇÇÑ MiniMMD¶ó´Â À̸§À¸·Î ¸®¾ó¼­¹öÀÇ fail over¸¦ Áö¿øÇÏ´Â ÇÁ·Î±×·¥À» ¼Ò½º¿Í ÇÔ²² °ø°³ÇÏ¿´´Ù.
    ÀÌ ¹®¼­¿¡¼­ ¼³¸íÇÑ ¹æ¹ý°ú °°Àº ¹æ¹ýÀ¸·Î ÀÛµ¿ÇÑ´Ù. ´Ù¸¸ ¼³Á¤ÆÄÀÏÀ» Àаí, Çؼ®ÇÏ´Â ºÎºÐÀÌ Ãß°¡µÇ¾ú´Ù. http://www.moo.pe.kr/mmd/mmd.tar.gz ¿¡¼­ ¹ÞÀ» ¼ö ÀÖ´Ù.




¡ã top

homeÀ¸·Î...