######mysql dual replication 설정 ######
mysql dual replication이란 일반적인 리플리케이션과 달리 서로가 마스터이자 슬레이브로
서로 양쪽의 db를 리플리케이션 함으로 어느쪽에서든 데이터가 생성되면 서로 복제하며
한쪽 DB가 죽어도 나머지 한쪽은 정상 작동되며 죽은 DB가 다시 살아날 경우 작동이 중지되어있던 시간동안 생긴 데이터가 바로 복제된다
# replication 설정
# db 1
#my.cnf 수정
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id = 1
binlog_format = 'MIXED'
#mysql 재시작
/etc/init.d/mysqld restart
#리플리케이션에 이용할 db사용자 생성
mysql -u root -p
mysql> create user 'repli'@'서버2번 아이피 입력' identified by'비밀번호';
#mysql replication user 생성 및 master 정보 확인
mysql> grant replication slave on *.* to 'repli'@'서버2번 아이피 입력' identified by '비밀번호';
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 2516 | | | |
+------------------+----------+--------------+------------------+-------------------+
# server 2
# my.cnf 수정
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id = 2
binlog_format = 'MIXED'
# mysql 재시작
/etc/init.d/mysqld restart
#리플리케이션에 이용할 db사용자 생성
mysql -u root -p
mysql> create user 'repli2'@'서버1번 아이피 입력' identified by'비밀번호';
# mysql replication 설정, user 생성 및 master 정보 확인
mysql> stop slave;
mysql> change master to master_host='서버1번 아이피 입력', master_user='repli', master_port=3306, master_password='암호입력', master_log_file='mysql-bin.000001(위에나온 서버1 파일명)', master_log_pos=2516(위에나온 서버1 포지션번호);
mysql> start slave;
mysql> grant replication slave on *.* to 'repli2'@'서버1번 아이피 입력' identified by '암호입력';
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 2365 | | | |
+------------------+----------+--------------+------------------+-------------------+
# server 1
# mysql replication 설정
mysql -u root -p
mysql> stop slave;
mysql> change master to master_host='서버2번 아이피 입력', master_user='repli2', master_port=3306, master_password='암호입력', master_log_file='mysql-bin.000001(위에나온 서버2 파일명)', master_log_pos=2365(위에나온 서버2 포지션번호);
mysql> start slave;
확인작업으로 한쪽에서 testdb 생성
다른쪽에 정상적으로 생겼는지 조회해본후
한쪽 mysql stop 후 나머지 한쪽에서 testdb2 생성
다시 mysql start후 testdb2 생기는지 확인
#########heartbeat 설치 ################
# 호스트네임 추가
# Server 1 (192.168.232.129)
vi /etc/sysconfig/network
HOSTNAME=129s
vi /etc/hosts
192.168.232.129 129s
#내 아이피와 호스트네임, Server2의 아이피와 호스트네임을 추가해준다
# Server 2 (192.168.232.130)
vi /etc/sysconfig/network
HOSTNAME=130s
vi /etc/hosts
192.168.232.130 130s
#내 아이피와 호스트네임, Server1의 아이피와 호스트네임을 추가해준다
#호스트네임이 잘 변경되었는지 각각 서버에서 uname -n 으로 조회해본다
# 저장소 추가, heartbeat 설치(서버1,2 동일)
# heartbeat는 기본 저장소에 없으므로 저장소를 추가해준다(서버1,2 동일)
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# 추가 완료되었다면 heartbeat 설치(서버1,2 동일)
yum -y install heartbeat*
# 설치경로로 이동(서버1,2 동일)
cd /usr/share/doc/heartbeat-3.0.4/
# 설정 샘플파일 복사, 기본적으로 설정파일을 읽는 경로가 /etc/ha.d 이기때문에 /etc/ha.d로 설정파일(ha.cf haresources authkeys)을 복사해준다(서버1,2 동일)
cp ha.cf haresources authkeys /etc/ha.d/
#파일 퍼미션 변경(서버 1,2 동일) (변경 안하면 heartbeat 데몬 시작시 오류남)
chmod 600 /etc/ha.d/authkeys
# ha.cf 설정(서버1,2 동일)
vi /etc/ha.d/ha.cf
파일 끝에 복사해준다
#디버깅용 로그
debugfile /var/log/ha-debug.log
#기타 로그
logfile /var/log/ha.log
#노드간 체크 시간(두 노드간에 얼마나 자주 heartbeat를 주고받을 것인가를 설정)
keepalive 2
#호스트가 죽었다고 판단하는 시간
deadtime 30
#자동 복구 On(한 노드가 서비스 하다가 죽었을 때 새로운 노드로 자원이 이동)
auto_failback on
#노드간 체크에 사용할 인터페이스(heartbeat 를 보낼 인터페이스 설정)
bcast eth0
#노드 등록
node 129s # master
node 130s # slave
#UDP 에 사용할 포트(통신포트 설정)
udpport 694
# 로그파일 생성(서버1,2 동일)
touch /var/log/ha-debug.log
touch /var/log/ha.log
# haresources 설정
vi /etc/ha.d/haresources
#기존 설정되어있는 내용 모두 주석처리후 맨 아래 추가
# Server1쪽 haresources
uname -n 했을때 나오는 호스트명 IPaddr2::192.168.232.131/24/eth0:0/192.168.232.255 mysqld mon
# Server2쪽 haresources
uname -n 했을때 나오는 호스트명 IPaddr2::192.168.232.131/24/eth0:0/192.168.232.255 mysqld mon
# 설정내용 설명
# 129s = hostname
# 192.168.232.131 = 가상 IP(VIP)
# 24 = 클래스 (prefix)
# eth0:0 = 가상IP(VIP)가 사용할 인터페이스
# 192.168.232.255 = Broadcast
# mysqld = 서비스할 데몬
# authkeys 설정 (서버1,2 동일)
vi /etc/ha.d/authkeys
#변경전
#auth 1
#1 crc
#2 sha1 HI!
#3 md5 Hello!
#변경후
auth 2
#1 crc
2 sha1 HI!
#3 md5 Hello!
(sha1 Hi! 부분 Hi!는 변경 가능, 변경시 서버 1,2가 동일하게만 작성되어있으면 됨)
# 같이 서비스할 데몬 심볼릭링크 생성 (서버1,2 동일)
cd /etc/ha.d/resource.d
ln -s /etc/init.d/mysqld mysqld
# resourec.d 에 mysqld 링크를 걸어놨으므로 이제 heartbeat 데몬을 중지하거나 시작하면 mysql 데몬도 같이 중지, 시작된다.
/etc/init.d/heartbeat start
##방화벽을 사용중이라면 udp 694에 대해서 방화벽 허용을 해줘야 한다.
######mon 설치##########
mkdir /usr/local/lib64/perl5
cd /usr/include 로 이동 후 h2ph -r -l . 실행 (h2ph -r -l . <--마침표까지 복사해서 실행해야함)
yum install perl-CPAN
## perl 모듈 설치(wget으로 받으면 파일명이 깨지니 윈도우에 받고 나서 ftp든 이용해서 올리는게 좋음)
http://wnstjqdl.tistory.com/attachment/cfile25.uf@22786A38530192F40D0455.gz
http://wnstjqdl.tistory.com/attachment/cfile29.uf@2555DE38530192FB214704.gz
(모듈 다운이 안되면 cpan.org 에서 Period-1.20.tar.gz , Time-HiRes-1.9721.tar.gz 받으면 됨)
(아니면 cpan -i 모듈명 으로도 설치 가능)
tar xvzf Period-1.20.tar.gz
tar xvzf Time-HiRes-1.9721.tar.gz
cd Period-1.20
perl Makefile.PL
make
make install
cd ../Time-HiRes-1.9721
perl Makefile.PL
make
make install
## mon 설치(wget으로 받으면 파일명이 깨지니 윈도우에 받고 나서 ftp든 이용해서 올리는게 좋음)
(링크가 안들어가지면 mon-1.2.0.tar.gz 찾아서 다운 받으면 됨)
http://wnstjqdl.tistory.com/attachment/cfile9.uf@241C813A530194BC20DB8B.gz
##mon 압축 해제후 mon.d 디렉토리 에서
make
make install
####make install했을시
#install: invalid group `uucp'
#make: *** [install] Error 1
#오류가 나는경우 uucp계정이 없어서 나는 오류임 계정 생성해야함
##나는 관리하기 편하게 /opt/webapps/mon으로 이동시켜 압축풀고 make했음
##설정파일 복사
mkdir /etc/mon
cp /opt/webapps/mon/etc/example.cf /etc/mon/mon.cf
cp /opt/webapps/mon/etc/auth.cf /etc/mon/auth.cf
##mon.cf 수정
vi /etc/mon/mon.cf
##기존내용 삭제후 아래내용 추가
alertdir = /opt/webapps/mon/alert.d
mondir = /opt/webapps/mon/mon.d
logdir = /var/log/mon
historicfile = /var/log/mon/history.log
maxprocs = 20
histlength = 100
randstart = 60s
dtlogging = yes
dtlogfile = dtlog
authtype = getpwnam
hostgroup servers 127.0.0.1
watch servers
service mysql
interval 15s
monitor msql-mysql.monitor -mode=mysql --username=mon --password=mon --database=mon
allow_empty_group
period wd {Mon-Sun}
alert mysql.down.alert
alertevery 1m
alert file.alert /var/log/mon.file.log
alertafter 3
#### mon 스크립드 작성
vi /etc/init.d/mon
#아래내용 추가
#!/bin/bash
MON_HOME=/opt/webapps/mon # 본인이 설치한 폴더위치
MON_CF=/etc/mon # mon.cf 설정파일이 들어갈 위치
case "$1" in
start)
if [ -f $MON_HOME/mon.pid ]; then
echo "mon already started"
exit
fi
echo "Starting Mon"
$MON_HOME/mon -c $MON_CF/mon.cf -L $MON_HOME -P $MON_HOME/mon.pid &
;;
stop)
if [ -f $MON_HOME/mon.pid ]; then
echo "Stopping Mon"
kill -9 `cat $MON_HOME/mon.pid`
rm -f $MON_HOME/mon.pid
else
echo "no server pid, server doesn't seem to run"
fi
;;
status)
echo "doing good"
;;
*)
echo "Usage: $0 {start|stop|status|reload|restart}"
exit 1
esac
##저장후
chmod 755 /etc/init.d/mon
##mysql과 연결하기 위해 Convert-BER-1.31 , DBI-1.631 DBD-mysql-4.026 모듈 설치
##모듈 다운로드(wget으로 받으면 파일명이 깨지니 윈도우에 받고 나서 ftp든 이용해서 올리는게 좋음)
http://wnstjqdl.tistory.com/attachment/cfile10.uf@2175EA3353019DFC34B1C6.gz
http://wnstjqdl.tistory.com/attachment/cfile30.uf@220E0F3353019DFC089297.gz
http://wnstjqdl.tistory.com/attachment/cfile7.uf@217FAE3353019DFC221EBD.gz
tar xvzf Convert-BER-1.31.tar.gz
tar xvzf DBD-mysql-4.026.tar.gz
tar xvzf DBI-1.631.tar.gz
cd Convert-BER-1.31
perl Makefile.PL
make
make install
cd ../DBD-mysql-4.026
#나는 mysql을 소스설치했기때문에 경로 지정, 소스설치 아니라면 그냥 위에처럼 perl Makefile.PL 만 하면됨
perl Makefile.PL --mysql_config=/opt/webapps/mysql5/bin/mysql_config
make
make install
#Makefile.PL 실행했는데 Can't locate DBI/DBD.pm in @INC 나올시
sudo -H cpan DBI::DBD DBD::mysql
cd ../DBI-1.631
perl Makefile.PL
make
make install
#mysql 모니터링 유저,디비 생성
create database mon;
create user 'mon'@'%' identified by 'mon';
GRANT ALL PRIVILEGES ON mon.* TO 'mon'@'%' IDENTIFIED BY 'mon';
FLUSH PRIVILEGES;
use mon;
CREATE TABLE example ( id INT, data VARCHAR(100));
#(테이블 생성이 안되어있으면 mon 실행시 오류남)
#libmysqlclient.so.18 사용할수 있도록 ldconfig 등록
#find 명령어로 libmysqlclient.so.18 찾기
#나는 소스설치해서 경로가 /opt/webapps/mysql5/lib/ 아래에 있음
vi /etc/ld.so.conf
##아래에추가
/opt/webapps/mysql5/lib/
#저장하고 나온후
ldconfig
## mon으로 mysql 체크중에 문제가 생길시 mysql+heartbeat 중지시켜서 stanby 서버를 active로 사용되게 만들기
cd /opt/webapps/mon/alert.d
vi mysql.down.alert
##아래 내용 추가후 저장
#!/bin/sh
/etc/init.d/heartbeat stop
##스크립트에 heartbeat stop만 넣은 이유는 위에 설정한대로 heartbeat와 mysqld를 링크걸어놨기 때문에 heartbeat 데몬을 stop하면 mysql도 같이 내려감
#권한 변경
chmod 755 mysql.down.alert
/etc/init.d/mon start
## mon 설치 참고 : http://wnstjqdl.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-Mon-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%84%A4%EC%A0%95http
http://wnstjqdl.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-Mon-Mysql-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EC%84%A4%EC%A0%95