IT 관련/Database

MariaDB Galera Cluster-설치/셋팅

nullzone 2017. 12. 30.
반응형


MariaDB Galera Cluster 설치/셋팅




Galera Cluster 를 이야기 하기전에 Synchronous vs Asynchronous 의 차이를 알아보자 


Asynchronous 방식으로 대표적인 것이  Replication 이다.

모두 알고 있듯이 replication은 마스터 - 슬래이브로 이루어지고 데이터의 변경은 master에서만 이루지며,

변경된 데이터는 슬래이브로 복제된다. 

데이터 분산 및 부하 분산에 현재도 매우 널리 사용되는 방식이다. 

헌데 replication은 Asynchronous 방식으로 이루어 지므로  몇가지 문제가 발생한다. 


-. 마스터 노드에서 발생한 변화가 슬레이브 노드에 동시에 적용되는 것을 보장하지 않는다.  

-. 마스터-슬레이브 간 데이터 동기화 지연(엄격히 말하면 마스터-슬래이브간의 트랜잭션을 지원하지 않는다.)

-. 데이터의 변경은 오직 마스터에서만 이루어지므로 마스터 다운시 데이터 유실 가능성 존재.


이러한 문제는 근본적으로 Asynchronous 으로 인해 발생하는 문제를  해결하기 위해 

Synchronous 방식의 Galera Cluster 가 개발되었다.


MariaDB/Galera Cluster의 장점(특징)

각 서버는 마스터-슬래이브가 아닌 노드로 명칭된다. 

-. 모든 노드에서 데이터 변경 가능 (Active-Active 방식의 다중 마스터 구성 – 모든 노드에서 읽기/쓰기가 가능)

-. 노드 장애 시에도 데이터 유실 없이 높은 가용성 달성

-. 노드 사이의 트랜잭션 지원(클러스트 내 모든 노드 간 데이터 일관성을 보장)

-. 클러스터 내 노드 자동 컨트롤 (노드 장애 시 자동으로 해당 노드 제거, 추가 가능)


이와 같은 특징에서 전통적인 Asynchronous 방식의 리플리케이션이 가지는 한계점을 해결하였다.

하지만, Galera Cluster 가 발표된지 얼마간 시간이 지났어도 변변한 레퍼런스 사이트를 찾아보기 어렵다.

아니 내가 못 찾은 것일 수도 있다. 

분명히 문제(?) 혹은 한계가 존재 하며, 이는 노드 사이의 트랜잭션 지원(클러스트 내 모든 노드 간 데이터 일관성을 보장) 으로 인해 발생하는 문제라 본다.


MariaDB/Galera Cluster  의 동작 방식

Galera Replication은 wsrep API로 노드 간 통신을 하며, MariaDB 측에서는 wsrep API에 맞게 내부적인 개선하였다고 합니다. 

MySQL-wsrep는 MySQL의 InnoDB스토리지 엔진 내부에서 Write Set(기록 집합 : 트랜잭션의 기록하는 모든 논리적인 데이터 집합)을 추출하고 적용하는 구현됩니다. 노드 간 Write Set을 전송 및 통신을 위해서는 별도의 리플리케이션 플러그인을 사용하며, 리플리케이션 엔진은 wsrep에 정의된 Call/Callback 함수에 따라 동작합니다.

잘모르겠다... 매우 잘 만들었단다.


작동원리는 위의 그림처럼 수행된다.

1. 노드1에서 데이터 변경(커밋) 처리 

2. Cluster 내 다른 노드2로 이벤트 전송

3. 이벤트를 받은 노드2는 유효성 체크 후, 데이터 변경

4. 결과를 받아 원래 노드1에 데이터 변경 물리적 커밋


1. Galera 설치

구성은 아래와 같이 할 것이다.

  • Server1 : 192.168.0.1
  • Server2 : 192.168.0.2
  • Server3 : 192.168.0.3


CentOS 7 기준 MariaDB 10.2 설치


vi /etc/yum.repos.d/MariaDB.repo
# yum repository 등록(아래 내용 Copy)

# MariaDB 10.2 CentOS repository list - created 2017-12-31 00:34 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

sudo yum install MariaDB-server MariaDB-client


Ubuntu 16.04 기준 MariaDB 10.2 설치



sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu xenial main'
Once the key is imported and the repository added you can install MariaDB with:

sudo apt update
sudo apt install mariadb-server

MariaDB의 OS별 최신버전 및 Repository는 https://downloads.mariadb.org/mariadb/repositories/ 를 통해서 확인하자. 

복제방법은 Rsync를 사용할 것이므로 당연히 서버들에 Rsync가 설치되어있어야 한다. 

Local network이 아닌 외부 망을 통하여 노드간 원격 접속이 필요한 경우 또는 서버 자체 방화벽(ufw 등) 이 설정되어 있을 때는, 방화벽 설정에서 TCP 3306/4568/4444 port와 TCP, UDP 4567 open 해두자.


3대의 서버가 설치 되었다면 Cluster를 구성할 3대의 Server Config를 다음과 같이 수정하자 

언급하지 않은 내용은 default로 두자(혹은 코멘트 처리 해두자)


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

wsrep_node_address 에는 node의 자신의 ip
wsrep_provider=//libgalera_smm.so의 위치 
wsrep_cluster_address="gcomm://192.168.0.1,192.168.0.2,192.168.0.3" //클러스터에 참여할 서버 ip list
wsrep_cluster_name='cluster' //Galera Culster 이름, 3대 동일 
wsrep_node_address='192.168.0.1' //node의 자신의 ip
wsrep_node_name='db1' //node의 이름
wsrep_sst_method=rsync //data 복제 방법 여기서는 rsync 
wsrep_sst_auth=root:password //rsync 복제시 사용할 user/password



1. 첫 번째 Cluster( Doner 노드 )Start

Galera cluster 라고 하여 모든 node들이 master DB(Primery)의 역활을 하지만 그중에서도 최초 초기 data을 제공하는 node는 doner가 된다.

즉, 초기 cluster 에서 가장 먼저 참여 하는 server가 doner가 된다. 

* Cluster 내에서 최초로 기동되는 MariaDB doner 노드이기에 --wsrep-new-cluster 옵션으로 시작


root@192.168.0.1:~$ service mysql start --wsrep-new_cluster
 * Starting MariaDB database server mysqld...                              [ OK ] 


2. 두번째 노드 Start

모든 환경이 셋팅 되어 있으므로 일반적인 방법으로 start


root@192.168.0.2:~$ service mysql start 
 * Starting MariaDB database server mysqld...                              [ OK ] 


3. 세번째 노드 Start

모든 환경이 셋팅 되어 있으므로 일반적인 방법으로 start


root@192.168.0.3:~$ service mysql start 
 * Starting MariaDB database server mysqld...                              [ OK ] 


4. Galera Custer 작동 확인 

이제 서버3대가 정상적으로 Galera Custer 구성이 되었는지 확인해 보자



root@192.168.0.1:~$ mysql -uroot 

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

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

| Variable_name            | Value                         |

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

| wsrep_incoming_addresses | 192.168.0.1:3306, 192.168.0.2:3306, 192.168.0.3:3306 |

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

1 row in set (0.00 sec)




MariaDB [(none)]> show variables like 'wsrep_cluster_address';

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

| Variable_name         | Value             |

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

| wsrep_cluster_address | gcomm://192.168.0.1:192.168.0.2:192.168.0.3 |

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

1 row in set (0.00 sec)


모두 정상적으로 기동되었다면 node1, 2, 3에 데이터가 싱크 되는지 확인해 보자.


node1(192.168.0.1) 에 접속하여 테스트 테이블을 생성하고, 데이터를 넣어보자.

[node1(192.168.0.1)]


CREATE TABLE cluster_test( 
  `id` INT NOT NULL AUTO_INCREMENT, 
  `test` VARCHAR(30) NOT NULL, 
   PRIMARY KEY (`id`) 
) ; 

INSERT INTO cluster_test(test)VALUES('node1 insert data');

SELECT * FROM cluster_test;    
    id  test               
------  -------------------
     2  node1 insert data  



node2(192.168.0.2) 에 접속하여 테스트 테이블이 생성되었는지, 데이터가 올바르게 있는지 확인하자.

물론 node2 에서 데이터를 생성하고 올바르게 node1,3에 싱크되었는지도 확인해보자.

[node2(192.168.0.2)]


SELECT * FROM cluster_test;

    id  test               
------  -------------------
     2  node1 insert data  

INSERT INTO cluster_test(test)VALUES('node2 insert data');     
SELECT * FROM cluster_test;
    id  test               
------  -------------------
     2  node1 insert data  
     6  node2 insert data  


위의 과정에 에러가 없었다면 cluster 구성은 잘 이루어졌고, Data Sync도 잘됨을 확인할 수 있다.

혹시나 해서 말씀드리는데 여기서는 테스트를 위해서 DDL문을 사용했지만 실제 Galera cluster 된 상태에서 create table, drop table, alter 과 같은 DDL문을 사용하는 것은 매우 주의를 요한다. 





반응형

댓글