레이블이 리플리케이션인 게시물을 표시합니다. 모든 게시물 표시
레이블이 리플리케이션인 게시물을 표시합니다. 모든 게시물 표시

2010년 8월 10일 화요일

Replication : 행 레벨 replication

MySQL 5.1.5-alpha에서 행 레벨 replication이 도입되었다.   구현 아이디어로는  바이너리 로그의 기술을 변경하자라는 것이다.

행 레벨 replication은 종래의 replication하고 비교해서  다음과 같은  잇점이 있다.

  • UDF나 FOUND_ROWS(), LOAD_FILE(), SYSDATE(), USER(), UUID()를 사용한 경우에도 replication이 가능
  • 복잡한 SQL문을 slave가  순서대로 실행처리하는 것보다도 빠를 것이다라고 생각되어짐. 
단점으로는 다음과 같은 것이 있다.

  • 로그양이 증가한다. 
  • 처리가 큰 경우 Rollback된 데이터도  로그되는 경우가 있다. 
  • 인간이 바이너리로그를 보아도 판별되지 않는다. 
  • Slave가 어떤 SQL문을 받아 처리하는 지 알 수가 없다. 
소스로 빌드하는 경우는 configure옵션에서 다음과 같이 지정하면 행 레벨 replication은 포함되지 않는다.

shell$ ./configure --without-row-based-replication 


행 레벨 replication의 도입(binlog_format) 

행 레벨  replication을 도입하려면 binlog_format변수에 바이너리로그 기술방법을 지정할 필요가 있다.  mysqld의 옵션처리하려면  --binlog-format이다.

mysqld --binlog-format={ROW|1|STATEMENT|2|MIXED|3}

SET문으로도 변경가능하다.


mysql>SET GLOBAL binlog_format=2;

다음과 같은 경우는 SET문으로 동적으로 포맷을 변경할 수 없다.

  • 스토어드 함수나 트리거 내부
  • NDB가 유효한 경우 
  • 세션이  ROW베이스로 되어있고  임시 테이블을 사용하고 있을 경우 
1이나 STATEMENT는  종래와 마찬가지로  바이너리 로그에는 SQL문으로 변경사항을 기록한다.    행 레벨 replication으로 될 수 없다.
다음과 같은경우 replication할 수 없다.

  • UDF를 사용했을 경우
  • 다음과 같은 함수를 사용했을 경우 FOUND_ROWS(), LOAD_FILE(), USER(), UUID()
  • SYSDATE() 를 --sysdate-is-now옵션이 없는 상태에서 사용한 경우 
2또는 ROW의 경우는 행레벨 replication이 가능하게 된다.  MySQL Cluster의 Replication을 수행할 경우에는  이 값으로 해야한다.  바이너리 로그에는 다음과 같이 기록된다.

BINLOG '
 3w0rRRMBAAAAJgAAACYAAAAAA4AAAAAAAAABHRlc3QAAWEAAQM=
';

값은 base64로  인코딩되어 있다.  이 값은  테이블 핸들러(스토리지엔진에 대한 핸들러)에 전달하는 값이다 ( handler::ha_write_row(), handler::ha_update_row(), handler::ha_delete_row()등) 

3또는  MIXED는 MySQL 5.1.8에서 추가되었다.  보통은 STATEMENT와 마찬가지로 동작한다.  다음과 같은 경우는 ROW와 마찬가지로 바이너리로그를 기록한다.

  • UDF나 UUID()를 사용한 경우 
  • NDB테이블에 대해서 INSERT, UPDATE, DELETE등의 데이터 조작 
  • INSERT DELAYED를 실행했을 경우

2010년 7월 28일 수요일

Replication : Slave에서의 설정과 조작 5

  • SHOW WARNINGS: Replication에러가 나왔을 경우 에러 메세지를 볼 수 있다.
  • SET GLOBAL SQL_SLAVE_SKIP_COUNTER:  지정된 수만큼 이벤트의 실행을 건너뛴다. 
  • SELECT MASTER_POS_WAIT() : 지정된 바이너리 로그파일의 위치까지의 이벤트를  SQL스레드가 실행할 때까지 대기한다. SQL함수인 것을 주목하자.  다음과 같이 사용한다. SELECT MASTER_POS_WAIT('Master 바이너리로그 파일명', 바이너리로그 파일의 위치 [,타임아웃] ) 타임아웃은 0보다 큰 숫자를 지정한 경우, 지정된 초수를 넘어서 기다리게 되는 경우 에러를 낸다.  지정이 없으면 계속 기다린다.   반환되는 값은 이벤트의 수이다. NULL은  SQL스레드가 움직이고 있지 않던가 인수에러이던지 지정된 파일이 존재하지 않던지 하는 경우이다.  -1은 타임아웃이 발생한 상태이다.
  • START SLAVE (IO_THREAD|SQL_THREAD):  Slave를 시작한다. 
  • STOP SLAVE (IO_THREAD|SQL_THREAD):Slave를 정지시킨다.
  • RESET SLAVE:  Slave정보를 삭제한다. master.info, relay-bin.#, relay-bin.index, relay-log.info가 삭제되어 초기상태로 된다. 
  • LOAD DATA FROM MASTER:  Master데이터의 복사.  현재는 비추천기능. mysqldump등의 백업툴을 사용할 것을 추천한다.  MyISAM테이블만이 대상으로  그 외의 것은 Net error reading from master라는 에러메세지가 나온다. 또 데이터양이 많은 경우 타임아우이 발생할 가능성이 있다. 
  • LOAD TABLE 테이블명 FROM MASTER: Master의 테이블 복사.  이것도 현재 비추천기능.

2010년 7월 21일 수요일

Replication : Slave에서의 설정과 조작 4

SHOW SLAVE STATUS의 내용 


  • Slave_IO_State: I/O스레드의 상황 
  • Maser_Host: Master의 호스트
  • Master_User: 접속 유저
  • Master_Port: Master의 포트번호 
  • Connect_Retry: --master-connect-retry의 값
  • Master_Log_File: I/O스레드가 현재 읽어들이고 있는 Master의 바이너리로그 
  • Read_Master_Log_Pos: I/O스레드가 현재 읽어들이고 있는 Master의 바이너리로그의 위치 
  • Relay_Log_File: SQL스레드가 현재 읽어들여 실행중인 Relay로그 파일 
  • Relay_Log_Pos: SQL스레드가 현재 읽어들여 실행중인 Relay로그 파일의 위치 
  • Relay_Master_Log_File: SQL스레드가 가장 최후에 실행한 이벤ㅌ가 Master의 어느 바이너리로그 파일에 있는가
  • Slave_IO_Running: I/O스레드가 동작하고 있는가 
  • Slave_SQL_Running: SQL스레드가 동작하고 있는가
  • Replicate_Do_DB: --replicate-do-db의 지정값
  • Replicate_Ignore_DB: --replicate-ignore-db 의 지정값
  • Replicate_Do_Table: --replicate-do-table의 지정값 
  • Replicate_Ignore_Table: --replicate-ignore-table의 지정값
  • Replicate_Wild_Do_Table: --replicate-wild-do-table의 지정값
  • Replicate_Wild_Ignore_Table: --replicate-wild-ignore-table의 지정값
  • Last_Errno: 최후에 발생한 에러 번호 
  • Last_Error: 최후에 발생한 에러 메세지 
  • Skip_Counter: SQL_SLAVE_SKIP_COUNTER 지정된 값
  • Exec_Master_Log_Pos: SQL스레드가 최후에 실행한 이벤트가 Master의 바이너리로그의 어느 위치가 되는 가
  • Relay_Log_Space: Relay로그 사이즈.  모든 Relay로그의 합계 
  • Until_Condition: START SLAVE의 UNTIL의 지정 
  • Until_Log_File: START SLAVE의 UNTIL의 지정 
  • Until_Log_Pos: START SLAVE의 UNTIL의 지정 
  • Master_SSL_Allowed: SSL통신을 수행하고 있는지 
  • Master_SSL_CA_File: CA의 CERTIFICATE파일
  • Master_SSL_CA_Path: CA의 CERTIFICATE파일을 보존하는 디렉토리 
  • Master_SSL_Cert: CERTIFICATE 파일 
  • Master_SSL_Cipher: Cipher
  • Master_SSL_Key: 키 파일 
  • Seconds_Behind_Master: Slave가 어느정도 Master로부터 지연되고 있는가. 0인 경우에는 I/O스레드에 완전히 잘 따라가고 있음. 갱신등으로 늦어지고 있는 경우는  늦어진 추정 초수가 나타남. 


    2010년 7월 15일 목요일

    Replication : Slave에서의 설정과 조작 3

    Master정보의 변경(CHANGE MASTER TO)

    Master정보등의 변경을 수행한다. 구문은 다음과 같다.

     CHANGE MASTER TO 변경지정 [,변경지정]

    변경지정 키워드를 모두 지정할 필요는 없고 필요한 것만을 「,」로 지정한다.
    이 실행에 따라서 master.info , relay-log.info파일이 변경된다.

    변경지정 키워드는 아래와 같다.

    • MASTER_HOST='호스트명'
    • MASTER_USER='유저명'
    • MASTER_PASSWORD='패스워드'
    • MASTER_PORT=포트번호
    • MASTER_CONNECT_RETRY=시도횟수 
    • MASTER_LOG_FILE='Master의 바이너리로그파일명'
    • MASTER_LOG_POS=Master의 바이너리로그 파일의 위치 
    • RELAY_LOG_FILE='relay로그파일명'
    • RELAY_LOG_POS=relay로그파일의 위치 
    • MASTER_SSL= {0|1}
    • MASTER_SSL_CA = 'CA의 CERTIFICATE파일명'
    • MASTER_SSL_CAPATH='CA의 CERTIFICATE 파일저장 디렉토리'
    • MASTER_SSL_CERT ='CERTIFICATE파일명'
    • MASTER_SSL_KEY='개인키 파일명'
    • MASTER_SSL_CIPHER='Cipher지정'

    Slave상태확인 (SHOW SLAVE STATUS)

    Slave의 상태를 확인하기 위해서는 SHOW SLAVE STATUS를 사용한다.
    Slave_IO_Running과 Slave_SQL_Running중 둘중 하나가 No이면 Replication은 정지하고 있는 것이다.  장해로 SQL스레드만 정지하고 있으면 Relay_Master_Log_File과 Exec_Master_Log_pos 쌍과  Master_Log_File과 Read_Master_Log_Pos쌍의 값이 달라지게 된다.

    2010년 7월 13일 화요일

    Replication : Slave에서의 설정과 조작 2

    Slave에 관한 SQL문 

    • GRANT REPLICATION CLIENT ON *.* : SHOW SLAVE STATUS를 실행할 수 있는 권한을 부여 
    • CHANGE MASTER TO : Master 변경, 바이너리 로그의 읽기 위치 변경수행 
    • SHOW SLAVE STATUS: Slave 서버의 상황
    • SHOW WARNINGS : warning의 확인
    • SHOW SLAVE HOSTS: Slave리스트를 출력. Slave서버는 --report-host=옵션의 지정이 필요하다. REPLICATION CLIENT권한이 필요
    • SET GLOBAL SQL_SLAVE_SKIP_COUNTER=갯수 : 지정된 갯수만큼만 이벤트 실행을 건너뜀.
    • SELECT MASTER_POS_WAIT() :  지정된 바이너리로그의 위치까지 실행되기까지 대기 
    • START SLAVE: Slave개시
    • STOP SLAVE: Slave정지 
    • RESET SLAVE: Master 정보 삭제 
    • LOAD DATA FROM MASTER: Master로부터 데이터를 복사 
    • LOAD TABLE 테이블명 FROM MASTER: Master로부터 테이블을 복사 

    Slave가 작성하는 파일 
    • master.info:  Replication상태를 유지하기위해서 이용되는 파일. Slave서버가 자동으로 생성한다.  임의로 변경하지 않도록 주의한다.  다음과 같은 내용을 포함하고 있다.  
    1. 이 파일의 행수 
    2. Master_Log_File
    3. READ_Master_Log_Pos
    4. Master_Host
    5. Master_User
    6. 패스워드
    7. Master_Port
    8. Connect_Retry
    9. Master_SSL_Allowed
    10. Master_SSL_CA_File
    11. Master_SSL_CA_Path
    12. Master_SSL_Cert
    13. Master_SSL_Cipher
    14. Master_SSL_Key
    디폴트로 datadir/밑에 작성되지만 --master-info-file=옵션으로 변경가능하다.  파일명도 같은 방법으로 변경할 수 있다.  

    • relay-log.info: Slave서버의 relay-log상황을 기록하는 파일로 자동적으로 생성된다.  임의로 편집해서는 안된다.  다음과 같은 내용을 포함하고 있다. 
    1. Relay_Log_File
    2. Relay_Log_Pos
    3. Relay_Master_Log_File
    4. Exec_Master_Log_Pos
    디폴트로 datadir/밑에 작성되지만 --relay-log-info-file=옵션으로 변경가능하다.  파일명도 같은 방법으로 변경할 수 있다.  
    • 호스트명-relay-bin.NNNNNN:  relay로그파일이다.  N은 숫자로 000001에서 순차적으로 증가한다.  999999의 다음은 1000000가 된다.   호스트명-relay-bin의 부분은 --relay-log=옵션으로 변경가능하다.  또, 디폴트로는 datadir/에 작성되지만 장소는 --relay-log=옵션으로 변경가능하다. 

    • 호스트명-relay-bin.index:현재 가지고 있는 relay로그 리스트이다. 

    2010년 7월 6일 화요일

    Replication : Master에서의 설정과 조작 4

    바이너리 로그갱신의 일시적인 ON/OFF ( SET SQL_LOG_BIN)

    바이너리 로그의 갱신을 일시적으로 ON/OFF하는 경우는 SET SQL_LOG_BIN을 실행한다.
    보통 Replication 대상외로 하고 픈 테이블(권한 테이블)등을 갱신할 때만 사용한다.

    구문은 다음과 같다.

    SET SQL_LOG_BIN= {0|1}

    「1」은 이 세션의 갱신을 바이너리로그에 기록한다. 기본값이다. 「0」은 이 세션의 갱신을 바이너리로그에 기록하지 않는다.

    Master이 상태확인(SHOW MASTER STATUS)

    현재 써넣고 있는 바이너리로그와 그 위치를 확인하는 경우는 SHOW MASTER STATUS를 실행한다.


    바이너리 로그의 목록을 표시(SHOW BINARY LOGS)

    현재 유지하고 있는 바이너리 로그를 목록표시하기 위해서는 SHOW BINARY LOGS를 사용한다.
    구문은 다음과 같다.

    SHOW [MASTER|BINARY] LOGS


    바이너리로그내의 이벤트를 표시 ( SHOW BINLOG EVENTS ) 

    지정된 바이너리 로그파일의 이벤트를 나타낸다. 구문은 다음과 같다.

    SHOW BINLOG EVENTS
    [IN '바이너리로그파일'] [FROM 위치1] [LIMIT [오프셋,] 갯수]

    바이너리 로그파일명을 지정하지 않는 경우는 최초의 바이너리 로그를 읽어들인다.
    LIMIT으로 이벤트의 읽어들일 위치(오프셋)과 표시할 이벤트의 갯수를 지정할 수 있다.
    LIMIT가 없는 경우는 모든 이벤트를 표시하게 되어 엄청난 양이 될 수 있으므로 주의해야한다.



    지정한 바이너리 로그의 삭제 (PURGE MASTER LOGS)

    바이너리 로그를 삭제하려면 PURGE MASTER LOGS를 사용한다. 구문은 다음과 같다.

    PURGE {MASTER|BINARY} LOGS TO '바이너리 로그파일'
    PURGE {MASTER|BINARY} LOGS BEFORE 'YYYY-MM-DD hh:mm:ss'


    TO '바이너리 로그파일'의 지정의 경우는 지정된 파일 한개 전까지가 삭제된다.
    BEFORE '날짜시간'도 지정된 일시보다 전의 파일이 삭제된다.

    이 조작을 수행하면 호스트명-bin.index파일도 자동으로 변경된다.


    Slave정보의 확인(SHOW SLAVE HOSTS)

    Slave 정보를 얻기위해서는 SHOW SLAVE HOSTS를 실행한다.
    Slave 서버에 --report-host=옵션을 지정하고 있는 것에 한정된다.

    실행후에 나타나는 컬럼 Rpl_recovery_rank는 5.1.12-beta버전에서는 사용되어지지 않고 의미도 없다.
    또, Master 서버에 --show-slave-auth-info옵션을 지정한 경우는 유저명과 패스워드도 표시된다.

    이것은 Slave에서 다음의 옵션으로 지정한 값에 지나지 않는다. 실제로 Replication이 사용하고 있는 패스워드등은 표시되지 않는다.

    --report-host=
    --report-port=
    --report-user=
    --report-password=


    Master의 초기화
    모든 바이너리 로그파일을 삭제하고 Master를 초기화하는 경우는 RESET MASTER를 실행한다.
    Replication운용중에 사용하지는 않겠지만 처음에 Replication을 재셋업할 경우등에 사용한다.

    주의해서 사용해야한다.

    2010년 7월 1일 목요일

    Replication

    데이터베이스시스템의 부하를 분산시키고 싶은 경우는 replication을 이용한다.
    MySQL의 replication의 특징은 다음과 같다.

    • 한 방향(Master에서 Slave로 흘러감)
    • 비동기
    • Master:Slave = 1:N
    • Slave겸 Master가 될 수 있다.
    • 통신은 TCP/IP를 사용
    • 바이너리 로그를 사용
    • 갱신은 Master만 가능

    MySQL의 Replication은 Master의 바이너리 로그의 내용을 Slave에 보내는 것으로 수행된다.
    동작의 흐름은 다음과 같다.

    1. Slave I/O스레드가 Master에 접속
    2. Master가 Slave를 인증하고 Slave와의 세션 개시
    3. Slave I/O스레드가 바이너리 로그파일(파일명, 위치)를 요구
    4. Master(binlog dump스레드)가 요구되어진 지점으로부터 이벤트를 바이너리 로그에서 읽어들여 Slave 에 전송
    5. Slave I/O스레드는 받어낸 이벤트를 relay-log에 기록
    6. Slave SQL스레드가 relay-log내용을 읽어들여 SQL문을 실행
    7. Master에 새로운 이벤트가 있으면 Master가 Slave에 송신