MariaDB mha 이중화

Database/Mysql & Mariadb / /
728x90

 

MariaDB mha 이중화

1.    설치

1)      장비 구성

A.     기본 장비 구성


 

I.       Manager : 모든 MariaDBAlive를 체크하고 Failover, Master Change 등을 처리

II.      Master : 데이터의 write, read가 모두 발생되는 메인 DB

III.    Slave : Marster의 부하 분산을 위해 read-only DB

B.      해당 문서의 장비

I.       해당 문서의 4개의 장비로 구성한다.

II.      VIP : virtual IP(가상 아이피) 외부에서 1개의 IP로 접근하여 HA되어 Master가 변경되어도 write 작업을 APP의 변경 없이 진행할 수 있다.

III.    현재 테스트는 VIP로 문서가 작업되었으나 기업의 지원이 있다면 DNS로 작업되는 것이 대표적이다.

IV.    https://www.slideshare.net/NHNFORWARD/mysql-nhn-forward-2018

2)      장비 설정

A.     Hots 파일 설정

192.168.80.4    mgr      -- Manager IP

192.168.80.2    master   -- Master IP

192.168.80.6    slave1   -- Slave1 IP

192.168.80.5    slave2   -- Slave2 ip

192.168.80.50   mha-master-vip   -- VIP

 

I.       해당 아이피는 ifconfig를 통해 확인하여 연결

II.      Ifconfig 가 없을 시 net-tools 패키지를 설치한다.

B.      Mariadb 복제

I.       MHA semi-sync 방식의 복제를 권장한다.

II.      Mariadb 복제의 기본 설정은 Async 로 되어있다.


< ASync >

 


< Semi Sync >

 

III.    Semi-Sync 설정

(ㄱ)  10.3.3 이전의 버전은 따로 Plugin을 설치 해 주어야 한다.

(ㄴ)  글로벌 옵션 쿼리로 변경 방법

-- Master 장비

SET GLOBAL rpl_semi_sync_master_enabled=ON;

SET GLOBAL rpl_semi_sync_master_timeout=5000-- timeout 설정 default 10

show variables like '%semi%'-- 확인

 

-- Slave 장비

SET GLOBAL rpl_semi_sync_slave_enabled=1;

show variables like '%semi%'-- 확인

 

(ㄷ)  my.cnf(50-server.cnf) 수정으로 영구 설정 변경

-- Master 장비

[mariadb]

...

rpl_semi_sync_master_enabled=ON

rpl_semi_sync_master_timeout=5000

 

mariadb restart -- Mariadb 재시작

 

show variables like '%semi%'-- 확인

 

-- Slave 장비

[mariadb]

...

rpl_semi_sync_slave_enabled=ON

 

mariadb restart -- Mariadb 재시작

 

show variables like '%semi%'-- 확인

 

IV.    복제 설정

(ㄱ)  my.cnf (50-server.cnf) 수정

-- Master 설정

...

server-id=1 # -> server-id master slave 달라야 합니다

log_bin = /var/log/mysql/mysql-bin.log # Binlog 파일명을 기재 합니다.

sync_binlog = 1

expire_logs_days = 7

binlog_cache_size = 2M

max_binlog_size = 512M

log-bin-trust-function-creators = 1 # function  SP 생성도 가능 여부

report-host = master #  DB 호스트네임 show slave hosts 에서 정보로 활용

relay-log = /var/log/mysql/relay_log

relay-log-index = /var/log/mysql/relay_log.index

relay_log_purge=true

expire_logs_days = 7

log_slave_updates = ON

...

 

-- Slave 설정

...

server-id              = 2

log_bin                = /var/log/mysql/mysql-bin.log

sync_binlog             = 1

expire_logs_days        = 7

binlog_cache_size       = 2M

max_binlog_size        = 512M

log-bin-trust-function-creators = 1

report-host             = slave1

 

relay-log               = /var/log/mysql/relay_log

relay-log-index         = /var/log/mysql/relay_log.index

relay_log_purge         = true

expire_logs_days        = 7

log_slave_updates       = ON

read_only

...

 

(ㄴ)  Mariadb 재시작

(ㄷ)  복제 계정 생성

-- Master  모든 Slave 생성

create user 'repl_user'@'%' identified by 'epdlxjxla';

grant replication slave on *.* to 'repl_user'@'%';

flush privileges;

 

(ㄹ)  마스터 정보 확인

show master status\G;

 

다음과 같이 결과 발생

# *************************** 1row ***************************

File: mysql-bin.000001 -- Slave 에서 필요한 정보

# Position: 777 -- Slave 에서 필요한 정보

# Binlog_Do_DB:

# Binlog_Ignore_DB:

1 row in set (0.000 sec)

 

(ㅁ)  Slave 에서 복제 시작

CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl_user'

MASTER_PASSWORD='epdlxjxla'

MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=777;

 

start slave;

 

(ㅂ)  Slave에서 복제 확인

show slave status\G

 

*************************** 1row ***************************

Slave_IO_State:

Master_Host: master # host 확인

Master_User: repl_user # 계정 확인

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:  mysql-bin.000001 # 로그 파일 확인

Read_Master_Log_Pos: 777 # 포지션 확인

Relay_Log_File: relay_log.000001

Relay_Log_Pos: 4

Relay_Master_Log_File:  mysql-bin.000001

...

 

(ㅅ)  Master 에서 복제 확인

show slave hosts\G

 

*************************** 1row ***************************

Server_id: 3

     Host: slave2

     Port: 3306

Master_id: 1

*************************** 2row ***************************

Server_id: 2

     Host: slave1

     Port: 3306

Master_id: 1

 

3)      MHA 사전 구성

A.     mha 계정 생성 : 이미 복제가 완료되었다면 Master에서만 실행해도 slave에 자동 복제

create user 'mha'@'%' identified by 'epdlxjxla';

GRANT ALL PRIVILEGES ON *.* TO 'mha'@'%';

flush privileges;

 

B.      OS mha 용 계정 생성 – 4개 모든 장비

[root]# useradd -g mysql mha

[root]# passwd mha

Changing password for user test.

New password: [패스워드 입력]

Retype new password: [패스워드 입력]

 

C.      ssh 연결(4개 서버 모두 작업되어야 함)

I.       sshd가 설치되어 있지 않다면 openssh-server 패키지 설치

II.      공개키로 접근하기 위한 설정 변경 (sshd_config 파일 수정)

...

Port 22 # 주석 제거

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

...

#LoginGraceTime 2m

PermitRootLogin yes # 주석 제거  yes 변경

#StrictModes yes

#MaxAuthTries 6

#MaxSessions 10

...

 

ssh 서비스 restart

 

III.    mha 계정의 공개키 생성

[root]# su - mha 

 

[mha]$ ssh-keygen -t rsa -b 4096

 

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): [엔터]

Enter passphrase (empty for no passphrase): [엔터]

Enter same passphrase again: [엔터]

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:8//1111111111111 root@acs

The key's randomart image is:

+---[RSA 4096]----+

| . .oooooooooo+|

| . . oooooo o|

| . ooo000000.+o|

| . .. . ..*..|

| E.000000000o. |

| 0000000000. |

| . . o .. |

| . .. |

| .o.o+|

+----[SHA256]-----+

 

 

IV.    공개키를 복사

(ㄱ)  매니저 서버에서 -> master, slave1, slave2 서버로

(ㄴ)  master 서버에서 -> 매니저 서버, slave1, slave2 서버로

(ㄷ)  slave1 서버에서 -> 매니저 서버, master, slave2 서버로

(ㄹ)  slave2 서버에서 -> 매니저 서버, master, slave1 서버로

(ㅁ)  아래 명령어를 통해 복사 가능

[mha]$ ssh-copy-id -i master

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/mha/.ssh/id_rsa.pub"

The authenticity of host 'master (192.168.80.2)' can't be established.

ECDSA key fingerprint is SHA256:xoIzWmyrIMNAmxYuNJE7Yzi/xqQrboszAkYJgMdzonU.

Are you sure you want to continue connecting (yes/no/[fingerprint])? [yes 입력]

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

mha@master'password: [패스워드입력]

 

Number of key(s) added: 1

 

Now try logging into the machine, with:   "ssh 'master'"

and check to make sure that only the key(s) you wanted were added.

 

(ㅂ)  연결 확인

[mha]$ ssh master

Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.39-linuxkit x86_64)

 

 * Documentation:  https://help.ubuntu.com

 * Management:     https://landscape.canonical.com

 * Support:        https://ubuntu.com/advantage

 

This system has been minimized by removing packages and content that are

not required on a system that users do not log into.

 

To restore this content, you can run the 'unminimize' command.

 

[mha@master ~]$ hostname

master

[mha@master ~]$ exit

 

D.     VIP 에 대한 failover IP assign 을 위해 필요 시 mha 유저가 root 권한을 수행 할 수 있도록 sudouser 를 설정

[root]# visudo

...

mha ALL=(ALL) NOPASSWD:/sbin/ifconfig #해당 라인 추가

...

 

[root]# su – mha

[mha]# ifconfig -a

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.80.4  netmask 255.255.240.0  broadcast 192.168.95.255

 

E.      가상 아아피 설정 확인

sudo ifconfig eth0:0 192.168.80.50 up

sudo ifconfig eth0:0 192.168.80.50 down

 

4)      MHA 설치

A.     관련 패키지 설치

apt -y install make libdbd-mysql-perl libdbd-mariadb-perl libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl libperl5.30 libcpan-perl-releases-perl libmodule-install-perl

 

B.      maridb 10.5.8 까지는 아직 mysql super_read_only 옵션을 사용하지 못함.
따라서 mha 버전의 0.58은 사용하지 못 해 소스를 따로 다운받아 설치
apt
패키지는 0.58부터 시작되어 0.56repo 가 없음

C.      https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads 에서
MHA Manager 0.56 tarball , MHA Node 0.56 tarball 다운로드

D.     매니져 서버에 설치

[root]# mkdir -p /root/pkg #패키지 다운로드한 위치

[root]# cd /root/pkg #해당 폴더로 이동

 

해당 폴더로 다운로드한 파일이동

 

[root]# cp /home/mariadb/mha4mysql-manager-0.56.tar.gz ./

[root]# tar zxvf mha4mysql-manager-0.56.tar.gz # 압축해제

[root]# cd mha4mysql-manager-0.56

 

[root]# perl Makefile.PL

*** Module::AutoInstall version 1.03

*** Checking for Perl dependencies...

[Core Features]

- DBI                   ...loaded. (1.643)

- DBD::mysql            ...loaded. (4.050)

Time::HiRes           ...loaded. (1.976)

- Config::Tiny          ...loaded. (2.24)

Log::Dispatch         ...loaded. (2.69)

- Parallel::ForkManager ...loaded. (2.02)

- MHA::NodeConst        ...missing.

==> Auto-install the 1 mandatory module(s) from CPAN? [y] [y 입력]

 

[root]# make;make install # 빌드  설치

 

E.      모든 서버에 노드 설치

[root]# mkdir -p /root/pkg #패키지 다운로드한 위치

[root]# cd /root/pkg #해당 폴더로 이동

 

해당 폴더로 다운로드한 파일이동

 

[root]# cp /home/mariadb/mha4mysql-node-0.56.tar.gz ./

[root]# tar zxvf mha4mysql-node-0.56.tar.gz # 압축해제

[root]# cd mha4mysql-node-0.56

 

[root]# perl Makefile.PL

*** Module::AutoInstall version 1.03

*** Checking for Perl dependencies...

[Core Features]

- DBI        ...loaded. (1.643)

- DBD::mysql ...loaded. (4.050)

*** Module::AutoInstall configuration finished.

Checking if your kit is complete...

Looks good

Generating a Unix-style Makefile

Writing Makefile for mha4mysql::node

Writing MYMETA.yml and MYMETA.json

 

[root]# make;make install # 빌드  설치

 

F.      매니져 서버에서 mha 설정 파일 및 mha 스크립트 복사

[root]# mkdir -p /etc/masterha

[root]# mkdir -p /masterha/scripts

 

[root]# cd /root/pkg/mha4mysql-manager-0.56/samples

 

[root]# cp conf/* /etc/masterha/

[root]# cp scripts/* /masterha/scripts/

 

[root]# mkdir -p /masterha/app1

[root]# chown -R mha:mysql /masterha

 

G.     모든 디비 서버에 cnf 폴더 설정하고 log 폴더에 mysql 그룹 권한이 가능하도록 설정

[root]# mkdir -p /masterha/app1

[root]# chown -R mha:mysql /masterha

 

[root]# chown -R mysql:mysql /var/log/mysql/


 

2.    MHA 설정

1)      MHA 설정의 예시

A.     매니저 서버에서 모니터링 하고 장애 조치가 되는 MySQL Replication Group 1개 이상이 될 수도 있음


 

B.      공통적인 설정은 /etc/masterha_default.cnf 에 설정하여 사용 가능

C.      각각의 설정은 /etc/masterha/app1.cnf에 선언하여 따로 사용 가능

2)      매니져 서버 설정

A.     app1.cnf 파일 수정

[root]# cd /etc/masterha/

[root]# cp app1.cnf app1.cnf.ori #기존 파일 백업

[root]# chown root:mysql app1.cnf

[root]# chmod 775 app1.cnf # 권한 설정

 

[root]# vi app1.cnf

 

[server default]

user                = mha

password            = epdlxjxla

ssh_user            = mha

repl_user           = repl_user

repl_password       = epdlxjxla

manager_workdir     = /masterha/app1

manager_log         = /masterha/app1/app1.log

 

remote_workdir      = /masterha/app1

master_binlog_dir   = /var/log/mysql

 

secondary_check_script = /usr/local/bin/masterha_secondary_check -s master -s slave1 -s slave2 --user=mha --master_host=master --master_ip=master --master_port=3306

--user=mha   DB유저를 의미

 

master_ip_failover_script=/masterha/scripts/master_ip_failover

master_ip_online_change_script=/masterha/scripts/master_ip_online_change

 

[server1]

hostname=master

candidate_master=1

 

[server2]

hostname=slave1

candidate_master=1

 

[server3]

hostname=slave2

candidate_master=1

 

B.      VIP를 사용하기 위해 스크립트 수정

I.       VIP 변경 shell script 생성

[root]$ su - mha

[mha]$ cd /masterha/scripts

[mha]$ vi mha_change_vip.sh

 

#!/bin/bash

 

## Fail-Over VIP Change

 

V_NEW_MASTER=cat /etc/hosts | grep $1 | awk '{print $2}'

 

V_EXIST_VIP_CHK=ping -c 1 -W 1 mha-master-vip | grep "packet loss" | awk '{print $6}'

 

V_VIP_IP=cat /etc/hosts | grep mha-master-vip | awk '{print $1}'

 

if [ $V_EXIST_VIP_CHK = "0%" ]

then

 

echo "VIP IS Alive, VIP Relocate $V_NEW_MASTER "

/bin/ssh mha-master-vip /bin/sudo /sbin/ifconfig eth0:0 down &

 

ssh $V_NEW_MASTER /bin/sudo /sbin/ifconfig eth0:0 $V_VIP_IP

ssh $V_NEW_MASTER /sbin/arping -c 5 -D -I eth0 -s $V_VIP_IP $V_VIP_IP

 

VIP_NOHUP_PS=ps -ef| grep "ifconfig eth0:0" | grep ssh | grep -v grep | awk '{print $2}' && kill -9 $VIP_NOHUP_PS

 

elif [ $V_EXIST_VIP_CHK = "100%" ]

then

 

echo "VIP IS dead, VIP Relocate $V_NEW_MASTER "

/bin/ssh $V_NEW_MASTER /bin/sudo /sbin/ifconfig eth0:0 $V_VIP_IP

/bin/ssh $V_NEW_MASTER /sbin/arping -c 5 -D -I eth0 -s $V_VIP_IP $V_VIP_IP

 

fi

 

II.      master_ip_failover 수정

[root]$ su - mha

[mha]$ cd /masterha/scripts/

[mha]$ cp -ar master_ip_failover master_ip_failover.ori #기존 파일 백업

[mha]$ vi master_ip_failover

 

== 변경  - 86 라인

## 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;

 

== 변경 

## 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;

 

== mha_change_vip.sh 추가

## Update master ip on the catalog database, etc

## FIXME_xxx;

 

system("/bin/bash /masterha/scripts/mha_change_vip.sh $new_master_ip"); # 추가

# VIP 변경하는 Shell 스크립트

 

$exit_code = 0;

 

III.    master_ip_online_change 수정

[root]$ su - mha

[mha]$ cd /masterha/scripts

[mha]$ cp -ar master_ip_online_change master_ip_online_change.ori #기존 파일 백업

[mha]$ vi master_ip_online_change

 

변경  - 149 라인

## Drop application user so that nobody can connect. Disabling per-session binlog beforehand

$orig_master_handler->disable_log_bin_local();

print current_time_us() . " Drpping app user on the orig master..\n";

FIXME_xxx_drop_app_user($orig_master_handler);



변경  , 주석 처리

## Drop application user so that nobody can connect. Disabling per-session binlog beforehand

## $orig_master_handler->disable_log_bin_local();

## print current_time_us() . " Drpping app user on the orig master..\n";

## FIXME_xxx_drop_app_user($orig_master_handler);

 

변경  - 244 라인

## 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();

 

변경  , 주석 처리

## 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();

 

== mha_change_vip.sh 추가

## Update master ip on the catalog database, etc

 

system("/bin/bash /masterha/scripts/mha_change_vip.sh $new_master_ip"); <-- 추가

 

$exit_code = 0;

};

 

C.      OS 버전에 기호가 들어가 체크 스크립트가 제대로 작동하지 않는다.
따라서 해당 스크립트 수정

[root]$ cd /usr/local/share/perl/5.30.0/MHA/

[root]$ cp NodeUtil.pm NodeUtil.pm.ori

 

[root]$ vi /usr/local/share/perl/5.30.0/MHA/NodeUtil.pm

 

변경  - 182 라인

sub parse_mysql_version($) {

  my $str = shift;

  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );

  return $result;

}

 

sub parse_mysql_major_version($) {

  my $str = shift;

  my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );

  return $result;

}

 

변경  , 문자열 파싱 정규식 처리 추가

sub parse_mysql_version($) {

  my $str = shift;

##editied by kimdohee

  ($str) =  $str =~ m/^[^-]*/g;

  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );

  return $result;

}

 

sub parse_mysql_major_version($) {

  my $str = shift;

 

  ($str) =  $str =~ m/^[^-]*/g;

  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );

#  my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );

  return $result;

}

 

3.    MHA 사용법

1)        모니터링 체크

A.     사용 가능 명령어

I.       masterha_check_ssh : SSH 접속 체크

II.      masterha_manager Manager 실행(모니터링 시작) - 장애 발생시 failover 수행됨

III.    masterha_stop : Manager 중지

IV.    masterha_master_switch : TakeOver(relocate) 수행

V.      masterha_check_repl : 복제 현황(Master/Slave 노드 정보등)

VI.    masterha_check_status : Status 확인하기

B.      masterha_check_ssh (SSH 접속 체크)

[mha]$ masterha_check_ssh --conf=/etc/masterha/app1.cnf

 

Fri Jan  8 06:28:25 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jan  8 06:28:25 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..

Fri Jan  8 06:28:25 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..

Fri Jan  8 06:28:25 2021 - [info] Starting SSH connection tests..

Fri Jan  8 06:28:26 2021 - [debug]

Fri Jan  8 06:28:25 2021 - [debug]  Connecting via SSH from mha@master(192.168.80.2:22to mha@slave1(192.168.80.5:22)..

Fri Jan  8 06:28:25 2021 - [debug]   ok.

Fri Jan  8 06:28:25 2021 - [debug]  Connecting via SSH from mha@master(192.168.80.2:22to mha@slave2(192.168.80.6:22)..

Fri Jan  8 06:28:25 2021 - [debug]   ok.

Fri Jan  8 06:28:26 2021 - [debug]

Fri Jan  8 06:28:26 2021 - [debug]  Connecting via SSH from mha@slave1(192.168.80.5:22to mha@master(192.168.80.2:22)..

Fri Jan  8 06:28:26 2021 - [debug]   ok.

Fri Jan  8 06:28:26 2021 - [debug]  Connecting via SSH from mha@slave1(192.168.80.5:22to mha@slave2(192.168.80.6:22)..

Fri Jan  8 06:28:26 2021 - [debug]   ok.

Fri Jan  8 06:28:27 2021 - [debug]

Fri Jan  8 06:28:26 2021 - [debug]  Connecting via SSH from mha@slave2(192.168.80.6:22to mha@master(192.168.80.2:22)..

Fri Jan  8 06:28:26 2021 - [debug]   ok.

Fri Jan  8 06:28:26 2021 - [debug]  Connecting via SSH from mha@slave2(192.168.80.6:22to mha@slave1(192.168.80.5:22)..

Fri Jan  8 06:28:26 2021 - [debug]   ok.

Fri Jan  8 06:28:27 2021 - [info] All SSH connection tests passed successfully.

 

C.      masterha_check_repl : Replication 에 대해서 Master/Slave 노드 정보 등을 체크

[mha]$ masterha_check_repl --conf=/etc/masterha/app1.cnf

 

Fri Jan  8 06:41:38 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jan  8 06:41:38 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..

Fri Jan  8 06:41:38 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..

Fri Jan  8 06:41:38 2021 - [info] MHA::MasterMonitor version 0.56.

Fri Jan  8 06:41:40 2021 - [info] GTID failover mode = 0

Fri Jan  8 06:41:40 2021 - [info] Dead Servers:

Fri Jan  8 06:41:40 2021 - [info] Alive Servers:

Fri Jan  8 06:41:40 2021 - [info]   master(192.168.80.2:3306)

Fri Jan  8 06:41:40 2021 - [info]   slave1(192.168.80.5:3306)

Fri Jan  8 06:41:40 2021 - [info]   slave2(192.168.80.6:3306)

Fri Jan  8 06:41:40 2021 - [info] Alive Slaves:

...

Fri Jan  8 06:41:42 2021 - [warning] shutdown_script is not defined.

Fri Jan  8 06:41:42 2021 - [info] Got exit code 0 (Not master dead).

 

MySQL Replication Health is OK.

 

D.     masterha_check_status : 매니저 프로세스 체크

I.       구동 중이지 않을 경우

masterha_check_status --conf=/etc/masterha/app1.cnf

app1 is stopped(2:NOT_RUNNING).

 

II.      구동 중 일 경우

masterha_check_status --conf=/etc/masterha/app1.cnf

app1 (pid:2073is running(0:PING_OK), master:master

 

E.      masterha_manager : 매니저 기동 및 모니터링 시작

[mha]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --last_failover_minute=1 &

# MHA 마스터 DB 모니터링 중에 장애가 감지되어 failover  발생  이후 일정 시간내에 장애에 대해서는 failover  진행 되지 않음.

failover  한번 처리   일정 시간안에는 failover 되지 않으며 기본 값은 8시간

# last_failover_minute으로 8시간을 1분으로 변경

 

F.      로그 확인

[mha]$ cd /masterha/app1

[mha]$ tail -100f app1.log

 

Fri Jan  8 06:48:21 2021 - [info] MHA::MasterMonitor version 0.56.

Fri Jan  8 06:48:22 2021 - [info] GTID failover mode = 0

Fri Jan  8 06:48:22 2021 - [info] Dead Servers:

Fri Jan  8 06:48:22 2021 - [info] Alive Servers:

Fri Jan  8 06:48:22 2021 - [info]   master(192.168.80.2:3306)

Fri Jan  8 06:48:22 2021 - [info]   slave1(192.168.80.5:3306)

Fri Jan  8 06:48:22 2021 - [info]   slave2(192.168.80.6:3306)

Fri Jan  8 06:48:22 2021 - [info] Alive Slaves:

...

 

G.     Master 장비 VIP UP

[root]$ su - mha

 

[mha]$ sudo ifconfig eth0:0 192.168.80.50 up

 

2)      장애 상황 테스트 및 복구

A.     매니져에서 모니터링 프로세스 확인

[mha]$ masterha_check_status --conf=/etc/masterha/app1.cnf

app1 (pid:2073is running(0:PING_OK), master:master

 

B.      Master 장비에서 DB 서버 종료

C.      MHA 모니터링 상황 확인

[mha]$ masterha_check_repl --conf=/etc/masterha/app1.cnf

 

Fri Jan  8 06:59:43 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Fri Jan  8 06:59:43 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf..

Fri Jan  8 06:59:43 2021 - [info] Reading server configuration from /etc/masterha/app1.cnf..

Fri Jan  8 06:59:43 2021 - [info] MHA::MasterMonitor version 0.56.

Fri Jan  8 06:59:44 2021 - [info] GTID failover mode = 0

Fri Jan  8 06:59:44 2021 - [info] Dead Servers:

Fri Jan  8 06:59:44 2021 - [info]   master(192.168.80.2:3306)

Fri Jan  8 06:59:44 2021 - [info] Alive Servers:

Fri Jan  8 06:59:44 2021 - [info]   slave1(192.168.80.5:3306)

Fri Jan  8 06:59:44 2021 - [info]   slave2(192.168.80.6:3306)

Fri Jan  8 06:59:44 2021 - [info] Alive Slaves:

Fri Jan  8 06:59:44 2021 - [info]   slave2(192.168.80.6:3306)  Version=10.5.8-MariaDB-1:10.5.8+maria~focal-log (oldest major version between slaves) log-bin:enabled

Fri Jan  8 06:59:44 2021 - [info]     Replicating from slave1(192.168.80.5:3306)

Fri Jan  8 06:59:44 2021 - [info]     Primary candidate for the new Master (candidate_master is set)

Fri Jan  8 06:59:44 2021 - [info] Current Alive Master: slave1(192.168.80.5:3306)

Fri Jan  8 06:59:44 2021 - [info] Checking slave configurations..

...

 

D.     MHA 로그 확인

[mha]$ tail -100f app1.log

...

----- Failover Report -----

 

app1: MySQL Master failover master(192.168.80.2:3306to slave1(192.168.80.5:3306) succeeded

 

Master master(192.168.80.2:3306is down!

 

Check MHA Manager logs at mgr:/masterha/app1/app1.log for details.

 

Started automated(non-interactive) failover.

Invalidated master IP address on master(192.168.80.2:3306)

The latest slave slave1(192.168.80.5:3306) has all relay logs for recovery.

Selected slave1(192.168.80.5:3306as a new master.

slave1(192.168.80.5:3306): OK: Applying all logs succeeded.

slave1(192.168.80.5:3306): OK: Activated master IP address.

slave2(192.168.80.6:3306): This host has the latest relay log events.

Generating relay diff files from the latest slave succeeded.

slave2(192.168.80.6:3306): OK: Applying all logs succeeded. Slave started, replicating from slave1(192.168.80.5:3306)

slave1(192.168.80.5:3306): Resetting slave info succeeded.

Master failover to slave1(192.168.80.5:3306) completed successfully.

 

E.      장애가 발생되어 failover가 되게 되면 매니저서버에서 구동중인 매니저 프로세스(모니터링) 은 종료되게 됨
다시 모니터링을 하기 위해서는 마스터 서버의 정상화 후 설정을 해야 함.
다시 정상화를 위해서 1 서버를 현재 마스터 서버인 2 서버로 설정하여 정상적으로 replication  설정

F.      현재 Master가 된 Slave1의 정보 확인

MariaDB [(none)]> show master status\G

 

*************************** 1row ***************************

File: mysql-bin.000001

Position: 2047

Binlog_Do_DB:

Binlog_Ignore_DB:

1 row in set (0.000 sec)

 

MariaDB [(none)]> show slave hosts\G

*************************** 1row ***************************

Server_id: 3

     Host: slave2

     Port: 3306

Master_id: 2

 

G.     Slave2의 정보 확인

MariaDB [(none)]> show slave status\G

*************************** 1row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: slave1

Master_User: repl_user

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 2047

Relay_Log_File: relay_log.000002

Relay_Log_Pos: 555

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

 

H.     기존의 Master 였던 서버 복구 시작

I.       Master 서버의 디비 서비스 시작

II.      현재 MasterSlave1 서버의 복제 시작

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='slave1', MASTER_USER='repl_user', MASTER_PASSWORD='epdlxjxla', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=2047;

 

MariaDB [(none)]> start slave;

 

복제 설정 여부 확인

MariaDB [(none)]> show slave status\G

*************************** 1row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: slave1

Master_User: repl_user

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 2047

Relay_Log_File: relay_log.000002

Relay_Log_Pos: 555

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

 

III.    Slave1 에서 설정 확인

MariaDB [(none)]> show slave hosts\G

*************************** 1row ***************************

Server_id: 1

     Host: master

     Port: 3306

Master_id: 2

*************************** 2row ***************************

Server_id: 3

     Host: slave2

     Port: 3306

Master_id: 2

 

I.       매니져에서 모니터링 다시 시작

[mha]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --last_failover_minute=1 &

 

J.       모니터링 상황 확인

I.       매니져 실행 여부 확인

[mha]$ masterha_check_status --conf=/etc/masterha/app1.cnf

app1 (pid:2073) is running(0:PING_OK), master:master

 

II.      로그 확인

[mha]$ cd /masterha/app1

[mha]$ tail -100f app1.log

...

Fri Jan  8 07:17:18 2021 - [info] MHA::MasterMonitor version 0.56.

Fri Jan  8 07:17:19 2021 - [info] GTID failover mode = 0

Fri Jan  8 07:17:19 2021 - [info] Dead Servers:

Fri Jan  8 07:17:19 2021 - [info] Alive Servers:

Fri Jan  8 07:17:19 2021 - [info]   master(192.168.80.2:3306)

Fri Jan  8 07:17:19 2021 - [info]   slave1(192.168.80.5:3306)

Fri Jan  8 07:17:19 2021 - [info]   slave2(192.168.80.6:3306)

Fri Jan  8 07:17:19 2021 - [info] Alive Slaves:

Fri Jan  8 07:17:19 2021 - [info]   master(192.168.80.2:3306)  Version=10.5.8-MariaDB-1:10.5.8+maria~focal-log (oldest major version between slaves) log-bin:enabled

Fri Jan  8 07:17:19 2021 - [info]     Replicating from slave1(192.168.80.5:3306)

Fri Jan  8 07:17:19 2021 - [info]     Primary candidate for the new Master (candidate_master is set)

Fri Jan  8 07:17:19 2021 - [info]   slave2(192.168.80.6:3306)  Version=10.5.8-MariaDB-1:10.5.8+maria~focal-log (oldest major version between slaves) log-bin:enabled

Fri Jan  8 07:17:19 2021 - [info]     Replicating from slave1(192.168.80.5:3306)

Fri Jan  8 07:17:19 2021 - [info]     Primary candidate for the new Master (candidate_master is set)

Fri Jan  8 07:17:19 2021 - [info] Current Alive Master: slave1(192.168.80.5:3306)

...

 

3)      Master 서버 스위치

A.     switch 시 매니저의 모니터링을 중지 해야 함.

[mha]$ masterha_stop --conf=/etc/masterha/app1.cnf

 

[mha]$ masterha_check_status --conf=/etc/masterha/app1.cnf

app1 is stopped(2:NOT_RUNNING).

 

B.      Switch 명령어로 Master 서버 변경

masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.cnf --new_master_host=master --interactive=0

 

#--master_state=alive | dead

#master 서버가 장애로 인하여 수동적인 failover  하는 것이라면 --master_state=dead #라고 옵션을 사용해야 합니다.

#master 서버가 정상이라면 alive 라고 입력 합니다.

 

#--new_master_host=호스트명

#새로운 마스터가  호스트명 입력

 

#--interactive=0 | 1

#1번은 대화형으로 진행(default이며, 0번은 비대화식

 

...

From:

slave1(192.168.80.5:3306) (current master)

 +--master(192.168.80.2:3306)

 +--slave2(192.168.80.6:3306)

 

To:

master(192.168.80.2:3306) (new master)

 +--slave2(192.168.80.6:3306)

...

Fri Jan  8 07:52:09 2021 - [info]  master: Resetting slave info succeeded.

Fri Jan  8 07:52:09 2021 - [info] Switching master to master(192.168.80.2:3306) completed successfully.

 

C.      Master 서버에서 승격 여부 확인

MariaDB [(none)]> show slave hosts\G

*************************** 1row ***************************

Server_id: 3

     Host: slave2

     Port: 3306

Master_id: 1

 

기존의 Master 였던 Slave1  연결이 끊어진 것을   있음 

 

D.     Slave1을 다시 Master를 복제하도록 함

I.       Master 정보 확인

MariaDB [(none)]> show master status\G

*************************** 1row ***************************

File: mysql-bin.000002

Position: 563

Binlog_Do_DB:

Binlog_Ignore_DB:

 

II.      Slave1 에서 복제 시작

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl_user', MASTER_PASSWORD='epdlxjxla', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=563;

 

MariaDB [(none)]> start slave;

 

MariaDB [(none)]> show slave status\G

 

III.    Master에서 연결 정보 확인

MariaDB [(none)]> show slave hosts\G

*************************** 1row ***************************

Server_id: 2

     Host: slave1

     Port: 3306

Master_id: 1

*************************** 2row ***************************

Server_id: 3

     Host: slave2

     Port: 3306

Master_id: 1

 

E.      모니터링 재시작

[mha]$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --last_failover_minute=1 &

 

4.    참조

A.     https://mariadb.com/kb/en/semisynchronous-replication/#enabling-semisynchronous-replication

B.      https://sarc.io/index.php/mariadb/1427-mha-nodeutil-pm-version

C.      https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

D.     https://hoing.io/archives/3111

E.      https://hoing.io/archives/3633

728x90

'Database > Mysql & Mariadb' 카테고리의 다른 글

MySQL 8 계정 이슈  (0) 2021.10.06
Mysql JDBC Connector TimeZone 에러  (0) 2021.10.05
Visual code on Mysql (Mariadb)  (0) 2021.07.02
재귀 쿼리를 이용한 전년도 같은 주차 조회  (0) 2021.06.02
Mariadb Connect Engine  (0) 2021.04.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기