MariaDB/Admin

레플리케이션

알 수 없는 사용자 2015. 10. 27. 23:24
  • 글로벌 트랜잭션 아이디
    • 글로벌 트랜잭션 아이디란?(GTID)
      • Global Transaction ID의 약자
      • 바이너리 로그 파일명이나 위치는 해당 이벤트가 저장된 물리적인 위치를 가리키지만 글로벌 트랜잭션 아이디는 논리적인 의미
      • 주로 서버의 노드 아이디와 트랜잭션 아이디로 구성되어있어서 마스터와 슬레이브 간에 중복될 가능성이 없음
      • DML, DDL 이 발생할 때마다 트랜잭션 아이디가 1씩 증가하면서 글로벌 트랜잭션 아이디가 생성되며 바이너리 로그 이벤트와 매핑됨
      • 글로벌 트랜잭션 아이디가 슬레이브로 전달되면 릴레이 로그 파일이나 슬레이브 바이너리 로그 파일로 기록
    • 글로벌 트랜잭션 아이디의 필요성
      • 동기화 시 파일 내의 위치를 찾아서 (물리적) 복제를 수행하기는 어려움
      • 글로벌 트랜잭션을 사용하면 적용된 글로벌 트랜잭션 이후부터 동기화를 할 수 있음
    • MariaDB 10.0 글로벌 트랜잭션 아이디
      • 글로벌 트랜잭션 아이디는 도메인아이디 – 서버 아이디 – 트랜잭션 아이디로 구성
        • GTID를 이용한 복제 구축
          • 마스터 서버의 데이터 백업
          • 슬레이브 서버에서 1번 백업 파일로 복구
          • 슬레이브에서 바이너리 로그 파일명과 위치 확인
          • 3번을 이용하여 마스터의 GTID 확인
          • 슬레이브의 GTID를 4번 결과값으로 변경
          • 슬레이브에서 복제 설정
        • GTID를 사용한 복제 관리
          • 바이너리 로그 파일명과 위치로 글로벌 트랜잭션 아이디 찾기: BINLOG_GTID_POS('로그파일명','위치')

            바이너리 로그 파일명과 위치 확인

             

            BINLOG_GTID_POS로 GTID 확인

             

          • 글로벌 트랜잭션 아이디까지 대기: MASTER_GTID_WAIT('GTID','시간')
          • 초기 복제 연결; MASTER_USE_GTID=SLAVE_POS
          • 바이너리 로그 파일과 위치 기반의 복제를 GTID 기반으로 변경: MASTER_USE_GTID=CURRENT_POS
          • 마스터 MariaDB 변경: CHANGE MATSER TO MASTER_HOST='변경할 마스터 IP'
          • 특정 위치까지 실행 후 복제 멈춤: START SLAVE UNTIL MASTER_GTID_POST='GTID'
        • GTID를 이용한 슬레이브에서 트랜잭션 건너뛰기
          • 서버의 비정상 종료로 슬레이브에서 중복키 에러가 발생할 때 해당 이벤트를 건너뛰고 복제를 진행해야 함
          • 이벤트를 건너뛰는 시스템변수(SQL_SLAVE_SKIP_COUNTER)는 MariaDB 10.0에서는 사용할 수 없음
          • 에러가 발생한 GTID를 확인해서 GTID값을 증가시켜 재설정 후 복제를 다시 시작
  • 멀티 소스 복제
    • 멀티 소스 복제 관련 명령
      • 멀티 소스 복제란 하나의 슬레이브가 두 개 이상의 마스터 MariaDB로부터 데이터를 복제하는 것을 의미
      • 복제 관련 명령을 사용할 때 어느 마스터 서버와 연결된 복제에 대해서 실행될지 선택할 수 있도록 복제 연결의 이름을 명시해야 함
    • 멀티 소스 복제 구축
      • A와 B서버 모두 데이터가 크지 않을 경우: mysqldump 사용
      • A 서버의 데이터는 크고 B서버의 데이터는 적을 경우: A 서버는 XtraBackup으로 백업 및 복구한 후 B서버의 mysqldump파일로 적재
      • A, B 모두 데이터가 많을 경우: 두 서버에서 XtraBackup 백업을 진행한 후, 둘 중 테이블 개수가 많은 서버의 백업 파일로 슬레이브에 적재, B서버의 백업 파일 중 innoDB/XtraDB 파일의 ibd를 이용해서 슬레이브에 임포트
    • 멀티 소스 복제와 글로벌 트랜잭션
      • gtid_slave_pos에 각 마스터의 GTID 값을 ','로 연결해서 설정
  • 멀티 스레드 복제
    • MySQL 5.6의 멀티 스레드 복제
      • 데이터베이스 단위로 병렬 처리를 지원하기 때문에 데이터베이스 수 만큼 슬레이브의 스레드 개수를 설정해주는 것이 좋음
      • 실제 바이너리 로그 파일에 기록된 이벤트 순서대로 슬레이브에서 실행하지는 않음
    • MariaDB 10.0의 멀티 스레드 복제
      • 도메인 아이디를 기준으로 작동하며 여러 마스터로부터 전달된 바이너리 로그에 각각의 스레드가 할당되어서 바이너리 로그 이벤트를 처리함
      • 사용자가 멀티 스레드 복제 여부를 결정할 수 있음
      • 다음 쿼리에 대해서 멀티 스레드로 복제 가능
        • 마스터에서 하나의 그룹 커밋에 속한 쿼리
        • 다른 도메인 아이디를 가진 쿼리
        • 멀티 소스 복제에서 서로 다른 마스터로부터 가져온 쿼리
  • 크래시 세이프 슬레이브
    • IO 스레드 : 마스터로부터 바이너리 로그 이벤트를 슬레이브 로컬 디스크에 파일로 저장하는 역할
    • SQL 스레드 : 바이너리 로그 이벤트를 실제 서버에서 재실행해서 슬레이브에 적용하는 역할
    • 바이너리 파일이 복제될 때마다 파일의 내용을 변경하고 디스크에 동기화하는 작업이 필요 -> 비동기로 처리할 경우 서버가 비정상적으로 종료했을 때 파일의 내용 손실이 있을 수 있음 -> 서버 재가동 시 파일의 내용은 이전의 값을 가지고 있기 때문에 복제됐던 부분이 다시 복제되면서 중복키 에러가 발생할 수 있음 -> 파일의 내용을 테이블로 저장할 수 있는 기능 추가 (크래시 세이프 복제)
    • MariaDB 10.0의 크래시 세이프 복제
      • 글로벌 트랜잭션 아이디를 사용하는 경우 슬레이브가 실행한 복제 위치 정보가 gtid_slave_pos라는 테이블에 자동 저장
    • MySQL 5.6의 크래시 세이프 복제
      • 글로벌 트랜잭셩 아이디 사용 여부에 관계없이 크래시 세이프 복제를 사용할지를 설정할 수 있음
  • ROW 기반의 복제 기능 개선
    • ROW 포맷의 용량 최적화
      • STATEMENT 포맷: 용량이 작음, 실행한 SQL 문장이 그대로 기록됨/UUID 함수와 비결정적 함수(NOT DETERMINITIC) 의 기능들에 대해서는 복제를 수행할 수 없음
      • ROW 포맷: 최종적으로 테이블에 적용된 컬럼의 값을 바이너리 로그에 기록하기 때문에 복제에 대한 제한 사항이 없음/용량이 큼
      • MIXED 포맷: STATEMENT 포맷과 ROW 포맷의 장점을 혼합
    • ROW 포맷 바이너리 로그를 위한 정보성 로그 이벤트
      • MariaDB 주석 이벤트
        • 변경된 레코드 정보가 바이너리 로그에 기록되기 전에 사용자가 실행한 SQL 문장을 바이너리 로그 이벤트로 기록할 수 있도록 보완
        • SHOW BINLOG EVENTS IN '로그파일명';
      • MySQL 5.6의 정보성 로그 이벤트
        • MariaDB와 동일하게 주석 이벤트 기능 도입
  • 지연된 복제
    • 일부러 지연시켜서 복제를 수행할 수 있음
    • CHANGE MASTER TO… MASTER_DELAY=시간(초);
    • 마스터의 바이너리 파일은 즉시 슬레이브에 복사되지만 적용을 지연시키는 것이며 이 파일을 이용해서 바로 복제할 수도 있음
  • MariaDB와 Mysql 서버간의 복제
  • 그 외의 기타 기능 개선
    • 바이너리 로그 체크섬
    • 바이너리 로그 API
    • 바이너리 로그 그룹 커밋
      • 여러 개의 트랜잭션 바이너리 로그를 모아서 한 번에 플러시를 수행