MySQL MHA(Master High Availability) 2 - 설치 및 구성

Share

Last Updated on 6월 25, 2024 by Jade(정현호)

안녕하세요 
이번 포스팅은 MySQL 의 고가용성 솔루션인 MHA에 대한 설치 및 구성 그리고 사용에 관한 두 번째 포스팅 글입니다. 

MHA의 2번째 글로 아래 포스팅에서 이어지는 글입니다. 

       

MHA 구성 환경 내역

포스팅에서는 아래 이미지와 같이 총 4개 서버 를 통해 설치 및 구성하였습니다.



MySQL 설치 버전 및 경로

OS: CentOS 7.8

MySQL: 5.7.31
MySQL S/W 경로 : /usr/local/mysql


IP 설정 내역

Master Server - 192.168.56.51 / Hostname: acs
Slave Server1 - 192.168.56.52 / Hostname: acs2
Slave Server2 - 192.168.56.56 / Hostname: acs3

MHA Manager - 192.168.56.104 / hostname: mgr
Master DB VIP - 192.168.56.50


/etc/hosts 설정 내역 - 모든 서버 공통

192.168.56.51 acs
192.168.56.52 acs2
192.168.56.56 acs3

192.168.56.104 mgr
192.168.56.50 mha-master-vip

* 본문 내용과 작성된 스크립트 내부에서 대부분 위의 호스트 네임을 사용합니다


MHA 설치 환경

conf 파일 위치: /etc/masterha/
script 위치: /masterha/scripts/

MHA 매니저/Remote 서버 실행 정보 저장 디렉토리 및 로그 디렉토리
/masterha/app1/



* 각 노드에 MySQL 은 설치된 상태에서 진행된 시나리오입니다.
설치 방법은 아래 포스팅을 참조하시면 됩니다.

 • 우분투 - MySQL 5.7 설치 - APT,Binary, Source Compile
 •CentOS - MySQL 5.7 YUM 으로 설치
 •CentOS - MySQL 5.7 - Source Compile, Binary Unzip 설치


MySQL 8 버전 환경의 MHA글은 아래 포스팅을 참조하시면 됩니다.(RockyLinux 8, ProxySQL 사용)

        

MySQL Replication 구성

MHA 포스팅 1편 에서 설명 드린 것처럼 데이터에 손실 방지나 최소화하기 위해서는 Semi Sync(Lossless Replication) 이 권장되고 있습니다.

Semi Sync Replication 은 아래 포스팅을 참조하시면 됩니다.





Semi-sync Replication 은 MySQL 5.5 버전에서 도입된 sync 형태의 복제 방식입니다.


Semi-sync Replication 방식은 Master 에서 Slave 로 전달된 Relay log의 기록이 완료되었다는 메세지(신호)를 받고나서 처리중인 transaction의 결과를 요청한 application(client)에 결과를 반환해주는 방식입니다.


그래서 Master 장애시 복제에 대해서 손실 방지 혹은 손실의 최소화를 할 수 있습니다

포스팅에서는 설명의 간략화를 위해 async로 구성하였습니다.
자세한 내용은 아래 포스팅을 꼭 참조해주세요

 • MySQL 복제구성 - Async 구성 및 Semi Sync
 • MySQL 복제구성 - Semi Sync 구성 및 설정
       

MySQL 설정 변경 - my.cnf 수정

MySQL 복제 구성을 위해서 MySQL 설정을 먼저 변경하도록 하겠습니다.

# 으로 된 설명(주석) 은 복사에서 제외하고 사용하시면 됩니다.


[root]# vi /etc/my.cnf

# Master 설정

[mysqld]

server-id=1
# -> server-id는 master와 slave가 달라야 합니다
### Replication
log-bin=/usr/local/mysql/logs/binlog
# -> Binlog의 파일명을 기재합니다.
sync_binlog=1
binlog_cache_size=2M
binlog_format=ROW

max_binlog_size=512M
expire_logs_days=7
log-bin-trust-function-creators=1
report-host=acs
# -> 각 DB의 호스트네임으로 show slave hosts 에서 정보로 활용
relay-log=/usr/local/mysql/logs/relay_log
relay-log-index=/usr/local/mysql/logs/relay_log.index
relay_log_purge=off
expire_logs_days=7
log_slave_updates=ON


# Slave 설정

[mysqld]
server-id=2
# -> server-id는 master와 slave가 달라야 합니다
### Replication Option
log-bin=/usr/local/mysql/logs/binlog
# -> Binlog의 파일명을 기재합니다.
sync_binlog=1
binlog_cache_size=2M
binlog_format=ROW

max_binlog_size=512M
log-bin-trust-function-creators=1
report-host=acs2
# -> 각 DB의 호스트네임으로 show slave hosts 에서 정보로 활용
relay-log=/usr/local/mysql/logs/relay_log
relay-log-index=/usr/local/mysql/logs/relay_log.index
relay_log_purge=off
expire_logs_days=7
log_slave_updates=ON
read_only=ON


# Slave 설정

[mysqld]
server-id=3
# -> server-id는 master와 slave가 달라야 합니다
### Replication Option
log-bin=/usr/local/mysql/logs/binlog
# -> Binlog의 파일명을 기재합니다.
binlog_cache_size=2M
binlog_format=ROW

max_binlog_size=512M
log-bin-trust-function-creators=1
report-host=acs3
# -> 각 DB의 호스트네임으로 show slave hosts 에서 정보로 활용
relay-log=/usr/local/mysql/logs/relay_log
relay-log-index=/usr/local/mysql/logs/relay_log.index
relay_log_purge=off
expire_logs_days=7
log_slave_updates=ON
read_only=ON


* 포스팅에서는 마스터1대 , 슬레이브 2대의 구성입니다.
* MHA에서 relay_log_purge 의 권장값은 비활성화 하며, fail-over나 Switch-over시 MHA 에 의해 purge 되고 별도의 log purge 는 다음 포스팅에서 설명하고 있습니다.

           

재시작 및 유저 생성

이전 단계에서 my.cnf 를 수정하였고 적용하기 위해서 MySQL 재시작 과 복제에 사용할 별도의 DB 유저를 생성하겠습니다.


MySQL 재시작


위 설정을 추가하고 master/slave 모두 mysql을 재시작 합니다.


[root]# systemctl restart mysqld


Replication 전용 유저 생성


(마스터,슬레이브 - 모든 DB)


[root]# mysql --login-path=dba

mysql> create user 'repl_user'@'%' identified by 'repl_user';
mysql> grant replication slave on *.* to 'repl_user'@'%';
mysql> flush privileges;


[참조] --login-path 는 MySQL 5.6부터 추가된 기능으로 접속정보, 계정정보를 암호화해 저장해서 사용하는 기능입니다

자세한 내용은 아래 포스팅을 참조하시면 됩니다.

           

Replication 설정

이제 Slave 인스턴스에서 Replication 설정을 진행하도록 하겠습니다.
복제 구성을 위해서 마스터에서 binlog 파일 정보와 log pos 정보를 확인하도록 하겠습니다.

Note

포스팅에서는 테스트 시스템으로 데이터가 계속 변경되지 않고 초기 데이터의 차이가 없기 때문에 이와 같이 진행하였습니다. 실제 사용 환경에서는 mysqldump 나 xtrabackup 등을 통해서 Master DB 나 Backup 에서 데이터 구성 및 biolog pos 정보 등을 확인하여 복제를 구성해야 합니다.



마스터에서 정보 조회

mysql> show master status\G

*************************** 1. row ***************************
File: binlog.000020
Position: 154
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:


Slave 에서 Replication 설정 및 시작

mysql> CHANGE MASTER TO MASTER_HOST='acs', MASTER_USER='repl_user',

MASTER_PASSWORD='repl_user',
MASTER_LOG_FILE='binlog.000020',
MASTER_LOG_POS=154;

mysql> start slave;

mysql> show slave status\G

Note

포스팅의 테스트 시스템에서는 /etc/hosts 에 mha 서버와 각 MySQL 인스턴스의 호스트명과 IP 명에 대한 정보가 설정된 환경에서 진행 중입니다.



마스터에서 조회

mysql> show slave hosts\G
*************************** 1. row ***************************
Server_id: 3
Host: acs3
Port: 3306
Master_id: 1
Slave_UUID: 706aaace-11d5-11eb-8127-0800279c8b61
*************************** 2. row ***************************
Server_id: 2
Host: acs2
Port: 3306
Master_id: 1
Slave_UUID: 6e5b28b4-3666-11eb-a44f-080027bf7f98
2 rows in set (0.00 sec)


* master / slave 모두 MySQL 설치 직후 Replication 임으로 master를 통해 초기데이터를 구성하지 않았지만, 계속 사용 중인 master 라면 mysqldump 등을 통해 초기 데이터 복제가 필요 합니다.
         

mha 접속 DB 계정 생성

MHA 매니저 서버에서는 소스, 리플리카 인스턴스 모든 DB에 접속할 수 있어야 합니다.
기본적으로 MySQL의 관리 계정인 root 유저를 사용하며, 별도의 계정 생성 및 권한 부여를 하여 사용할 수도 있습니다.

포스팅에서는 별도로 계정을 생성하여 진행하였으며, 기본 관리자 계정인 root 계정을 사용해도 됩니다.
생성된 계정을 통해서 STOP SLAVE, CHANGE MASTER, RESET SLAVE와 같은 필요한 모든 관리 명령을 실행하게 되며 그에 따라서 관리자 권한이 필요 합니다.


Master 에서 수행

[root]# mysql --login-path=dba

mysql> CREATE USER ‘mha’@'%' IDENTIFIED BY 'mha';

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘mha’@'%';
mysql> FLUSH PRIVILEGES;

* 계정명과 비밀번호는 예시입니다.
* mysql 스키마를 포함한 전체 복제 구성이라면 Master에서 계정 생성시 Slave에서도 동일하게 생성됩니다.
* mysql 스키마를 복제에서 제외하였다면 Slave에서 별도로 계정을 생성합니다.


생성 확인 - Slave 에서 조회

mysql> select user,host from mysql.user where user='mha';
       

OS 유저 생성 및 SSH 인증 설정

MHA로 관리되는 모든 서버에는 SSH를 통해서 접속할 수 있어야 하며, MHA 매니저 서버에서 마스터 서버, 슬레이브 서버에 비밀번호 입력 필요 없이 접속 가능한 환경이 구성되어 있어야 합니다.

먼저 모든 서버에 공통으로 유저를 생성합니다.


OS 유저 생성 및 설정

그룹 생성 및 유저를 아래와 같이 추가합니다.

[root]# useradd -g mysql mha
[root]# passwd mha
Changing password for user mha.
New password: [패스워드 입력]
Retype new password: [패스워드 입력]

[root]# su - mha



PATH 관련 환경 변수를 추가
(모든 노드의 mha 유저)

[mha]$ echo "export PATH=$PATH:/usr/local/bin:/usr/local/mysql/bin" >> ~/.bash_profile

[mha]$ source ~/.bash_profile

* /usr/local/mysql/bin 위치는 소스 컴파일이나 Binary unzip 으로 설치하였을 때 위치입니다.
RPM/YUM 패키지로 설치하였을 경우 /usr/local/bin 만 추가 해주시면 됩니다.


모든 서버에서 생성 SSH 키 생성

생성 명령어 :  ssh-keygen -t rsa -b 4096

[mha]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mha/.ssh/id_rsa): [엔터]
Created directory '/home/mha/.ssh'.
Enter passphrase (empty for no passphrase): [엔터]
Enter same passphrase again: [엔터]
Your identification has been saved in /home/mha/.ssh/id_rsa.
Your public key has been saved in /home/mha/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:J52+2342342sdfsdfasdfasfasdfasf mha@xxxx
The key's randomart image is:
+---[RSA 4096]----+
|xxxxxxxx ..      |
|.xxxxxx..        |
| o.xxxxxxx       |
|+xxxxxxxxx .     |
|=..xxxxxx +      |
|+.. . o.++       |
|.xxxxxxxxxxx     |
|  xxxxxxxxxxxx   |
|    xxxxxxxx     |
+----[SHA256]-----+



공개키 전송(Copy)

생성한 공개키(.pub)를 모든 서버로 전송해야 합니다.

매니저 서버에서 -> 1,2,3 번 서버로
1번 서버에서 -> 매니저 서버,2,3번 서버로
2번 서버에서 -> 매니저 서버,1,3번 서버로
3번 서버에서 -> 매니저 서버,1,2번 서버로


ssh-copy-id 를 이용하면 되며 아래와 같이 수행합니다.
명령어 예시: 매니저 서버-> 1번 서버로 공개키 복사


[mha]$ ssh-copy-id -i acs
mha@acs's password: [패스워드입력]

Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'acs'"
and check to make sure that only the key(s) you wanted were added.


전송이 완료되었다면 패스워드 없이 접속이 되는지 확인해봅니다.

[mha]$ ssh acs
Last login: Fri Dec 2020

[mha@acs ~]$ hostname
acs <-- 정상적으로 접속이 확인됨


1번 서버에서는 매니저서버로 부터 전송 받은 키는 authorized_keys 파일에 입력되어 있습니다.

[mha]$ cd .ssh
[mha]$ cat authorized_keys
ssh-rsa XXXXXXXXXX== mha@mgr


위와 같은 방법으로 공개키를 서버간에 모두 복사(전송) 합니다.
            

mha 유저 sudo 설정

VIP 에 대한 Failover(장애조치) 및 IP assign 을 위해 필요시 mha 유저가 root 권한을 수행할 수 있도록 sudouser 를 설정해야 합니다.


mha 유저 sudo 설정

마스터 노드와 슬레이브 모두에서 설정이 필요 합니다
[root]# visudo

아래 내용 추가합니다.
mha ALL=(ALL) NOPASSWD:/sbin/ifconfig


[mha]$ifconfig -a
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.51 netmask 255.255.255.0 broadcast 192.168.56.255

* 포스팅 환경에서 public nic은 enp0s3 입니다.


가상 IP(VIP) 설정 테스트 

mha 유저로 vip 가동 여부를 확인하는 절차로 마스터서버와 슬레이브 노드 모두에서 한 번씩은 테스트를 진행합니다. 


VIP UP

[mha]$ sudo ifconfig enp0s3:0 192.168.56.50 netmask 255.255.255.0 up

* 192.168.56.50 는 포스팅 환경에서의 VIP 입니다.
* 서브넷(netmask)는 사용하는 환경에 따라서 C 클래스
가 아닐 수도 있으며, 포스팅 환경에서는 C 클래스 255.255.255.0 로 사용 중 입니다.


[mha]$ ifconfig -a
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.51 netmask 255.255.255.0 broadcast 192.168.56.255

enp0s3:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.50 netmask 255.255.255.0 broadcast 192.168.56.255
ether 08:00:27:d4:f8:ed txqueuelen 1000 (Ethernet)


VIP Down

[mha]$ sudo ifconfig enp0s3:0 down

         

MHA 설치

이제 MHA 를 설치하도록 하겠습니다.
         

필요 패키지 설치

MHA 설치에 따른 필요한 패키지 설치를 해야 합니다. 
모든 서버에 공통적으로 설치를 하면 됩니다.

[root]# yum install perl-DBD-MySQL \
perl-Config-Tiny perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-Log-Dispatch perl-Time-HiRes \
perl-CPAN perl-Module-Install
         

MHA 매니저 설치

MHA 매니저를 설치를 진행하도록 하겠습니다
(mha4mysql-manager-0.58)


매니저 서버에서만 설치합니다.

[root]# mkdir -p /root/pkg
[root]# cd /root/pkg
* 경로는 임의의 경로입니다.

[root]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz


[root]# tar zxvf mha4mysql-manager-0.58.tar.gz
[root]# cd mha4mysql-manager-0.58


[root]# perl Makefile.PL

*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
- Time::HiRes ...loaded. (1.9725)
- Config::Tiny ...loaded. (2.14)
- Log::Dispatch ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst ...missing.
==> Auto-install the 1 mandatory module(s) from CPAN? [y] y

[root]# make;make install

          

MHA Node 설치

MHA Node 를 설치하도록 하겠습니다
(mha4mysql-node-0.58)

매니저 서버 와 Master & Slave MySQL Server 모두에서 설치합니다.


[root]# mkdir -p /root/pkg
[root]# cd /root/pkg
* 경로는 임의의 경로입니다.

[root]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz

[root]# tar zxvf mha4mysql-node-0.58.tar.gz

[root]# cd mha4mysql-node-0.58

[root]# perl Makefile.PL

[root]# make;make install
               

후속 작업 수행

심볼릭 링크 생성

대상 : 마스터 서버, 슬레이스 서버 (매니저 서버 제외)

mysql 와 mysqlbinlog 파일이 아래 경로에 없다면 root 유저로 심볼릭 링크를 설정해줍니다.

[root]# ls -al /usr/bin/mysqlbinlog
[root]# ls -al /usr/local/bin/mysql

[root]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql


필요 디렉토리 생성 및 파일 복사

= 매니저 서버에서 수행

[root]# mkdir -p /etc/masterha

[root]# mkdir -p /masterha/scripts

[root]# cd /root/pkg/mha4mysql-manager-0.58/samples
 * /root/pkg/mha4mysql-manager-0.58 경로는 설치파일의 압축 해제 경로입니다
=> tar zxvf mha4mysql-manager-0.58.tar.gz


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



= 매니저, 마스터, 슬레이브
 - 모든 서버에서 실행 


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

MHA 설정

아래 이미지처럼 1개의 MHA 매니저 서버에서 모니터링 하고 장애 조치가 되는 MySQL의 Replication Group 은 1개 이상이 될 수도 있습니다.




/etc/masterha_default.cnf 파일은 공통 설정(기본 설정 파일) 파일로 여러 그룹이 공통적으로 사용할 수 있습니다.

예를 들어 아이디/패스워드나 디렉토리 나 로그의 경로 가 같다면 /etc/masterha_default.cnf 파일에 설정하면 중복되는 내용을 줄일 수 있습니다.
또는 기본 설정 파일로 사용할 수 있습니다.

포스팅에는 app1.conf 를 별도로 만들어서 사용하도록 하겠습니다.

파일명: /etc/masterha/app1.cnf


매니저서버 파일 설정(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&password is DB User
user=mha
password=mha
# ssh_user is OS User
ssh_user=mha
# repl_user&repl_password is DB User
repl_user=repl_user
repl_password=repl_user
manager_workdir=/masterha/app1
manager_log=/masterha/app1/app1.log

remote_workdir=/masterha/app1
master_binlog_dir=/usr/local/mysql/logs

secondary_check_script=/usr/local/bin/masterha_secondary_check -s acs2 -s acs3 --user=mha --master_host=acs --master_ip=acs --master_port=3306
# --user=mha is os ssh user

master_ip_failover_script=/masterha/scripts/master_ip_failover
master_ip_online_change_script=/masterha/scripts/master_ip_online_change

[server1]
hostname=acs
candidate_master=1

[server2]
hostname=acs2
candidate_master=1

[server3]
hostname=acs3
candidate_master=1


master_binlog_dir=/usr/local/mysql/logs   는 사용중인 환경에 맞게 binlog 파일이 있는 경로를 입력해 줍니다.

masterha_secondary_check 의 -s 에서는 현재 Slave DB호스트를 입력하고, Master는 "--master_host --master_ip --master_port" 에 정보를 입력합니다.

MHA 테스트를 위한 MySQL 복제 설정과 구성, OS 설정, 패키지 설치, MHA 설치 및 구성 등에 대해서 확인해 보았습니다.

다음 포스팅에서는 VIP 스크립트 생성 및 설정, MHA 모니터링, Take-over 등에 대해서 확인해 보도록 하겠습니다.


이어지는 다음 글

              

Reference

Reference link
https://github.com/yoshinorim/mha4mysql-manager
https://github.com/yoshinorim/mha4mysql-node
https://github.com/yoshinorim/mha4mysql-manager/wiki
https://www2.slideshare.net/matsunobu/automated-master-failover


Book
DBA를 위한 MySQL 운영 기술


연관된 글

 

 

 

              

8
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x