[MariaDB - Galera Cluster 구성] part 1

안녕하세요 이번글에선 galera cluster를 구성하도록 하겠습니다. 

최종적인 아키텍처는 아래와 같으나 저는 DB node 3개와 그를 관리할 maxscale을 설치 진행하겠습니다.

 

최종 아키텍처

 

 

 

Galera Cluster란

 

갈레라 클러스터는 동기 방식의 복제구조를 사용하는 멀티마스터 RDB 클러스터입니다.
현재 Galera cluster는 MySQL, MariaDB 그리고 Percona XtraDB 까지도 클러스터를 구성할 수 있습니다.  
Master Slave 구성의 Replication 과는 다르게 모든 노드에서 Write가 가능합니다.
Galera Cluster Write-Set Replication API (이하 wsrep api) 를 통해 각 노드와 데이터를 동기화합니다.

 

 

장점

모든 노드의 데이터가 일관성있게 저장
모든 노드가 write가 가능하므로 모든 노드 down전까지 서비스가 장애에 대응하기 용이
 

단점

동기식 복제 구조때문에 쓰기가 많이 발생할 경우, 다른 아키텍처보다 성능 저하
인증에 실패할 경우 발생하는 데드락 발생 치명적

 

 

 

 

테스트 환경

Galera1
10.70.101.78
MariaDB10.2.14
Centos7.6
Galera2
10.70.101.79
MariaDB10.2.14
Centos7.6
Galera3
10.70.101.80
MariaDB10.2.14
Centos7.6
Maxscale
10.70.101.81
maxscale 2.5.0
Centos7.6

 

 

 

 사전 작업

 

■ 필수 패키지 설치

[root@node1 ~]## yum -y install rsync nmap lsof perl-DBI nc

 

 

 selinux disable

[root@node1 ~]# setenforce 0
 
 

 사용포트 

Default
MariaDB = 3306
Galera  = 4567
IST     = 4568 ( 증분 상태 전송 용 ) ist.recv_addr에서 설정하여 변경할수 있다.
SST     = 4444 State Snapshot Transfer 전용

**IST 나 SST는 Galera가 알아서 정해서 한다.  log를 보면 SST로 하는지 IST로 하는지 확인 가능



## 포트 개방
[root@node1 ~]# firewall-cmd --permanent --add-service=mysql
success

[root@node1 ~]# firewall-cmd --permanent --add-port={3306,4567,4568,4444}/tcp
success

[root@node1 ~]# firewall-cmd --permanent --add-port=4567/udp
success

[root@node1 ~]# firewall-cmd --reload
success

[root@node1 ~]# firewall-cmd --list-ports
3306/tcp 4567/tcp 4568/tcp 4444/tcp 4567/udp
 
 

 

MySQL 5.7 install 

[root@node1 ~]# groupadd mysql

[root@node1 ~]# useradd -g mysql mysql

[root@node1 ~]# tar -zxvf mariadb-10.2.14-linux-x86_64.tar.gz

[root@node1 ~]# mv mariadb-10.2.14-linux-x86_64.tar.gz /mysql



[root@node1 ~]# vi /etc/my.cnf
[mysqld]
datadir=/data/data
socket=/tmp/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/data/log/mariadb.log
pid-file=/data/log/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d




[root@node1 ~]# mkdir /data/data /data/log

[root@node1 ~]# chown -R mysql.mysql /data/data /data/log

[root@node1 ~]# chown -R mysql.mysql /mysql

[root@node1 ~]# cd /mysql/bin/





[root@node1 ~]# vi ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/mysql/bin

export PATH



[root@node1 ~]# source ~/.bash_profile

[root@node1 ~]# mysqld_safe --user=mysql &
 
 
 
 
 
 

 Galera Cluster 작업

 

 galera cluster 설정 (모든 서버)

[root@node1 ~]# 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.70.101.78,10.70.101.79,10.70.101.80'
wsrep_node_address='10.70.101.78'
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 = 갈레라 플러그인이 있는 위치 확인
[root@node1 ~]# find / -name 'libgalera_smm.so'
/data/maria/lib/galera/libgalera_smm.so
/data/maria/lib/libgalera_smm.so


- wsrep_provider : Galera 라이브러리 경로
- wsrep_cluster_name : 클러스터의 이름
- wsrep_cluster_address : Galera 클러스터 주소 형식 및 사용법 참조. 현재 노드의 IP
- wsrep_cluster_address : 클러스터의 멤버 리스트
- wsrep_sst_method = 노드간의 전송 방법 ( rsync, mysqldump, xtrabackup, xtrabackup-v2, mariabackup )
- binlog_format=ROW : 바이너리 로그 형식 참조
- default_storage_engine=InnoDB
- innodb_autoinc_lock_mode=2
- innodb_doublewrite=1
- 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 버전이후)
 
 
 
 

Galera cluster start

※ wsrep_local_state_comment : 노드의 현재 상태 확인

 1) Joining : 해당 노드가 클러스터에 들어가는 상태 
 2) Doner / Desynced : 노드가 Donor 모드. 다른 노드에 데이터를 복제중 or 다른 노드와 동기화되지 않은 상태
 3) Joined : 노드가 클러스터에 포함
 4) Synced : 노드가 클러스터의 멤버 상태
## 1번 노드 start
[root@node1 ~]# mysqld_safe --user=mysql --wsrep-new-cluster &


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     | 708fb68f-9385-11ec-a435-f34f2dd2796b          |
| 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       | 1.475e-06/5.8616e-06/1.8018e-05/6.20173e-06/5 |
| 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             | 708f421f-9385-11ec-ae74-36d73def7985          |
wsrep_incoming_addresses     | 10.70.101.78: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.500000                                      |
| 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       | 708fb68f-9385-11ec-a435-f34f2dd2796b          |
| wsrep_protocol_version       | 8                                             |
| wsrep_provider_name          | Galera                                        |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>             |
| wsrep_provider_version       | 25.3.23(r3789)                                |
| wsrep_ready                  | ON                                            |
| wsrep_received               | 2                                             |
| wsrep_received_bytes         | 141                                           |
| 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)



## node 2,3 기동
[root@node2 ~]# mysqld_safe --user=mysql &
[root@node3 ~]# mysqld_safe --user=mysql &



## 모든 node join 후 wsreo 상태 확인
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     | 708fb68f-9385-11ec-a435-f34f2dd2796b                  |
| 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             | 708f421f-9385-11ec-ae74-36d73def7985                  |
wsrep_incoming_addresses     | 10.70.101.78:3306,10.70.101.79:3306,10.70.101.80: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.100000                                              |
| 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       | 708fb68f-9385-11ec-a435-f34f2dd2796b                  |
| wsrep_protocol_version       | 8                                                     |
| wsrep_provider_name          | Galera                                                |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>                     |
| wsrep_provider_version       | 25.3.23(r3789)                                        |
| wsrep_ready                  | ON                                                    |
| wsrep_received               | 10                                                    |
| wsrep_received_bytes         | 742                                                   |
| 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)



MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.00 sec)
 

 

 동기화 확인

## node1에 data insert

MariaDB [(none)]> create database kim;
Query OK, 1 row affected (0.01 sec)


MariaDB [(none)]> use kim
Database changed


MariaDB [kim]> create table tt(i int);
Query OK, 0 rows affected (0.00 sec)


MariaDB [kim]> insert into tt values(1);
Query OK, 1 row affected (0.00 sec)




## node2,3 확인
MariaDB [(none)]> select * from kim.tt;
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)


MariaDB [(none)]> select * from kim.tt;
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
 
 
 
 
이상으로 galera cluster 구성을 마치겠습니다. 다음글에서 maxscale 구축하도록 하겠습니다.

 

 

참고

 

https://rastalion.me/galera-cluster-for-mysql-8-1-architecture/

 

Galera cluster for MySQL 8 - #.1 Architecture - RastaLion's IT Blog

Galera clusterGalera cluster는 코더십이 만든 동기식 멀티 마스터 복제 기법입니다. 인증 기반 복제(Certification-Based Replication) 방식을 사용하며, 데이터의 완전성을 자동으로 관리해줍니다. 그리고 현재

rastalion.me

https://bamdule.tistory.com/66

 

[Linux] CentOS 7 Galera Cluster 사용하기

1. Galera Cluster 란? 오픈소스이다. 동기 방식의 복제를 지원한다. 노드간 통신을 위해 wsrep API를 사용한다. Active-Active 방식의 다중 Master 구성 및 모든 노드에서 Read/Write가 가능하다. 노드의 추가와..

bamdule.tistory.com