반응형
http://cafe.naver.com/mysqlpg/32
* 본 문서는 오픈소스 MySQL Failover 솔루션인 MMM (Multi-Master Replication Mananger) 설치 절차를 정리한 문서입니다.
* 테스트 환경에서 사용된 DB의 구성 정보는 아래와 같습니다.
db1 (10.211.55.4 : 3306) - active master
db2 (10.211.55.5 : 3306) - second master & slave
db3 (10.211.55.6 : 3306) - slave
writer vip (master db 접근을 위한 ip) = 10.211.55.10
reader vip (slave db 접근을 위한 ip) = 10.211.55.11, 10.211.55.12
(1) DB 환경 구성
MMM 구성할 MySQL DB중 active master / passive master 2대를 양방향 복제 환경으로 구성합니다.
추가 slave db들이 있는 경우 active master의 slave로 구성합니다.
MMM 데몬이 접속할 수 있도록 별도의 DB 계정을 생성합니다.
필요한 권한은 SUPER, PROCESS, REPLICATION CLIENT 3개이며, MMM 모니터 서버와 각 DB 서버의 IP에서 접근할 수 있도록 구성합니다.
GRANT SUPER, PROCESS, REPLICATION CLIENT ON *.* TO mmm_user@xxx.xxx.xxx.xxx IDENTIFIED BY '***';
=> 모니터 서버와 각 DB 서버의 ip address로 전체 DB에 동일하게 적용
(2) Perl 모듈 설치
MMM은 Perl 기반으로 제작되어 있으며, 기본적으로 시스템에 설치된 라이브러리 이외에도 몇 가지 추가 모듈 설치가 필요합니다. 추가 Perl 모듈들은 cpan(Comprehensive Perl Archive Network)을 통해 설치하면 매우 편리하며, 일부 모듈의 경우에는 gcc 컴파일도 필요하므로 사전에 gcc 컴파일러도 설치되어 있어야 합니다.
(MMM 설치 완료 후 debug 모드로 데몬을 구동해 봄으로써 누락된 모듈이 없는지 확인이 가능합니다.)
또한 매번 Perl 모듈 설치를 할 필요없이 한번 설치를 진행했던 시스템의 Perl Library 디렉토리를 동일 플랫폼의 다른 시스템에 그대로 복사해서 사용이 가능합니다.
Algorithm::Diff | Class:Singleton | DBI and DBD::mysql | File::Basename |
File::stat | File::Temp | Log::Dispatch | Log::Log4perl |
Mail::Send | Net::ARP | Net::Ping | Proc::Daemon |
Thread::Queue | Time::HiRes |
(3) MMM 설치 및 구성
* 설치파일 다운로드 : MySQL Master-Master Replication Manager v2.2.1 (.tar.gz)
* 모니터 설치
- make install_monitor
- 보통 한대의 모니터 서버에 MMM 모니터 데몬을 여러개 구동하므로 멀티 인스턴스 구동이 가능하도록 init scrip를 수정합니다.
( /etc/init.d/mysql-mmm-monitor 파일의 CLUSTER='' 부분을 CLUSTER=$2로 수정 )
- 이미 MMM 모니터 데몬이 구동중인 서버인 경우 설정 파일만 신규로 생성해서 모니터 데몬만 추가로 구동합니다.
* 에이전트 설치 (각 DB 서버에 설치)
- make install_agent
- Master만 Failover 구성하고 Slave의 Failover 구성을 하지 않는 경우에도 Slave DB에 모두 설치합니다.
( master가 변경되었을 때 자동으로 change master 처리 )
* MMM 모니터 설정
- 모니터 데몬을 생성하기 전에 클러스터 이름을 먼저 정의합니다. (본 예제에서는 hellommm 으로 사용함)
- 설정파일 => /etc/mysql-mmm/mmm_mon_hellommm.conf
active_master_role writer <monitor> ip 127.0.0.1 port 20211 -> 모니터 데몬 별로 포트를 다르게 구성합니다. pid_path /var/run/mmm_mond-hellommm.pid bin_path /usr/lib/mysql-mmm/ status_path /var/lib/misc/mmm_mond-hellommm.status ping_ips 10.211.55.4,10.211.55.5,10.211.55.6 -> 실제 모니터링해야 할 DB 서버들의 IP 주소입니다. (master/slave 전체) </monitor> <host default> monitor_user mmm_user monitor_password *** </host> <host db1> ip 10.211.55.4 peer db2 mysql_port 3306 mode master -> master mode인 서버(active master, second master는 반드시 2대가 사전 정의되어야 합니다.) </host> <host db2> ip 10.211.55.5 peer db1 mysql_port 3306 mode master </host> <host db3> ip 10.211.55.6 mysql_port 3306 mode slave </host> <role writer> hosts db1,db2 -> writer role vip가 할당될 수 있는 서버를 정의합니다. (반드시 2대 지정) ips 10.211.55.10 mode exclusive </role> -> master 접근을 위해 사용할 mmm vip를 정의합니다. <role reader> hosts db1,db2,db3 -> reader role vip가 할당될 수 있는 서버를 정의합니다. ips 10.211.55.11,10.211.55.12 mode balanced </role> -> slave 접근을 위해 사용할 mmm vip를 정의합니다. slave db failover에 MMM을 사용하지 않는 경우 생략해도 무방합니다. debug 1 -> (위에서 잠시 언급된) debug 모드로 구동하는 옵션입니다. 최초 구동시 debug 모드로 구동을 해보고, Perl 모듈 참조 에러 등이 발생하지 않는지 체크해 보는 것을 권장합니다. 이상 없으면 해당 라인을 지우거나 debug 0 옵션으로 데몬을 재가동합니다. |
* MMM 에이전트 설정
- 설정파일 => /etc/mysql-mmm/mmm_agent.conf
active_master_role writer <host default> cluster_interface eth1 -> 실제 DB 서버 IP가 할당되어 있는 인터페이스를 지정합니다. pid_path /var/run/mmm_agentd.pid bin_path /usr/lib/mysql-mmm/ replication_user repl_user -> 복제 계정 정보 replication_password 111 agent_user mmm_user -> MMM 접근 계정 정보 agent_password 111 </host> this db1 -> 에이전트가 설치되는 서버가 어느 서버인지 정보를 기재합니다. (아래 호스트 설정에 사용된 이름으로 지정) <host db1> ip 10.211.55.4 peer db2 mysql_port 3306 mode master </host> <host db2> ip 10.211.55.5 peer db1 mysql_port 3306 mode master </host> <host db3> ip 10.211.55.6 mysql_port 3306 mode slave </host> <role writer> hosts db1,db2 ips 10.211.55.10 mode exclusive </role> <role reader> hosts db1,db2,db3 ips 10.211.55.11,10.211.55.12 mode balanced </role> debug 1 |
(4) MMM 데몬 가동
* 모니터 데몬 가동 : /etc/init.d/mysql-mmm-monitor start hellommm
* 에이전트 데몬 가동 (각 DB 서버) : /etc/init.d/mysql-mmm-agent start
* MMM 모니터 상에서 클러스터 정보를 확인해보면 모두 AWAITING RECOVERY 초기 상태가 되어 있으며, ONLINE 처리를 해주면 됩니다.
(mmm_control 사용시 항상 클러스터명 앞에 @를 붙여주어야 됩니다.)
mon# mmm_control @hellommm show
db1(10.211.55.4) master/AWAITING_RECOVERY. Roles:
db2(10.211.55.5) master/AWAITING_RECOVERY. Roles:
db3(10.211.55.6) slave/AWAITING_RECOVERY. Roles:
mon# mmm_control @hellommm set_online db1
mon# mmm_control @hellommm set_online db2
mon# mmm_control @hellommm set_online db3
mon# mmm_control @hellommm show
db1(10.211.55.4) master/ONLINE. Roles: writer(10.211.55.10)
db2(10.211.55.5) master/ONLINE. Roles: reader(10.211.55.11)
db3(10.211.55.6) slave/ONLINE. Roles: reader(10.211.55.12)
* 각 서버에서 IP가 정상 할당되었는지 확인합니다. 단, ifconfig 커맨드 대신 ip addr 커맨드를 사용합니다.
db1# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1c:42:13:ea:2e brd ff:ff:ff:ff:ff:ff
inet 10.211.55.4/24 brd 10.211.55.255 scope global eth0 --> 실제 DB 서버 IP
inet 10.211.55.10/32 scope global eth0 --> MMM IP
inet6 fdb2:2c26:f4e4:0:21c:42ff:fe13:ea2e/64 scope global dynamic
valid_lft 2591925sec preferred_lft 604725sec
inet6 fe80::21c:42ff:fe13:ea2e/64 scope link
valid_lft forever preferred_lft forever
(5) MMM 제어
* mmm 관련 모든 제어는 모니터 서버에서 mmm_control 툴을 사용합니다.
* 자주 사용하는 커맨드
- SHOW : agent 상태 및 클러스터 상태 확인
- MOVE_ROLE : exclusive 모드의 vip (writer)를 다른 서버로 강제 이동 (master 강제 failover)
- SET_OFFLINE : 특정 노드를 강제로 OFFLINE 처리하고 해당 서버의 모든 MMM IP를 모두 다른 서버로 이동
- SET_ONLINE : AWAITING_RECOVERY, ADMIN_OFFLINE 상태의 노드를 ONLINE 처리함 (reader IP가 자동으로 분산됨)
- SET_PASSIVE : 모니터를 PASSIVE 모드로 변경 (DB 모니터링은 하되 failover 작업은 하지 않음)
- SET_ACTIVE : 모니터의 PASSIVE 모드 해제
Valid commands are:
help - show this message
ping - ping monitor
show - show status
checks [<host>|all [<check>|all]] - show checks status
set_online <host> - set host <host> online
set_offline <host> - set host <host> offline
mode - print current mode.
set_active - switch into active mode.
set_manual - switch into manual mode.
set_passive - switch into passive mode.
move_role [--force] <role> <host> - move exclusive role <role> to host <host>
(Only use --force if you know what you are doing!)
set_ip <ip> <host> - set role with ip <ip> to host <host>
(6) MMM 패치 적용
- 현재 MMM 2.2.1 버전에는 몇가지 버그가 존재하고 있으며, 아래 패치를 적용하면 문제를 해결할 수 있습니다.
[MMM 모니터]
- /usr/share/perl5/vendor_perl/MMM/Monitor/Monitor.pm 파일을 첨부된 파일로 교체
DB 서버가 커널 패닉 등의 상태가 되는 경우, 에이전트와 통신하는 MMM 모니터 데몬이 같이 hang 상태에 빠지는 버그가 존재하며, 해당 로직에 타임아웃 처리가 필요합니다.
[MMM 에이전트]
- /usr/share/perl5/vendor_perl/MMM/Agent/Helpers/ 경로의 Actions.pm, Network.pm 파일을 첨부된 파일로 교체
Master failover가 진행될 때, active/second master로 지정된 2대의 DB이외 Slave들은 신규 서버로 change master를 수행해야 하지만, 잘못된 binary log 포지션으로 연결하거나 혹은 지연 중인 복제를 모두 적용하지 못하고 master를 변경하는 문제가 수정되었습니다.
IP 할당 과정에서의 ARP 패킷을 broadcasting interval을 수정했습니다.
동시에 너무 많은 ARP 패킷이 유입되면 DS 스위치 동작 방식에 따라 ARP 패킷이 drop 되면서, IP 할당이 실패할 수 있습니다.
반응형
'연구개발 > MYSQL' 카테고리의 다른 글
기초 Admin 2장 테스트 (0) | 2014.09.16 |
---|---|
기초 Admin 1장 테스트 (0) | 2014.09.16 |
SHOW ENGINE INNODB STATUS (0) | 2014.09.15 |
INNODB 두번째 (0) | 2014.09.15 |
INNODB 첫번째 (0) | 2014.09.15 |