Intro

Features

  • Synchronous Replication
  • Multi Master topology
  • 아무곳에나 read, write 실행 가능
  • 자동 관리.. 즉 한 DB가 죽으면 자동으로 cluster에서 제외됨
  • Automatic node joining
  • True parallel replication, on row level

Install & Configure Galera Cluster

10.1 버젼부터 Galera Cluster가 함께 제공되고 있습니다.
https://downloads.mariadb.org/mariadb/repositories/ 여기에 들어가면,
10.1을 깔수 있으며, 그냥 시키는대로 하면 됩니다.

Setting Firewall

Port 사용되는 곳
3306 For MySQL client connections and State Snapshot Transfer that use the mysqldump method.
4567 For Galera Cluster replication traffic, multicast replication uses both UDP transport and TCP on this port.
4568 For Incremental State Transfer.
4444 For all other State Snapshot Transfer.

my.cnf

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

skip-host-cache
skip-name-resolve
#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages     = en_US
skip-external-locking

# Galera Cluster Required
wsrep_on=ON
wsrep_causal_reads=ON
binlog_format = ROW
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
innodb_flush_log_at_trx_commit=0
wsrep_retry_autocommit=10

# Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
#wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
wsrep_node_address="node_ip"
wsrep_node_name="node_name"

Primary Node

중요한점은 Primary Node는 wsrep_cluster_address부분을 아무것도 설정하지 않습니다.

wsrep_cluster_address="gcomm://"
wsrep_node_address="primary_node_ip"
Additional Cluster Node

Running Primary Node

Cluster의 첫번째 Node는 다음과 같이 실행시킵니다.

sudo service mysql start --wsrep-new-cluster
sudo service mysql restart --wsrep_new_cluster

상태체크는 다음과 같이 합니다.

systemctl status mariadb.service

클러스터 상태체크

SHOW STATUS LIKE 'wsrep_%';

wsrep_cluster_address 그리고 wsrep_node_address 이 부분이 중요한데,
3306이 포트를 찾는게 아니라 4567 포트로 먼저 통신을 하게 됩니다.

#wsrep_cluster_address="gcomm://first_ip:4567,second_ip:4567,third_ip:4567"<br>
wsrep_node_address="ip:4567"

Dockerinzing MariaDB

Install Dockerized MariaDB 10.1

git clone git@github.com:AndersonJo/mariadb10.1-docker.git

docker build -t mariadb .
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 --name cluster1 -d mariadb

Connect to each other

Docker의 –link 는 Bidirectional Connection (즉 서로 연결되는 Connection) 을 지원하지 않습니다.
(아직 Running도 안하는 Container에 연결을 시킬순 없겠죠)
대신에 서로의 IP 주소로 들어갈수 있습니다.
inspect로 현재 컨테이너의 IP Address를 알아낼수 있습니다.

docker inspect cluster1  | grep IPAddress

# 만약 Container 안이라면..
cat /etc/hosts

Create a primary node

docker run --name cluster01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mariadb mysqld --wsrep_new_cluster

MySQL에 Cilent로 로그인 한뒤, 다음의 명령어로 status를 확인할수 있습니다.

show status like 'wsrep%';

–wsrep-new-cluster 의 의미는 연결할수 있는 cluster가 없고, 새로운 history UUID를 만듭니다.
restarting server를 하면 새로운 UUID가 만들어지며, old cluster에 reconnect하지 않습니다.

Primary Node 의 my.cnf 에 반드시 들어가야 할 내용

wsrep_cluster_address="gcomm://172.17.0.3"
wsrep_node_address="172.17.0.2"
wsrep_node_name="cluster01"

wsrep_cluster_address 에는 다른 nodes 의 주소를 , comma 를 통해서 써넣습니다.
wsrep_node_address 에는 자신의 주소를 적어넣습니다.

Creating Network (Optional)

먼저 Network를 만듭니다.

docker network create mynetwork
docker network ls

NETWORK ID          NAME                DRIVER
5ad5a14327d4        mynetwork           bridge              
89c3406dab1e        bridge              bridge              
b6ce7303a798        none                null                
33ae8e65897a        host                host

docker를 실행할때 –net=<네트워크 이름=""> 을 통해서 어디 네트워크를 사용할지 결정할수 있습니다.
기본적으로 --net 옵션을 주지 않는다면 bridge (docker0 네트워크) 라는 network를 기본적으로 사용하게 됩니다.

유용한 링크

docker run -d --name fission --net=host -p 0.0.0.0:3370:3370 cluster

docker pull mariadb
docker run -p 3306:3306 --name db01 -e MYSQL_ROOT_PASSWORD=1234 -d mariadb:10.0.22 --wsrep-new-cluster
docker run -p 3306:3306 -p 4444:4444 -p 4567-4568:4567-4568 -e MYSQL_ROOT_PASSWORD=1234 -v /home/ubuntu/db/mysql:/var/lib/mysql -v /home/ubuntu/db/log/mysql:/var/log/mysql/ --name cluster -d mariadb mysqld --wsrep_new_cluster