새소식

MySQL & Maria

[ 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  |
+------+------+
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.