Docker MariaDB의 Master-Slave 수동설정

busybean3·2021년 9월 7일
0

데이터베이스

목록 보기
5/6

🔍 MariaDB 란

MariaDB는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다. MySQL과 동일한 소스 코드를 기반으로 하며, GPL v2 라이선스를 따른다. 오라클 소유의 현재 불확실한 MySQL의 라이선스 상태에 반발하여 만들어졌으며, 배포자는 몬티 프로그램 AB(Monty Program AB)와 저작권을 공유해야 한다.[1] 이것은 MySQL과 높은 호환성을 유지하기 위함이며, MySQL API와 명령에 정확히 매칭하여, 라이브러리 바이너리와 상응함을 제공하여 교체 가능성을 높이고자 함이다.[2] 마리아 DB에는 새로운 저장 엔진인 아리아(Aria)뿐만 아니라, InnoDB를 교체할 수 있는 XtraDB 저장 엔진을 포함하고 있다.[3] 이것은 트랜잭션과 비트랜잭션 엔진 그리고 미래에 나올 MySQL 판에 대응하고자 함일 것이다.[4] 마리아 DB의 주요 개발자는 MySQL과 몬티 프로그램 AB를 설립한 몬티 와이드니어스(Michael Monty Widenius)이다. 그는 이전에 자신의 회사, MySQL AB를 썬 마이크로시스템즈에 10억 달러에 판매를 한 적이 있으며, 마리아 DB는 그의 둘째 딸인 마리아의 이름을 딴 것이다.[5]

결론적으로 MariaDB는 데이터베이스 관리 시스템으로, Mysql과 비슷한 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS) 중 하나입니다.

🔍 Replication 란 [6]

복제는 마스터 데이터베이스 또는 서버로 알려진 다양한 데이터베이스에서 여러 슬레이브 서버로 데이터를 복사하는 프로세스입니다. 마스터 서버는 복제용 데이터를 제공하기 때문에 그렇게 알려져 있습니다. 복제된 데이터는 완전한 데이터베이스 세트, 단일 데이터베이스 또는 원하는 데이터베이스에서 가져온 데이터 테이블일 수 있습니다.

마스터-슬레이브 구성에서 슬레이브 중 하나에 대한 모든 변경 사항은 몇 초 만에 마스터 레코드에 자동으로 반영되고, 그 후 모든 슬레이브는 마스터 서버에서 완전 자동화된 방식으로 데이터 업데이트를 수신합니다.

Replication의 몇 가지 주요 기능:

  • Scalability: 하나 이상의 슬레이브 서버를 사용하면 데이터 읽기를 수행할 수 있으므로 쓰기 작업만 수행할 수 있는 마스터 서버의 부하가 줄어듭니다.
  • Backup Assistance: 여기에는 백업 데이터로 사용할 수 있는 슬레이브로 데이터를 복제하는 작업이 포함됩니다. 그러면 이 백업이 안정적인 상태의 독립 실행형 서버로 작동할 수 있습니다.
  • Data Analysis: 복제가 있는 상태에서 마스터 서버에 추가 부하를 추가하지 않고 슬레이브 서버에서 데이터를 분석 할 수 있습니다.
  • Distribution of Data: 복제를 사용하면 마스터 서버에 연결하지 않고도 이 데이터에 대해 로컬로 작업할 수 있습니다. 후속 연결 시 업데이트된 데이터가 마스터와 병합됩니다.

MariaDB를 사용하면 전체 데이터베이스를 전체적으로 복제하거나 데이터베이스에서 특정 양의 데이터를 선택할 수 있습니다. MariaDB의 복제는 마스터-슬레이브 구성으로 사용되며 모든 데이터 업데이트가 수행되는 마스터 서버에서 binlog를 활성화합니다. 마스터 서버는 모든 트랜잭션에 대해 글로벌 트랜잭션 ID(GTID)를 사용하고 이를 바이너리 로그에 씁니다.

GTID(글로벌 트랜잭션 ID)를 사용하면 서로 복제하는 서로 다른 서버에서 동일한 binlog 이벤트를 쉽게 고유하게 식별할 수 있습니다. 이진 로그에는 데이터베이스에 대한 모든 변경 사항(데이터 및 구조 모두)과 각 명령문이 실행되는 데 걸린 시간이 포함됩니다. 슬레이브는 복제할 데이터에 접근하기 위해 각 마스터로부터 바이너리 로그(binlog)를 읽어온다. 슬레이브 서버에서는 바이너리 로그와 동일한 형식으로 릴레이 로그를 생성하여 복제를 수행합니다.

MariaDB의 Replication 유형

MariaDB를 사용하면 사용자가 다양한 방법을 사용하여 데이터를 복제할 수 있습니다.

  • Master-slave replication.
  • Master-master replication.
  • Multi-source replication.
  • Star replication.

🐳 Master-Slave Replication (docker)

이번 포스팅에서는 MariaDB를 docker로 Master-Slave 구조로 설정하는 방법을 알아보도록 하겠습니다.

1. slave용 디렉토리와 master용 디렉토리를 생성

## master DB용 디렉토리
mkdir master

## slave DB용 디렉토리
mkdir slave

2. Master-Slave DB를 docker를 통해 실행

master DB의 container를 띄우는 명령어는 아래와 같습니다.

## 실행 명렁어
docker container run -d -p 13306:3306   \ 
-e MYSQL_ROOT_PASSWORD=root비밀번호   \
-v .../master:/var/lib/mysql   \
-v .../master:/etc/mysql/conf.d   \
--name maria-master mariadb

## 실행 예시
docker container run -d -p 13306:3306   \
-e MYSQL_ROOT_PASSWORD=pwd123   \
-v /Users/Shared/data/maria/master:/var/lib/mysql   \
-v /Users/Shared/data/maria/master:/etc/mysql/conf.d   \
--name maria-master mariadb

옵션 설명

  • -p 는 포트번호 설정으로 저는 13306 번을 이용했습니다.
  • -e MYSQL_ROOT_PASSWORD 는 접속시 root의 비밀번호 입니다.
  • -v .../master:/var/lib/mysql 는 각종 log와 index등이 volume이 저장되는 디렉토리 설정입니다. (실행예시의 경우 제가 위에서 master 디렉토리 만든 곳으로 설정했습니다. )
  • -v .../master:/etc/mysql/conf.d 는 아까 설정한 환경설정 파일의 위치를 설정입니다. 실행예시의 경우 제가 위에서 master 디렉토리 만든 곳으로 설정했습니다.)

Slave DB의 container를 띄우는 명령어는 아래와 같습니다.

## 실행 명렁어
docker container run -d -p 23306:3306   \
-e MYSQL_ROOT_PASSWORD=root비밀번호   \
-v .../slave:/var/lib/mysql      \
-v .../slave:/etc/mysql/conf.d      \
--link maria-master   \
--name maria-slave mariadb


## 실행 예시
docker container run -d -p 23306:3306   \
-e MYSQL_ROOT_PASSWORD=pwd123   \
-v /Users/Shared/data/maria/slave:/var/lib/mysql      \
-v /Users/Shared/data/maria/slave:/etc/mysql/conf.d      \
--link maria-master   \
--name maria-slave mariadb

3. Master DB에서 복제할 database와 user를 생성

일단 master DB container에 접속합니다.

## master DB contianer 접속 (1)
mysql -u root -ppwd123 --port 13306 --host 127.0.0.1

## master DB contianer 접속 (2)
docker exec -it maria_master /bin/bash
>> mysql -u root -p 
>>> pwd123

그 다음 database와 user를 생성하도록 하겠습니다.

## 복제할 데이터베이스 생성 
create database repldb;

## user 생성 
grant all privileges on repldb.* to repldb@'%' identified by 'replpw';

## slave 서버에서 master 서버에 접속할 수 있도록 권한 추가
grant replication slave on *.* to 'repldb'@'%';

## 적용하기
flush privileges;

이제 생성된 user를 확인 해보도록 하겠습니다.

## 생성된 user 확인
use mysql;

select user, host from user;

확인해보면 user가 repldb로 생성된 것을 확인할 수 있습니다.

4. Slave DB에서 user를 생성

일단 Slave DB container에 접속합니다.

## slave DB contianer 접속 (1)
mysql -u root -ppwd123 --port 23306 --host 127.0.0.1

## slave DB contianer 접속 (2)
docker exec -it maria_slave /bin/bash
>> mysql -u root -p 
>>> pwd123

그 다음 user를 생성하도록 하겠습니다.

## user 생성 
CREATE USER 'repldb'@'%' IDENTIFIED BY 'replpw'; 

## 권한 설정 
grant all privileges on repldb.* to repldb@'%' identified by 'replpw';

## 적용하기
flush privileges;

5. Slave DB에서 Master DB를 설정

일단 master DB의 File과 position를 확인해야 합니다. master의 DB에 접근하여 아래와 같은 명령어로 확인합니다.

## File, position 확인하기
SHOW MASTER STATUS\G

이제 slave DB에서 master DB를 설정하도록 하겠습니다.

## master DB 설정 
CHANGE MASTER TO MASTER_HOST='maria-master', MASTER_USER='repldb', MASTER_PASSWORD='replpw', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1223;

각 옵션의 설명은 아래와 같습니다.

  • MASTER_HOST='maria-master' -> master DB의 container name
  • MASTER_USER='repldb' -> 복제할 DB
  • MASTER_PASSWORD='replpw' -> 비밀번호
  • MASTER_LOG_FILE='mysql-bin.000003' -> master의 file
  • MASTER_LOG_POS=1223 -> master의 position

그 다음 시작해보도록 하겠습니다. slave DB에서 아래와 같은 명령어를 사용합니다.

## 시작 명령어
start slave;

## 설정된지 확인하기 
SHOW SLAVE STATUS\G

여기서 우리는 Last_Errno 는 0, Last_IO_Errnork 0이면 설정이 완료된것 입니다.

설정을 완료하게 되면 이제 Master container에서 복제설정한 DB에 데이터가 들어가거나 삭제되는경우 Slave DB에도 바로 적용되는 것을 확인 할 수 있습니다.

REFERENCE

전체적 참조 https://lemontia.tistory.com/741
[1]. Contributing Code Archived 2013년 3월 16일 - 웨이백 머신, AskMonty Knowledgebase
[2]. MariaDB versus MySQL - Compatibility Archived 2013년 5월 26일 - 웨이백 머신, AskMonty KnowledgeBase
[3]. About XtraDB Archived 2013년 7월 8일 - 웨이백 머신, AskMonty KnowledgeBase
[4]. Aria FAQ Archived 2013년 6월 16일 - 웨이백 머신, AskMonty KnowledgeBase
[5]. Why is the project called MariaDB? Archived 2013년 6월 4일 - 웨이백 머신, AskMonty KnowledgeBase
[6]. https://hevodata.com/learn/mariadb-replication-easy-steps/

profile
엉덩이 무거운 개발자가 되기 위해서 몸무게를 찌웠다...

0개의 댓글