Tag Archives: RHEL

MySQL Replication

MASTER CONFIGURATION (127.0.0.1)

my.cnf 파일에 설정을 추가합니다.
[code]# inodb configurations
log-bin                         = mysql-bin
server-id                       = 1
innodb_data_home_dir            = /theeye/db
innodb_data_file_path           = ibdata1:1000M;ibdata2:1000M:autoextend
innodb_buffer_pool_size         = 1G
innodb_additional_mem_pool_size = 40M
innodb_log_file_size            = 250M
innodb_log_buffer_size          = 8M
innodb_flush_log_at_trx_commit  = 0
innodb_lock_wait_timeout        = 5
relay-log                       = /theeye/db/master-relay-bin


# for master
innodb_flush_log_at_trx_commit  = 1
sync_binlog                     = 1
binlog_ignore_db                = mysql
binlog_ignore_db                = test
binlog_do_db                    = theeye[/code]

슬레이브가 리플리케이션을 위해 접근할 계정을 추가합니다. 원격지에서 접근 가능하도록 합니다.
[code]mysql> GRANT REPLICATION SLAVE ON *.* TO replicator@’%’ IDENTIFIED BY ‘password’;[/code]

마스터의 데이터를 백업하기 위해 쓰기를 금지합니다., innodb의 경우 COMMIT까지 방지됩니다.
[code]mysql> FLUSH TABLES WITH READ LOCK;[/code]

현재 쓰고 있는 마스터 log-bin 파일을 확인합니다.
[code]
mysql > SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————+———-+————–+——————+
| mysql-bin.003 | 73       | theeye       | test,mysql       |
+—————+———-+————–+——————+[/code]

마스터 디비를 백업합니다.
[code]# mysqldump –add-drop-table –routines  –triggers –default-character-set=utf8 –master-data theeye > theeye.sql[/code]

디비 락 걸었던것을 해제 합니다. 실제로는 슬레이브로의 이관작업이 끝날때 합니다.
[code]mysql> UNLOCK TABLES;[/code]

SLAVE CONFIGURATION (127.0.0.2)

my.cnf 파일에 설정을 추가합니다.
[code]# inodb configurations
server-id                       = 2
master-host                     = 127.0.0.1
master-user                     = replicator
master-password                 = ‘password’
master-port                     = 3306
innodb_data_file_path           = ibdata1:1000M;ibdata2:1000M:autoextend
innodb_buffer_pool_size         = 1G
innodb_additional_mem_pool_size = 40M
innodb_log_file_size            = 250M
innodb_log_buffer_size          = 8M
innodb_flush_log_at_trx_commit  = 0
innodb_lock_wait_timeout        = 5
relay-log                       = /theeye/db/slave-relay-bin


# for slave
read-only
master-connect-retry            = 60
replicate-do-db                 = theeye[/code]

마스터에서 백업해온 파일로 복원합니다.
[code]shell> mysql theeye < theeye.sql[/code]

연결할 마스터를 정의합니다. 아까 봐둔 마스터 log-bin파일명을 넣어줍니다.
[code]mysql> slave stop;
mysql> CHANGE MASTER TO MASTER_HOST=’127.0.0.1′, MASTER_USER=’replicator’, MASTER_LOG_FILE=’mysql-bin.003′, MASTER_PASSWORD=’password’;
mysql> slave start;[/code]

Slave_IO_Running, Slave_SQL_Running가 둘다 Yes이고 Read_Master_Log_Pos가 마스터의 변화에 따라 올라간다면 정상적으로 작동중인것입니다.
[code]mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 127.0.0.1
                Master_User: replicator
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000004
        Read_Master_Log_Pos: 2288979
             Relay_Log_File: slave-relay-bin.000002
              Relay_Log_Pos: 1267487
      Relay_Master_Log_File: mysql-bin.000004
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: theeye
        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: 2288979
            Relay_Log_Space: 1267487
            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
1 row in set (0.00 sec)[/code]

기타 슬레이브가 다수가 될 경우에는 위와 같은 방법으로 my.cnf의 server-id값만 다르게 하면 됩니다.
LOAD DATA FROM MASTER등의 명령은 deprecated되었으므로 사용을 자제 합시다.

rsync 사용 하기

rsync를 사용하면 손쉽게 데이터 미러링을 할 수 있습니다. 또한 증분 백업이 가능한 백업 시스템을 구축 할 수 있으며, 다수의 웹서버를 사용할 경우 웹페이지 배포등에 활용할 수 있습니다.

저는 백업 용도로 구성을 한번 해보겠습니다.

사용자 삽입 이미지위와 같이 파일 서버가 2대가 있고 그 정보를 백업할려는 백업 서버가 있습니다. 파일 서버에는 rsync 데몬을 실행하고 백업 서버에서는 rsync 명령으로 데이터를 끌어가면 됩니다.

FILE SERVER #1(192.168.0.1) ————————————————————————————
rsync는 xinetd 슈퍼 데몬에 얹혀 돌아갑니다. 데몬모드로 실행하기 위해 설정을 바꿔 봅시다.

$ vi /etc/xinetd.d/rsync

# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#   allows crc checksumming etc.
service rsync
{
    disable = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure  += USERID
}

disable을 no로 바꾼후에 xinetd를 재시작 해줍니다.

$ service xinetd restart
xinetd 를 정지 중:                                        [  OK  ]
xinetd (을)를 시작 중:                                    [  OK  ]

nmap을 실행해 정상적으로 873번 포트가 떠있는지 확인해 봅시다.

$ nmap localhost

Starting Nmap 4.99 ( http://www.insecure.org/nmap/ ) at 2008-05-20 13:05 KST
Interesting ports on Theeye (127.0.0.1):
Not shown: 1672 closed ports
PORT     STATE SERVICE
873/tcp  open  rsync

Nmap finished: 1 IP address (1 host up) scanned in 0.105 seconds

/etc/rsyncd.conf 파일을 만들어 줍시다.

[file]
path = /home/file
comment = File server #1
uid = nobody
gid = nobody
use chroot = yes
read only = yes
host allow = 192.168.0.3
max connection = 1
timeout 300

첫번째 줄의 []로 감싸여 있는 값은 해당 설정의 이름입니다. 이 이름으로 다른 서버에서 데이터를 끌어올 수 있습니다.

path : 공유할 디렉토리
comment : 설명
uid : 접근할 user id
gid : 접근할 group id
use chroot : chroot를 사용할지 여부, 특별한 이유가 없는 이상 꼭 사용할 것
read only : 읽기만 가능할 것인지, 백업의 피 대상이므로 yes로 설정
host allow : 접근 가능한 호스트 설정. 백업서버만 접근 가능하도록 설정
max connection : 최대 몇개의 커넥션을 연결할 수 있는지 설정
timeout : 타임아웃 시간 설정

FILE SERVER #2 (192.168.0.2) ————————————————————————————–
당연하게도 FILE SERVER #1과 모든 설정이 동일합니다. 그래도 rsyncd.conf 파일의 comment값만 좀 조정해 볼까요?;;

[file]
path = /home/file
comment = File server #2
uid = nobody
gid = nobody
use chroot = yes
read only = yes
host allow = 192.168.0.3
max connection = 1
timeout 300

BACKUP SERVER (192.168.0.3) ————————————————————————————-
백업 서버에서는 안타깝게도 그다지 설정할 것이 없습니다. 데이터를 끌어와 봅시다.

$ rsync -avz 192.168.0.1::file /home/backup/file1
$ rsync -avz 192.168.0.2::file /home/backup/file2

보시다 시피 위에서 지정한 file이라는 공유 이름으로 데이터를 가져오게 됩니다. 다시 한번 실행해 보면 변동된 데이터만 가져오게 됩니다.