-
[MHA] Mysql MHA 구성 및 설치 DB이중화 테스트Database/MHA 2018. 9. 2. 15:33반응형
MHA 개념
MHA란?
Master DB가 장애로 서비스가 불가능한 상태가 되면, 자동으로 failover를 수행하여 slave DB를 master DB로 승격시켜 서비스 다운타임을 최소화 auto failover 솔루션입니다.
MHA 서버 구성
MHA Manager, Masrer, Slave 서버 총 3개가 기본 구성이며 상황에 따라서는 1개의 Master와 N개의 Salve 최소 2대 까지 사용할 수 있습니다. (Activity, Standby 구조)
Master와 Slave에서는 하나의 VIP를 공유하며 DB접속은 해당 VIP를 이용하며 장애발생시 VIP를 이용하여 절제를 진행합니다.
-해당 포스트에서는 2대의 서버 구성을 가지고 테스트합니다. (2대로 구성시 MHA Manager는 Slave장비에 설치)
MHA 의 장점
1. 최소한의 Down Time으로 Master의 장애 처리 및 Slave의 새로운 Master로 변경 수행 가능
2. Master의 장애로 각 노드(Master 및 Slave)의 데이터 불일치가 발생하지 않음
3. 현재 MySQL 서버의 설정을 변경 할 필요가 없음 (MySQL 5.0이상)
4. 서버를 많이 늘릴 필요가 없음 (MySQL Cluster 대비)
5. 스토리지 엔진에 제약을 받지 않음
6. MySQL 성능에 전혀 제약 사항이 없음
MHA의 장애 체크
MHA Manager가 3초마다 마스터 DB를 CONNECT / SELECET / INSERT 체크하며 3회 실패시 장애로 인식하고 Failover를 수행합니다
MHA 의 Replication
1. Mysql에서는 Lossless Replication은 지원 하는데 이는 Master에서 데이터 변경이 되면 Slave 어딘가에 반드시 변경이력(relay log)이 남아있다는 것을 보장 합니다.
2. MHA에서는 장애 발생시 가장 최근에 변경된 Slave를 Master DB로 승격 시킨 후 Lossless Replication 를 통한 relay log로 데이터 복구를 수행합니다.
3. 장애 발생부터 Master DB 승격, 데이터 복구 까지 걸리는 시간은 통상 10~30초 입니다.
MHA 의 FailOverMaster DB에 장애가 발생하면 MHA Manager는 Master장비의 VIP를 down시킵니다.
이후 Replication을 진행 후 down 시킨 VIP를 Slave장비에서 올려 FailOver를 진행합니다.
MHA 설치
1. MHA설치 - 의존성 패키지 설치
Master 장비
명령어
yum -y install perl-CPAN perl-DBD-MySQL perl-Module-Install
Slave 장비
명령어
yum -y install perl-CPAN perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel- ForkManager perl-Module-Install
2. MHA설치 - 소스코드 컴파일
Master 장비
명령어
tar xvzf mha4mysql-node-0.57.tar
cd mha4mysql-node-0.57.tar
perl Makefile.PL
make
make install
Slave 장비
명령어
tar xvzf mha4mysql-node-0.57.tar
cd mha4mysql-node-0.57.tar
perl Makefile.PL
make
make install
tar xvzf mha4mysql-manager-0.57.tar
cd mha4mysql-manager-0.57.tar
perl Makefile.PL
make
make install
3. MHA설치 - MHA 접속계정 생성
Master 장비
명령어
GRANT ALL PRIVILEGES ON *.* TO ‘mha’@'%' IDENTIFIED BY 'mha123';
FLUSH PRIVILEGES;
Slave 장비
명령어
GRANT ALL PRIVILEGES ON *.* TO ‘mha’@'%' IDENTIFIED BY 'mha123';
FLUSH PRIVILEGES;
4. MHA설치 - 설정파일 생성
Slave 장비
vim /etc/masterha-default.cnf
[server default]
user=mha
password=mha123
manager_workdir=/install/log/masterha
manager_log=/install/log/masterha/MHA.log
remote_workdir=/install/log/masterha
master_ip_failover_script=/mha4mysql-manager-0.57/samples/scripts/master_ip_failover
master_ip_online_change_script=/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change
[server1]
hostname=192.xxx.xxx.xxx (Master Host)
master_binlog_dir=/install/data/mysql_binlog (Master binlog가 저장되는 경로)
candidate_master=1
[server2]
hostname=192.yyy.yyy.yyy (Slave Host)
master_binlog_dir=/install/data/mysql_binlog (Slave binlog가 저장되는 경로)
candidate_master=1
※[server1], [server2] 의 IP는 Master장비와 Slave장비의 ssh 접속용 IP로 작성
5. MHA설치 - Failover 및 원복 스크립트 적용
Slave 장비
vim mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_master_to_slave.sh
ifup eth1
ssh root@192.xxx.xxx.xxx /sbin/ifconfig eth1 down (Master DB의 접속 IP)
※Master Failover시 Master의 Database 접속 IP를 내리고 Slave Database 접속 IP를 올리는 스크립트
vim /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_slave_to_master.sh
ifdown eth1
ssh root@192.yyy.yyy.yyy /sbin/ifup eth1
※Slave -> Master DB로 복구 할때 Slave Database 접속 IP를 내리고 Master Database IP를 올리는 스크립트
vim /mha4mysql-manager-0.57/samples/scripts/master_ip_failover
## Set read_only=0 on the new master
$new_master_handler->disable_log_bin_local();
print "Set read_only=0 on the new master.\n";
$new_master_handler->disable_read_only();
## Creating an app user on the new master
## print "Creating app user on the new master..\n";
##FIXME_xxx_create_user( $new_master_handler->{dbh} );
##$new_master_handler->enable_log_bin_local();
##$new_master_handler->disconnect();
## Update master ip on the catalog database, etc
##FIXME_xxx;
#VIP migration
if($new_master_ip eq "192.xxx.xxx.xxx"){
system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_slave_to_master.sh");
}
elsif($new_master_ip eq "192.yyy.yyy.yyy"){
system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_master_to_slave.sh");
}
$exit_code = 0;
};
※ Master 장애발생시 MHA Manager에서 해당 스크립트를 실행 할 수 있도록 해당 스크립트 부분을 다음과 같이 수정
※192.xxx.xxx.xxx -> Master Database 접속 IP 192.yyy.yyy.yyy -> Slave Databases 접속 IP
vim /mha4mysql-manager-0.57/samples/scripts/master_ip_online_change
##FIXME_xxx_drop_app_user($orig_master_handler);
...
...
## Creating an app user on the new master
## print current_time_us() . " Creating app user on the new master..\n";
##FIXME_xxx_create_app_user($new_master_handler);
##$new_master_handler->enable_log_bin_local();
##$new_master_handler->disconnect();
## Update master ip on the catalog database, etc
if($new_master_ip eq "192.xxx.xxx.xxx"){
system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_slave_to_master.sh");
}
elsif($new_master_ip eq "192.yyy.yyy.yyy"){
system("/bin/sh /mha4mysql-manager-0.57/samples/scripts/change_virtual_ip_master_to_slave.sh");
}
※ Slave 서비스 중 Master로 Databases로 원복을 할 수 있도록 스크립트 작성
※192.xxx.xxx.xxx -> Master Database 접속 IP 192.yyy.yyy.yyy -> Slave Databases 접속 IP
6. MHA설치 - 심볼릭 링크 생성
Slave 장비
명령어
ln -s /install/software/mysql-5.7.19-linux-glibc2.12-x86_64/bin/mysqlbinlog /usr/bin/mysqlbinlog
※ln -s 설치되어있는 mysqlbinlog 위치 /usr/bin/mysqlbinlog
7. MHA설치 - SSH 접속 설정
Master 장비
명령어
ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
ssh-keygen -t rsa
ls -al ~/.ssh/ <-키가 정상적으로 생성되었는지 확인chmod 700 ~/.sshchmod 600 ~/.ssh/id_rsachmod 644 ~/.ssh/id_rsa.pubchmod 600 ~/.ssh/id_dsachmod 644 ~/.ssh/id_dsa.pubchmod 644 ~/.ssh/authorized_keyschmod 644 ~/.ssh/known_hostsscp $HOME/.ssh/id_rsa.pub root@192.hhh.hhh.hhh:id_rsa.pub <- Slave 장비에 Master IP 접속 키 전송※192.hhh.hhh.hhh는 Slave장비 Database 접속 ip가 아닌 ssh 접속 용 ip로 설정
Slave 장비
명령어
ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
ssh-keygen -t rsa
ls -al ~/.ssh/ <-키가 정상적으로 생성되었는지 확인chmod 700 ~/.sshchmod 600 ~/.ssh/id_rsachmod 644 ~/.ssh/id_rsa.pubchmod 600 ~/.ssh/id_dsachmod 644 ~/.ssh/id_dsa.pubchmod 644 ~/.ssh/authorized_keyschmod 644 ~/.ssh/known_hostsscp $HOME/.ssh/id_rsa.pub root@192.zzz.zzz.zzz:id_rsa.pub <- Master장비에 Master IP 접속 키 전송※192.zzz.zzz.zzz는 Master장비 Database 접속 ip가 아닌 ssh 접속 용 ip로 설정
Master 장비
명령어
cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys
cat $HOME/.ssh/id_dsa.pub >> $HOME/.ssh/authorized_keys
※Slave장비에서 전송한 Key를 Master 장비 Key에 저장
Slave장비
명령어
cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys
cat $HOME/.ssh/id_dsa.pub >> $HOME/.ssh/authorized_keys
※Master장비에서 전송한 Key를 Slave 장비 Key에 저장
Slave장비 - ssh접속 Test
명령어
masterha_check_ssh --conf=/etc/masterha-default.cnf
※ 다음과 같은 화면이 나온다면 ssh 설정 완료
8. MHA설치 - Master/Slave my.cnf 수정
Master 장비
/etc/my.cnf
[client]
port=3306
socket=/install/data/mysql/mysqld.sock
[mysql]
default-character-set=utf8
no-auto-rehash
[mysqld]
basedir=/install/software/mysql-5.7.19-linux-glibc2.12-x86_64
binlog_format=STATEMENT
character-set-server=utf8
collation-server=utf8_general_ci
datadir=/install/data/mysql
default-storage-engine=InnoDB
event-scheduler=OFF
expire_logs_days=3
innodb_data_home_dir=/install/data/mysql
innodb_log_group_home_dir=/install/data/mysql
log-bin=/install/data/mysql_binlog/mysql-bin
log-error=/install/log/mysql/error.log
log-slave-updates
long_query_time=3
max_allowed_packet=16M
max_connections=1024
pid-file=/install/data/mysql/mysqld.pid
port=3306
relay-log-purge=1
relay-log=/install/data/mysql_binlog/mysql-relay-bin
server-id=1
skip-external-locking
skip-name-resolve
slow_query_log=1
slow_query_log_file=/install/log/mysql/slow.log
socket=/install/data/mysql/mysqld.sock
tmpdir=/install/data/mysql_tmp
Slave장비
/etc/my.cnf
[client]
port=3306
socket=/install/data/mysql/mysqld.sock
[mysql]
default-character-set=utf8
no-auto-rehash
[mysqld]
basedir=/install/software/mysql-5.7.19-linux-glibc2.12-x86_64
binlog_format=STATEMENT
character-set-server=utf8
collation-server=utf8_general_ci
datadir=/install/data/mysql
default-storage-engine=InnoDB
event-scheduler=OFF
expire_logs_days=3
innodb_data_home_dir=/install/data/mysql
innodb_log_group_home_dir=/install/data/mysql
log-bin=/install/data/mysql_binlog/mysql-bin
log-error=/install/log/mysql/error.log
log-slave-updates
long_query_time=3
max_allowed_packet=16M
max_connections=1024
pid-file=/install/data/mysql/mysqld.pid
port=3306
read_only=1
relay-log-purge=1
relay-log=/install/data/mysql_binlog/mysql-relay-bin
server-id=2
skip-external-locking
slow_query_log=1
skip-name-resolve
slow_query_log_file=/install/log/mysql/slow.log
socket=/install/data/mysql/mysqld.sock
tmpdir=/install/data/mysql_tmp
※해당 설정에서 중요한 것은 Master DB의 Server-id=1 Slave DB의 Server-id=2 그리고 Slave 장비의 read_only=1 설정이다.
9. MHA설치 - Master/Slave Replication 구성Master 장비
mysql -uroot -pxxxx (db접속)
show master status\G;
Slave 장비
mysql -uroot -pxxxx (db접속)
CHANGE MASTER TO MASTER_HOST='192.168.0.13', (Master로 지정할 Host - ssh접속용 IP)
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000034', (1번장비서 확인한 binlog File명)
MASTER_LOG_POS=5703562, (1번장비에서 확인한 Position Number)
MASTER_USER='mha',
MASTER_PASSWORD='mha123';
start slave;
Show slave status\g;
※Watinf for master to send event 가 나오면 정상적으로 Slave상태가 된 것
10. MHA설치 - replication 체크Slave 장비
명령어
masterha_check_repl --conf=/etc/masterha-default.cnf
※해당 로그가 나온다면 Replication Test 성공
11. MHA설치 - MHA 구동Slave 장비
명령어
nohup masterha_manager --conf=/etc/masterha-default.conf &
※해당 로그가 나온다면 MHA가 정상적으로 구동 된 것이다.
TIP : MHA Manager에서는 정상 구동중에는 masterha-default.master_status.health 파일을 남겨 둔다.
만약 Slave 장비가 Master로 승격되고 남은 Slave 장비가 없을 때 masterha-default.master_status.health 파일은
health.complete 파일로 바뀌게 되며 해당 파일을 이용하여 장애 알람 및 MHA Manager 상태 알람을 등록할 수 있다.
MHA FailOver 확인 및 이후 원복 절차
반응형'Database > MHA' 카테고리의 다른 글
[MHA] Mysql MHA FailOver 확인 및 이후 원복 절차 (0) 2018.09.02