지금까지 배웠던 것
리눅스 기초
명령어와 vi편집기
리눅스 컴퓨터 네트워크 설정
네트워크 기초
IP주소와 port번호, 클라이언트와 서버의 관계, 포트포워딩
DB (mysql)
요구사항 분석
개념적 설계
D-R Diagram
내부적 설계
SQL (DDL,DML,DCL),
DDL : CREAT, ALTER, DROP
DML : INSERT, UPDATE, DELETE, SELECT
DCL : GRANT, REVOKE
외부적 설계
양방향 Repulication를 통한 Active-Active 설계,
haproxy를 통한 7계층 부하 분산, keepalived를 이용한 Active- steadby 설계
오늘한 것
1교시 9-10 : 오늘 쓸 프로그램 설정 및 실습
1) 컴퓨터 이름 설정
vi /etc/hostname #컴퓨터 이름을 설정하는 파일
vi /etc/hosts #localhost처럼 문자열과 IP주소를 매핑해주는 파일
라우팅 컴퓨터 설정할 때 hosts 설정이 정말 중요하다고 생각하게 된다.
mysqld 설치 및 초기 설정
yum install -y https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm (repo 확장, mysql의 다양한 확장 프로그램을 받을 수 있다.)
mysql-shell 설치 (mysql의 다양한 확장 프로그램 중 하나.)
2교시 10-11
mysqlsh #(mysql-shell 실행 명령어)
dba.configureInstance('root@localhost:3306') #클러스터 구성용 계정 생성 명령어
'root@localhost:3306' #mysqld에 접속하기 위해 입력
새로운 계정 생성 시 계정 이름만 적는다. (모든 host에서 접속 가능한 계정이 만들어진다.)
계정의 패스워드를 입력해야함.
\connect root@localhost:3306 으로 root 계정 접속
dba.checkInstanceConfiguration('clusteradmin@localhost:3306')
클러스터 설정을 위해 생성된 계정을 확인하는 코드입력 status : ok를 확인하면 된다.
clusteradmin는 위에서 내가 적은 계정 이름이다.
위의 과정을 3대의 DB_server에서 실행.
이제 대표 서버 1대에만 cluster 개체를 생성한다. 전부 클론 방식으로 데이터를 공유한다.
var cluster = dba.createCluster('MyCluster', {ipAllowlist: "db1, db2, db3"})
cluster.addInstance('clusteradmin@db2:3306', {ipAllowlist: "db1, db2, db3"})
cluster.addInstance('clusteradmin@db3:3306', {ipAllowlist: "db1, db2, db3"})
db1이 db2,3에 접속해서 cluster의 동기화 및 failover 방지 설정을 한다.
이때 @ 뒤에 hostname 말고 IP를 적어도 된다.
아니 hostname이 정확이 어떤 컴퓨터인지 알고 있어야한다.
cluster.describe()
실행했을 때 "topology" 에 db1, db2, db3이 있으면 성공
cluster.status()
3교시 11-12
이 때 발생했던 에러는 addInstance를 실행할 때, 다른 DB서버에 접속할 수 없다는 것이었다.
확인해보니 vi /etc/my.cnf.d/mysql-server.cnf를 설정할 때
공백인 줄이 있으면 설정에 오류가 발생하는 모양인지 공백줄만 지워주니 에러가 사라졌다.
휴먼 이슈...
4교시 12-13
2차 클러스트 설정 (다시 하기)
별 에러없이 DB_server 3대를 Cluster로 묶었다.
하지만 다른 분들은 앞은 에러에 시달렸다.
이건 5교시에 종합해서 해결 방법을 알려주었다.
점심 시간 13-14
kakao에서 mysql-cluster를 사용한다는 걸 유튜브로 봤다.
https://youtu.be/sAMityTmMCs?si=pep6eKi4SUrJ5-US
5교시 14-15
클러스터 설정 시 생겼던 오류 정리
상황 : 클러스터 생성할 때 에러
에러 : Slave failed to initialize relay log info structure from the repository, Error_code: MY-013124
해결 : stop slave; reset slave; 후 다시 실행
상황 : 인스턴스 추가할 때 에러
에러 :[GCS] Error on opening a connection to db1:33061 on local port: 33061.
해결 : 3대 전부 mysqld끄고 /var/lib/mysql/* 삭제, cd ~, mysqld 시작, 2-5번부터 다시 진행
mysqld 설정을 초기화하고 새로 진행한다는 것이다.
클러스터 삭제
\connect clusteradmin@db1:3306
var cluster = dba.getCluster()
cluster.dissolve()
클러스터까지 삭제하고 아에 새로 한다.
참고 : https://dev.mysql.com/doc/mysql-shell/8.0/en/add-instances-cluster.html
6교시 15-16
클러스터 라우팅 컴퓨터 설정
이 때 반드시 /etc/hosts에 DB_server들을 매핑 해둬야한다.
yum install -y https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
yum install -y mysql-router
mysql-router 구성
mysqlrouter --bootstrap clusteradmin@db1:3306 --name clusterrouter --directory mycluster --account myrouter --user root
--bootstrap : 대표 서버 주소
--name : 구성할 라우터 이름
--directory : 구성 파일이 생성 될 디렉토리의 경로
--account : 라우터로 접속할 때 사용할 계정
--user : 파일을 생성할 리눅스의 사용자
directory 옵션에 입력했던 곳에 파일이 생겼을 것이다.
생성된 폴더 안에 있는 start.sh 파일을 실행해서 라우터를 실행시킨다.
7교시 16-17
mysql-router 실습 후 테스트
workbench에서 접속 테스트
hostname : [mysql-router 컴퓨터의 IP주소]
username : [mysql-router에서 생성한 계정]
port : [6446 or 6447] 6446은 읽기/쓰기, 6447 읽기 전용
8교시 17-18
Repulication 과 cluster
Repulication
마스터 1, 슬레이브 N 관계
방식이 비동기이므로 속도가 빠르나 안정성이 Cluster 비해 떨어짐.
Master가 죽으면 복구 시키기 힘들다. 다시 Repulication 설정을 해줘야한다.
추가로 haproxy나 keepalived를 이용할 수 있다.
cluster
최소 3대의 데이터 저장소를 하나로 묶는다.
방식이 동기이므로 속도가 느리나 안정성이 좋다.
Primary가 죽어도 Secondary중에서 자동으로 Primary를 선정하므로
Repulication 방식에 비해 Failover에 대처하기 쉽다.
추가로 haproxy나 keepalived를 이용할 필요가 없다.
이번 수업으로 느낀 것은 cluster 방식이 압도적으로 편하다.
Repulication 방식으로 데이터 동기화를 하는 방식은 너무 불안정하고
다른 프로그램도 써서 버전 관리에 어려움이 있었다.
하지만 cluster 방식은 동기화 속도가 느리다는 것이 고려사항이다.
즉, 너무 많은 DB_server를 cluster 방식으로 서비스 안정성을 추구한다면
오히려 서비스 제공 시간이 느려질 수 있다는 것이다.
그러면 일부는 cluster 일부는 Repulication 방식을 이용하는 식으로 재난 대비를 하는 것도 좋다는 생각이 든다.