kjh00n의 기록저장소
Project A에 Galera Cluster 구축 (MariaDB) 본문
[기본 망] (내가 만든거 아님)
[서버 구성]
서버 | OS | 사용한 패키지 |
Galera1 (MDB) (180.180.180.100) |
Rocky Linux 9.3 | ● mariadb-server-galera-10.5.27-1.el9_5.x86_64 ● mariadb-server-10.5.27-1.el9_5.x86_64 ● rsync-3.2.3-20.el9.x86_64 ● galera-26.4.20-1.el9_5.x86_64 ● chrony-4.5-3.el9.x86_64 |
Galera2 (SDB1) (180.180.180.200) |
Rocky Linux 9.3 | ● mariadb-server-galera-10.5.27-1.el9_5.x86_64 ● mariadb-server-10.5.27-1.el9_5.x86_64 ● rsync-3.2.3-20.el9.x86_64 ● galera-26.4.20-1.el9_5.x86_64 ● chrony-4.5-3.el9.x86_64 |
Galera3 (SDB2) (160.160.160.3) |
Rocky Linux 9.3 | ● mariadb-server-galera-10.5.27-1.el9_5.x86_64 ● mariadb-server-10.5.27-1.el9_5.x86_64 ● rsync-3.2.3-20.el9.x86_64 ● galera-26.4.20-1.el9_5.x86_64 ● chrony-4.5-3.el9.x86_64 |
1. 시간 동기화 [모든 서버]
pool 2.rocky.pool.ntp.org iburst를 주석처리하기
server time.bora.net iburst를 추가하기
systemctl enable chronyd.service
systemctl start chronyd.service
몇 초 뒤에 시간이 동기화 됨
2. 방화벽 설정 [모든 서버]
systemctl enable firewalld.service
systemctl start firewalld.service
firewall-cmd --state
firewall-cmd --permanent --add-service=mysql
firewall-cmd --permanent --add-port={3306,4444,4567,4568}/tcp
firewall-cmd --permanent --add-port=4567/udp
firewall-cmd --reload
firewall-cmd --list-ports
3306 : MariaDB의 기본 포트
4444 : SST(State Snapshot Transfer)에 사용되는 포트 / 새 노드가 추가될 경우 동기화
4567 : Galera Cluster 복제에 사용되는 포트 / UDP,TCP 둘 다 사용하며 복제 트래픽, 다중 복제에 사용
4568 : IST(Incremental State Transfer)에 사용되는 포트 / 기존 노드와 비교하여 트랜잭션 동기화에 사용
3. Galera Cluster 유저 생성 [모든 서버]
systemctl enable mariadb.service
systemctl start mariadb.service
mariadb -u root -p
CREATE USER 'gcuser'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'gcuser'@'%';
FLUSH PRIVILEGES;
4. Galera Cluster 설정 [모든 서버]
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://180.180.180.100,180.180.180.200,160.160.160.3
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name=cluster
wsrep_node_address=180.180.180.100 (각자의 IP에 맞게 설정)
wsrep_node_name=node1 (이름도 따로 설정해줘야함)
wsrep_sst_method=rsync
wsrep_sst_auth=gcuser:123456 (3번에서 생성한 계정의 id와 pw를 입력)
5. Galera Cluster 구동 [첫번째 서버]
180.180.180.100에서
galera_new_cluster 입력하기
※첫번째 서버는 systemctl restart mariadb하면 안돼!!!
6. 모든 서버의 MariaDB 재시작하기 [두번째, 세번째 서버]
systemctl restart mariadb
※오류가 발생한다?
systemctl stop mariadb
systemctl start mariadb
7. Galera Cluster 구동 확인하기 [첫번째 서버]
MariaDB [(none)]> show status like 'wsrep%';
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| wsrep_local_state_uuid | 6d9e07ad-ee73-11ef-8f7d-1b7a446b417a |
| wsrep_protocol_version | 11 |
| wsrep_last_committed | 16 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 22 |
| wsrep_received_bytes | 3740 |
| wsrep_local_commits | 0 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_max | 5 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0.5 |
| wsrep_local_cached_downto | 1 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_paused | 0 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_flow_control_active | false |
| wsrep_flow_control_requested | false |
| wsrep_cert_deps_distance | 0 |
| wsrep_apply_oooe | 0 |
| wsrep_apply_oool | 0 |
| wsrep_apply_window | 0 |
| wsrep_apply_waits | 0 |
| wsrep_commit_oooe | 0 |
| wsrep_commit_oool | 0 |
| wsrep_commit_window | 0 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 0 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0 |
| wsrep_open_transactions | 0 |
| wsrep_open_connections | 0 |
| wsrep_incoming_addresses | 180.180.180.100:0,180.180.180.200:0,160.160.160.3:0 |
| wsrep_cluster_weight | 3 |
| 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_gcomm_uuid | 8593aaf0-ee73-11ef-abbc-77f31dbec2ed |
| wsrep_gmcast_segment | 0 |
| wsrep_applier_thread_count | 1 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 15 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 6d9e07ad-ee73-11ef-8f7d-1b7a446b417a |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 0 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 26.4.20(rXXXX) |
| wsrep_ready | ON |
| wsrep_rollbacker_thread_count | 1 |
| wsrep_thread_count | 2 |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
wsrep_local_state | 4 노드의 상태를 나타낸다.
일반적으로 4는 SYNCED 상태를 의미한다.
----------------------------------------------------------------------------------------
wsrep_incoming_addresses 클러스터에 노드가 연결된 IP 주소를 보여준다.
----------------------------------------------------------------------------------------
wsrep_cluster_size | 3 현재 클러스터에 참여하고 있는 노드의 수를 나타낸다.
(나는 3개의 서버를 참여시키고 있음)
----------------------------------------------------------------------------------------
wsrep_cluster_status | Primary 클러스터의 상태를 나타낸다.
정상적인 상태에서는 Primary로 표시된다.
----------------------------------------------------------------------------------------
wsrep_connected | ON 값이 ON이면 이 노드가 다른 노드들과 성공적으로 연결되어 있다는 의미
값이 OFF이면 이 노드가 다른 노드들과 연결되지 않았다는 의미
----------------------------------------------------------------------------------------
wsrep_ready | ON 값이 ON이면 Galera 노드가 정상적으로 준비되어 있다는 뜻이다.
값이 OFF이면 Galera가 제대로 작동하지 않거나 클러스터에서 연결이 끊긴 상태
8. 구현 (동기화)
180.180.180.100에서 'clear'라는 Database 생성
180.180.180.200과 160.160.160.3에서도 'clear'라는 Database가 생성되었음 (동기화)
[통신 과정]
1. 클러스터 노드 연결
● 신규 노드가 기존 노드들에게 SYN / SYN,ACK / ACK를 통해 3Way-Handshake를 맺음 (4567 Port 사용)
2. 노드 간 상태 동기화
● 기존 노드들이 신규 노드에게 자신들의 클러스터 상태 정보를 강제 전송 (PSH) / 신규 노드는 그에 응답함 (ACK)
(4567 Port 사용)
3. 트랜잭션 수행 및 복제
● 각 노드들이 다른 노드들에게 WriteSet을 생성하여 전송함 (PSH는 강제전송, ACK는 응답) (4567 Port 사용)
1.트랜잭션은 데이터베이스에서 한 묶음으로 처리되는 논리적인 작업 단위
2.클러스터는 여러 개의 데이터베이스 서버를 하나처럼 운영하는 기술
3.WriteSet(WSREP WriteSet)은 Galera Cluster에서 트랜잭션을 복제하는 핵심 데이터 단위
Galera는 노드 간 데이터를 동기화할 때 일반적인 SQL 쿼리(INSERT, UPDATE, DELETE)를 직접 실행하는 것이 아니라
해당 트랜잭션의 변경 사항을 WriteSet이라는 구조로 만들어 모든 노드에 전송함
4. SST (State Snapshot Transfer)
● SST(State Snapshot Transfer)는 클러스터에 새롭게 참여하는 노드가 기존 노드에서 전체 데이터를 동기화하는 과정
● 각 노드 간 rsync 연결 설정 (3way-handshake) (4444 Port 사용)
● 각 노드들이 다른 노드들에게 자신의 전체 데이터를 전송함 (PSH는 강제전송, ACK는 응답) (4444 Port 사용)
5. IST (Incremental State Transfer)
● IST(Incremental State Transfer)는 클러스터에 재연결하는 노드가 최신 트랜잭션 로그만 복구 (4568 Port 사용)
'파이널 프로젝트' 카테고리의 다른 글
DB 취약점 분석 (0) | 2025.02.24 |
---|---|
Project B에 MHA + SSL 구축하기 (0) | 2025.02.18 |
Rocky Linux9 + MySQL 8로 MHA 구성 (SSL 있는 ver.) root계정 사용 (0) | 2025.02.17 |
Mysql 8에 SSL 적용해서 이중화하기 (0) | 2025.02.14 |
Rocky Linux9 + MySQL 8로 MHA 구성 (SSL 없는 ver.) (0) | 2025.02.13 |