Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

MMM 구성 방법 본문

MySQL/H.A (High Availability)

MMM 구성 방법

`O` 2021. 3. 3. 17:10
728x90
반응형
Host IP VIP Role
master 192.168.0.11
Monitoring
worker1 192.168.0.12 192.168.0.102 Master 1
worker2 192.168.0.13 192.168.0.103 Master 2

 

    • Write VIP : 192.168.0.101 (서버간 연결 시 추가 추성

    • 서버의 역할은 아래와 같다.
IP Role Description
192.168.0.101 writer App 이 DB write 를 위해서 접근하는 IP
192.168.0.102 reader
App 이 DB read 를 위헤서 접근하는 IP
192.168.0.103 reader

    • 각 서버 간의 제한된 성능 spec 이 없으므로 자신이 실제로 사용할 서버의 spec 은 상황에 맞게 임의로 구성한다. (해당 자료는 각 서버당 cpu 2 core, mem 4G 로 설정)

 

  • 구성방법

    • 먼저 각 서버별로 VIP 를 구성해줘야 한다. 아래와 같이 network-script 에 있는 ifcfg-eth0 을 복사 후 vi 로 파일을 수정해준다. (eth0 대신 현재 서버에서 다른 이더넷 명칭을 사용 한다면 해당 이름의 파일을 복사.

$> cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:1
$> vi /etc/sysconfig/network-scripts/ifcfg-eth0:1

 

    • 파일을 들어간 후 아래의 내용으로 기존내용을 수정한다. 각 서버별로 할당하려고 하는 VIP 로 수정한다.
      (서버별로 static 또는 dhcp 인지 확인 후 그에 맞게 네트워크 환경을 구성 후 변경)

IPADDR=192.168.0.102
NETMASK=255.255.255.0
GATEWAY=192.168.0.1

 

    • 수정 후, service network restart 또는 /etc/init.d/network restart 로 네트워크를 재시작한다. 그 후 ifconfig 를 통하여 아래 예시와 같이 vip (eth0:1) 도 구동 되는지 확인한다.

  •  
    • 그 후, worker1, worker2 서버에 MySQL 을 설치한다. (yum, tar package 상관없음)

    • 그 후, 각 MySQL 서버들에 있는 my.cnf 에 binlog 및 relay log 내용을 추가한다.
      (Replication 응용 기술이기에 binlog 설정을 통한 Replication 환경 구성, 파일 적재 및 기본 datadir 등의 디렉토리는 임의로 조절)

 

[mysqld]

basedir=/mysql/mysql-5.7.31-el7-x86_64
datadir=/mysqldata
socket=/tmp/mysql.sock

#server_id 는 각 서버별로 반드시 다르게 배정
server_id = 1
log_bin = /mysqldata/mysql-bin.log
log_bin_index = /mysqldata/mysql-bin.log.index
relay_log = /mysqldata/mysql-relay-bin
relay_log_index = /mysqldata/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1

#auto_increment_increment 는 Master 의 서버대수 만큼 설정
auto_increment_increment = 2

#auto_increment_offset 은 각 서버별로 고유 숫자로 설정하되 auto_increment_increment 보다 작거나 숫자로 설정. 미설정 시, 각 server 의 ID 로 자동 설정
#고유값 설정은 Multimaster Replication 구성 시, 각 서버간의 auto_increment 증가 숫자에 대한 충돌을 피하기 위함임. auto_increment_offset = 1

#외부에서 접근을 허용하도록 bind-address 는 0.0.0.0 으로 설정
bind-address = 0.0.0.0

 

    • 실제 설정 예시

  •  
    • 해당 파라미터 추가 후 재시작을 통하여 해당 파라미터들이 적용되도록 한다.
    • 그 후, worker1 DB 접속 후, 아래와 같은 형식으로 계정을 만들어준다.

 

GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'agent_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'replication_password';
  •  
    • 이제 각 서버간의 Replication 을 위해서는 서버간의 데이터 동기화가 필요하므로 Write 를 사용할 Master 서버에서 dump 파일을 받아야한다. 이를 위해서 외부접근을 통한 데이터 변경을 임시로 막기 위해서 테이블들을 잠근다. 그 후, 해당 서버의 binlog 작성 position 을 확인 한다.

(worker1) mysql> FLUSH TABLES WITH READ LOCK;

(worker1) mysql> show master status;
+--------------------+----------+----------------+--------------------+--------------------+
| File               | Position | Binlog_Do_DB   | Binlog_Ignore_DB   | Executed_Gtid_Set  |
+--------------------+----------+----------------+--------------------+--------------------+
| mysql-bin.000005   | 3522     |                |                    |                    |
+--------------------+----------+----------------+--------------------+--------------------+
1 row in set (0.00 sec)

    • mysqldump 를 받기 위해 해당 서버에서 새로운 세션을 열어서 dump 를 받는다.
      (기존 세션 종료 후 받을 시 Lock 이 풀리기 때문)

(worker1) $ mysqldump -u root -p --all-databases > /tmp/database-backup.sql
  •  
    • dump 가 끝나면 Lock 을 수행한 세션으로 돌아가 Lock 을 해제한다.

(worker1) mysql> UNLOCK TABLES;
  •  
    • SCP 를 통하여 dump 를 다른서버 (worker2) 에 전송한다. (<user> 는 mysql 을 설치 할 때 사용한 계정 사용을 권장한다.)

(worker1) scp /tmp/database-backup.sql <user>@192.168.0.13:/tmp

 

    • 그 후 worker2 서버에서 DB dump 를 import 한 후, 아래 명령어를 통하여 worker1 에서 받은 MySQL 내 DB 접근 유저 정보가 갱신 되도록 한다.

(worker2) $mysql -u root -p < /tmp/database-backup.sql 2(worker2) mysql> FLUSH PRIVILEGES;

 

    • 설정이 끝났다면, worker2 가 worker1 과 Replication 연결이 되도록 설정한다. <file>,<position> 은 위의 show master status 의 정보를 이용한다. 설정 후, start slave 를 통하여 slave 동기화 연결이 되도록 한다.

(worker2) mysql> CHANGE MASTER TO master_host='192.168.0.12', master_port=3306, master_user='replication',
                        master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;
(worker2) mysql> start slave;

 

    • worker2 에서 아래와 같이 연결이 된 상태인지 확인 한다.

  •  
    • 연결이 정상적으로 되었다면 이제 worker1 이 worker2에 slave 로 붙을 차례다. worker2 에서 Binlog 동기화 상태를 확인한다.

(worker2) mysql> show master status;
+--------------------+----------+----------------+--------------------+---------------------+
| File               | Position | Binlog_Do_DB   | Binlog_Ignore_DB   | Executed_Gtid_Set   |
+--------------------+----------+----------------+--------------------+---------------------+
| mysql-bin.000002   | 843089   |                |                    |                     |
+--------------------+----------+----------------+--------------------+---------------------+
1 row in set (0.00 sec)

 

    • worker1 에서도 worker2 에서 했던 연결 명령어를 동일하게 사용하여 연결 해 준다.
      그리고 위와 같이 연결 상태를 확인한다.

  •  
    • 이제 MMM 을 설치전에 해당 프로세스를 사용할 유저를 만든다. (mmmd 혹은 사용할 유저 명) 다만 기존 유저 사용을 원한다면 만들지 않아도 된다.


(master) useradd --comment "MMM Script owner" --shell /sbin/nologin mmmd
  •  
    • 아래의 명령어로 MMM 을 설치한다. (Monitor, Agent 간 설치 대상 확인)


    • CentOS 기준

(master) yum -y install mysql-mmm-monitor

(worker1,2) yum -y install mysql-mmm-agent (차후 서버간 역할 변경도 고려 한다면 모든서버 일괄 설치)

yum -y install mysql-mmm-*
  •  
    • Ubuntu 기준

2.1. 의존성 패키지 설치

(master) aptitude install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl

2.2. Agent 설치

(master) dpkg -i mysql-mmm-common_*.deb mysql-mmm-agent_*.deb

(master) dpkg -i mysql-mmm-common_*.deb mysql-mmm-agent_*.deb
  •  
    • vi /etc/mysql-mmm/mmm_common.conf 를 열면 아래와 같은 양식이 있다. 해당 구성 가이드는 아래 기준으로 내용을 기입했다.
      (Password 는 위에서 MMM DB 계정 생성 시 지정했던 패스워드로 기입)
      (role writer 의 ips 는 위의 서버 정보에서 사용 하려한 VIP 를 기입한다.)

active_master_role          writer
<host default>
    cluster_interface       eth0
    pid_path                /var/run/mmmd_agent.pid
    bin_path                /usr/lib/mysql-mmm.html
    replication_user        replication
    replication_password    replication_password
    agent_user              mmm_agent
    agent_password          agent_password
</host>
<host db1>
    ip                      192.168.0.11
    mode                    master
    peer                    db2
</host>
<host db2>
    ip                      192.168.0.12
    mode                    master
    peer                    db1
</host>
<host db3>
    ip                      192.168.0.13
    mode                    slave
</host>
<host db4>
    ip                      192.168.0.14
    mode                    slave
</host>
<role writer>
    hosts                   db1, db2
    ips                     192.168.0.100
    mode                    exclusive
</role>
<role reader>
    hosts                   db1, db2, db3, db4
    ips                     192.168.0.101, 192.168.0.102, 192.168.0.103, 192.168.0.104
    mode                    balanced
</role>

 

 

(해당 기입 내용은 monitor, agent 구분없이 모든 서버에 적용시켜야 한다.)

  •  
    • worker1,2 서버에서 vi /etc/mysql-mmm/mmm_agent.conf 를 열어서 아래와 같이 내용을 기입한다.
(worker1)
include mmm_common.conf
this worker1

 

(worker2)
include mmm_common.conf
this worker2
  •  
    • master 서버에서 vi /etc/mysql-mmm/mmm_mon.conf 를 열면 아래와 같은 양식이 나온다. 아래 화면과 같이 설정한 값들로 기입한다.

include mmm_common.conf
<monitor>
    ip                 127.0.0.1
    pid_path           /var/run/mmmd_mon.pid
    bin_path           /usr/lib/mysql-mmm.html
    status_path        /var/lib/misc/mmmd_mon.status
    ping_ips           192.168.0.1, 192.168.0.11, 192.168.0.12, 192.168.0.13, 192.168.0.14
</monitor>
<host default>
    monitor_user       mmm_monitor
    monitor_password   monitor_password
</host>
debug 0

 


    • 위와 같이 구성 후 각 서버들이 재기동 후에도 monitor, agent 가 자동으로 구동되도록 enable 명령어를 입력한다. (각 서버별 해당 프로세스 구성을 한 유저를 사용)

(monitor) systemctl enable mysql-mmm-monitor
(worker1) systemctl enable mysql-mmm-agent
(worker2) systemctl enable mysql-mmm-agent
  •  
    • 그 후. 각각의 프로세스들을 기동시킨다. (각 서버별 해당 프로세스 구성을 한 유저를 사용)

(monitor) systemctl start mysql-mmm-monitor
(worker1) systemctl start mysql-mmm-agent
(worker2) systemctl start mysql-mmm-agent
  •  
    • 프로세스들을 구동시키면 monitor 서버 (master) 에서 mmm_control show 를 통하여 각 서버간에 연결이 아래와 같이 (ONLINE) 되었는지 확인한다. (각 서버별의 역할을 조절했다면 아래와 다른 role 로 나올 수 있다.)

 

    • mmm_control checks all 을 통하여 각 서버간 MMM 관련 세션들의 정상여부를 파악한다.

  •  
    • 이 상태에서 세션들의 role 을 바꿀수도 있다. 아래의 명령어를 사용하면 위의 role 이 바뀌어 있는 것을 확인 할 수 있다.

(monitor) mmm_control move_role writer worker2

 

 

 

 

 

 

 

 

반응형

'MySQL > H.A (High Availability)' 카테고리의 다른 글

갈레라 클러스터 구성 방법  (0) 2021.03.04
갈레라 클러스터 개요  (0) 2021.03.04
MHA 구성 방법  (0) 2021.03.04
MHA 개요  (0) 2021.03.03
MMM 개요  (0) 2021.03.03
Comments