install mariadb galera cluster

galera cluster 에 대한 이해에 대해선 다음 사이트를 참조한다.

Synchronous 방식의 Replication 인 galera cluster를 사용하기 전에 꼭 유념해야 할 부분은 다음과 같다.

  • 트랜젝션을 지원하는 엔진을 사용해야 된다. 일단 innodb면 된다.
  • 테이블마다 primary key가 꼭 있어야 한다.
  • 다른 커넥션끼리의 locking은 지원하지 않는다. 그러므로 트랜젝션시 하나의 커넥션을 유지 해야 한다.
  • wsrep_node_address=’gcomm://’ 으로 설정하고 리스타팅 하면 cluster group에서 분리된다.
  • wsrep_auto_increment_control 옵션에 의해 각 노드의 auto_increment의 증가수가 node의 수가 된다. 3개의 노드라면 3씩 증가한다. off를 할경우 auto_increment dead_lock이 걸릴수 있으니 대책을 마련해야 한다. reference : https://blog.mariadb.org/auto-increments-in-galera/
  • wsrep_sst_method 중 xtrabackup를 하기로 했다.
  • galera cluster는 홀수로 구성하여야 하며, 짝수로 구성시 garbd를 이용하여 3개를 맞춰준다.

case : ubuntu 12.04LTS

sudo apt-get install -y -qq python-software-properties
# add mariadb repository 
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/5.5/ubuntu precise main'
sudo apt-get -qq update

기존에 깔려있는 DB가 있다면 깔끔히 지우는게 좋다.

 #check preinstalled packages
dpkg -l | grep mariadb
dpkg -l | grep mysql

# remove mysql packages
sudo apt-get purge libdbd-mysql-perl libmysqlclient18 mariadb-common mysql-common
sudo apt-get autoremove

sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
sudo rm /etc/init.d/mysql

Install xtrabackup

reference : http://www.percona.com/doc/percona-xtrabackup/2.2/installation/apt_repo.html

sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
sudo /etc/apt/sources.list

deb http://repo.percona.com/apt precise main
deb-src http://repo.percona.com/apt precise main

sudo apt-get update
sudo apt-get install percona-xtrabackup

Install galera cluster mariadb

sudo apt-get install mariadb-common mariadb-client 
sudo apt-get install galera mariadb-galera-server libmariadbd-dev

sudo vi /etc/mysql/my.cnf
[client]
#bind-address           = 127.0.0.1

sudo vi /etc/mysql/conf.d/mariadb.cnf
[client]
default-character-set = utf8

[mysqld]
character-set-server  = utf8 
collation-server      = utf8_general_ci 
#character_set_server   = utf8 
#collation_server       = utf8_general_ci
log_error                = /var/log/mysql/error.log

sudo vi /etc/mysql/conf.d/wsrep.cnf

[mysqld]
wsrep_cluster_name=[cluster_name]
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_node_address=[my_ip]
wsrep_cluster_address='gcomm://'
#wsrep_cluster_address='gcomm://[cluster_ip]'
wsrep_sst_method=xtrabackup
wsrep_sst_auth=[galera_account]:[galera_password]

binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1

# check wsrep status
mysql -uroot -e "SHOW STATUS LIKE 'wsrep_%'"

# wsrep mysqldump account setting
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* to '[galera_account]'@'localhost' IDENTIFIED BY '[galera_password]';"
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* to '[galera_account]'@'172.16.10.%' IDENTIFIED BY '[galera_password]';"
mysql -uroot -e "FLUSH PRIVILEGES;"

case : centos 6.4

reference : https://kb.askmonty.org/en/installing-mariadb-with-yum/

sudo vi /etc/yum.repos.d/MariaDB.repo

# MariaDB 5.5 CentOS repository list - created 2013-05-15 05:43 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-[i386/amd64]
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

sudo yum update
sudo yum install MariaDB-Galera-server MariaDB-client galera

sudo service iptables stop
sudo vi /etc/selinux/config

SELINUX=disabled

setenforce 0
# This would then disable SELinux on your next reboot

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

[mysqld]
character-set-server=utf8
log_bin=/var/lib/mysql/mariadb-bin
log_bin_index=/var/lib/mysql/mariadb-bin.index
pid-file = /var/lib/mysql/mysql.pid
socket = /var/lib/mysql/mysql.sock
log_error=/var/log/mysql.log

# for galera 
wsrep_cluster_name=[cluster_name]
wsrep_node_address=[my_ip]
wsrep_cluster_address='gcomm://'
#wsrep_cluster_address='gcomm://[cluster_ip],[cluster_ip]'
wsrep_provider='/usr/lib64/galera/libgalera_smm.so'
wsrep_sst_method=mysqldump
wsrep_sst_auth=[galera_account]:[galera_password]

binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1 

# to prevent cluster from erroring out on startup
sudo vi /usr/bin/wsrep_sst_common

#echo "WSREP_SST: $* ($tst)" >>/dev/stderr
echo "WSREP_SST: $* ($tst)" >&2

sudo service mysql start
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON *.* to '[galera_account]'@'localhost' IDENTIFIED BY '[galera_password]';"
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON *.* to '[galera_account]'@'%' IDENTIFIED BY '[galera_password]';"
mysql -uroot -p -e "FLUSH PRIVILEGES;"

mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_%';"

이 다음 부터는

1. 첫번째 MariaDB 서버(Doner)에서 두번째 MariaDB 서버(Joiner)를 연결한다.

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

wsrep_cluster_address='gcomm://[fisrt_joiner_ip]'

sudo service mysql restart

2. 세번째 MariaDB 서버(Joiner)를 첫번째, 두번째 MariaDB에 연결한다.

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

wsrep_cluster_address='gcomm://[fisrt_doner_ip], [second_joiner_ip]'

sudo service mysql restart

3. 나머지 첫번째 MariaDB 서버(Doner), 두번째 MariaDB 서버(Joiner)에 들어가 있지 않은 cluster 군의 ip를 입력한후 restart한다. 이때 ubuntu server의 경우 /etc/mysql/debian.cnf 안에 있는 password 가 첫번째 MariaDB와 같아야 한다. 그렇지 않으면 리부팅이 제대로 되지 않는다.

4. galera cluster 상태 확인 방법은 다음과 같다 각 서버의 wsrep_ready, wsrep_cluster_size는 서버가 제대로 작동하는 가를 확인해준다. wsrep_ready가 OFF가 되면 ‘WSREP has not yet prepared node for application use’란 메세지와 함께 query가 실행되지 않는다. wsrep_cluster_size가 짝수개면 spilt-brain의 위험이 있는 것이다.

mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_ready';"
mysql -uroot -p -e "SHOW STATUS LIKE ‘wsrep_cluster_size’;"

reference : http://www.sebastien-han.fr/blog/2012/04/01/mysql-multi-master-replication-with-galera/

5. galera cluster의 경우 짝수개의 서버로 구성되어있으면 일시적 네트워크 단절이나, 서버 다운등으로 spilt-brain 상황이되면 2개 서버의 경우 2개 서버다 wsrep_ready가 OFF가 되고, 3대의 서버의 경우 문제가 있는 그 서버만 wsrep_ready가 OFF가 된다. 그래서 짝수개의 서버군의 경우 garbd를 이용하여 홀수개로 맞춰준다.

case : ubuntu

sudo apt-get install galera

sudo vi /etc/default/garb

# A space-separated list of node addresses (address[:port]) in the cluster
# GALERA_NODES=""
GALERA_NODES=" [first_server_ip]:4567 [second_server_ip]:4567"

# Galera cluster name, should be the same as on the rest of the nodes.
# GALERA_GROUP=""
GALERA_GROUP="[cluster_name]"

# Optional Galera internal options string (e.g. SSL settings)
# see http://www.codership.com/wiki/doku.php?id=galera_parameters
# GALERA_OPTIONS=""

# Log file for garbd. Optional, by default logs to syslog
# LOG_FILE=""
LOG_FILE="/var/log/garbd.log"

sudo service garb start

6. 서버들이 wsrep_ready가 다 OFF 되서 불능상태가 되었을 경우 다음과 같은 명령어로 남아있는 서버를 서버 데몬을 리스타팅하지 않고도 복귀시킬수 있다. 이 작업은 아마도 서버들의 상태를 확인한 후에 직접 수정해야 한다.

mysql -uroot -p -e "SHOW VARIABLES LIKE 'wsrep_cluster_address'";

# alive server
mysql -uroot -p -e "SET GLOBAL wsrep_cluster_address='gcomm://'";

글쓴이

yupmin

Inside Deep Throat.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.