출처 : https://idchowto.com/?p=47066
1.Galera Cluster 란?
http://galeracluster.com/ 에서 제공되는 오픈소스로, 동기식의 복제구조를 사용하고 있습니다.
Mysql 리플리케이션과는 달리, active -active cluster 구조로 되어있습니다.
노드 추가와 제거가 매우 간단합니다.
InnoDB만 지원을 하며, 한 노드에서 테이블의 락이 걸리게 되면, 모든 노드에서도 같이 락이 걸리게 됩니다.
사용 버전 : Mysql 5.5이상, Mariadb 5.5이상 (10.1부터는 기본적으로 포함되어있습니다.)
2. Galera Cluster 설치 및 설정
테스트 진행환경 : CentOS 7.6 Mariadb 10.2
IP를 쓰지않고 A서버,B서버 IP로 칭하겠습니다.
Mariadb YUM 설치
# vi /etc/yum.repos.d/MariaDB.repo
[MariaDB]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1
# yum -y install mariadb-server galera rsync
Galera Cluster 설정
# vi /etc/my.cnf.d/server.cnf
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=”gcomm://A서버IP,B서버IP″
wsrep_cluster_name=cluster
wsrep_node_address=”A서버IP″
wsrep_node_name=”서버의hostname″
wsrep_sst_method=rsync
wsrep_sst_auth=”root:패스워드”
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
설정에 대한 설명
1) wsrep_on=ON // galera cluster 사용여부
2) wsrep_provider=/usr/lib64/galera/libgalera_smm.so // libgalera_snm.so 모듈 위치
3) wsrep_cluster_address=”gcomm://A서버IP,B서버IP″ // 본 서버를 포함한 동기화할 서버 IP 리스트
4) wsrep_cluster_name=cluster // 그룹명 (동기화할 서버들은 모두 동일해야 함.)
5) wsrep_node_address=”A서버IP″ // 현재 서버 IP
6) wsrep_node_name=”서버의hostname″
7) wsrep_sst_method=rsync // 동기화 될 데이터 전송방식
8) wsrep_sst_auth=”root:패스워드” // 데이터 전송시에 쓸 계정과 패스워드
9) binlog_format=row // 바이너리 로그파일 형식
10) default_storage_engine=InnoDB // 스토리지 엔진 타입
11) innodb_autoinc_lock_mode=2
12) bind-address=0.0.0.0 // 모든 IP에서 접근 허용
방화벽 설정
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 3306 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 4444 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 4567 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state –state NEW -m udp –dport 4567 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 4568 -j ACCEPT
# service iptables restart
첫번째 노드 실행 시
# galera_new_cluster
두번째 노드부터
# service mysql start
서비스 확인
# netstat -nltp | grep mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 14773/mysqld
tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 14773/mysqld
MariaDB [(none)]> show status like ‘wsrep_cluster_size’;
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| wsrep_cluster_size | 2 |
+——————–+——-+
1 row in set (0.00 sec)
MariaDB [(none)]> show status like ‘wsrep_incoming_addresses’;
+————————–+—————————————+
| Variable_name | Value |
+————————–+—————————————+
| wsrep_incoming_addresses | A서버IP:3306,B서버IP:3306 |
+————————–+—————————————+
1 row in set (0.00 sec)
MariaDB [(none)]> show status like ‘wsrep_%’;
+——————————+—————————————+
| Variable_name | Value |
+——————————+—————————————+
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 1.000000 |
| wsrep_causal_reads | 0 |
| wsrep_cert_deps_distance | 1.000000 |
| wsrep_cert_index_size | 4 |
| wsrep_cert_interval | 0.000000 |
| wsrep_cluster_conf_id | 2 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | d16835b4-2b67-11e9-87c0-f267b27d5379 |
| wsrep_cluster_status | Primary |
| wsrep_cluster_weight | 2 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 1.000000 |
| wsrep_connected | ON |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_flow_control_paused | 0.000000 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_flow_control_sent | 0 |
| wsrep_gcomm_uuid | d16538b5-2b67-11e9-a430-5e8e90c80541 |
| wsrep_incoming_addresses | A서버IP:3306,B서버IP:3306 |
| wsrep_last_committed | 7 |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_cached_downto | 1 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_commits | 0 |
| wsrep_local_index | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_avg | 0.125000 |
| wsrep_local_recv_queue_max | 2 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_avg | 0.000000 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_local_state_uuid | d16835b4-2b67-11e9-87c0-f267b27d5379 |
| wsrep_open_connections | 0 |
| wsrep_open_transactions | 0 |
| wsrep_protocol_version | 9 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy info@codership.com |
| wsrep_provider_version | 25.3.25(r3836) |
| wsrep_ready | ON |
| wsrep_received | 8 |
| wsrep_received_bytes | 1353 |
| wsrep_repl_data_bytes | 1820 |
| wsrep_repl_keys | 5 |
| wsrep_repl_keys_bytes | 160 |
| wsrep_repl_other_bytes | 0 |
| wsrep_replicated | 5 |
| wsrep_replicated_bytes | 2320 |
| wsrep_thread_count | 2 |
+——————————+—————————————+
A서버를 위와같이 구성했으면, B서버도 동일하게 구성해줍니다.
3. 동기화 테스트
[node 1에서 진행]
MariaDB [(none)]> create database galera_test;
Query OK, 1 row affected (0.03 sec)
MariaDB [(none)]> show databases;
+——————–+
| Database |
+——————–+
| galera_test |
| information_schema |
| mysql |
| performance_schema |
| test |
+——————–+
5 rows in set (0.00 sec)
[node 2에서 확인]
MariaDB [(none)]> show databases;
+——————–+
| Database |
+——————–+
| galera_test |
| information_schema |
| mysql |
| performance_schema |
| test |
+——————–+
5 rows in set (0.00 sec)
4. 노드 추가
새 노드에 아래에 IP를 추가한다.
# vi /etc/my.cnf.d/server.cnf
wsrep_cluster_address=”gcomm://A서버IP,B서버IP,C서버IP″
# service mysql start
기존 노드의 경우, mysql를 재시작 안해도 되며, server.cnf 파일에 위와같이 IP를 추가시켜준다.
5. 장애테스트
기본적으로 A서버와 B서버 중 A서버가 죽었을 때, A서버에서 다시 시작할때 mysql service start나 glaera_new_cluster로 시작해주면 복구가 됩니다.
하지만, 모든 노드가 죽었을 경우, mysql service start 나 galera_new_cluster 로 시작이 안됩니다.
이 경우, recovery 옵션을 통해 복구가 가능하다. 해당 부분은 데이터가 깨질 수가 있습니다.
# vi /var/lib/mysql/grastate.dat // 노드의 상태를 확인할 수 있다.
# GALERA saved state
version: 2.1
uuid: d16835b4-2b67-11e9-87c0-f267b27d5379
seqno: 9
safe_to_bootstrap: 0
safe_to_bootstrap의 넘버로 확인할 수 있으며, 노드들 중에, 한 노드가 safe_to_bootstrap이 1로 되어있는 노드가 존재합니다. 1로 되어있는 서버가 제일 마지막에 죽은 노드로, 최신 데이터를 가지고 있습니다. 그 노드가 존재하는 서버에서는 galera_new_cluster로 실행해주며, 나머지 노드들은 service mysql start로 시작해주면 시작이 됩니다.