MariaDB Galera Cluster 구성 (MySQL, MariaDB 지원)

리눅스/MySQL|2018. 12. 5. 11:27
반응형

Galera Cluster 는 두대 이상의 DB 서버를 '마스터 - 마스터' 형태로 운영토록 해주므로 아주 매력있는 기술이지만

실제 서비스를 가동하는데 있어 기능제한이나 오류 등이 많이 발견되고 있어 고객 서버에 적용하기에 적합하지 않습니다.

버전이 올라감에 따라 단점이 보완 될 것으로 보이므로 미리 설치, 테스트를 거쳐 고객 응대하는데 도움이 되시기 바랍니다.


본 매뉴얼은 Galera Cluster 를 CentOS 7.4 에서 MariaDB 10.2 환경에서 구성하였습니다.


[테스트 서버]

- 49.247.212.17    // 마스터 노드

- 49.247.212.46    // 슬레이브 노드

* 마스터 및 슬레이브 노드의 구분은 최초 구동 명령의 차이 밖에 없습니다. (반드시 기억해야 할 부분. 이유는 맨 하단 테스트에 나옴)



1. Galera Cluster 개요


1) 장점

- 모든 노드 읽기/쓰기가 가능하므로 Active - Active 방식의 멀티 마스터 구성 가능

- 노드간에 트랜젝션을 지원하므로 데이터의 일관성이 보장

- 노드 추가 및 제거가 간단


2) 단점

InnoDB 테이블만 지원

데이터베이스 단위가 아닌 서버 단위로 구성

한 노드에서 테이블 락이 걸리면 모든 노드에서 락이 걸림

- 한 노드에서 insert 시에 모든 노드에 데이터 insert 요청을 하게 되므로 쓰기 성능 저하

   => 이 문제로 순식간에 양 노드에 쓰기가 들어간다면 Auto Increment 충돌로 인한 장애 또는 데이터 유실이 발생할 수 있음


3) 지원 버전

MySQL 5.5, 5.6 이상 지원

MariaDB 5.5 이상 지원

* MariaDB 10.1 부터 기능이 기본 포함되어 설정이 더 간편해 졌습니다.



2. 설치


CentOS 7.4 가 설치된 상태에서 yum 명령을 통해 mariadb 를 설치하면 버전이 5.5.60 이 설치되므로

repositories 를 추가하여 더 높은 버전 (10.2.19) 의 mariadb 를 설치하도록 합니다.


1) 서버 공통 작업


[MariaDB 설치]


# vi /etc/yum.repos.d/MariaDB.repo


[MariaDB]

name = MariaDB

baseurl = http://yum.mariadb.org/10.2/centos7-amd64

gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck = 1 


# yum -y install mariadb-server galera rsync

// 복제 방식은 rsync 를 사용할 것이므로 rsync 패키지도 같이 설치


# vi /etc/my.cnf.d/server.cnf


[galera]

wsrep_on=ON                                                                                                                // galera cluster 사용 여부

wsrep_provider=/usr/lib64/galera/libgalera_smm.so                                 // libgalera_smm.so 모듈 위치

wsrep_cluster_address="gcomm://49.247.212.17,49.247.212.46"         // 본 서버를 포함한 동기화될 서버 IP LIST

wsrep_cluster_name=cluster                                                                                   // 그룹명 (동기화 될 서버가 모두 동일해야 함)

wsrep_node_address="49.247.212.17"                                                               // 현재 서버 IP

wsrep_node_name="sysdocu1"                                                                             // 현재 서버의 이름 (동기화될 서버간에 중복되면 안됨)

wsrep_sst_method=rsync                                                                                         // 동기화 될 데이터 전송 방식

wsrep_sst_auth="root:12345678"                                                                         // 데이터 전송 방식에 사용할 계정

binlog_format=row                                                                                                      // 바이너리 로그 파일 형식

default_storage_engine=InnoDB                                                                          // 스토리지 엔진 타입

innodb_autoinc_lock_mode=2                                                                              // 

bind-address=0.0.0.0                                                                                                  // 모든 IP 에서 접근 허용


마스터 서버는 위와 같이 구성하고, 나머지 서버는 위 내용에서 wsrep_node_addresswsrep_node_name각 서버의 고유한 값으로 바꾸어 줍니다.


[iptables 방화벽 설정]


아래 포트 리스트를 모든 서버에 동일하게 적용해줍니다. (선진행 필수)

3306/tcp

4444/tcp

4567/tcp

4567/udp

4568/tcp


2) 마스터 노드


데이터를 최초 배포 하는 마스터 노드에서 아래와 같이 실행합니다.


# galera_new_cluster


* 주의 : (모든 노드가 다운 상태인) 최초 구동일 경우에만 사용합니다.


3) 슬레이브 노드 (마스터 노드를 제외한 모든 서버)


# service mysql start



3. 동기화 확인 및 테스트


1) 확인


# mysql -p

(mysql root 비밀번호 입력)


MariaDB [(none)]> show status like 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size |    |

+--------------------+-------+

1 row in set (0.01 sec)


MariaDB [(none)]> show status like 'wsrep_incoming_addresses';
+--------------------------+---------------------------------------+
| Variable_name            | Value                                 |
+--------------------------+---------------------------------------+
| wsrep_incoming_addresses | 49.247.212.46:3306,49.247.212.17:3306 |
+--------------------------+---------------------------------------+
1 row in set (0.00 sec)

2) 데이터베이스, 테이블 생성 및 데이터 입력


마스터 노드에서 아래와 같이 테이블을 생성하고 데이터를 입력합니다.


MariaDB [(none)]> use test

MariaDB [test]> create table memo (name varchar(20), email varchar(250));

MariaDB [test]> insert memo (name, email) values ('SYSDOCU', 'sysdocu@sysdocu.tistory.com');


그리고 슬레이브 노드에서 데이터 입력을 확인하면 됩니다.
이와 같이 여러대의 서버를 cluster 로 묶은 경우 반대쪽 노드에서 insert 를 해서 반영이 되었는지 양방향으로 꼭 확인을 해봅니다.


4. 장애 복구 테스트


운영중 발생한 장애에 대하여 데이터를 동기화할 필요성이 있습니다.

한 대의 노드가 중지 된 상태에서 입력된 데이터는 나중에 해당 노드가 복구되어서 DB가 가동 되었을때 자동으로 sync 가 맞추어 집니다.

(마스터, 슬레이브 구분 없음)


[테스트 - 슬레이브 노드 장애]

1) 49.247.212.46 노드 셧다운

2) 49.247.212.17 노드에 데이터 insert

3) 49.247.212.46 노드 부팅 및 mariadb 가동

     # service mysql start

4) 49.247.212.46 노드에서 17번 입력 데이터 확인

     -- DB 데이터 sync 확인 --


[테스트 - 마스터 노드 장애]

1) 49.247.212.17 노드 셧다운

2) 49.247.212.46 노드에 데이터 insert

3) 49.247.212.17 노드 부팅 및 mariadb 가동

4) 49.247.212.17 노드에서 46번 입력 데이터 확인

     -- DB 데이터 sync 확인 --


[테스트 - 마스터, 슬레이브 노드 동시 장애]

1) 49.247.212.17 노드 셧다운

2) 49.247.212.46 노드에 데이터 insert

3) 49.247.212.46 노드 셧다운

     -- DB 서비스 완전 종료 --

4) 49.247.212.46 노드 부팅 및 mariadb 가동    // Master - Master 기반의 환경이지만 두번째 서버이므로 구동이 되지 않음

     # service mysql start

5) 49.247.212.17 노드 부팅 및 mariadb 가동    // 성공. 모든 노드 다운시에는 마스터 서버 부터 가동해야 함

     # galera_new_cluster

6) 49.247.212.46 노드 부팅 및 mariadb 가동

     # service mysql start

7) 17번, 46번 노드에서 데이터 확인

     -- DB 데이터 sync 확인 --


[장애 복구 테스트 결론]

- 운영중 마스터, 슬레이브 상관없이 어느 노드 하나가 다운 되었다면, 장애 서버 부팅만으로 데이터 sync 를 맞출 수 있습니다.

- 모든 노드의 서버가 다운되었을 경우, 마스터 노드부터 부팅을 시키는게 일반적이지만

   마스터 노드 다운 후 슬레이브 노드로 insert 된 데이터가 있다면 마스터 노드부터 가동할 경우 슬레이브 노드에 추가된 데이터가 유실 됩니다.

   유실을 막는 대안으로는 (데이터가 추가로 존재하는) 슬레이브 노드에서 galera_new_cluster 명령 먼저 가동하고 나머지 노드를 service mysql start 로 가동하면 됩니다.

   (마스터, 슬레이브 노드 역할을 바꿈)



5. 노드 추가


새로운 노드 IP : 49.247.212.68


1) 새로운 노드에 MariaDB를 설치하고 환경을 위와 같이 설정합니다.

     다만 아래 항목에서는 추가된 노드 IP를 추가해 주어야 합니다.


     wsrep_cluster_address="gcomm://49.247.212.17,49.247.212.46,49.247.212.68"


2) 방화벽 설정

     위 'iptables 방화벽 설정' 내용을 참고하여 설정합니다.


3) MariaDB 가동

     # service mysql start    // 이때 데이터가 동기화 되므로 데이터 양이 많다면 그만큼 기다려야 합니다.


4) MariaDB 에 로그인 해서 데이터 sync 된 것을 확인합니다.


5) 관리 목적상 헷갈리지 않도록 17번과 46번 노드의 설정 파일도 일관성 있게 아래 옵션에 새로운 노드 IP를 추가해 줍니다. (mysql 재시작 불필요)

     추가 설정 여부와 관계없이 데이터는 이미 양방향으로 전송이 가능한 상태입니다.


     wsrep_cluster_address="gcomm://49.247.212.17,49.247.212.46,49.247.212.68"



반응형

댓글()