티스토리 뷰
MySQL MMM
1. 시스템
OS Red Hat Enterprise Linux Server release 5.8 (Tikanga)
하드웨어 동일 서버를 3대 준비
네트워크 로컬 접속이용(eth0) vip
ip host 서버id
모니터링 서버 192.168.0.21 mon -
Master1 192.168.0.25 db1 1
Slave1 192.168.0.27 db2 2
가상 ip의 구성
ip 역할(role) 설명
192.168.10.100 쓰기(writer) 쓰기 쿼리(update,insert,delete등)가 접근할 ip
192.168.0.101 읽기(reader) 읽기쿼리(select)가 접근할 ip
192.168.0.102 읽기(reader)
1.1 VIP설정
1.5 호스트명의 설정(hostname을 변경한후 재부팅을 실시한다.)
#vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=mon
#vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=db1
#vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=db2
1.1 VIP설정
[root@mon] #ifconfig eht0:1 192.168.0.100(VIP용)
[root@mon network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@mon network-scripts] # vi ifcfg-eth0:0
# Virtio Network Device
DEVICE=eth0:0
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:1a:4a:a8:00:42
IPADDR=192.168.10.100
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
[root@mon network-scripts]# ifup eth0:1
[root@db1] #ifconfig eht0:1 192.168.0.101(VIP용)
[root@db2] #ifconfig eht0:1 192.168.0.102(VIP용)
MySQL 설정
모든 호스트의 my.cnf파일을 아래와 같이 수정한다.(/etc/my.cnf 에 주로 위치한다.)
다음 설정중 server_id값은 서버마다 유일한 식별값이어야 한다. 중복되면 안된다.
db1(/etc/my.cnf에 다음의 항목을 추가한다.)
# Replication
server-id = 1
log_bin = /MYSQL/LOG/blog/mysql-bin.log
log_bin_index = /MYSQL/LOG/blog/mysql-bin.log.index
expire_logs_days = 7
max_binlog_size = 100M
log_slave_updates = 1
binlog_format = mixed
binlog_cache_size = 1M
sync_binlog = 1
log-bin-trust-function-creators = 1
relay_log = /MYSQL/LOG/rlog/mysql-relay-bin
relay_log_index = /MYSQL/LOG/rlog/mysql-relay-bin.index
relay_log_purge = TRUE
#bind-address = 0.0.0.0
auto_increment_increment = 2
auto_increment_offset = 1
db2(/etc/my.cnf에 다음의 항목을 추가한다.)
# Replication
server-id = 2
log_bin = /MYSQL/LOG/blog/mysql-bin.log
log_bin_index = /MYSQL/LOG/blog/mysql-bin.log.index
expire_logs_days = 7
max_binlog_size = 100M
log_slave_updates = 1
binlog_format = mixed
binlog_cache_size = 1M
sync_binlog = 1
log-bin-trust-function-creators = 1
relay_log = /MYSQL/LOG/rlog/mysql-relay-bin
relay_log_index = /MYSQL/LOG/rlog/mysql-relay-bin.index
relay_log_purge = TRUE
#bind-address = 0.0.0.0
auto_increment_increment = 2
auto_increment_offset = 2
서버를 재시작한다.
/etc/init.d/mysql restart
사용자 생성
각 서버에 3가지 타입의 사용자를 생성해야 한다.
구분 설명 요구권한
모니터링 Mmm monitor가 중앙에서각 서버의 상태를 체크하기 위해서 필요한 계정 Replication client
에이전트 유저 서버를 mmm을 통해서 제어하거나, 서버에 문제문 생겼을 때 제어를 수행하는 에이젼트의 계정 Super, replication client, process
복제유저 복제를 위한 계정 Replication slave
아래의 명령을 mysql 콘솔에 실행한다.
mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'mysql123';
mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'mysql123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'mysql123';
mysql> flush privileges;
동기화 작업
Db1에 기본데이터가 있다고 가정하고, db1의 데이터를 dump해서 이를 각 서버에 복원한다.
아래의 명령을 db1의 mysql콘솔에 실행한다. 다음 명령어는 mysqldump를 실행하기 전에 각 테이블을 읽기 전용으로 변경한다.
mysql> FLUSH TABLES WITH READ LOCK;
다음 명령을 실행해서 db1의 상태를 확인한다. Db1의 파일명(file)과 바이너리 로그 포지션(position)을 기록해둔다. 나머지 서버들은 dump된 데이터를 기반으로 할것이기 때문에 db1의 바이너리 로그상의 포지션을 정확하게 지정해야 동기화에서 오류가 발생하지 않는다.
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 1216
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
Mysql 클라이언트를 닫으면 lock가 해제되므로 닫으면 안된다. 쉘을 새로 실행해서 그곳에서 다음 작업을 실행한다.
mysqldump -u root -p --all-databases > /tmp/database-backup.sql
FLUSH TABLES WITH READ LOCK를 실행해서 쉘에서 다음 명령을 실행한다.
mysql> unlock tables;
덤프한 파일을 각 서버로 전송한다.
[root@db1 default]# scp /tmp/database-backup.sql root@192.168.0.27:/tmp
각 서버에서 백업한 데이터를 복원한다.
mysql -u root -p < /tmp/database-backup.sql
Db1의 권한을 다른 테이블에도 적용하기 위해서 아래 명령을 실행한다.
mysql> FLUSH PRIVILEGES;
이렇게 해서 db1과 db2의 데이터를 동기화 했다.
복제 설정
Db2의 복제를 설정한다. 아래명령을 이용해서 db1를 제외한 서버들에게 마스터가 누구인가를 알려준다. 또 db1에 서 추출한 dump이후에 갱신된 데이터에 대한 죄표(파일과 포지션)를 알려줌으로써 dump데이터 이후부터 슬레이브 구동까지 누락될 데이터가 생기는 것을 방지한다.
각 슬레이브에 아래와 같이 명령해 슬레이브(패시브 마스터 포함)가 마스터 액티브를 바라보게 한다.
여기서 <file>, <position>은 db1에서 내린 show master status의 결과값을 사용해야 한다.
(db2) mysql> change master to master_host = 'db1', master_user = 'repl', master_password = 'mysql123', master_log_file = 'mysql-bin.000003', master_log_pos = 107;
슬레이브를 구동한다.
(db2) mysql> START SLAVE;
각각의 슬레이브에서 show slave status를 실행하고, 슬레이브가 잘 작동하는지 확인한다.
Slave_IO_Running, Slave_SQL_Running의 값이 모두 Yes인지 확인한다. 아니라면 문제가 있는것이다.
Db2) mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.25
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 1216
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 253
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: 1216
Relay_Log_Space: 555
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: 1
1 row in set (0.00 sec)
ERROR:
No query specified
Db1을 db2의 슬레이브로 설정해서 마스터-마스터 복제구성을 완료해야 한다.
Db2) mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 518945 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Db1의 마스터로 db2를 바라보게하고, db2와 동기화 시점을 설정한다.
Db1) mysql> CHANGE MASTER TO master_host = '192.168.0.27', master_port=3306, master_user='replication', master_password='mysql123', master_log_file='mysql-bin.000001', master_log_pos=510602;
슬레이브 시작
Db1) mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 1216
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
MMM 설치
유저 생성(옵션)
useradd --comment "MMM Script owner" --shell /sbin/nologin mmmd
의존성이 있는 모듈을 먼저 설치
[root@mon ~]# ll
[root@mon ~]#mkdir mmm-rpm
[root@mon mmm_rpm]# rpm -i perl-DBI-1.52-2.el5.x86_64.rpm
[root@mon mmm_rpm]# rpm -i mysql-5.0.77-4.el5_6.6.x86_64.rpm
[root@mon mmm_rpm]# rpm -i perl-Algorithm-Diff-1.1902-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Class-Singleton-1.4-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-DBD-MySQL-3.0007-2.el5.x86_64.rpm
[root@mon mmm_rpm]# rpm -i perl-Params-Validate-0.95-1.el5.rf.x86_64.rpm
[root@mon mmm_rpm]# rpm -i perl-Log-Dispatch-2.26-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Log-Log4perl-1.26-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Pod-Escapes-1.04-1.2.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Pod-Simple-3.16-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Test-Pod-1.45-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-MailTools-2.09-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Net-ARP-1.0.6-1.el5.rf.x86_64.rpm
[root@mon mmm_rpm]# rpm -i perl-Proc-Daemon-0.03-1.2.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-Text-Diff-1.37-1.el5.rf.noarch.rpm
[root@mon mmm_rpm]# rpm -i perl-TimeDate-1.16-5.el5.noarch.rpm
다운로드
http://mysql-mmm.org/downloads
다운로드한 파일을 설치한다.
#tar xvf mysql-mmm-2.2.1.tar.gz
#ll
#cd mysql-mmm-2.2.1
#make install
데이터베이스 호스트
의존성있는 모듈을 먼저 설치
db1,2 $ rpm -i perl-DBI-1.52-2.el5.x86_64.rpm
rpm -i mysql-5.0.77-4.el5_6.6.x86_64.rpm
rpm -i perl-Algorithm-Diff-1.1902-1.el5.rf.noarch.rpm
rpm -i perl-Class-Singleton-1.4-1.el5.rf.noarch.rpm
rpm -i perl-DBD-MySQL-3.0007-2.el5.x86_64.rpm
rpm -i perl-Params-Validate-0.95-1.el5.rf.x86_64.rpm
rpm -i perl-Log-Dispatch-2.26-1.el5.rf.noarch.rpm
rpm -i perl-Log-Log4perl-1.26-1.el5.rf.noarch.rpm
rpm -i perl-Pod-Escapes-1.04-1.2.el5.rf.noarch.rpm
rpm -i perl-Pod-Simple-3.16-1.el5.rf.noarch.rpm
rpm -i perl-Test-Pod-1.45-1.el5.rf.noarch.rpm
rpm -i perl-MailTools-2.09-1.el5.rf.noarch.rpm
rpm -i perl-Net-ARP-1.0.6-1.el5.rf.x86_64.rpm
rpm -i perl-Proc-Daemon-0.03-1.2.el5.rf.noarch.rpm
rpm -i perl-Text-Diff-1.37-1.el5.rf.noarch.rpm
rpm -i perl-TimeDate-1.16-5.el5.noarch.rpm
다운로드한 파일을 설치한다.
#tar xvf mysql-mmm-2.2.1.tar.gz
#ll
#cd mysql-mmm-2.2.1
#make install
MMM설정
아래의 설정 파일을 모드 호스트(모티터링 호스트 포함)의 /etc/mysql-mmm/mmm_common.conf파일에 적용한다.
active_master_role writer
<host default>
cluster_interface eth0
pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user replication
replication_password mysql123
agent_user mmm_agent
agent_password mysql123
</host>
<host db1>
ip 192.168.0.25
mode master
peer db2
</host>
<host db2>
ip 192.168.0.27
mode master
peer db1
</host>
<role writer>
hosts db1, db2
ips 192.168.0.100
mode exclusive
</role>
<role reader>
hosts db1, db2
ips 192.168.0.101, 192.168.0.102
mode balanced
</role>
모니터링 호스트를 제외한 데이터베이스 호스트의 /etc/mysql-mmm/mmm_agent.conf파일을 수정한다. ‘db1’은 각 서버의 서버명에 맞게 변경해야 한다.
[root@db1 mysql-mmm]# cat mmm_agent.conf
include mmm_common.conf
this db1
모니터링 호스트에 /etc/mysql-mmm/mmm_mon.cnf파일을 아래와 같이 수정한다.
'DB > MySQL' 카테고리의 다른 글
| Replication MySQL (0) | 2016.05.04 |
|---|---|
| MySQL 업그레이드 (0) | 2016.05.04 |
| mysql password 찾는법 (0) | 2016.05.04 |
| MySQLStatList (0) | 2016.05.04 |
| MySQL의 개요 (0) | 2016.05.02 |
