[클러스터] Encluster를 이용한 웹서버, MYSQL 서버 HA 하기

# Encluster 를 이용한 apache 웹서버 LVS Cluster 및 Mysql HA Cluster 구축 하기

1. svr1, svr2 서버에 apache 와 mysql 을 설치 한다. mysql 버전은 3.23 이상으로 한다.

2. Encluster 로 svr1, svr2의 서버들은 DR 형태로 클러스터 구성을 한다.

3. httpd 와 mysqld 서비스를 등록하다.

4. mysql replication 설정하기

svr1 서버를 master 서버로 지정 함.

svr2 서버를 slaver 서버로 지정 함.

– master 서버에 DB 복제를 해주는 역활의 User 를 만든다.

mysql > GRANT FILE ON *.* TO cluster@”%” IDENTIFIED BY ‘<password>’;

여기서 % 대신에 slave 서버 주소를 적어 주어도 상관없음.

master 의 /etc/my.cnf

——————————————————————-

[mysqld]

log-bin

binlog-do-db=syszone

server-id=1

——————————————————————-

binlog-do-db=’DB 이름’

slaver 의 /etc/my.cnf

——————————————————————-

[mysqld]

server-id=2

master-host=211.238.41.165

master-user=repli

master-password=root///

master-port=3306

——————————————————————-

master-user=repli 가 잘 안되면 그냥 root 로 한다.

단..root 역시 원격 DB 접속을 가능토록 해주어야 한다.

mysql> select User,Host from user;

+———+———–+

| User    | Host      |

+———+———–+

| root    | %         |

| www     | %         |

|         | localhost |

| root    | localhost |

| sahak21 | localhost |

| www     | localhost |

| www     | svr2      |

+———+———–+

svr1, svr2 서버의 mysql deamon 을 차례로 start 시킨다.

확인 절차 –master server ( svr1 )

mysql > show master status;

+————–+———-+————–+——————+

| File         | Position | Binlog_do_db | Binlog_ignore_db |

+————–+———-+————–+——————+

| svr1-bin.023 | 79       | syszone      |                  |

+————–+———-+————–+——————+

확인 절차 –slave server ( svr2 )

| Master_Host                    211.238.41.165

| Master_User                          root

| Master_Port                    3306

| Connect_retry                  60

| Master_Log_File                 svr1-bin.023

| Read_Master_Log_Pos           79

| Relay_Log_File                     svr2-relay-bin.025

| Relay_Log_Pos                 271

| Relay_Master_Log_File         svr1-bin.023

| Slave_IO_Running                 Yes

| Slave_SQL_Running                 Yes

| Replicate_do_db                 

| Replicate_ignore_db

| Last_errno                         0

| Last_error                         

| Skip_counter                         0

| Exec_master_log_pos                 79

| Relay_log_space                 271

여기서 master pos 에 관련된것이 master status 의 position 값과 일치해야함.

– Encluster 상에서 Apache Virtual Host 와 Mysql DB host 지정 문제를 해결해야 한다.

        – apache virtualhost 문제 해결

        실제 apache 에서 virtualhost 를 사용할 경우 현 서버 구성중 자기 자신이 direct

        로 되어져 있는 경우 httpd.conf 의 서버 주소 및 virtualhost 주소가 모두 vip 로

        되어져야 virtualhost 가 되어진다. 그리고 real server 인 경우에는 httpd.conf

        의 Ip address 가 모두 real ip로 되어져 있어야 virtualhost 가 이루어 진다.

        /usr/local/apache/conf 디렉토리에 httpd.conf-real , httpd.conf-vip 의 두개의

        설정파일을 만들어 둔다.

        – Mysql connect address 문제 해결

        Encluster 의 클러스터 구성에서 web 과 같은 서비스와 Mysql DB 서비스를 같이

        할 경우 mysql db connection address 가 vip 로 되어져야 하는데 web의 경우는

        vip 를 인식하는 클라이언트가 클러스터 구성의 외부에 있는 client brower 에서

        찾아 들어가기 때문에 vip를 통한 부하분산에 문제가 없다.

        하지만 mysql 처럼 DB 서버의 경우에는 db client 가 클러스터 구성 외부의 client

        가 아닌 web server가 db client 역할을 하고 그 web server 가 db server와 같은

        서버일 경우 client 가 클러스터 구성 안에 존재 하게 된다.

        이때 클러스터 구성안에서는 vip 를 direct server 로 인식하기 때문에 부하분산

        방식에 문제가 생긴다. 그래서 이를 해결 하기 위해서는 direct 서버에 별도의

        db connection 전용의 ip address 를 활당하는 방법으로 이를 해결한다.

        – Encluster 구성중 /usr/clx/sbin/vipctl 의 script 를 이용하여 위의 두가지

        문제를 해결한다.

        vipctl 의 역활은 direct 가 변경되는 경우 이 스크립터를 실행한다.

        

//////        master (svr1) 의 /usr/clx/sbin/vipctl script  수정

        

        script fuction 중 honor_vip () 는 direct 변동으로 인해 자기가 director 가

        안 되었을 경우 실행하는 함수이다.

honor_vip () {

  if ifconfig $DEV:$ALIAS | grep “inet addr:$VIP” &> /dev/null

  then

    # The VIP is already taken

    exit 0;

  fi

  if [ -e /proc/sys/net/ipv4/conf/all/hidden ]

  then

    # Linux-2.2.x with hidden patch

    # Do ARP disabling on the interface

    # This line may be moved to system init script

    echo 1 > /proc/sys/net/ipv4/conf/all/hidden

    echo 1 > /proc/sys/net/ipv4/conf/lo/hidden

    # Add interface alias on the vip

    ifconfig lo:$ALIAS $VIP netmask 255.255.255.255 broadcast $VIP up

  elif [ -e $IPTABLES ]

  then

    # Linux-2.4.x with iptables

    $IPTABLES -t nat -D PREROUTING -j REDIRECT -d $VIP -p tcp > /dev/null 2>&1

    $IPTABLES -t nat -D PREROUTING -j REDIRECT -d $VIP -p udp > /dev/null 2>&1

    $IPTABLES -t nat -A PREROUTING -j REDIRECT -d $VIP -p tcp

    $IPTABLES -t nat -A PREROUTING -j REDIRECT -d $VIP -p udp

    이부분 추가

———————————————————————————-

    ifconfig $DEV:777 down

    /usr/local/apache/bin/apachectl stop

    ln -sf /usr/local/apache/conf/httpd.conf-real /usr/local/apache/conf/httpd.conf

   /usr/local/apache/bin/apachectl start

———————————————————————————-

  fi

}

        take_vip () 함수는 자기가 director 가 되었을 경우 실행하는 함수이다.

take_vip () {

        # 디렉터가 되는 경우

  # Remove vip honoring

  dishonor_vip

  # Add interface alias on the vip

  ifconfig $DEV:$ALIAS $VIP netmask 255.255.255.255 broadcast $VIP up &> /dev/null

  route add -host $VIP dev $DEV:$ALIAS &> /dev/null

        이부분 추가

——————————————————————————–

  ifconfig $DEV:777 211.238.41.174 netmask 255.255.255.224 up &> /dev/null

  /usr/local/apache/bin/apachectl stop

  ln -sf /usr/local/apache/conf/httpd.conf-vip /usr/local/apache/conf/httpd.conf

  /usr/local/apache/bin/apachectl start

——————————————————————————–

  # Do ARP spoofing; do several times

  if [ $DOARPSPOOFING = true ]

  then

    HWADDR=`ifconfig $DEV | grep HWaddr | cut -d’ ‘ -f11`

    BADDR=’ff:ff:ff:ff:ff:ff’

    ( \\

    $SENDARP $DEV $VIP $HWADDR $VIP $BADDR &> /dev/null; usleep 400; \\

    $SENDARP $DEV $VIP $HWADDR $VIP $BADDR &> /dev/null; usleep 400; \\

    $SENDARP $DEV $VIP $HWADDR $VIP $BADDR &> /dev/null; \\

    ) &

  fi

}

//////  slave (svr2) 의 /usr/clx/sbin/vipctl 수정

honor_vip () 의 수정 부분에 아래 내용을 추가

    ifconfig $DEV:777 down

    /usr/local/apache/bin/apachectl stop

    ln -sf /usr/local/apache/conf/httpd.conf-real /usr/local/apache/conf/httpd.conf

   /usr/local/apache/bin/apachectl start

   /usr/clx/sbin/dush -n svr1 /etc/rc.d/init.d/mysql stop

   /etc/rc.d/init.d/mysql stop

   /usr/clx/sbin/dua /usr/local/mysql/data/syszone

   /usr/clx/sbin/dush -n svr1 /etc/rc.d/init.d/mysql start

   /etc/rc.d/init.d/mysql start

take_vip () 의 수정 부부에 아래 내용을 추가

  ifconfig $DEV:777 211.238.41.174 netmask 255.255.255.224 up &> /dev/null

  /usr/local/apache/bin/apachectl stop

  ln -sf /usr/local/apache/conf/httpd.conf-vip /usr/local/apache/conf/httpd.conf

  /usr/local/apache/bin/apachectl start

        

이는 웹 서버는 Encluster 를 이용하여 정상적으로 부하분산을 시키고 Mysql 의 경우는  replication 을 이용하여 평소에는 master 서버의 내용을 slave 에서 실시간 복제를 하고  있다가 master 서버에 문제가 발생했을 경우 slave 서버가 director 가 되면서  mysql connection address 를 slave 가 가져가면서 slave 에서 db service를 하게 된다.

그런 이후 master 가 살아나면 slave db server 새로 갱신된 내용을 master 서버로 file  dump 방식으로 다시 전달하고 master 서버에서 db connection ip address 를 가져 오게  되어 master 서버에서 다시 서비스를 하게 된다.

slave 서버에서 master 서버로 다시 db service server가 변경되는 액션은 관리자가  수동으로 처리하게 하고 있다. 자동으로 할 경우엔 slave server 의 honor_vip ()  함수의 추가 내용 마지막에 /etc/rc.d/init.d/cmctl restart 를 추가해 주면 된다.

;;; 추가 설정 시 주의 사항

rsh, rlogin 을 이용한 dua, dush util 를 설치하고 설정해야 함.

direct 가중치를 master 노드에 200 , slave 노드에 100 을 주도록 한다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.