[클러스터] 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 을 주도록 한다.