준비물
OS 3대(Centos 설치 서버 1대, replication 구성 1식)
replication 설치 방법 : https://peryh.tistory.com/64?category=976917
[설치 파일(/root/mha디렉터리 내부로 업로드)]
dependency : mha 의존성 해결을 위한 패키지 파일
master_ip_failover : 실제 서비스 시 사용하는 프로그램, mha가 동작하여 failover 되면 해당 프로세스는 사라짐(crontab으로 재기동 필요)
master_ip_online_change : 수동으로 master와 slave를 전환하는 프로그램
mysql 5.7버전 실행파일(mysql, mysqlbinlog) : MySQL 8.x 버전의 경우 MHA에서 mysql/mysqlbinlog 호출 시 OS 7 버전의 openssql-1.0 버전과 호환되지 않아 명령어가 존재함에도 실행할 수 없다는 에러가 발생됨, openssl을 1.1 버전으로 업데이트는 8버전부터 제공되며, 8버전 설치파일을 7버전에 설치하는 부분도 권장되지 않음
mha 0.57 설치파일
구성도
각 OS를 편의상 manager(192.168.8.70), master(192.168.8.74), slave(192.168.8.75)로 통칭
master가 되는 mysql 서버에 Virtual Interface(192.168.8.80)가 up 상태로 존재
설치방법
mha OS 유저 생성(master/slave 모두 작업)
useradd -g mysql -G wheel mha passwd mha mha |
mha OS 유저 생성(manager 작업, manager 서버의 mysql 그룹 및 wheel 그룹포함은 필수가 아니나, 빠른 설치 시 명령어 복사의 편리성을 위해서 아래처럼 수행)
groupadd mysql useradd -g mysql -G wheel mha passwd mha mha |
mha profile 설정(manager/master/slave 모두 작업)
vi /home/mha/.bash_profile
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/.local/bin:$HOME/bin:/mysql_engine/mysql/bin export PATH alias mm='mysql -u root -p' |
hosts 파일 설정(manager/master/slave 모두 작업), ip와 host 이름을 매핑한 파일
192.168.8.70 c70m #각 OS 별 ip
192.168.8.74 c741
192.168.8.75 c742
192.168.8.80 mha-master-vip #가상 인터페이스 ip
|
디렉터리 생성 및 권한 변경(manager/master/slave 모두 작업)
mkdir -p /mysql_mha/scripts
mkdir -p /mysql_mha/log
mkdir -p /mysql_mha/manager
mkdir -p /mysql_mha/remote
chown -R mha:mysql /mysql_mha
chmod -R 770 /mysql_mha
|
패키지 설치(manager/master/slave 모두 작업)
yum -y install perl*
혹은 원격지 repository에서 skip-broken 옵션 에러날 시, yum -y install perl* --skip-broken
|
추가 dependency 설치(manager/master/slave 모두 작업)
vi /root/mha/dependency/install.sh 쉘 작성
rpm -Uvh perl-Class-Load-0.20-3.el7.noarch.rpm
rpm -Uvh perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
rpm -Uvh perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
rpm -Uvh perl-Config-Tiny-2.14-7.el7.noarch.rpm
rpm -Uvh perl-Data-Dumper-2.145-3.el7.x86_64.rpm
rpm -Uvh perl-Data-OptList-0.107-9.el7.noarch.rpm
rpm -Uvh perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
rpm -Uvh perl-DBI-1.627-4.el7.x86_64.rpm
rpm -Uvh perl-Email-Date-Format-1.002-15.el7.noarch.rpm
rpm -Uvh perl-IO-Compress-2.061-2.el7.noarch.rpm
rpm -Uvh perl-IO-Socket-IP-0.21-5.el7.noarch.rpm
rpm -Uvh perl-IO-Socket-SSL-1.94-7.el7.noarch.rpm
rpm -Uvh perl-List-MoreUtils-0.33-9.el7.x86_64.rpm
rpm -Uvh perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
rpm -Uvh perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
rpm -Uvh perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
rpm -Uvh perl-MailTools-2.12-2.el7.noarch.rpm
rpm -Uvh perl-MIME-Lite-3.030-1.el7.noarch.rpm
rpm -Uvh perl-MIME-Types-1.38-2.el7.noarch.rpm
rpm -Uvh perl-Module-Implementation-0.06-6.el7.noarch.rpm
rpm -Uvh perl-Module-Runtime-0.013-4.el7.noarch.rpm
rpm -Uvh perl-Mozilla-CA-20130114-5.el7.noarch.rpm
rpm -Uvh perl-Net-Daemon-0.48-5.el7.noarch.rpm
rpm -Uvh perl-Net-LibIDN-0.12-15.el7.x86_64.rpm
rpm -Uvh perl-Net-SMTP-SSL-1.01-13.el7.noarch.rpm
rpm -Uvh perl-Net-SSLeay-1.55-6.el7.x86_64.rpm
rpm -Uvh perl-Net-Telnet-3.03-19.el7.noarch.rpm
rpm -Uvh perl-Package-DeprecationManager-0.13-7.el7.noarch.rpm
rpm -Uvh perl-Package-Stash-0.34-2.el7.noarch.rpm
rpm -Uvh perl-Package-Stash-XS-0.26-3.el7.x86_64.rpm
rpm -Uvh perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
rpm -Uvh perl-Params-Util-1.07-6.el7.x86_64.rpm
rpm -Uvh perl-Params-Validate-1.08-4.el7.x86_64.rpm
rpm -Uvh perl-PlRPC-0.2020-14.el7.noarch.rpm
rpm -Uvh perl-Sub-Install-0.926-6.el7.noarch.rpm
rpm -Uvh perl-Sys-Syslog-0.33-3.el7.x86_64.rpm
rpm -Uvh perl-TimeDate-2.30-2.el7.noarch.rpm
rpm -Uvh perl-Try-Tiny-0.12-2.el7.noarch.rpm
|
쉘 수행(manager/master/slave 모두 작업)
sh /root/mha/dependency/install.sh |
의존성으로 인해 에러 발생, 쉘 다시 수행(manager/master/slave 모두 작업)
sh /root/mha/dependency/install.sh |
쉘 다시 수행 시, perl-Log-Dispatch에서 에러 발생
수동으로 패키지 설치(manager/master/slave 모두 작업)
rpm -Uvh perl-MIME-Lite-3.030-1.el7.noarch.rpm
rpm -Uvh perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
|
mha node 및 manager 설치(manager부터 설치 시, 의존성 에러 발생, master/slave는 node만 설치)
rpm -Uvh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm rpm -Uvh /root/mha/mha4mysql-manager-0.57-0.el7.noarch.rpm #master, slave는 수행하지 않음 |
인터페이스 설정(master/slave 작업)
master가 되는 DB에 vip 인터페이스를 기동시키기 위한 사전 작업
visudo #쉘 명령어로 진입 아래 내용 추가 mha ALL=(ALL) NOPASSWD: ALL #mha 계정만 권한을 주거나 %wheel ALL=(ALL) NOPASSWD: ALL #mha가 속한 그룹에 권한을 주거나 |
보안상 필요 계정만 등록하는 것을 권장(master/slave 작업)
정상적으로 권한을 받아 인터페이스 활성화가 되는지 테스트(master/slave 작업)
su - mha
ifconfig sudo ifconfig ens33:0 192.168.8.80 up # ens33은 자신의 인터페이스 이름에 맞게 작성
ifconfig
|
해당 인터페이스 down(master/slave 작업)
sudo ifconfig ens33:0 down ifconfig |
서버의 네트워크 설정에 따라, 명령어가 달라질 수 있음, 이 경우 mha failover 파일에 서버에서 사용 가능한 명령어 작성(별도 예시)
cd /etc/sysconfig/network-scripts ls -l cp ifcfg-ens33 ifcfg-ens33:0 NAME, DEVICE, IPADDR 수정 |
네트워크 설정 파일이 존재하는 경우 아래 명령어로 인터페이스 활성화(별도 예시)
ifconfig ifup ens33:0 |
아래 명령어로 인터페이스 내리기(별도 예시)
ifdown ens33:0 ifconfig |
mha 계정의 암호 입력 없는 연결 위한 설정(manager/master/slave 모두 작업)
su - mha
ssh-keygen -t rsa -b 4096
enter-enter-enter
각 서버별로 ssh-key 생성 후 ssh-copy-id 수행할 것 [manager] ssh-copy-id c741 #자기 이외의 다른 서버들 등록
ssh-copy-id c742
[master]
ssh-copy-id c742
ssh-copy-id c70m
[slave]
ssh-copy-id c741
ssh-copy-id c70m
|
만들어진 ssh-key는 계정의 home 디렉터리 내부에 숨김파일로 존재(manager/master/slave 모두 작업)
암호없는 접속 연결 테스트(manager/master/slave 모두 작업)
[manager] ssh mha@c741 hostname ssh mha@c741 hostname exit ssh mha@c742 hostname [master] ssh mha@c742 hostname ssh mha@c70m hostname hostname [slave] ssh mha@c741 hostname ssh mha@c70m hostname |
계정 생성 전 my.cnf 암호 복잡도 설정 해제(master/slave 작업)
추후 mha로 master/slave 전환 시, 패스워드에 특수문자가 존재 시 정상적으로 전환이 안되는 문제가 발생
복잡도 해제 후 진행 필요
su - mysql dbshutdown ps -ef | grep mysql |
vi /etc/my.cnf(master 작업)
[client] port=3306 socket=/mysql_data/mysql.sock [mysqld] user=mysql authentication_policy=mysql_native_password datadir=/mysql_data/data port=3306 socket=/mysql_data/mysql.sock pid-file=/mysql_data/mysqld.pid server-id=1 log_error=/mysql_dump/error/mysql.err log_bin=/mysql_dump/binlog/mysql-bin relay-log=/mysql_dump/relaylog/relay-log relay-log-index=/mysql_dump/relaylog/relay-log.index relay_log_purge=0 sync_binlog=1 binlog_cache_size=1M max_binlog_size=1G binlog_expire_logs_seconds=86400 # Character set Config character-set-client-handshake=FALSE character-set-server=utf8mb4 init_connect=SET collation_connection = utf8_general_ci init_connect=SET NAMES utf8 ##아래는 추후에 추가(mha 시에 특수문자를 추가할 수 없어서 적용) # Password Policy validate_password.policy=LOW #LOW는 비밀번호가 8글자 이상이면 통과 validate_password.length=4 #0으로 설정해도 4가 최소값 |
vi /etc/my.cnf(slave 작업)
[client] port=3306 socket=/mysql_data/mysql.sock [mysqld] user=mysql authentication_policy=mysql_native_password datadir=/mysql_data/data port=3306 socket=/mysql_data/mysql.sock pid-file=/mysql_data/mysqld.pid server-id=2 log_error=/mysql_dump/error/mysql.err log_bin=/mysql_dump/binlog/mysql-bin relay-log=/mysql_dump/relaylog/relay-log relay-log-index=/mysql_dump/relaylog/relay-log.index relay_log_purge=0 read_only # Character set Config character-set-client-handshake=FALSE character-set-server=utf8mb4 init_connect=SET collation_connection = utf8_general_ci init_connect=SET NAMES utf8 # Password Policy validate_password.policy=LOW validate_password.length=4 |
DB 재기동(master/slave 작업)
dbstartup ps -ef | grep mysql cat /mysql_dump/error/mysql.err |
replication 재설정(master/slave 작업)
[master] reset master; show master status\G; [slave] stop slave; reset slave; reset master; CHANGE MASTER TO
MASTER_HOST='192.168.8.74',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='Password1!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
start replica; |
replication 상태 확인(master/slave 작업)
[master] show slave hosts\G; [slave] show slave status\G; |
mysql mha계정 생성(master 작업)
create user 'mha'@'%' identified by 'mham';
grant all privileges on *.* to 'mha'@'%'; flush privileges; select user, host from mysql.user; |
slave도 생성 되었는지 확인(slave 작업)
select user, host from mysql.user; |
mha 매니저용 설정파일 작성(manager 작업)
su - mha
vi /mysql_mha/app1.cnf
[server default]
log_level=debug
user=mha #mysql의 유저명
password=mham #mysql user의 비밀번호
ssh_user=mha #OS user의 유저명
repl_user=repl
repl_password=Password1!
# working directory on the manager
manager_workdir=/mysql_mha/manager
# manager log file
manager_log=/mysql_mha/log/mha.log
# working directory on MySQL servers
remote_workdir=/mysql_mha/remote
master_binlog_dir=/mysql_dump/binlog/
#ping interval, 3 times trial
ping_interval=5
#custom scripts for master ip failover
master_ip_failover_script=/mysql_mha/scripts/master_ip_failover
#custom scripts for manual master switch
master_ip_online_change_script=/mysql_mha/scripts/master_ip_online_change
[server1]
hostname=c741
port=3306
ignore_fail=1
candidate_master=1
[server2]
hostname=c742
port=3306
ignore_fail=1
candidate_master=1
|
설정파일로 check_ssh 수행, ssh 통신이 정상적으로 동작되는지 확인(manager 수행)
masterha_check_ssh --conf=/mysql_mha/app1.cnf
|
설정파일로 check_repl 수행, replication이 정상적으로 동작중인지 확인(manager 수행)
masterha_check_repl --conf=/mysql_mha/app1.cnf |
su - cd /root/mha cp mysql /usr/bin/ cp mysqlbinlog /usr/bin/
chmod 775 /usr/bin/mysql
chmod 775 /usr/bin/mysqlbinlog
ls -l /usr/bin | grep mysql
|
check_repl 재수행(manager 수행)
masterha_check_repl --conf=/mysql_mha/app1.cnf |
Can't exec "/mysql_mha/scripts/master_ip_failover": No such file or directory at /usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm line 68. 에러 발생
다운받은 파일 복사하여 옮겨주기(manager 수행)
su - pwd ls -l cp master_ip_* /mysql_mha/scripts/ chown mha. /mysql_mha/scripts/* chmod 775 /mysql_mha/scripts/* #권한이 644인 경우도 Can`t exec 에러 발생함 ls -l /mysql_mha/scripts/ |
check_repl 재수행(manager 수행), 정상동작
masterha_check_repl --conf=/mysql_mha/app1.cnf |
vi /mysql_mha/scripts/master_ip_failover sudo ifconfig ens33:0 192.168.8.80/24 up #master/slave에서 동작하던 명령어 작성, ifup이라면 해당 형태로 작성 필요 sudo ifconfig ens33:$key $vip up #my $vip와 $key 변수에 넣은 값으로 치환 |
mha 엔진 스크립트 수정(manager 수행)
MHA에서 권고하는 Custom Script 수정과 함께, MHA failover의 서버 프로세스 정리 부문의 서버 비정상 종료 버그를 피하기 위해, MHA 매니저 설치 서버의 다음 엔진 스크립트 수정
su - vi /usr/share/perl5/vendor_perl/MHA/ManagerConst.pm our $SSH_OPT_CHECK ="-o StrictHostKeyChecking=no -o PasswordAuthentication=no -o BatchMode=yes -o ConnectTimeout=5"; # modified VAR_CONNECT_TIMEOUT이 정의되어 있지 않아 오류 발생
# SSH 연결 세션의 connection timeout 값으로 기본값 5초로 변경 # 원본 내용
#our $SSH_OPT_CHECK ="-o StrictHostKeyChecking=no -o PasswordAuthentication=no -o BatchMode=yes -o ConnectTimeout=VAR_CONNECT_TIMEOUT"; |
mha 매니저 구동(manager 수행)
nohup masterha_manager --conf=/mysql_mha/app1.cnf &
ps -ef | grep master masterha_check_status --conf=/mysql_mha/app1.cnf |
mha 매니저 종료(manager 수행)
nohup masterha_stop --conf=/mysql_mha/app1.cnf &
|
수동 스크립트 수정(manager 수행)
vi /mysql_mha/scripts/master_ip_online_change
|
mha 테스트
masterha_master_switch를 수행하기 위해서는 mha 매니저 프로세스가 종료되어야 함
mha 매니저가 올라와 있지 않은 상태에서 아래 명령어 수행
--orig_master_is_new_slave 옵션을 주게 되면 이전 마스터가 신규 마스터의 슬레이브로 설정되며, 이 옵션을 주지 않게 되면 이전 마스터는 신규 마스터의 슬레이브로 설정되지 않는다. --interactive=0 옵션을 주면 아래 실행 중 YES/NO를 묻지 않고 수행됨
masterha_master_switch --master_state=alive --conf=/mysql_mha/app1.cnf --orig_master_is_new_slave --interactive=0
|
수행 전 확인(manager 수행)
ps -ef | grep master masterha_check_status --conf=/mysql_mha/app1.cnf |
master인지 slave인지 확인(master/slave 둘다 작업)
\! hostname show slave status\G; show slave hosts\G; |
수동 failover 수행
masterha_master_switch --master_state=alive --conf=/mysql_mha/app1.cnf --orig_master_is_new_slave --interactive=0
|
master인지 slave인지 확인(master/slave 둘다 작업)
기존 slave(192.168.8.75)가 master로 전환되며 가상 인터페이스가 올라온 것을 확인할 수 있음
다시 변경하려면 수동 failover를 재실행하여 변경
\! hostname \! ifconfig show slave hosts\G; |
mha 매니저 구동(manager 수행)
nohup masterha_manager --conf=/mysql_mha/app1.cnf &
ps -ef | grep master masterha_check_status --conf=/mysql_mha/app1.cnf |
master인지 slave인지 확인(master/slave 둘다 작업)
\! hostname show slave status\G; show slave hosts\G; |
새 접속창 띄워놓고 mha 로그 띄워두기(manager 수행)
tail -f /mysql_mha/log/mha.log |
master 강제 종료(master 수행)
ps -ef | grep mysql kill -9 혹은 dbshutdown |
tail 걸어둔 로그 확인 시, 아래와 같은 에러 발생 한다면
[error][/usr/share/perl5/vendor_perl/MHA/MasterFailover.pm, ln309] Last failover was done at 2022/07/19 00:06:40. Current time is too early to do failover again. If you want to do failover, manually remove /mysql_mha/manager/app1.failover.complete and run this script again.
app1.failover.complete 파일 삭제(manager 수행)
rm -rf /mysql_mha/manager/app1.failover.complete |
정상적인 로그
매니저 서버 프로세스 및 파일 확인(manager 수행)
master 관련 프로세스가 사라지고, failover가 성공한 파일만 존재
ps -ef | grep master ls -l /mysql_mha/manager/ |
'데이터베이스 > mysql' 카테고리의 다른 글
[mysql8.0.29]Centos7.4 mysql 8 replication 설정 (0) | 2022.07.14 |
---|---|
[mysql8.0.29]Centos7.4 mysql 8 binary 설치 (0) | 2022.06.13 |
[mysql8.0]Centos7.4 mysql 8 yum 설치 및 root 비밀번호 설정 (0) | 2022.05.28 |