반응형

고가용성(HA) :  서버와 네트워크, 프로그램 등의 정보 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질로

고(高)가용성이란 "가용성이 높다"는 뜻으로서, "절대 고장 나지 않음"을 의미한다.

고가용성은 흔히 가용한 시간의 비율을 99%, 99.9% 등과 같은 퍼센티지로 표현하는데, 1년에 계획 된 것 제외 5분 15초 이하의 장애시간을 허용한다는 의미의 파이브 나인스(5 nines), 즉 99.999%는 매우 높은 수준으로 고품질의 데이터센터에서 목표로 한다고 알려져 있다.

하나의 정보 시스템에 고가용성이 요구된다면, 그 시스템의 모든 부품과 구성 요소들은 미리 잘 설계되어야 하며, 실제로 사용되기 전에 완전하게 시험되어야 한다.

고가용성 솔루션(HACMP)을 이용하면, 각 시스템 간에 공유 디스크를 중심으로 집단화하여 클러스터로 엮어지게 만들 수 있다. 동시에 다수의 시스템을 클러스터로 연결할 수 있지만 주로 2개의 서버를 연결하는 방식을 많이 사용한다. 만약 클러스터로 묶인 2개의 서버 중 1대의 서버에서 장애가 발생할 경우, 다른 서버가 즉시 그 업무를 대신 수행하므로, 시스템 장애를 불과 몇 초만에 복구할 수 있다.


위와 같은 목적을 가지고 MySQL에서도 HA구성을 하게 되는데, 대표적으로 MHA(MasterHA)와 MySQL Fabric, MtoM이 있다.

제가 MySQL을 HA로 구성한 방법은 MHA이다.

MySQL Fabric보다 나아서라기보다는 기존의 MySQL 장비에 추가적인 작업 없이 HA를 구성할 수 있었으면 하고

MtoM은 IP에 대한 부분이 IP스위치가 어렵고 MHA는 자동으로 IP가 변경할 수 있기에 MHA로 구성을 해 보았다.


구성은 IP도 할당해야하고 대수도 여러대 필요하기 때문에 AWS에서 테스트를 해보았다.

호스트명

IP

bastion_server

172.31.2.124

mha_manager

172.31.13.97

my_master

172.31.9.88, 172.31.0.79

my_slave1

172.31.6.249

my_slave2

172.31.4.175

bastion_server는 AWS로 들어가는 진입통로이다. 나는 AWS를 접근할 때 처음 통로를 Bastion_server로 놓고 해당 서버에만

EIP를 주어 접속할 수 있게 해놓았다. 그리고 bastion_server에 pem파일을 올려 모든 서버는 bastion_server를 통해

접근하도록 설정되어 있다.

mha_manager는 모든 my_master의 장애를 모니터링하고 장애시 my_slave2가 master로써 승격되고 my_slave1은 기존 my_master에서 my_slave2에 동기화된다.  (bastion_server는 굳이 구성할 때 없어도 되는 서버이다.)







1. 기본 모듈 설치

[manager/master/slave1/slave2]

MHA Perl 모듈로 동작하기 때문에 펄 관련 모듈 설치

yum install -y perl-DBD-MySQL

yum install -y perl-Config-Tiny

yum install -y perl-Params-Validate

yum install -y perl-Parallel-ForkManager

yum install -y perl-Log-Dispatch

yum install -y perl-Time-HiRes

yum install -y perl-ExtUtils-MakeMaker

yum install -y perl-CPAN

 

#perl -MCPAN -e "install Config::Tiny"

#perl -MCPAN -e "install Log::Dispatch"

#perl -MCPAN -e "install Parallel::ForkManager"


2. MHA 노드 설치

[manager/master/slave/slave2]

https://code.google.com/p/mysql-master-ha/wiki/Downloads?tm=2/

mha4mysql-node-0.56.tar.gz download

mha4mysql-manager-0.56.tar.gz download


bastion_server 접속

sftp -o IdentityFile=/key_pair/XXXX.pem ec2-user@172.31.9.88

put mha4mysql-node-0.56.tar.gz

 

sftp -o IdentityFile=/key_pair/XXXX.pem ec2-user@172.31.6.249

put mha4mysql-node-0.56.tar.gz

 

sftp -o IdentityFile=/key_pair/XXXX.pem ec2-user@172.31.4.175

put mha4mysql-node-0.56.tar.gz

 

sftp -o IdentityFile=/key_pair/XXXX.pem ec2-user@172.31.13.97

put mha4mysql-node-0.56.tar.gz

put mha4mysql-manager-0.56.tar.gz

 

tar xvzf mha4mysql-node-0.56.tar.gz

cd mha4mysql-node-0.56

perl Makefile.PL

make

make install


3. MHA 매니저 설치

[manager]

mha_manager서버에 mha4mysql-manager 파일 설치

mkdir /data/mha_manager

cd /data/mha_manager

tar xvzf mha4mysql-manager-0.56.tar.gz

cd mha4mysql-manager-0.56

perl Makefile.PL

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

 

make

Would you like to configure as much as possible automatically? [yes]

CPAN build and cache directory? [/root/.cpan]

Download target directory? [/root/.cpan/sources]

Directory where the build process takes place? [/root/.cpan/build]

Always commit changes to config variables to disk? [no]

Cache size for build directory (in MB)? [100]

Let the index expire after how many days? [1]

Cache metadata (yes/no)? [yes]

Use CPAN::SQLite if available? (yes/no)? [no]

Policy on installing 'build_requires' modules (yes, no, ask/yes,

ask/no)? [yes]

Always try to check and verify signatures if a SIGNATURE file is in

the package and Module::Signature is installed (yes/no)? [no]

Generate test reports if CPAN::Reporter is installed (yes/no)? [no]

Do you want to rely on the test report history (yes/no)? [no]

Which YAML implementation would you prefer? [YAML]

Do you want to enable code deserialisation (yes/no)? [no]

<make>

Where is your make program? [/usr/bin/make]

 <bzip2>

Where is your bzip2 program? [/usr/bin/bzip2]

 <gzip>

Where is your gzip program? [/bin/gzip]

 <tar>

Where is your tar program? [/bin/tar]

Would you like to configure as much as possible automatically? [yes]

Would you like me to automatically choose some CPAN mirror

sites for you? (This means connecting to the Internet) [yes]

 

make install


4. SSH 설정

[manager/master/slave1/slave2]

모든 IP에 서로 SSH 접근이 가능하도록 추가해준다.

(AWS에서는 security_group에 22번 포트를 열어줌으로써 아래와 같은 작업이 불필요하다.)

vi /etc/hosts.allow

# for MHA

sshd: 172.31.2.124,172.31.1.164,172.31.4.134,172.31.4.134,172.31.0.79


[master/slave1/slave2]

MHA구성으로 사용한 시스템계정 생성

useradd -g mysql -d /home/mhauser -m -s /bin/bash mhauser

cat /etc/passwd | grep mhauser

 

passwd mhauser

패스워드 설정


[manager]

mha_manager 서버에도 시스템계정 생성

groupadd mysql

useradd -r -g mysql mysql

useradd -g mysql -d /home/mhauser -m -s /bin/bash mhauser

cat /etc/passwd | grep mhauser

 

passwd mhauser

 

[manager/master/slave1/slave2]

mhauser에 대한 SSH key파일 설정

su - mhauser

ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/home/mhauser/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/mhauser/.ssh/id_rsa.

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

The key fingerprint is:

XXXX mhauser@bastion_server

 

cat /home/mhauser/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+Y1teVMIZF3K9X8LjEoHYpV9EFAusugbpXQB3pub8kZ

mhauser@bastion_server

 

 

manager, master, slave1, slave2 서버의 id_rsa.pub 파일을 각각 복사해 서버의 authorized_keys

파일에 붙여 넣는다.

 

cat /root/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+… mhauser@mha_manager

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWqz+… mhauser@my_master

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCaeQE+… mhauser@my_slave1

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCg6QU… mhauser@my_slave2

 

 

[manager/master/slave/slave2]

해당 서버에 SSH 접속을 원활하게 하기 위해 /etc/hosts파일에 아래와 같이 내용을 추가한다.

그리고 .ssh 디렉토리 내의 파일에 대한 모든 권한을 변경한다.

(root계정으로 실행)

vi /etc/hosts

172.31.2.124

172.31.2.124 bastion_server

172.31.13.97

172.31.13.97 mha_manager

172.31.9.88

172.31.9.88  my_master

172.31.0.79

172.31.0.79 my_master

172.31.6.249

172.31.6.249 my_slave1

172.31.4.175

172.31.4.175 my_slave2

 

cd .ssh/

chmod 600 *

 

접속테스트(mhauser로 접속한 상태에서 테스트)

각 서버마다 접속해서 아래와 같이 전부 접속 테스트를 해준다.

ssh 172.31.2.124 hostname

ssh 172.31.13.97 hostname

ssh 172.31.9.88 hostname

ssh 172.31.0.79 hostname

ssh 172.31.6.249 hostname

ssh 172.31.4.175 hostname

 

아래와 같은 메시지가 나오면 yes를 누른다.

다음에 실행 시해당 IP 호스트명만 출력된다.

[mhauser@my_slave2 .ssh]$ ssh 172.31.4.175 hostname

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

ECDSA key fingerprint is 49:c7:ae:1c:90:1a:b1:a1:d1.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '172.31.4.175' (ECDSA) to the list of known hosts.

my_slave2

[mhauser@my_slave2 .ssh]$ ssh 172.31.4.175 hostname

my_slave2

 

[master/slave1/slave2]

sudo 권한에 변경작업을 해준다.

root계정 접속

 

visudo

#Default requiretty

 

mhauser ALL=(ALL) NOPASSWD:/sbin/ifconfig

 

[master]

my_master 서버에 서비스로 쓰이는 IP 하나를 할당해준다.

vip 할당

ifconfig eth0:0 172.31.0.79 netmask 255.255.0.0 broadcast 172.31.0.255 up

5. DB접속 계정 생성

[master/slave1/slave2]

MHA 매니저 서버(배스천)에서는 모든 DB서버의 MySQL에 접속할 수 있어야 한다.

/mysql/bin/mysql -uroot -p

grant all on *.* to mhauser@'172.31.2.124' identified by 'XXXXXXXX';

grant all on *.* to mhauser@'172.31.13.97' identified by 'XXXXXXXX';

grant all on *.* to mhauser@'172.31.0.79' identified by 'XXXXXXXX';

grant all on *.* to mhauser@'172.31.9.88' identified by 'XXXXXXXX';

grant all on *.* to mhauser@'172.31.6.249' identified by 'XXXXXXXX';

grant all on *.* to mhauser@'172.31.4.175' identified by 'XXXXXXXX';


[master/slave2]

master의 repl 계정 권한을 마스터 대체서버(slave2)에도 동일하게 적용

GRANT REPLICATION SLAVE, REPLICATION CLIENT

ON *.* TO 'repl'@'172.31.6.249' IDENTIFIED BY PASSWORD 'XXXXXXXX';

GRANT REPLICATION SLAVE, REPLICATION CLIENT

ON *.* TO 'repl'@'172.31.4.175' IDENTIFIED BY PASSWORD 'XXXXXXXX';

flush privileges;



6. MHA 설정

* master 대체 slave서버의 주의사항

- mysqlbinlog 버전이 5.1이상이어야 한다. master의 binlog가 row 포맷이면 mysqlbinlog 5.1부터는

  분석이 가능하다. 만약 5.1보다 낮으면 동기화시 row포맷을 사용해서는 안된다.

- DB서버의 binlog에 접근할 수 있게 디렉토리 권한을 설정해야 한다.

   (저는 mhauser를 mysql 그룹으로 묶어서 mysql이 접근가능한 디렉토리는 mhauser도 접근 가능하게 하였다.)

- 새로운 master가 될 slave에 binlog가 횔성화 되어 있어야 한다.(log-bin)

   (저는 log-bin 뿐만 아니라 log-bin=경로/파일명 이렇게하여 마스터와 동일한 경로와 파일명이 생기도록 하였다.)

- binlog와 relay log의 필터 규칙이 모든 MySQL DB군에서 동일해야 한다.

  즉, binlog에 대해 binlog-db-db나 replicate-ignore-db와 같은 필터 규칙이 정의되어 있다면 모든 MySQL은

  동일하게 해줘야 한다.

새로운 master가 될 slave에 read_only로 읽기 전용으로만 해두는 것이 나중에 교체시 문제를 최소화 시킬 수 있다.


[manager]

MHA를 사용하기 위한 디렉토리 생성

mkdir /data/mha_log                              ## mha 로그파일 저장

mkdir /data/mha_app                             ## mha 실행시 failover 프로그램 저장

mkdir /data/mha_scripts                           ## mha 스크립트 저장

chown mhauser:mysql /data/mha_log

chown mhauser:mysql /data/mha_app

chown mhauser:mysql /data/mha_scripts


7. MHA 매니저 서버 설정파일

* 싱글모드로 설정하여 테스트를 진행하였다.

1) 싱글모드

vi /etc/mha-manager.cnf

[server default]

user=mhauser

password=XXXXXXXX

repl_user=repl

repl_password=XXXXXXXX

 

## mha manager 실행파일이 생길 폴더 지정

manager_workdir=/data/mha_app

## 로그파일 지정

manager_log=/data/mha_log/mha4mysql.log

 

## mysql서버에 실행파일이 생길 폴더 지정

remote_workdir=/data/mha_app

## binlog 파일 폴더 지정

master_binlog_dir=/mysql/var

 

## mysql서버의 mysql 실행파일 폴더 지정

client_bindir=/mysql/bin

## mysql서버의 mysql 라이브러리가 저장되어 있는 폴더 지정

client_libdir=/mysql/lib

ignore_fail=2

 

[server1]

hostname = 172.31.9.88                     ## my_master ip

candidate_master=1

 

[server2]

hostname = 172.31.4.175                  ## replace slave2 ip

candidate_master=1

 

[server3]

hostname = 172.31.6.249                   ## slave1 ip

no_master=1


2) 다중모드

[manager]

vi /etc/mha-manager.cnf

[server default]

user=mhauser

password=XXXXXXXX

ssh_user=mhauser

 

master_binlog_dir=/mysql/var

remote_workdir=/data/mha_app

secondary_check_script= masterha_secondary_check -s remote_host1 -s remote_host2

ping_interval=3

master_ip_failover_script=/data/mha_script/master_ip_failover

shutdown_script=/data/mha_script/power_manager

report_script=/data/mha_script/send_master_failover_mail


vi /etc/my_master.cnf

[server_default]

manager_workdir=/data/mha_app

manager_log=/data/mha_log/mha4mysql.log

 

[server1]

hostname = 172.31.9.88                     ## my_master ip

candidate_master=1

 

[server2]

hostname = 172.31.4.175                  ## replace slave2 ip

candidate_master=1

 

[server3]

hostname = 172.31.6.249                   ## slave1 ip

no_master=1


[master]

할당된 IP 설정을 확인한다.

 

ifconfig

eth0      Link encap:Ethernet  HWaddr 02:8C:A2: 

          inet addr:172.31.9.88  Bcast:172.31.15.255  Mask:255.255.240.0

          inet6 addr: fe80::8c:a2ff:fe61:c841/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

          RX packets:106222 errors:0 dropped:0 overruns:0 frame:0

          TX packets:77495 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:112547338 (107.3 MiB)  TX bytes:11160527 (10.6 MiB)

 

eth0:0    Link encap:Ethernet  HWaddr 02:8C: 

          inet addr:172.31.0.79  Bcast:172.31.0.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:65 errors:0 dropped:0 overruns:0 frame:0

          TX packets:65 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1

          RX bytes:10938 (10.6 KiB)  TX bytes:10938 (10.6 KiB)

 

 


활성화

ifconfig eth0:0 172.31.0.79 netmask 255.255.0.0 broadcast 172.31.0.255 down


8. MHA모니터링 시작하기

mha 기동

cd /data/mha4mysql-manager-0.56/bin

nohup masterha_manager --conf=/etc/mha-manager.cnf < /dev/null > /data/mha_log/mha4mysql.log 2>&1 &


중단

/data/mha/mha4mysql-manager-0.56/bin/masterha_stop --conf=/etc/mha_manager.cnf


masterha_check_status로 masterha_manager 모니터링

 

./masterha_check_status --conf=/etc/mha-manager.cnf

mha-manager (pid:18325) is running(0:PING_OK), master:172.31.1.164

 

 


ssh접속이 정상적으로 이루어지는지 확인

 

masterha_check_ssh --conf=/etc/mha-manager.cnf

Thu Jan  5 08:02:14 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Thu Jan  5 08:02:14 2017 - [info] Reading application default configuration from /etc/mha-manager.cnf..

Thu Jan  5 08:02:14 2017 - [info] Reading server configuration from /etc/mha-manager.cnf..

Thu Jan  5 08:02:14 2017 - [info] Starting SSH connection tests..

Thu Jan  5 08:02:15 2017 - [debug]

Thu Jan  5 08:02:16 2017 - [debug]   ok.

Thu Jan  5 08:02:16 2017 - [info] All SSH connection tests passed successfully.

 

 


리플리케이션 상태 모니터링

./masterha_check_repl --conf=/etc/mha-manager.cnf

MySQL Replication Health is OK.

 

 


호스트 정보 관리(IP추가)

./masterha_conf_host --command=add --conf=/etc/mha-manager.cnf --hostname=XXX.XXX.XXX.XXX

옵션 : --command=(add/delete)


[slave2]

slave2에 릴레이로그는 mysql 설치시 적용후 자동삭제하게 되어 있다.

master 대체 서버이기 때문에 릴레이로그를 purge하는 것을 중단하고 크론탭에 새벽에 자동 삭제할 수

있게 걸어 놓는다.

/mysql/bin/mysql -uroot -p

set global relay_log_purge=0

릴레이로그 삭제 설정

vi /etc/crontab

0 5 * * * /usr/local/bin/purge_relay_logs --user=root --disable_relay_log_purge >> /data/mha_log/purge_relay_logs.log 2>&1

 

 


9. 스크립트 생성

1) 스위치오버 시 vip도 자동으로 스위치 오버하는 스크립트 생성(root계정으로 실행)

cd /data/mha4mysql-manager-0.56/samples/scripts

cp master_ip_online_change master_ip_online_change.org

chown mhauser:mysql master_ip_online_change

vi master_ip_online_change

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

 

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

## =========================================================

## vip Change

if ( $new_master_ip eq "172.31.1.164") {

        system("/bin/sh /mysql/mha/scripts/change_vitual_ip_slave_to_master.sh");

}

elsif ( $new_master_ip eq "172.31.15.118") {

        system("/bin/sh /mysql/mha/scripts/change_vitual_ip_master_to_slave.sh");

}

else {}

## ========================================================

 

cd /data/mha_scripts/

vi change_virtual_ip_master_to_slave.sh

#!/bin/sh

 

ssh mhauser@172.31.15.118 sudo /sbin/ifconfig eth0:0 down

ssh mhauser@172.31.1.164 sudo /sbin/ifconfig eth0:0 172.31.0.79 netmask 255.255.0.0 broadcast 172.31.0.255 up

 

vi change_virtual_ip_slave_to_master.sh

#!/bin/sh

 

ssh mhauser@172.31.4.175 sudo /sbin/ifconfig eth0:0 down

ssh mhauser@172.31.9.88 sudo /sbin/ifconfig eth0:0 172.31.0.79 netmask 255.255.0.0 broadcast 172.31.0.255 up

 

vi /etc/mha-manager.cnf

master_ip_online_change_script=/data/mha_scripts/master_ip_online_change

 

 

 

2) 페일오버 시 vip도 자동으로 페일오버하는 스크립트

cd /data/mha4mysql-manager-0.56/samples/scripts

cp master_ip_failover /data/mha_scripts/

cd /data/mha_scripts/

chown mhauser:mysql master_ip_failover

 

vi master_ip_failover

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

      #IXME_xxx;

## vip change

system("/bin/sh /data/mha_scripts/change_virtual_ip.sh");

 

vi change_virtual_ip.sh

#!/bin/sh

 

ssh mhauser@172.31.9.88 sudo /sbin/ifconfig eth0:0 down # master DB server vip down

ssh mhauser@172.31.4.175 sudo /sbin/ifconfig eth0:0 172.31.0.79 netmask 255.255.0.0 broadcast 172.31.0.255 up

 

vi /etc/mha-manager.cnf

master_ip_failover_script=/data/mha_scripts/master_ip_failover

 

cd /data/mha_scripts

chown mhauser:mysql *

 

 

 

10. 테스트

1) 상태확인

[master]

my_master 서버는 read 전용이 아니며 아래와 같은 master 상태값을 가지고 있다.

mysql> show variables like 'read_only';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | OFF   |

+---------------+-------+

1 row in set (0.01 sec)

 

mysql> show master status;

+------------------+----------+--------------+--------------------------------------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                       | Executed_Gtid_Set |

+------------------+----------+--------------+--------------------------------------------------+-------------------+

| mysql-bin.000004 |   120 |             | mysql,test,information_schema,performance_schema |          |

+------------------+----------+--------------+--------------------------------------------------+-------------------+

1 row in set (0.00 sec)

 

 

ifconfig

eth0      Link encap:Ethernet  HWaddr 02:8C:A2:61 

          inet addr:172.31.9.88  Bcast:172.31.15.255  Mask:255.255.240.0

          inet6 addr: fe80::8c:a2ff:fe61:c841/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

          RX packets:112357 errors:0 dropped:0 overruns:0 frame:0

          TX packets:82278 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:113169520 (107.9 MiB)  TX bytes:11858827 (11.3 MiB)

 

eth0:0    Link encap:Ethernet  HWaddr 02:8C:A2: 

          inet addr:172.31.0.79  Bcast:172.31.0.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:138 errors:0 dropped:0 overruns:0 frame:0

          TX packets:138 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1

          RX bytes:27398 (26.7 KiB)  TX bytes:27398 (26.7 KiB)

 

 

 

[slave1]

my_slave1은 현재 my_master(172.31.9.88) master로써 동기화하고 있다.

mysql> show slave status \G;

Slave_IO_State: Waiting for master to send event

                  Master_Host: 172.31.9.88

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000005

          Read_Master_Log_Pos: 120

               Relay_Log_File: my_slave1-relay-bin.000009

                Relay_Log_Pos: 283

        Relay_Master_Log_File: mysql-bin.000005

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 120

              Relay_Log_Space: 623

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 88

                  Master_UUID: b3146e4b-d3e3-11e6-b88d-028ca261c841

             Master_Info_File: /mysql/var/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind:

      Last_IO_Error_Timestamp:

     Last_SQL_Error_Timestamp:

               Master_SSL_Crl:

           Master_SSL_Crlpath:

           Retrieved_Gtid_Set:

            Executed_Gtid_Set:

                Auto_Position: 0

 

[slave2]

my_slave2 my_master 대체 슬레이브로써 읽기 전용으로만 사용되고 있고 172.31.9.88(my_master)와 동기화 되어 있다.

mysql> show variables like 'read_only';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | ON    |

+---------------+-------+

1 row in set (0.00 sec)

 

mysql> show slave status \G;

Slave_IO_State: Waiting for master to send event

                  Master_Host: 172.31.9.88

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000004

          Read_Master_Log_Pos: 120

               Relay_Log_File: my_slave2-relay-bin.000006

                Relay_Log_Pos: 236

        Relay_Master_Log_File: mysql-bin.000004

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 120

              Relay_Log_Space: 576

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 88

                  Master_UUID: b3146e4b-d3e3-11e6-b88d-028ca261c841

             Master_Info_File: /mysql/var/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind:

      Last_IO_Error_Timestamp:

     Last_SQL_Error_Timestamp:

               Master_SSL_Crl:

           Master_SSL_Crlpath:

           Retrieved_Gtid_Set:

            Executed_Gtid_Set:

                Auto_Position: 0

 

[manager]

mha_manager 기동하여 위의 모든 서버들을 모니터링하게 한다.

su - mhauser

cd /data/mha4mysql-manager-0.56/bin/

nohup masterha_manager --conf=/etc/mha-manager.cnf < /dev/null > /data/mha_log/mha4mysql.log 2>&1 &

 

[master]

my_master서버에서 mysql를 kill하여 장애를 발생시킨다.

mysql kill

ps -ef | grep mysql

kill -9 22009 22921

 

위와 같이 할 경우, mha_manager서버의 /data/mha_log/mha4mysql.log파일에 마스터와 슬레이브가

스위칭 되는 로그가 남는다.

마지막에 failover report까지 나오면 스위칭이 완료된다.

 

ifconfig

eth0      Link encap:Ethernet  HWaddr 02:8C:A2:61:C8:41 

          inet addr:172.31.9.88  Bcast:172.31.15.255  Mask:255.255.240.0

          inet6 addr: fe80::8c:a2ff:fe61:c841/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

          RX packets:116549 errors:0 dropped:0 overruns:0 frame:0

          TX packets:85789 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:113678944 (108.4 MiB)  TX bytes:12379793 (11.8 MiB)

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:138 errors:0 dropped:0 overruns:0 frame:0

          TX packets:138 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1

          RX bytes:27398 (26.7 KiB)  TX bytes:27398 (26.7 KiB)

 

[slave2]

마스터에 있던 IP정보가 my_slave2 서버에 옮겨진 것을 확인할 수 있다.

 

ifconfig

eth0      Link encap:Ethernet  HWaddr 02:59:5C:47:DC:2D 

          inet addr:172.31.4.175  Bcast:172.31.15.255  Mask:255.255.240.0

          inet6 addr: fe80::59:5cff:fe47:dc2d/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

          RX packets:104714 errors:0 dropped:0 overruns:0 frame:0

          TX packets:60773 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:112706859 (107.4 MiB)  TX bytes:10153218 (9.6 MiB)

 

eth0:0    Link encap:Ethernet  HWaddr 02:59:5C:47:DC:2D 

          inet addr:172.31.0.79  Bcast:172.31.0.255  Mask:255.255.0.0

          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:371 errors:0 dropped:0 overruns:0 frame:0

          TX packets:371 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1

          RX bytes:56561 (55.2 KiB)  TX bytes:56561 (55.2 KiB)

 

 

 

[slave1]

slave 상태를 확인하면 my_slave1 서버가 동기화하는 master IP가 변경된 것을 확인할 수 있다.

 

show slave status \G;

Slave_IO_State: Waiting for master to send event

                  Master_Host: 172.31.4.175

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000004

          Read_Master_Log_Pos: 120

               Relay_Log_File: my_slave1-relay-bin.000002

                Relay_Log_Pos: 283

        Relay_Master_Log_File: mysql-bin.000004

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 120

              Relay_Log_Space: 460

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 175

                  Master_UUID: 02244886-d3e4-11e6-b88f-02595c47dc2d

             Master_Info_File: /mysql/var/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind:

      Last_IO_Error_Timestamp:

     Last_SQL_Error_Timestamp:

               Master_SSL_Crl:

           Master_SSL_Crlpath:

           Retrieved_Gtid_Set:

            Executed_Gtid_Set:

                Auto_Position: 0

 

 

 

[manager/master/slave/slave2]

mha_manager은 이렇게 IP와 동기화 되는 부분을 자동으로 변경하고 중지된다.

/data/mha_app를 삭제하지 않으면 mha_manager 기동 시 에러가 발생한다.

 

rm -f /data/mha_app/*

* MHA 구성시 에러사항 정리 

 

Mon Jan  9 04:24:20 2017 - [error][/usr/local/share/perl5/MHA/ManagerUtil.pm, ln177] Got Error on finalize_on_error at monitor: Permission denied:/data/mha_app/mha-manager.master_status.health at /usr/local/share/perl5/MHA/MasterMonitor.pm line 633.

chown mhauser.mysql mha_app

chown mhauser.mysql mha_scripts


 

Mon Jan  9 04:29:26 2017 - [error][/usr/local/share/perl5/MHA/ManagerUtil.pm, ln122] Got error when getting node version. Error:

Mon Jan  9 04:29:26 2017 - [error][/usr/local/share/perl5/MHA/ManagerUtil.pm, ln123]

mysql에 mha4node가 설치되어 있지 않았다. 


 

Mon Jan  9 05:28:53 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln158] Binlog setting check failed!

Mon Jan  9 05:28:53 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln405] Master configuration failed.

Mon Jan  9 05:28:53 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations.  at /u

sr/local/bin/masterha_manager line 50.

Mon Jan  9 05:28:53 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln523] Error happened on monitoring servers.

Mon Jan  9 05:28:53 2017 - [info] Got exit code 1 (Not master dead).

mkdir /data/mha_app 

chown mhauser.mysql /data/mha_app

[출처] MHA 구성|작성자 theswice


반응형

+ Recent posts