Mariadb에서 Galera와 Maxscale를 설치해본다.

1. Galera 설치

Galera를 사용하려면 최소 3대의 장비가 필요하다. 테스트는 아래 장비로 구성한다.

server name ip
server1 192.168.0.40
server2 192.168.0.41
server3 192.168.0.42

먼저 server1에서 my.cnf를 보면 [galera]부분이 보인다.초기는 모두 주석으로 되어 있다.3대의 클러스터가 서로 연결될 수 있는 계정을 만들어준다.

GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '1234' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO cluster_user@'%' IDENTIFIED BY '1234' WITH GRANT OPTION;

[Server1 세팅]

[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_address=gcomm://
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

#추가 
wsrep_provider_options="gcache.size=512M"
wsrep_cluster_name=test_cluster
wsrep_node_name=server1
wsrep_sst_method=rsync

wsrep_cluster_address에 최초서버에는 클러스트된 서버가 없으므로 기본으로 설정해야 한다. 추후에 다른 서버랑 클러스트되면 그때 수정한다. 저장을 하고 mariadb를 중지시키고 아래 옵션으로 재시작한다.

sudo service mysql stop
sudo service mysql start --wsrep_cluster_new

옵션 —wsrep_cluster_new 는 최초 1회만 수행하면 된다.

[Server2 세팅]

server2에서 같은 설정을 하고 경로만 수정한다.

wsrep_cluster_address=gcomm://192.168.0.40,192.168.0.41
wsrep_node_name=server2
wsrep_sst_receive_address=192.160.0.41:4569

[Server3 세팅]

wsrep_cluster_address=gcomm://192.168.0.40,192.168.0.41,192.168.0.42
wsrep_node_name=server2
wsrep_sst_receive_address=192.160.0.41:4569

[재시작]

Server2, Server3각각의 서버를 재시작한다.

sudo service mysql stop
sudo service mysql start (옵션필요없음)

세 개의 서버가 정상적으로 작성되면 각각의 my.cnf파일을 열어서 wsrep_cluster_address를 동일하게 수정한다. 이렇게 되면 만약 서버가 재시작될경우 작성된 아이피로 클러스트링이 이루어진다.

wsrep_cluster_address=gcomm://192.168.0.40,192.168.0.41,192.168.0.42

[확인]

세팅이 모두 끝났으면 server1에서 해당 쿼리를 실행해보자..

SHOW STATUS LIKE 'wsrep%';

그러면 아래와 같이 나오면 정상적으로 세팅된 것이다.

Variable_name Value
wsrep_cluster_conf_id 3
wsrep_cluster_size 3
wsrep_cluster_state_uuid 00be20a6-28be-11e7-9400-678af9ffc349
wsrep_cluster_status Primary
wsrep_connected ON

[에러발생시]

1) 에러

Apr 24 16:12:40 ubuntu1 mysqld[8844]: 2017-04-24 16:12:40 140660766763264 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave th
Apr 24 16:12:40 ubuntu1 mysqld[8844]: 2017-04-24 16:12:40 140660766763264 [ERROR] WSREP: wsrep::connect(gcomm://) failed: 7
Apr 24 16:12:40 ubuntu1 mysqld[8844]: 2017-04-24 16:12:40 140660766763264 [ERROR] Aborting

Galera관련 파일을 삭제한다.

sudo rm -rf galera.cache grastate.dat wsrep_sst_binlog.tar 

2) 에러

Apr 24 16:40:15 ubuntu1 mysqld[10977]: 2017-04-24 16:40:15 139623460747520 [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection ti
Apr 24 16:40:15 ubuntu1 mysqld[10977]:          at gcomm/src/pc.cpp:connect():158
Apr 24 16:40:15 ubuntu1 mysqld[10977]: 2017-04-24 16:40:15 139623460747520 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():208: Failed to open backend connection: -110 (Connection 
Apr 24 16:40:15 ubuntu1 mysqld[10977]: 2017-04-24 16:40:15 139623460747520 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1380: Failed to open channel 'test_cluster' at 'gcomm://192.168.0.4
Apr 24 16:40:15 ubuntu1 mysqld[10977]: 2017-04-24 16:40:15 139623460747520 [ERROR] WSREP: gcs connect failed: Connection timed out
Apr 24 16:40:15 ubuntu1 mysqld[10977]: 2017-04-24 16:40:15 139623460747520 [ERROR] WSREP: wsrep::connect(gcomm://192.168.0.40,192.168.0.41,192.168.0.42) failed: 7
Apr 24 16:40:15 ubuntu1 mysqld[10977]: 2017-04-24 16:40:15 139623460747520 [ERROR] Aborting

해결방법

sudo galera_new_cluster

2. Galera의 사용시 유의점

Galera설치후에 auto_increment가 증가하는 문제가 있다. 즉, 같은 인서트문을 3번 수행하면 auto_increment가 5번부터 시작일때 5,6,7으로 되지 않고 아래처럼 증가한다.

id val
5 val1
8 val2
13 val3
18 val4

한마디로 auto_increment가 +1이 아닌 노드 갯수만큼 증가한다. 물론 이와 같은 것을 방지하기 위해서는 아래 옵션을 줘서 해결할 수 있다.

[galera]
wsrep_auto_increment_control=off

문제는 이와 같이만 설정하면 데드락 문제가 발생한다. 관련되서는 아래서 블로그를 참조하자.

MariaDB / Galera Cluster / 데드락이 생긴다!?

3. Maxscale 설치

문제를 해결하기 위해서 우리는 Maxscale 를 사용하도록 한다. 설치는 쉽다. 홈페이지에서 다운받고 패키지를 설치하면 된다. 우분투에서는 다음과 같이 설치하도록 하자.

sudo dpkg -i maxscale-2.0.5-1.ubuntu.xenial.x86_64.deb

그럼 다음 각각의 maxscale에서 각각의 mariadb를 접속하기 위해서 계정을 만들어주자.

GRANT ALL PRIVILEGES ON *.* TO maxscale@'%' IDENTIFIED BY '1234' WITH GRANT OPTION;

/etc/maxscale.cnf 에서 파일을 수정하자

[maxscale]
#threads=1
threads=4

# Server definitions
#
# Set the address of the server to the network
# address of a MySQL server.
#

[server1]
type=server
address=192.168.0.40
port=3306
protocol=MySQLBackend

[server2]
type=server
address=192.168.0.41
port=3306
protocol=MySQLBackend

[server3]
type=server
address=192.168.0.42
port=3306
protocol=MySQLBackend

# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.

# MySQL Monitor documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md

#[MySQL Monitor]
#type=monitor
#module=mysqlmon
#servers=server1
#user=myuser
#passwd=mypwd
#monitor_interval=10000

[Splitter Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale
passwd=1234


[Galera Monitor]
type=monitor
module=galeramon
servers=server1,server2,server3
#use_priority=true
user=maxscale
passwd=1234


# Service definitions
#
# Service Definition for a read-only service and
# a read/write splitting service.
#

[Splitter Listener]
type=listener
service=Splitter Service
protocol=MySQLClient
port=4040
socket=/tmp/ClusterMaster

[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default


[CLI]
type=service
router=cli

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
address=localhost
port=6603

설정이 되면 service maxscale start 를 실행시키면 된다.