[ MARIA ] Galera Cluster 구성
- -
■ 갈레라 클러스터 장점
- 진정한 다중 마스터 : 아무 때나 어떤 노드에서도 읽기와 쓰기가 가능하다.
- 동기적 복제 : 슬레이브 지연이 없고 노드 충돌 시에 데이터 손실이 없다.
- 일관적인 데이터 : 모든 노드는 같은 상태를 유지한다.
- 멀티스레드 슬레이브 : 어떠한 워크로드에서도 더 나은 성능을 가능케한다.
- 상시 대기 : 장애 극복 시 downtime이 없다.
- 읽기와 쓰기 스필릿이 필요 없다 : 읽기와 쓰기 요청을 스플릿할 필요가 없다.
- 자동 노드 복제 : 노드를 추가하거나 유지 관리를 위해 종료 할 때 증분 데이터 또는 기본 데이터를 수동 백업할 필요 없시 Galera Cluster는 자동으로 온라인 노드 데이터를 가져온다.
■ 갈레라 클러스터 단점
- 동기적 복제이다 보니 클러스터의 성능은 클러스터에서 가장 낮은 성능 노드에 의해 결정됨 ( 기본적으로는 모두 같은 성능의 서버를 사용 )
- innodb 스토리지 엔진 테이블만을 지원한다.
- 새 노드 조인 또는 대형 노드가 다시 조인하는데 지연되면 데이터 전체를 복사하게된다. 복제시 Doner 노드는 동기화 중에 쓰기를 제공 할 수 없다.
■ 갈레라 클러스터 제한 사항
- innodb 스토리지 엔진만을 지원
- Galera Cluster는 모든 노드 간의 서로 다른 쿼리 실행 순서를 피하기 위해 모든 테이블에서 기본키를 필수적으로 사용한다. 사용자가 직접 만들지 않으면 갈레라가 직접 만들게된다.
- Galera cluster 는 Query Cache를 비활성화한다
- XA 트랜잭션 (전역 트랜잭션)은 지원하지 않는다.
■ 갈레라 클러스터 전송 방법
Galera Cluster 전송 방법
- 현재 클러스터에서 어떤 노드를 통합해야 할 떄 동작 중인 노드는 상태를 바꾸고 도너로 되는 것으로 설계되어있다. 도너는 새로운 노드에 데이터를 전송하는 전용 노드이다.
* 노드가 Doner 모드일때, 데이터 전송이 끝날 떄까지 이 노드에서 Transaction Lock이 걸린다.
1.SST = 전체 백업을 하기 위한 방법이다.
2.IST = 잃어버린 데이터를 전송하기 위한 방법으로 증분이다.
1.MySQLDUMP
- myqsldump는 SST는 가능하지만 IST 데이터 전송은 불가능하다. 해당 mysqldump로 할시 큰 데이터베이스에서는 클러스터에 새로운 노드를 통합할떄 SST가 며칠이 걸릴 수도 잇다.
사용방법
create user 'sst_user'@'%' identified by 'sst_password';
grant all on *.* to 'sst_user'@'%';
flush privileges;
galera.cnf 에 아래 설정 추가
wsrep_sst_method = mysqldump
wsrep_sst_auth = 'sst_user:sst_password'
Logical This method uses mysqldump. It requires that you fully initialize the receiving server and ready it to accept connections before the transfer.
This is a blocking method. The Donor Node becomes READ-ONLY for the duration of the transfer. The State Snapshot Transfer applies the FLUSH TABLES WITH READ LOCK command on the donor node.
2.Xtrabackup
- Xtrabckup은 SST와 IST 전송을 수행하는 빠른 방법이다.
- Xtrabackup 설치한후 galera.cnf 에 설정 추가 wsrep_sst_method = xtrabackup
Some of these methods, such as xtrabackup can be made non-blocking on the donor. They are supported through a scriptable SST interface.
3.rsync
- rsync는 IST와 SST 전송을 하기 위한 가장 빠른 방법이다. 하지만 도너 노드에서 긴 시간동안 Transaction Lock이 걸린다.
* https://galeracluster.com/library/documentation/state-transfer.html
4.Mariabackup ( https://mariadb.com/kb/en/mariabackup-sst-method/ )
- SST 방법중 하나로 도너 노드를 차단하지 않는 방법 중 하나이다.
- mariabackupSST 방법 을 사용하는 경우 socat서버 에도 설치되어 있어야 합니다. 이는 도너 노드에서 조이너 노드로 백업을 스트리밍하는 데 필요합니다
create user 'mariabackup'@'%' identified by 'mypassword';
grant all on *.* 'mariabackup'@'%';
flush privileges;
- galera.cnf 에 아래 설정 추가
wsrep_sst_auth = 'mariabackup:mypassword'
wsrep_sst_method='mariabackup'
Galera Cluster 설치 |
■ TEST 환경
- Cent 7
- Galera1 ( 10.0.3.40 ) , Galera2 ( 10.0.3.8 ) , Galera3 ( 10.0.3.185 )
- 10.2.12-MariaDB
■ 0. 필수 설정 ( 방화벽, Package 등 )
- 3306 MariaDB 서비스 포트
- 4444 요청 SST의 포트
- 4567 그룹 구성원 간의 통신 포트
- 4568 IST 전송에 사용되는 포트
#package 설치
yum -y install rsync nmap lsof perl-DBI nc
#Selinux 설정
[root@galera1 opc]# setenforce 0
#방화벽 설정 ( https://galeracluster.com/library/documentation/firewall-settings.html )
firewall-cmd --permanent --add-service=mysql
firewall-cmd --permanent --add-port={3306,4567,4568,4444}/tcp
firewall-cmd --permanent --add-port=4567/udp
firewall-cmd --reload
firewall-cmd --list-ports
■ 1. DB 설치 ( 모든 서버 )
- yum으로 설치하거나 Binary 설치
■ 2. Galera Cluster 설정 ( 모든 서버 )
- https://mariadb.com/kb/en/configuring-mariadb-galera-cluster/ -- Galera Cluster 필수 파라미터
- wsrep_provider : Galera 라이브러리 경로
- wsrep_cluster_address : Galera 클러스터 주소 형식 및 사용법 참조
- binlog_format=ROW : 바이너리 로그 형식 참조
- default_storage_engine=InnoDB
- innodb_autoinc_lock_mode=2
- innodb_doublewrite=1 : 이것은 기본값이지만 Galera 공급자 버전 >= 2.0을 사용할 때 변경하면 안 됩니다.
- query_cache_size=0 : MariaDB Galera Cluster 5.5.40, MariaDB Galera Cluster 10.0.14 및 MariaDB 10.1.2 이전 MariaDB 버전에만 필수입니다 .
- wsrep_on=ON : wsrep 복제 활성화(10.1.1부터)
[root@galera1 etc]# vi /etc/my.cnf.d/galera.cnf
[galera]
wsrep_on=ON
wsrep_provider=/data/maria/lib/galera/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://10.0.3.40,10.0.3.8,10.0.3.185'
wsrep_node_address='10.0.3.40'
wsrep_node_name='node1'
wsrep_sst_method=rsync
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_provider_options="gcache.size = 512M; gcache.name = /tmp/galera.cache; gcache.page_size = 100M"
#wsrep_provider = 갈레라 플러그인이 있는 위치 ( find / -name 'libgalera_smm.so' )
#wsrep_cluster_name 클러스터의 이름
#wsrep_node_name = 현재 노드의 고유한 이름으로 여러 설정에서 같은 노드 이름으로 된것을 피하고 싶을때 사용한다.
#wsrep_node_address = 현재 노드의 IP
#wsrep_cluster_address = 클러스터의 멤버 리스트이다. 나열된 모든 노드는 마스터와 갈레라 클러스터의 일부이다.
#wsrep_provider_options = 클러스터의 추가적인 옵션을 활성화한다.
1) gcache.size = 갈레라를 위한 전용 캐시로 디스크 캐시에 버퍼되며 데이터 베이스 크기보다 작아야한다. 복제 요청이 들어오고 적용하는 등의 작업을 할 떄 저장하기 위해 사용한다. 높은 트래픽 부하에서도 항상 모든 노드를 동기화 하고 싶다면 이 값을 키워야한다.
2) gcache.name = gcache가 저장될 위치와 이름
3) gcache.page_size = 페이지 스토리지에 있는 페이지 파일의 크기다.
#wsrep_sst_method = 노드간의 전송 방법이다. ( rsync, mysqldump, xtrabackup, xtrabackup-v2, mariabackup )
* rsync = 가장 원시적인 데이터 동기화 방법으로 권장되지 않는다. 왜냐하면 데이터 동기화가 진행되는 동안 Donor(데이터를 제공하는 노드)에서 읽기 및 쓰기 명령이 불가능하기 때문이다. (이 때 클러스터 노드 수가 2개라면 완전한 클러스터 다운 타임이 발생한다.)
* Mariabackup / mysqldump 등을 사용할시 wsrep_sst_auth 파라미터와 mysqldump / mariabackup시 사용될 유저 생성이 필요하다.
https://mariadb.com/kb/en/introduction-to-state-snapshot-transfers-ssts/#sst-methods
#gcache 관련 Default 값이다.
gcache.dir = /data/mariadb/volume/; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = galera.cache; gcache.page_size = 128M; gcache.recover = yes; gcache.size = 128M;
■ 3. Galera Cluster 기동
-wsrep_local_state_comment : 노드의 현재 상태를 알려준다.
1) Joining : 노드가 클러스터에 들어가고 잇다.
2) Doner / Desynced : 노드가 Donor 모드(다른 노드에 데이터를 복제)에 있거나 다른 노드와 동기화되지 않았다.
3) Joined : 노드가 클러스터에 들어왔다.
4) Synced : 노드가 클러스터의 멤버다.
-wsrep_cluster_size : 갈레라 클러스터에 있는 노드 멤버의 수를 나타낸다.
-wsrep_cluster_state_uuid : 고유한 클러스터 ID로 연결된 모든 노드가 같은 값을 가지고있어야한다.
-wsrep_cluster_conf_id : 노드에 관하여 현재 복제 상태를 알려준다.
1) Primary : 마스터 상태의 노드
2) Non-primary : 마스터가 아닌 노드
3) Disconnected : 클러스에 연결되지 않는 노드
-wsrep_connected : 복제를 위한 네트워크 연결을 나타낸다.
-wsrep_ready : 노드가 준비되고 SQL 트랜잭션을 다룰수 있음을 나타낸다.
1. 1번 NODE Start
[root@galera1 ~]# mysqld_safe --user=mysql --wsrep-new-cluster &
[1] 9335
[root@galera1 ~]# 211125 00:32:40 mysqld_safe Logging to '/data/log/mariadb.log'.
211125 00:32:40 mysqld_safe Starting mysqld daemon with databases from /data/data
MariaDB [(none)]> show status like '%wsrep_%';
+------------------------------+--------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------+
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 0.000000 |
| wsrep_causal_reads | 0 |
| wsrep_cert_deps_distance | 0.000000 |
| wsrep_cert_index_size | 0 |
| wsrep_cert_interval | 0.000000 |
| wsrep_cluster_conf_id | 1 |
| wsrep_cluster_size | 1 |
| wsrep_cluster_state_uuid | 46d32e39-4d88-11ec-b8c6-0784d3a344a0 |
| wsrep_cluster_status | Primary |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 0.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 | 46d2c045-4d88-11ec-8047-332ac3e728aa |
| wsrep_incoming_addresses | 10.0.3.40:3306 |
| wsrep_last_committed | 0 |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_cached_downto | 18446744073709551615 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_commits | 0 |
| wsrep_local_index | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_avg | 0.000000 |
| wsrep_local_recv_queue_max | 1 |
| 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 | 46d32e39-4d88-11ec-b8c6-0784d3a344a0 |
| wsrep_protocol_version | 7 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 25.3.22(r3764) |
| wsrep_ready | ON |
| wsrep_received | 2 |
| wsrep_received_bytes | 138 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_thread_count | 2 |
+------------------------------+--------------------------------------+
58 rows in set (0.00 sec)
2. 2번 NODE Start
[root@galera2 ~]# mysqld_safe --user=mysql &
[1] 9382
[root@galera2 ~]# 211125 00:52:05 mysqld_safe Logging to '/data/log/mariadb.log'.
211125 00:52:05 mysqld_safe Starting mysqld daemon with databases from /data/data
3. 3번 NODE Start
[root@galera3 data]# mysqld_safe --user=mysql &
[1] 9436
[root@galera3 data]# 211125 00:52:42 mysqld_safe Logging to '/data/log/mariadb.log'.
211125 00:52:42 mysqld_safe Starting mysqld daemon with databases from /data/data
4.모든 Node 조인후 wsrep
MariaDB [(none)]> show status like '%wsrep_%';
+------------------------------+------------------------------------------------+
| Variable_name | Value |
+------------------------------+------------------------------------------------+
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 0.000000 |
| wsrep_causal_reads | 0 |
| wsrep_cert_deps_distance | 0.000000 |
| wsrep_cert_index_size | 0 |
| wsrep_cert_interval | 0.000000 |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 46d32e39-4d88-11ec-b8c6-0784d3a344a0 |
| wsrep_cluster_status | Primary |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 0.000000 |
| wsrep_connected | ON |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0.000466856/0.00270845/0.00505961/0.00196639/8 |
| 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 | db777ad4-4d8d-11ec-9364-43dcad2a7fc3 |
| wsrep_incoming_addresses | 10.0.3.40:3306,10.0.3.8:3306,10.0.3.185:3306 |
| wsrep_last_committed | 4 |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_cached_downto | 18446744073709551615 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_commits | 0 |
| wsrep_local_index | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_avg | 0.000000 |
| wsrep_local_recv_queue_max | 1 |
| 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 | 46d32e39-4d88-11ec-b8c6-0784d3a344a0 |
| wsrep_protocol_version | 7 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 25.3.22(r3764) |
| wsrep_ready | ON |
| wsrep_received | 10 |
| wsrep_received_bytes | 717 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_thread_count | 2 |
+------------------------------+------------------------------------------------+
58 rows in set (0.00 sec)
■ 4. Galera Cluster DATA 확인
[root@galera1 data]# mysql -uroot -proot -e "insert into lee.lee values(1,'LEE');"
[root@galera2 data]# mysql -uroot -proot -e "select * from lee.lee;"
+------+------+
| a | b |
+------+------+
| 1 | LEE |
+------+------+
[root@galera3 data]# mysql -uroot -proot -e "select * from lee.lee;"
+------+------+
| a | b |
+------+------+
| 1 | LEE |
+------+------+
'MySQL & Maria' 카테고리의 다른 글
[MySQL] MySQL 5 vs 8 ( Auto_increment ) (2) | 2021.12.23 |
---|---|
[Maria] Galera Cluster 성능 튜닝 (0) | 2021.12.06 |
[MySQL] MSR ( Multi Source Replication ) (0) | 2021.11.23 |
[MySQL] MySQL_8.0 Binary Install (0) | 2021.11.10 |
[MySQL / Maria] Innodb_flush_log_at_trx_commit (0) | 2021.11.10 |
소중한 공감 감사합니다