꼬반 Blog

MySQL Replication 설정하기

====== MySql Replication 설정하기 ======


회사에서 한 팀에게 할당해주었던 팀 DB 서버가 디스크가 깨져 날라갔다!!!
replication 설정 된 서버가 있어서 다행이! 라고 생각했었는데
이럴수가.. slave 서버는 1주일 전 Data만이 남아있었고 그 이후 Data가 없는 것 아닌가!?!

로그와 설정을 확인해본 결과 mysql 기본 셋팅인 max_allow_packet이 1M 였고
이 때문에 1주일전쯤 대량의 Data가 replication 도중 error가 났던 것.. 때문에 그 후 Data는 replication 이
되지 않고 있었다...

아...

일단은 DB는 해당 담당자가 되는대로 복구 하기로 하였고 디스크가 나간 master 서버는 새 disk 교체 후 os, mysql 최신버전으로
재설치, slave 서버 역시 새 디스크로 교체 후 os, mysql 재설치 하였다. (서버에 사용되는 disk가 오래되면 재앙이다 ㅠㅠ)

이 후 replication 설정한 기록을 남긴다.

===== Master Server Setting =====

mysql 공식 메뉴얼 (사용한 mysql 버전이 5.1.67 버전이었으므로 5.1 메뉴얼에 따라 설정)
참조 : http://dev.mysql.com/doc/refman/5.1/en/replication-howto-masterbaseconfig.html

<code>
$ vi /etc/my.cnf

[mysqld]
#log-bin=mysql-bin // 주석 해제
log-bin=mysql-bin
server-id=1 // 입력
max_allowed_packet=128M // 이전 replication 설정에서 error 가 됬던 부분으로 최대치 설정.
</code>

===== Slave Server Setting =====

<code>
$ vi /etc/my.cnf

[mysqld]
#log-bin=mysql-bin // 주석 해제
log-bin=mysql-bin
server-id=2 // master 와 다른 id 입력
max_allowed_packet=128M // 이전 replication 설정에서 error 가 됬던 부분으로 최대치 설정.
</code>

master나 slave의 몇몇 설정옵션들이 더 있지만 현재는 전체 DB를 대상으로 하는 replication 이므로 이정도 설정이면 된다.

===== Creating a User for Replication =====

master 서버에 slave 서버에서 replication을 위해 접속할 user를 추가해 주어야 한다.

<code>
mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
mysql> FLUSH PRIVILEGES;
</code>

===== Creating a Data Snapshot Using mysqldump =====

master 서버의 db를 slave로 복사해 주어야 하는데 여러 가지 방법이 있다.
이번에 진행하면서 mysqld 를 stop 하고 rsync 로 slave에 복사하였는데 mysql manual dump를 사용하는 방법은 아래와 같다.

<code>
mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
shell> mysqldump --all-databases --master-data >dbdump.db
mysql> UNLOCK TABLES;
</code>

===== Creating a Data Snapshot Using Raw Data Files =====

dump 가 아닌 다른 방법으로 db를 slave로 옮기는 방법.
<code>
shell> mysqladmin shutdown
// 먼저 mysql을 정지
shell> tar cf /tmp/db.tar ./data
// mysql data폴더를 tar로 묶거나 zip으로 압축
shell> zip -r /tmp/db.zip ./data
// 아니면 rsync 를 사용하여 slave로 바로 복사한다.
shell> rsync --recursive ./data /tmp/dbdata
// 이번에 복사할때 아래와 같이 복사하였다.
shell> rsync -avz -e 'ssh -p 2022' root@ip:/var/lib/mysql /home
// -e 옵션은 기본 포트가 아닌 다른 포트를 사용하기때문에 포트를 지정하는 옵션.
// slave 서버는 sdb1에 따로 /home 을 마운트 하고 그곳에 mysql data 폴더를 옮겨주었다.
</code>

===== Setting Up Replication with New Master and Slaves =====

master 서버 확인

<code>
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |    61290 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
</code>

위의 file과 position을 slave에 셋팅하여 준다.

<code>
mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;

mysql> start slave;
// 정지할땐 mysql> stop slave;
// slave의 경우는 셋팅이 된 이후 mysqld 가 시작될때 자동으로 같이 동작 됨.
// 자동으로 동작되는 slave를 동작하지 않게 하기 위해서는 option을 주면 됨.

mysql> show slave status;
+----------------------------------+----------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+
| Slave_IO_State                   | Master_Host    | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File          | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error |
+----------------------------------+----------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+
| Waiting for master to send event | ip | repl     |        3306 |            60 | mysql-bin.000003 |               61290 | mysqld-relay-bin.000003 |         59606 | mysql-bin.000003      | Yes              | Yes               |                 |                     |                    |                        |                         |                             |          0 |            |            0 |               61290 |           59762 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 | No                            |             0 |               |              0 |                |
+----------------------------------+----------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+---------------+----------------+----------------+
1 row in set (0.00 sec)
</code>

===== Check =====

이제 정상적으로 Replication 이 동작하는지 확인하여 보면 된다.
master에 임시로 db와 table을 생성하여 보고 slave에 잘 반영이 된다면 기본적인 동작은 잘 동작한다고 할 수 있다.

다만 이제 운영중에 나오는 트러블이나 에러가 나올 수 있지만 이건 앞으로 문제로 남겨두면 된다.

첨부.

이번 작업때 master server의 설정을 slave server의 설정으로 그대로 복구 (해당 db 담당자가..) 한 바람에 ..

master server에도 slave 설정이 되어 있어서 replication 이 정상적으로 동작되지 아니하였다 ㅠㅠ

때문에 구글링에 다음과 같은 해결방법을 찾았다.

master server 에서 아래와 같이 조치 한다.

<code>
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_HOST='';
mysql> RESET SLAVE;
</code>

반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post