MariaDB Galera를 이용한 다중화 구성

 

MariaDB Galera를 이용한 다중화 구성

 

장애를 대비한 이중화 구성은 안정적인 서비스를 위한 최선책입니다. DB 역시 요즘은 HA 구성에서 Master-Master 구성을 가지는 다중화 기능으로 변화하고 있습니다. Oracle은 오래전부터 RAC라는 Active-Active 구조의 아주 뛰어난 클러스터링 시스템을 가지고 있었고, MariaDB와 MySQL은 기존의 Replication 방식이 아닌 Galera 를 이용한 클러스터 구성이 새로 등장 했습니다. 그래서 그 갈레라 제가 한번 설치해 봤습니다… CentOS 7에 MariaDB 10.3 버전으로 3노드 구성을 했습니다. 모든 노드에 MariaDB를 설치 합니다.

 

MariaDB Repository 설치

$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

MariaDB Yum 설치

yum install mariadb mariadb-server

MariaDB 파라미터 설정 및 갈레라 구성

Node01

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

# this is only for the mysqld standalone daemon
[mysqld]
#innodb
default-storage-engine          = InnoDB
innodb_buffer_pool_size         = 512M
innodb_flush_method             = O_DIRECT
innodb_log_buffer_size          = 16M
innodb_log_file_size            = 256M
innodb_io_capacity              = 2000
innodb_io_capacity_max          = 6000
innodb_flush_log_at_trx_commit  = 2

##logs
slow_query_log                  = ON
long_query_time                 = 10

## limits
join_buffer_size                = 1M
read_buffer_size                = 256K
read_rnd_buffer                 = 1M
tmp_table_size                  = 256M
max_heap_table_size             = 256M
lock_wait_timeout               = 300

innodb_monitor_enable           = all
performance_schema              = ON

#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.10.181,192.168.10.182,192.168.10.183"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name='mariadb-cluster'
wsrep_node_address='192.168.10.181'
wsrep_node_name='mariadb01'
wsrep_sst_method=rsync
wsrep_sst_auth=root:password
wsrep_sst_receive_address=192.168.10.181
wsrep_provider_options="gcache.recover=yes"

Node02

[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.10.181,192.168.10.182,192.168.10.183"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name='mariadb-cluster'
wsrep_node_address='192.168.10.182'
wsrep_node_name='mariadb02'
wsrep_sst_method=rsync
wsrep_sst_auth=root:password
wsrep_sst_receive_address=192.168.10.182
wsrep_provider_options="gcache.recover=yes"

Node03

[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.10.181,192.168.10.182,192.168.10.183"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name='mariadb-cluster'
wsrep_node_address='192.168.10.183'
wsrep_node_name='mariadb03'
wsrep_sst_method=rsync
wsrep_sst_auth=root:password
wsrep_sst_receive_address=192.168.10.183
wsrep_provider_options="gcache.recover=yes"

mysqld 부분은 세 노드 모두 똑같이 설정합니다.

기본값으로 올리기 보다는 몇가지 튜닝을 적용한 값인데, 기본적으로 Zabbix나 애플리케이션이 붙을때를 위해 약간의 조정을 해주는 겁니다. 서버의 사양에 따라 많고 다양한 파라미터 적용값이 있지만 VM 테스트에서 기본적으로 적용한 값이고, percona-pmm 모니터링을 위한 설정을 몇가지 추가 했습니다.

갈레라 부분의 변경한 파라미터 값의 의미를 알아보도록 하죠.

[galera]
# Mandatory settings
wsrep_on=ON
갈레라 클러스터를 활성화합니다.

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
libgalera_smm.so 라이브러리의 위치를 지정해 줍니다. find / -name libgalera_smm.so  하면 위치를 쉽게 찾을 수 있습니다.

wsrep_cluster_address=”gcomm://192.168.10.181,192.168.10.182,192.168.10.183
클러스터에 포함될 노드의 ip를 적어줍니다.

wsrep_cluster_name=’mariadb-cluster
갈레라 클러스터의 이름을 지정해 줍니다.

wsrep_node_address=’192.168.10.181
각각의 노드가 가진 localhost의  IP를 적어줍니다.

wsrep_node_name=’mariadb01
각각의 노드의 호스트네임을 적어줍니다.

wsrep_sst_method=rsync
노드간 sync 방식을 지정해 줍니다.

wsrep_sst_auth=root:password
rsync에 사용할 계정과 패스워드를 적어줍니다.

wsrep_provider_options=”gcache.recover=yes
갈레라 클러스터중 노드가 종료되었을때 깨진 클러스터를 재구성하지 않고 DB를 되살리기 위한 옵션입니다.

 

마스터가 될 첫번째 cluster 노드 (doner) 의 구동

/etc/init.d/mysql start --wsrep-new-cluster

첫번째 노드만 –wsrep-new-cluster 옵션을 이용해 구동해 줍니다.

Galera 4 버전에서는 galera_new_cluster 명령을 사용합니다.

$ galera_new_cluster

나머지 노드에서는 systemctl start mysqld (mariadb) 하면 됩니다.

 

갈레라 클러스터 확인

ariaDB [(none)]> show variables like '%wsrep_cluster%';
+-----------------------+------------------------------------------------------+
| Variable_name         | Value                                                |
+-----------------------+------------------------------------------------------+
| wsrep_cluster_address | gcomm://192.168.10.181,192.168.10.182,192.168.10.183 |
| wsrep_cluster_name    | mariadb-cluster                                      |
+-----------------------+------------------------------------------------------+

 

갈레라 클러스터의 전체 재구동

갈레라 클러스터는 모든 노드가 종료되었을시 일반적인 명령을 통해 정상적으로 구동되지 않습니다. rsync 혹은 Xtrabackup(mariabackup)을 이용할 경우 아래와 같은 순서로 구동할 수 있습니다.

 

우선 마스터가 될 노드에

wsrep_cluster_address=”gcomm://192.168.10.181,192.168.10.182,192.168.10.183″

부분을 다 지웁니다.

wsrep_cluster_address=”gcomm://”

ip는 다지우고

wsrep_provider_options=”gcache.recover=yes”

옵션을 주고 기동 시킵니다.

그리고 DB를 구동 시킵니다.

/etc/init.d/mysql start –wsrep-new-cluster

 

두번째 노드는

wsrep_cluster_address=”gcomm://192.168.10.181″

부분을 mater node의 ip만 기입한채

wsrep_provider_options=”gcache.recover=yes”

옵션을 주고 기동 시킵니다.

 

세번째 노드는

wsrep_cluster_address=”gcomm://192.168.10.181,192.168.10.182″

부분을 mater node와 두번째노드의 ip를 기입하고

wsrep_provider_options=”gcache.recover=yes”

옵션을 주고 기동 시킵니다.

 

그러면 세 노드가 모두 올라옵니다. 이 상태에서 각 노드의 옵션을

wsrep_cluster_address=”gcomm://192.168.10.181,192.168.10.182,192.168.10.183″

바꾸고 순서대로 하나씩 내렸다가 올립니다.

MariaDB [(none)]> show variables like '%wsrep_cluster%';
+-----------------------+------------------------------------------------------+
| Variable_name         | Value                                                |
+-----------------------+------------------------------------------------------+
| wsrep_cluster_address | gcomm://192.168.10.181,192.168.10.182,192.168.10.183 |
| wsrep_cluster_name    | mariadb-cluster                                      |
+-----------------------+------------------------------------------------------+

그럼 다시 조회 했을때 위와 같이 조회가 되면서 갈레라 구성이 살아납니다.

 

mysqldump를 SST 옵션으로 사용할 경우 해당 상황에서 노드를 부팅하기 위한 파라미터가 있습니다.

  • pc.wait_prim=no: 무기한으로 기본 컴포넌트를 기다린다(mysqldump를 SST복제 방식으로 요청합니다).
  • pc.bootstrap=1: 기본 노드를 부트스트랩한다(비어있는 ‘gcomm://’ 값으로 노드가 시작하는것을 막는다).

갈레라 설정에 아래와 같이 설정하면 사용할 수 있습니다.

gcomm://192.168.10.181?pc.waitprim=no&pc.bootstrap=1,192.168.10.182,192.168.10.183

 

스플릿 브레인 상태에서의 복구

갈레라 클러스터에서 다수의 노드(N/2+1)에서 장애가 발생하면 성능 저하 상태에 빠지거나 장애가 발생합니다. 이러한 현상을 스플릿 브레인이라고 합니다. 스플릿 브레인 상태의 클러스터에서 장애 노드를재구동 하고 싶다면 아래와 같은 절차로 진행을 합니다. 살아있는 노드에 접속하여 다음과 같은 명령을 실행합니다.

MariaDB [(none)]> SHOW STATUS LIKE ‘wsrep_last_committed’;

해당 명령으로 가장 높은 값을 가진 노드를 찾으면 가장 높은 값을 지닌 노드에 접속하여 쿼럼을 다시 설정합니다.

MariaDB [(none)]> SET GLOBAL wsrep_provider_options=‘pc.bootstrap=1’;
MariaDB [(none)]> SET GLOBAL wsrep_provider_options=‘pc.ignore_quorum=0’;

이 방법을 통해 해당 노드를 마스터로 변경할 수 있고, 다른 노드들이 새로운 마스터와 동기화를 시작합니다. 갈레라 클러스터를 완전히 복구한 후에는 해당 값들을 반드시 원상복구 해줘야 합니다.

 

오라클 RAC와의 차이점

오라클 RAC는 하나의 스토리지를 여러 노드가 공유해서 사용합니다. 어느 노드에서 작업이 이루어 져도 같은 디스크에 쓰기 때문에 작업후 추가적으로 동기화 작업이 일어나지 않습니다. MariaDB나 MySQL에서 갈레라를 통한 다중화 구성은 Master-Master 구성이 맞긴 하지만 한 노드의 작업이 이루어지면 다른 노드에는 해당 결과 값을 복사를 해서 동기화하는 과정을 거치기 때문에, 노드가 늘어나면 DB의 리소스 여유가 생기고 작업에 대한 부담이 줄어드는 오라클과 달리, MariaDB는 노드가 늘어날수록 동기화의 시간이 더 소요 되고 성능적인 저하 발생합니다. 또 갈레라 클러스터 구성 상태에서 create table, database 같은 DDL 작업에 있어서 다소 무리가 있기 때문에 RLU 방식의 롤링 업그레이드를 직접 해주는 것을 권장합니다.

 

 

소셜 미디어로 공유하기

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

 

새 블로그로 이사갑니다.

 

rastalion.dev

 

도메인 변경했어요. 현재 지속적으로 개선 중입니다.

 

This will close in 10 seconds