[MariaDB] Glaera Cluster - 설치방법
- Databases/MariaDB
- 2021. 2. 22.
■ Galera Cluster 설치 환경
1. MariaDB 10.4 버전
2. Galera Cluster 4버전
3. CentOS 7버전
■ 방화벽 용도 및 파라미터 설명
▶︎ 방화벽 오픈 필요 포트 및 용도
3306 : mysqldump 메서드를 사용하는 MariaDB 클라이언트 연결 및 상태 스냅샷 전송에 사용. MariaDB 접속 기본포트
4567 : Galera 클러스터 복제 트래픽 포트입니다. 멀티 캐스트 복제는 이 포트에서 UDP 전송과 TCP를 모두 사용합니다.
4568 : 증분 상태 전송 (IST : Incremental State Transfers)의 경우 클러스터의 다른 노드에서 누락된 상태를 수신하는 프로세스입니다.
4444 : 다른 모든 상태 스냅샷 전송 (SST)의 경우 참가(joiner) 노드가 도너 노드에서 상태와 데이터를 가져올때 사용하는 포트입니다.
▶︎ Glera cluster 파리미터 설명
wsrep_provider : 갈레라 클러스터의 라이브러리를 입력하는 파라미터입니다. 경로와 파일명을 전체 경로로 입력합니다.
wsrep_cluster_name : 클러스터 이름을 입력합니다.
wsrep_cluster_address : Galera cluster에 참가하는 ip리스트를 입력합니다.
wsrep_node_name : 각 노드의 이름입니다. 노드마다 달라야 합니다. 보통 호스트 이름으로 지정합니다.
wsrep_node_address : 각 노드의 IP주소입니다. 자신의 IP주소를 입력합니다.
wsrep_sst_method : galera cluster에서 동기화 방법을 나타냅니다. 대표적으로 rsync와 mariabackukp이 있습니다.
wsrep_sst_auth : 클러스터 동기화 계정입니다.
■ OS 환경 설정 및 방화벽 설정
▶︎ 설치 서버 환경
|
Server 1 |
Server 2 |
Server 3 |
hostname |
galera01 |
galera02 |
galera03 |
IP |
10.30.224.100 |
10.30.224.101 |
10.30.224.102 |
OS |
CentOS 7 |
CentOS 7 |
CentOS 7 |
▶︎ 방화벽 설정
shell> firewall-cmd --state (방화벽이 실행되지 않았을 경우 systemctl start firewalld 입력)
running
shell> firewall-cmd --permanent --add-service=mysql
success
shell> firewall-cmd --permanent --add-port={3306,4567,4568,4444}/tcp
success
shell> firewall-cmd --permanent --add-port=4567/udp
success
shell> firewall-cmd --reload
success
shell> firewall-cmd --list-ports
3306/tcp 4567/tcp 4568/tcp 4444/tcp
■ MariaDB Engine 설치
마리아 DB 10.4 버전의 Galera Cluster 26.4.0 버전(Galera 4버전)을 설치하는것으로 합니다.
먼저 CentOS를 설치하면 기본적으로 설치되는 MariaDB 프로그램이 있습니다. 이것을 깨끗하게 삭제합니다.
▶︎ 기존 MariaDB 버전 확인
shell> rpm -qa | grep -i mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
이외 mariadb로 시작하는 패키지가 있다면 삭제합니다.
shell> yum remove mariadb-libs-5.5.60-1.el7_5.x86_64
▶︎ 엔진 설치 및 환경설정.
• Repository 환경 설정
shell> curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
• mariadb repository 수정.
shell> vi /etc/yum.repos.d/mariadb.repo
[mariadb-main]
name = MariaDB Server
baseurl = https://downloads.mariadb.com/MariaDB/mariadb-10.5/yum/rhel/7/x86_64 <- 밑의 내용으로 수정
gpgkey = file:///etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY
gpgcheck = 1
enabled = 1
mariadb 4로 수정
baseurl = https://downloads.mariadb.com/MariaDB/mariadb-10.4/yum/rhel/7/x86_64
• 모든 repo에 대한 캐시 빌드 및 업데이트
shell> yum makecache fast
shell> yum update
• MariaDB 및 Galera 설치
shell> yum install MariaDB-backup MariaDB-client MariaDB-common MariaDB-devel MariaDB-server
설치 후 테스트 실행.
shell> systemctl start mariadb
shell> mysql -uroot
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(none)]> quit;
• 암호 변경
shell> mysqladmin -uroot password 'admin1234'
• 클러스터 노드 복제용 계정 생성.
MariaDB [(none)]> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'admin1234';
MariaDB [(none)]> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
• 서버 셧다운
shell> systemctl stop mariadb
■ Glaera Cluster 환경 설정 및 수행
Glera Cluster는 서버 Node시작시 노드간 데이터를 복제하여 동기화 시킵니다. 여기에서 동기화를 시키는 방법은 대표적으로 2가지가 있습니다.
OS레벨에서 지원하는 Rsync방법과 MariaDB 서버에서 제공하는 mariabackup, mysqldump 방법, 총 3가지 입니다.
Rsync보다는 Backup방식이 더 빠른것으로 평가되고 있습니다. 백업 방식으로 데이터를 동기화 시키려면 몇가지 추가적으로 환경설정이 필요합니다.
여기에서는 백업방식으로 하는 방법을 알아봅니다.
▶︎ Galera cluster library file 찾기
shell> find / -name libgalera_smm.so
/usr/lib64/galera-4/libgalera_smm.so
▶︎ MariaDB 서버 환경설정 - 1,2,3 노드 모두
shell> vi /etc/my.cnf
[galera]
wsrep_on=ON
# 위에서 찾은 galera library 경로 입력
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
# 서버 IP를 순서대로 입력
wsrep_cluster_address=gcomm://10.30.224.100,10.30.224.101,10.30.224.102
#클러스터 이름 설정. 모든 노드에 같은 이름으로 설정.
wsrep_cluster_name="mycluster"
wsrep_sst_method=mariabackup
#스냅샷 복제 유저. user명:암호 형식으로 입력
wsrep_sst_auth="sstuser:admin1234"
# 각 노드마다 다른 이름으로 입력. 통상 호스트 네임으로 입력.
wsrep_node_name="node1"
wsrep_node_address="10.30.224.100"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
▶︎ selinux 허용 모드 설정
Current mode가 permissive 상태여야 합니다.
아래 명령어를 수행하지 않으면 Galera Cluster 실행시 오류가 납니다. 모든 노드에서 수행합니다.
수행전
shell> sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing <-- 이부분이
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
수행후
shell> setenforce 0
shell> sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive <-- 이렇게 바뀌어야 합니다.
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
오류 내용 참고:
shell> systemctl start mariadb.service
Warning: mariadb.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Job for mariadb.service failed because a fatal signal was delivered to the control process. See "systemctl status mariadb.service" and "journalctl -xe" for details.
[root@galera02 mysql]# systemctl status mariadb.service
● mariadb.service - MariaDB 10.4.17 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf, tokudb.conf
Active: activating (start-pre) since Sun 2021-02-21 01:02:26 KST; 1s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Process: 7376 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=killed, signal=ABRT)
Process: 7396 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Main PID: 7376 (code=killed, signal=ABRT); : 7398 (sh)
CGroup: /system.slice/mariadb.service
└─control
├─7398 /bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1
├─7400 /bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1
├─7401 /bin/sh /usr/bin/galera_recovery
└─7429 /usr/sbin/mysqld --user=mysql --wsrep_recover --disable-log-error
Feb 21 01:02:26 galera02 systemd[1]: Starting MariaDB 10.4.17 database server...
▶︎ Galera Cluster 실행
1번 노드에서 실행. 아래 명령어는 반드시 1번 노드에서만 수행해야 함
아래 galera_new_cluster 스크립트는 서버 시작 명령까지 같이 포함됨
shell> galera_new_cluster
나머지 노드들(Node 2번, Node 3번)은 다음의 명령어로 MariaDB 서버 실행
shell> systemctl start mariadb
▶︎ galera cluster 상태 확인.
MariaDB [(none)]> show variables like '%wsrep_cluster%';
+-----------------------+---------------------------------------------------+
| Variable_name | Value |
+-----------------------+---------------------------------------------------+
| wsrep_cluster_address | gcomm://10.30.224.100,10.30.224.101,10.30.224.102 |
| wsrep_cluster_name | my_wsrep_cluster |
+-----------------------+---------------------------------------------------+
2 rows in set (0.001 sec)
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.001 sec)
▶︎ selinux 원복
shell> setenforce 1
▶︎ 서버 종료 방법
모든 노드에서 다음과 같은 명령어를 입력합니다.
shell> systemctl stop mariadb
■ Glaera Cluster 재시작 혹은 복구 순서
모든 노드의 데이터 디렉토리를 확인해보면 다음과 같은 파일이 있습니다.
여기의 데이터 디렉토리는 /var/lib/mysql 입니다.
shell> ls /var/lib/mysql/grastate.dat
이 파일을 열어보면 다음과 같은 속성이 있습니다.
shell> vi /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 9e4a3dcb-7393-11eb-a1af-821236b3a947
seqno: 273
safe_to_bootstrap: 1
여기안에 속성들중 safe_to_bootstrap 이 1인곳은 노드들중 단 한곳이며 나머지는 0입니다.
이 safe_to_bootstrap 이 1인 곳에서 맨 처음 Galera cluster를 설정했던 명령어를 입력합니다.
shell> galera_new_cluster
그리고 나머지 노드들도 노드들을 실행합니다.
shell> systemctl start mariadb
클러스터 노드수를 확인합니다.
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.001 sec)
■ 참고 URL
엔진 버전별 갈레라 버전 확인
https://mariadb.com/kb/en/meta/galera-versions/
Configuring Nodes for Write-Set Replication(멀티 마스터 복제 노드 설정 방법)
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/configure.html
Bootstrapping the First Node(노드를 처음 시작하는 방법)
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/bootstrap.html
Adding Nodes to Cluster(클러스터에 노드를 추가하는 방법)
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/add-node.html
Verifying Replication(복제 검증)
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/verify.html
Comparing Galera wsrep sst methods rsync vs. mariabackup(Rsync방식과 maariabackup방법 성능 비교)
https://www.claudiokuenzler.com/blog/887/comparing-galera-wsrep-sst-methods-rsync-vs-mariabackup
Galera cluster unable to sync SST: xtrabackup checkpoints missing, failed innobackupex on donor
(Galera 클러스터에서 SST를 동기화 할 수 없음 : xtrabackup 체크 포인트 누락, 기증자에서 innobackupex 실패)
How to Avoid SST When Adding a New Node to MySQL Galera Cluster(Galera cluster에 새로운 노드를 추가했을 때 SST를 피하는 방법)
https://severalnines.com/database-blog/how-avoid-sst-when-adding-new-node-mysql-galera-cluster
Change from rsync to xtrabackup - avoid read-only Donor during SST(rsync에서 xtrabackup으로 변경-SST 중 읽기 전용 Donor 방지)
Codership Tutorials on Galera Cluster(Galera 클러스터의 Codership 자습서)
https://galeracluster.com/library/training/tutorials/index.html
wsrep 옵션
https://galeracluster.com/library/documentation/mysql-wsrep-options.html
갈레라 버전 확인
'Databases > MariaDB' 카테고리의 다른 글
[MariaDB] Galera Cluster - 소개 (0) | 2021.02.22 |
---|---|
[MariaDB][Install] CentOS7 + MariaDB 10.3 RPM 설치 (0) | 2020.06.13 |