본문 바로가기
DATABASE/DB HA

MHA construct

by 개폰지밥 2019. 3. 21.
반응형

* MHA란?

MHA에 대해서 짧게 설명을 하자면 MHA는 manager, master, slave로 구성되어있습니다. master는 평소에 동작하는 active db 서버입니다. 어떤 이유로 master db가 동작할 수 없게 되면 manager 서버는 master db가 동작할 수 없다는 것을 파악해, slave가 master로 승격되서 slave가 master 서버로 동작되게 됩니다. 이렇게 되면 서비스가 동작안하는 다운 타임을 최소로 할 수 있습니다.


* 아래와 같이 ip주소 변경

- manager:192.168.56.80

- master:192.168.56.81

- slave:192.168.56.82


어댑터1은 NAT로 어댑터2는 VirtualBoxk Host-Only Ethernet Adapter로 설정해준다.

(위와 같이 어댑터1,2를 설정하지 않으면, 네트워크가 되지 않아 yum에러가 발생할 수 있습니다.)


먼저 ifcfg-eth0을 수정해줍니다. ifcfg-eth0은 아까 NAT로 설정한 어댑터1을 뜻합니다. ONBOOT를 yes로 바꿔줍니다. 시작할 때도 실행시키겠다는 의미입니다.

vi /etc/sysconfig/network-scripts/ifcfg-eth0


그 다음 host-only 어댑터2를 사용하 위해 ifcfg-eth1을 생성해줍니다.

(ifcfg-eth1이 만들어져 있으면 아래와 같이 수정만 하면 됩니다.)

간단하게 설명하면 ip주소는 192.168.56.80을 할 것이고, 시작할 때 실행 시킬 것이고 static(수동)으로 ip주소를 고정시키겠다는 뜻이다.

이렇게 smanager, smaster, sslave의 ip 모두 변경해주세요.


* host명 변경

모두가 localhost로 되어있으면 어느것이 manager인지 어느것이 slave인지 헷갈릴 수 있으므로 host명을 변경해준다.

host명을 변경하는 방법에는 2가지가 있다. 일시적으로 변경하는 방법과 영구적으로 변경하는 방법이 있다. (나는 영구적으로 변경해 주도록 하겠다.)

- 일시적 변경

hostname smanager

- 영구적 변경

vi /etc/sysconfig/network

이렇게 smanager, smaster, sslave의 hostname 모두 변경해주세요.


* 도메인 추가

ip 주소를 외우기 어려우니 도메인을 추가해줍니다. 아래와 같이 추가하면 smanager가 192.168.56.80이 됩니다.

vi /etc/hosts

(왜 smanager smaster sslave냐.. 그냥 지은거예요 ㅎㅎ 그냥 manager master slave로 하셔도 되는데, 그러면 헷갈릴꺼예요! smanager smaster sslave라고 해주세요.)


* 재시작

ip, host명, 도메인 설정을 변경한 후 reboot 해줍니다.


* 변경 설정 확인하기

우선 host명, ip 주소가 잘 변경되었습니다.


ping smaster 이라 해도 ip 주소로 변경해서 잘 찾아갑니다. 도메인 추가도 잘 완료되었습니다. 


* 포트 열어주기

mha를 하기 위해 ssh 접속mysql이 복제(replication)이 되어야 합니다. 그렇기 때문에 ssh와 mysql이 사용하는 포트를 열어줘야합니다.

ssh는 보통 22번, mysql은 보통 3306을 사용합니다.

(열어주지 않으면 ssh 접속과 mysql 복제시 포트 에러가 생겨난다.)

포트 포워딩 후

vi /etc/sysconfig/iptables 에 가서

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 를 추가해줍니다.

이렇게 smanager, smaster, sslave의 포트 모두 열어 주세요.



* mysql 설치

mysql의 mha를 해줄 거기때문에 mysql이 필요 합니다.

mysql을 설치하는 방법에는 크게 소스설치와 yum 설치가 있습니다.

소스설치는 위치를 지정할 수 있고 버전을 선택할 수 있지만 의존성 문제가 많이 발생합니다.

yum은 위치지정과 버전선택이 어렵지만 의존성 문제가 발생하지 않는 편입니다.

소스설치는 보통 /usr/local에 저장되고, yum 설치는 /var/lib에 저장되는 편입니다.

설치 확인

rpm -qa | grep ^mysql-server

(아무것도 안 뜨면 설치가 안되어있는것임 설치 ㄱㄱ)

설치

yum -y install mysql-server

mysql 시작

service mysqld start

(mysql을 시작하지 않으면 접속이 되지않습니다!! 꼭 시작해주세요.)

접속확인

mysql -uroot

(접속 할 때 패스워드를 설정했다면 mysql -uroot -p로 패스워드를 입력해주세요. 저는 패스워드 설정을 하지않았습니다.)

부팅시 자동시작 설정

chkconfig mysqld on



* 의존라이브러리 설치

각 모든 서버에서

# yum -y install perl-DBD-MySQL

manager에서

# yum -y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes


* MHA 설치

MHA 설치도 소스 설치와 rpm 설치가 있습니다.


- 소스 설치하는 방법

소스 설치는 싸이트에 가서 mha.tar 파일을 다운 받고 아래와 같이 실행해주면 됩니다.

하지만 저는 rpm을 이용해서 설치하도록 하겠습니다.

$ tar -zxf mha4mysql-node-X.Y.tar.gz

$ perl Makefile.PL

$ make

$ sudo make install


- rpm 설치 방법

다운로드 사이트: https://code.google.com/archive/p/mysql-master-ha/downloads

(저는 0.53 버전을 다운 받았습니다. 이 글 보고 진행하면 0.53 같은 버전을 받는것을 추천합니다! 다른 버전 다운시 여러가지 문제가 발생할 수도 있기 때문입니다 ㅠ)


다운받은 파일

1) mha4mysql-manager-0.53-0.el6.noarch.rpm

2) mha4mysql-node-0.53-0.el6.noarch.rpm

- 다운로드 받은 파일 옮기기

(저는 ftp 소프트웨어인 파일질라를 이용해서 파일 옮겼습니다.)

Manager 서버에서는 manager와 node 둘 다 필요함. 다른 서버는 node만 필요함.


각 서버에서

rpm -ivh mha4mysql-node~

manager 서버 에서만

rpm -ivh mha4mysql-manager~

(rpm iinstall로 패키지 설치, v는 자세한 정보 출력, hprint hash marks로 설치 진행 상황을 # 문자를 이용하여 출력한다.)


* mha 라이브러리를 OS(linux)에 맞춰주기

cp -crp /usr/share/perl5/vendor_perl/MHA/ /usr/lib64/perl5/vendor_perl/


replication 계정생성 & 권한주기

먼저 mysql 접속합니다.

mysql -u root -p

=> u 접속할 user 뜻하며 p password 뜻합니다.

=> 저는 패스워드를 설정하지 않아서 mysql -uroot   접속하겠습니다.

 

mysql 계정생성 방법입니다.

GRANT ALL PRIVILEGES ON *.* TO ‘mha’@'%' IDENTIFIED BY 'mha123';

 flush privileges;

@뒤에는 localhost%를 사용할 수 있는데 localhost는 내부접근, %는 외부 접근입니다.

*.*은 모든 database의 모든 table의 접근을 허용한다는 뜻입니다.

flush privileges;는 변경된 내용을 적용하는 명령어 입니다.

mha 계정을 통해 master DB에서 slave DB로 데이터를 가져오는 명령어 입니다.


* 만들어진 계정 확인하기

select user,host,password from mysql.user;

user에 mha가 생겼다면 잘 생성된 것입니다.
mysql.user의 mysql은 database를 뜻합니다.
database와 tables을 확인하는 명령어는
show databases;
show tables; 입니다.



이제부터 MHA를 위한 SSH와 replication 설정을 하도록 하겠습니다.

MHA를 구성하기 위해서는 SSH접속과 replication(복제)가 먼저 되어야 하고,

MHA 구성 하기 위해서 생성 혹은 수정해야 할 파일이 3가지 있습니다.

1) manager 서버 - /etc/MHA.cnf

(먼저 manager 서버 설정입니다. MHA.cnf는 제가 생성한 것입니다. 이름을 app1.cnf, masterha-default.cnf 등 다르게 하셔도 상관 없습니다. masterha 명령어의 끝에 읽혀주기만 하면 됩니다. 저는 MHA.cnf라는 이름으로 생성해서 진행하도록 하겠습니다.)

2) master 서버 - /etc/my.cnf

3) slave 서버 - /etc/my.cnf

(그 다음에 master 서버와 slave 설정을 위해 /etc/에 가시면 my.cnf가 있는데 my.cnf를 수정하도록 하겠습니다.)


* manager 서버의 /etc/MHA.cnf 생성

ㅡMHA Configure file 생성 – manager 서버에서만 하도록 합니다.

##은 주석으로 쓰지 않으셔도 됩니다. 복사 붙여넣기 하시면 manager_workdir와 remote_workdir가 자동으로 생성됩니다.

ㅕuser=mha와 password=mha123은 MHA-1에서 replication을 하기 위해 생성한 user를 적으시면 됩니다.

 

[server default]

user=mha

password=mha123


manager_workdir=/var/log/masterha

#manager_log=/var/log/masterha/MHA.log

remote_workdir=/var/log/masterha

[server1]

hostname=smaster

#master_binlog_dir=/var/lib/mysql

[server2]

hostname=sslave

#master_binlog_dir=/usr/lib/mysql



* SSH 접속

MHA는 SSH를 통해서 각 노드들에 연결하기 때문에 SSH 접속이 먼저 선행되어야 합니다아래와 같은 명령어는 SSH 비밀번호 인증없이 접속할 수 있게 해줍니다각각의 모든 서버에서 실행해줍니다. 아래의 IP 주소는 MHA-1에서 설정한 manager, master, slave ip 주소 입니다.

ssh-keygen -t rsa

엔터 세번을 치세요

ssh-copy-id root@192.168.56.80

ssh-copy-id root@192.168.56.81

ssh-copy-id root@192.168.56.82





* ssh 접속 확인

ssh 접속이 잘 되는지 확인하는 명령어 입니다. error가 뜨면 ssh 접속이 되지 않는 것이니 ssh 접속 위의 명령어를 한번더 입력하던가 error를 해결하고 넘어가야 합니다.

masterha_check_ssh –conf=/etc/MHA.cnf




* * Replication을 위한 my.cnf 수정

    가장 중요한 것은 servier id와 read_only값입니다. 자세한 설명은 나중에 하도록 하고 복사붙여넣기 합시다!

   주석(#)은 안쓰셔도 됩니다.

 

-       Master my.cnf

[mysqld]

basedir = /var/lib/mysql

#datadir = /var/lib/mysql/mysql

port = 3306

server_id=1

#socket = /var/lib/mysql/mysql.sock

skip-name-resolve

#relay_log_purge=0

#read_only=1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

#binlog-do-db=databasename

relay-log=/var/lib/mysql/mysql-relay-bin

relay-log-index=/var/lib/mysql/mysql-relay-bin.index

log-error=/var/lib/mysql/mysql.err

master-info-file=/var/lib/mysql/mysql-master.info

relay-log-info-file=/var/lib/mysql/mysql-relay-log.info

log-bin=/var/lib/mysql/mysql-bin

 

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid





-       Slave my.cnf

[mysqld]

basedir = /var/lib/mysql

#datadir = /var/lib/mysql/mysql

port = 3306

server_id=2

#socket = /var/lib/mysql/mysql.sock

skip-name-resolve

relay_log_purge=0

read_only=1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

 

master-host=192.168.56.81

master-connect-retry=60

master-user=mha

master-password=mha123

#replicate-do-db=databasename

relay-log = /var/lib/mysql/mysql-relay-bin

relay-log-index = /var/lib/mysql/mysql-relay-bin.index

log-error = /var/lib/mysql/mysql.err

master-info-file = /var/lib/mysql/mysql-master.info

relay-log-info-file = /var/lib/mysql/mysql-relay-log.info

log-bin = /var/lib/mysql/mysql-bin

 

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

 




my.cnf 수정 후 반드시 service mysqld restart로 mysql 재시작 해줘야함.


* replication(복제) 확인하기

masterha_check_repl --conf=/etc/MHA.cnf

MySQL Replication Health is OK.라고 뜨면 정상적으로 된 것 입니다.




l  Master 서버에서 master 상태 확인

Show master status\G

Master 상태 - File과 Position을 기억하고 있어야함.

 

l  Slave 서버

아래와 같이 입력해야 master 서버와 연결할 수 있습니다.

Mysql -uroot

stop slave;


CHANGE MASTER TO MASTER_HOST='192.168.56.81',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql-bin.000010',

MASTER_LOG_POS=106,

MASTER_USER='mha',

MASTER_PASSWORD='mha123';

 

start slave;


 


(change master to master_host에는 master ip 주소를 적고, master_log_file과 master_log_pos에는 아까 기억하고 있던 file과 position을 적습니다.)

Show slave status\G



위와 같이 wating for master to send event라 뜨면 정상적으로 master slave 관계가 성립된 것입니다

참고로 mha 실행 명령어는

master_manager --conf=/etc/MHA.cnf 입니다.



mha가 잘 돌아가는지 확인하는 명령어는

masterha_check_status --conf=/etc/MHA.cnf 입니다



다음은 MHA failover와 에러에 대해서 다루도록 하겠습니다.


수정하기로 보면 사진이 잘 나오는데... 그냥 글보기로 보면 사진이 왜 안나오는지 모르겠네요.

안보이는 사진은 위에 적힌 명령어를 입력해본 것이니까 없어도 크게 문제 없을 것 같습니다!




반응형

댓글