Contents
(TeamProject)클라우드의 노드 구성하는 프로젝트
   2022년08월14일     7분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] 내가 맡은 DB 클러스터(replica) 부분을 진행해 볼 것임

팀 프로젝트 진행

개요

  • 목표
    • img_18
  • 할 일
    • img_19
    • 맡게 된 부분: Database & replication
    • 어째 작년부터 DB만 죽어라 하는 것 같다.. 몽고디비.. 샤드키.. 낄낄
  • 네트워크 구성
    • img_20


  • 아무튼 담당한 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로 변경해야 함. 이게 보안상 제한을 걸어 둔 듯 (둘다 설정하기)
    • 어차피 나중에 가면 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 측에서 트랜젝션 손상을 방지하기 위해 추가한 문제라고 한다
  • image
  • image


  • 마스터 노드에서 클러스터 생성
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가 슬레이브에서 보임
    • img_17


  • 계정 구성 및 테이블 생성
# 비밀번호만 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           |
+--------------+