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://'";