MariaDB Galera Cluster via Docker
- Intro - {:.} Features
- Install & Configure Galera Cluster - {:.} Setting Firewall - {:.} my.cnf - {:.} Primary Node - {:.} Additional Cluster Node
- Running Primary Node
- Dockerinzing MariaDB - {:.} Install Dockerized MariaDB 10.1 - {:.} Connect to each other - {:.} Create a primary node - {:.} Creating Network (Optional)
- 유용한 링크

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