(TeamProject)클라우드의 노드 구성하는 프로젝트
[카카오 클라우드 스쿨] 내가 맡은 DB 클러스터(replica) 부분을 진행해 볼 것임
팀 프로젝트 진행
개요
- 목표
- 할 일
- 맡게 된 부분: Database & replication
- 어째 작년부터 DB만 죽어라 하는 것 같다.. 몽고디비.. 샤드키.. 낄낄
- 네트워크 구성
- 아무튼 담당한 DB 부분을 진행해 보자
MariaDB 설치 및 한글 사용 설정
- 설치 (master, slave 공통)
# 원래 있던 망할 녀석들 제거
yum remove -y MariaDB-server-10.4.25-1.el7.centos.x86_64
yum remove -y MariaDB-compat-10.4.25-1.el7.centos.x86_64
# 마리아디비설치
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup
./mariadb_repo_setup
yum -y install MariaDB-server
systemctl start mariadb && systemctl enable mariadb
systemctl disable firewalld --now
setenforce 0
# 한글가능하게하기
# sed -i'' -r -e "/\[client\]/a\default-character-set = utf8" /etc/my.cnf.d/mysql-clients.cnf
sed -i'' -r -e "/\[mysqldump\]/a\default-character-set = utf8" /etc/my.cnf.d/mysql-clients.cnf
sed -i'' -r -e "/\[mysql\]/a\default-character-set = utf8" /etc/my.cnf.d/mysql-clients.cnf
sed -i'' -r -e "/\[mysqld\]/a\character-set-server = utf8\ncollation-server = utf8_general_ci\ninit_connect = set names utf8" /etc/my.cnf.d/server.cnf
systemctl restart mariadb
방법 1 - 기본 레플리카 방식으로 구성하기(실패)
- 마스터 부분 세팅
# 마스터 부분
#sed -i'' -r -e "/\[mariadb\]/a\log-bin\nserver_id=1\nlog-basename=master1\nbinlog-format=mixed" /etc/my.cnf.d/server.cnf
echo "[mariadb]\nlog-bin\nserver_id=1\nlog-basename=master1\nbinlog-format=mixed" >> /etc/my.cnf
systemctl restart mariadb
# 레플리카에서 접근용 계정 생성하기
mysql -u root -ptest1234 -e " CREATE USER 'replication_user'@'%' IDENTIFIED BY 'bigs3cret' ; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; "
- 레플리케이션에는 다음 옵션이 있음
- skip-networking.. skip-networking=1이면 서버는 localhost로만 연결을 제한하고 모든 원격 슬레이브가 연결하는 것을 방지합니다.
- bind-address. 마찬가지로 서버가 TCP/IP 연결을 수신하는 주소가 127.0.0.1(localhost)이면 원격 슬레이브 연결이 실패합니다.
- 슬레이브 구성하기
#!/bin/bash
# 슬레이브
#sed -i'' -r -e "/\[mariadb\]/a\log-bin\nserver_id=11\nlog-basename=slave1\nbinlog-format=mixed" /etc/my.cnf.d/server.cnf
echo "[mariadb]\nlog-bin\nserver_id=11\nlog-basename=slave1\nbinlog-format=mixed" >> /etc/my.cnf
- 마스터의 상태 테이블 확인하기 -> 테이블 언락
- 이때 File 및 Position을 기억해 둬야 해요
- 마리아디비 재실행 할때마다 달라지는것 주의하시오
mysql -u root -ptest1234 -e 'UNLOCK TABLES;'
mysql -u root -ptest1234 -e 'SHOW MASTER STATUS;;'
#+--------------------+----------+--------------+------------------+
#| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
#+--------------------+----------+--------------+------------------+
#| master1-bin.000003 | 672 | | |
#+--------------------+----------+--------------+------------------+
- 슬레이브 구성 계속(본격적인 시작)
- 마스터의 주소, User이름 패스워드, LogFile, Position을 아까 설정값에 맞도록 한다
mysql -u root -ptest1234 -e "STOP SLAVE;RESET SLAVE; "
mysql -u root -ptest1234 -e "CHANGE MASTER TO MASTER_USE_GTID = slave_pos"
mysql -u root -ptest1234 -e "CHANGE MASTER TO MASTER_HOST='172.16.2.201', \
MASTER_USER='replication_user', MASTER_PASSWORD='bigs3cret', \
MASTER_PORT=3306, MASTER_LOG_FILE='master1-bin.000005', \
MASTER_USE_GTID=slave_pos; "
# (원본형태는 다음과 같음)
#CHANGE MASTER TO
# MASTER_HOST='172.16.2.201',
# MASTER_USER='replication_user',
# MASTER_PASSWORD='bigs3cret',
# MASTER_PORT=3306,
# MASTER_LOG_FILE='master1-bin.000002',
# MASTER_LOG_POS=672,
# MASTER_CONNECT_RETRY=10;
# 슬레이브 시작한 뒤 상태 확인
mysql -u root -ptest1234 -e 'START SLAVE;'
mysql -u root -ptest1234 -e 'SHOW SLAVE STATUS \G'
#*************************** 1. row ***************************
# Slave_IO_State: Connecting to master
# Master_Host: 172.16.2.201
# Master_User: replication_user
# Master_Port: 3306
# Connect_Retry: 10
# Master_Log_File: master1-bin.000002
# Read_Master_Log_Pos: 672
# Relay_Log_File: replica-relay-bin.000001
# Relay_Log_Pos: 4
# Relay_Master_Log_File: master1-bin.000002
# Slave_IO_Running: Yes 가 나와야 함
# Slave_SQL_Running: Yes 가 나와야 함
- 마스터에서 테이블 생성해 보기
#!/bin/bash
mysql -u root -ptest1234 -e " CREATE USER 'testuser'@'%' IDENTIFIED BY 'test123' ;"
mysql -u root -ptest1234 -e " GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%'; "
mysql -u testuser -ptest1234 -e 'create database vm;'
mysql -u testuser -ptest1234 -e 'use vm; CREATE TABLE host ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, hostname varchar(20) NOT NULL, hostip VARCHAR(18) NOT NULL);'
mysql -u testuser -ptest1234 -e 'use vm; CREATE TABLE image ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, imagename VARCHAR(20), type VARCHAR(8) NOT NULL, size FLOAT NOT NULL );'
mysql -u testuser -ptest1234 -e 'use vm; CREATE TABLE vm (id INT NOT NULL AUTO_INCREMENT ,vmname VARCHAR(20) NOT NULL, cpu INT NOT NULL, hostid INT NOT NULL, status VARCHAR(20), imageid INT, PRIMARY KEY(id), foreign key (hostid) references host(id), foreign key (imageid) references image(id));'
mysql -u testuser -ptest1234 -e 'use vm; show tables;'
- 응 복제 하나도 안돼^^ 실패
방법 2 - 갈레라 클러스터(galera cluster)로 구성하기(성공)
- 기본적인 지식은 이곳에서 얻음! 고마운 분 출두요!
- https://www.symmcom.com/docs/how-tos/databases/how-to-configure-mariadb-galera-cluster-on-centos-7
구성하기
- 갈레라 위치 찾기 - 이걸 conf 에 적어야 함
[root@replica ~]# find / -name libgalera_smm.so
/usr/lib64/galera-4/libgalera_smm.so
- 마스터 부분의 server 세팅
vi /etc/my.cnf.d/server.cnf
---
[galera]
# Mandatory settings
wsrep_on=ON
# 방금 찾은 경로 적기
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
# 모든 노드 공통, 모든 노드의 IP
wsrep_cluster_address="gcomm://172.16.1.201,172.16.1.202"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="cluster"
# Allow server to accept connections on all interfaces.
bind-address=0.0.0.0
# 추가 세팅(클러스터 단독 세팅)
wsrep_node_address="172.16.1.201"
wsrep_node_name="storage"
# 싱크 세팅
wsrep_sst_method=rsync
- 슬레이브 부분(단독 세팅 부분만 달라지고 나머지는 동일)
vi /etc/my.cnf.d/server.cnf
---
[galera]
# Mandatory settings
wsrep_on=ON
# 방금 찾은 경로 적기
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
# 모든 노드 공통, 모든 노드의 IP
wsrep_cluster_address="gcomm://172.16.1.201,172.16.1.202"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="cluster"
# Allow server to accept connections on all interfaces.
bind-address=0.0.0.0
# 추가 세팅(클러스터 단독 세팅)
wsrep_node_address="172.16.1.202"
wsrep_node_name="replica"
# 싱크 세팅
wsrep_sst_method=rsync
- 마스터 노드에서 클러스터 생성
galera_new_cluster
- 보조 노드에서 서비스 실행
systemctl restart mariadb
- 문제 발생!
5시간의 트러블 슈팅
- 정말 고마운 분
- https://microdevsys.com/wp/error-wsrep-it-may-not-be-safe-to-bootstrap-the-cluster-from-this-node-it-was-not-the-last-oneave-the-cluster-and-may-not-contain-all-the-updates/
- 팁: 오류가 발생하면 journalctl 부분을 잘 확인한다
- 케이스1: failed to open gcomm backend connection: 110: failed to reach primary
- 이 경우 마스터 노드에서 클러스터가 안 켜진 것임. 마스터 오류를 먼저 해결하러 가자
- 케이스 2: bootstrap not safe 오류
- 하단을 참고
- 케이스1: failed to open gcomm backend connection: 110: failed to reach primary
- 부트스트랩 부분을 1로 변경해야 함. 이게 보안상 제한을 걸어 둔 듯 (둘다 설정하기)
- 어차피 나중에 가면 0으로 바뀜(정상적으로 되면)
- 잘 안되면 둘다 1 1 , 0 0 으로 해 보자
vi /var/lib/mysql/grastate.dat
---
# GALERA saved state
version: 2.1
uuid: a683018b-1bfe-11ed-be70-8feb41102c7a
seqno: -1
safe_to_bootstrap: 1
- galera 측에서 트랜젝션 손상을 방지하기 위해 추가한 문제라고 한다
- 마스터 노드에서 클러스터 생성
galera_new_cluster
- 보조 노드에서 서비스 실행
systemctl restart mariadb
- 이제 정상적으로 실행 될 건데, 다음을 확인해 보자 (가급적 마스터에서)
mysql -u root
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
1 row in set (0.001 sec)
- 최종적으로 테스트 해 보면 감동의 도가니탕 삼계탕 엉엉 진짜 눈물바다
- 마스터에서 생성한 DB가 슬레이브에서 보임
- 계정 구성 및 테이블 생성
# 비밀번호만 test123으로 생성
mariadb-secure-installation
mysql -u root -ptest123 -e " CREATE USER 'testuser'@'%' IDENTIFIED BY 'test123' ;"
mysql -u root -ptest123 -e " GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%'; "
mysql -u testuser -ptest123 -e 'create database vm;'
mysql -u testuser -ptest123 -e 'use vm; CREATE TABLE host ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, hostname varchar(20) NOT NULL, hostip VARCHAR(18) NOT NULL);'
mysql -u testuser -ptest123 -e 'use vm; CREATE TABLE image ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, imagename VARCHAR(20), type VARCHAR(8) NOT NULL, size FLOAT NOT NULL );'
mysql -u testuser -ptest123 -e 'use vm; CREATE TABLE vm (id INT NOT NULL AUTO_INCREMENT ,vmname VARCHAR(20) NOT NULL, cpu INT NOT NULL, hostid INT NOT NULL, status VARCHAR(20), imageid INT, PRIMARY KEY(id), foreign key (hostid) references host(id), foreign key (imageid) references image(id));'
mysql -u testuser -ptest123 -e 'use vm; show tables;'
- 클러스터에도 VM이 적용된 모습이 보임
mysql -u testuser -ptest123 -e 'use vm; show tables;'
+--------------+
| Tables_in_vm |
+--------------+
| host |
| image |
| vm |
+--------------+