23.11.09 - clustering

임연진·2023년 11월 9일

11월 9일 - 클러스터링

mysql cluster

  1. 리눅스 준비(4대) - 네트워크설정무조건!
    db1 10.10.10.135 mysql-server
    db2 10.10.10.136 mysql-server
    db3 10.10.10.137 mysql-server
    router 10.10.10.110 mysql-router

1) 컴퓨터 이름설정(db1,2,3,router다해주기)
vi /etc/hostname 컴퓨터이름을 설정하는 파일 -> 들어가서 다지우고 db1 적고 :wq

init 6 재부팅
(다시로그인하고 이름바꼈는지보기)

2) 다른 컴퓨터의 IP주소를 이름으로 설정(db1,2,3,router에 다 해주기)
/etc/hosts IP주소와 이름을 매핑하는 파일

10.10.10.135 db1
10.10.10.136 db2
10.10.10.137 db3
10.10.10.110 router

하고 :wq 하면 ping db1하면 이름바뀜

#ping localhost = 나자신
=127.0.0.1


#인터넷저장소는 하나가 아니다.

yum install mysql-shell(아마없다고 설치안될거임

추가적인 저장소를 설정해줘야함
: yum install -y epel-release (이거는다음에씀)

#오늘 우리는 mysql에서 제공하는? 저장소쓸거임


  1. mysql-server 설치(db1, db2, db3)
    1) mysql-server 설치
    yum install -y mysql-server
    2) mysql이 제공하는 repo(저장소) 추가
    yum install -y https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm

    3) mysql-shell 설치
    yum install -y mysql-shell

    4) mysql 서버 실행
    systemctl restart mysqld

    5) 초기설정
    mysql_secure_installation
    No
    패스워드
    패스워드
    y 4번

  1. 클러스터 생성 준비(db1, db2, db3)

    0) mysql-shell 실행
    mysqlsh

    1) 클러스터 구성용 계정 생성
    dba.configureInstance('root@localhost:3306')
    패스워드 입력 root 로그인 필요하기 때문에 root 패스워드 입력
    (error떠도 무시)
    Y 패스워드 저장하겠다
    2 새로운 계정 생성
    clusteradmin 새로운 계정의 이름 입력
    패스워드 입력
    패스워드 확인
    y 설정 바꿀거냐?
    y 재실행 할거냐?

#clusteradmin 대신 clusteradmindb1, clusteradmindb2, clusteradmindb3 으로 함(3-1,3-2)

2) root 계정으로 로그인해서 설정 내용 확인
dba.checkInstanceConfiguration('clusteradmin@localhost:3306')

	패스워드 입력
	y
	실행 후 ok 확인
\quit 


mysql -u root -p
	show variables like '%enforce_gtid_consistency%';
	실행 결과에서 Value에 ON으로 된 것 확인
  1. mysql 서버 설정
    1) 서버 ID 및 포트 설정(마지막줄에 추가하기)
    vi /etc/my.cnf.d/mysql-server.cnf
    server-id=[각자 다른 숫자]
    port=3306
    mysqlx=ON
    mysqlx-port=33060

server-id = 1 ( 숫자랑 간격 띄워야 workbench에서 server-id 숫자 제대로나옴)
port=3306
mysqlx=ON
mysqlx-port=33060

server-id = 2
port=3306
mysqlx=ON
mysqlx-port=33060

server-id = 3
port=3306
mysqlx=ON
mysqlx-port=33060

2) 설정 적용
systemctl restart mysqld

  1. 방화벽 끄기
    1) 네트워크 방화벽 설정
    systemctl stop firewalld

    2) 로컬 방화벽
    setenforce 0

  1. 클러스터 생성(db1)
    1) clusteradmin 계정으로 로그인(mysqlsh들어가서!)
    \connect clusteradmin@db1:3306
    패스워드 입력
    y

    2) 클러스터 생성

var cluster = dba.createCluster('MyCluster')

#처음에 위에걸로 해보고 안되면 밑에걸로

var cluster = dba.createCluster('MyCluster', {ipAllowlist: "db1, db2, db3"})

3) 클러스터에 인스턴스 추가
var cluster = dba.getCluster()
cluster.addInstance('clusteradmin@db2:3306')
C 클론 방식으로 데이터를 공유하겠다
cluster.addInstance('clusteradmin@db3:3306')
C 클론 방식으로 데이터를 공유하겠다

#처음에 위에걸로 해보고 안되면 밑에걸로

cluster.addInstance('clusteradmin@db2:3306', {ipAllowlist: "db1, db2, db3"})
	C	클론 방식으로 데이터를 공유하겠다

cluster.addInstance('clusteradmin@db3:3306', {ipAllowlist: "db1, db2, db3"})
	C	클론 방식으로 데이터를 공유하겠다

#\connect clusteradmin[내가추가하고자하는db]@[내가추가하고자하는위치]:3306
#한번에 안되면 \connect clusteradmindb2@db2:3306해서 db2로 로그인하고, 비번누르고 y로 비번 저장후 \connect clusteradmindb1@db1:3306로 db1으로 다시 로그인
그다음에 6-3번해보기

4) 클러스터 확인
var cluster = dba.getCluster()
cluster.describe() 실행했을 때 "topology" 에 db1, db2, db3이 있으면 성공
cluster.status()

*클러스터 모드
	Single-Primary : 클러스터 내의 1개의 서버에서만 읽기-쓰기 가능, 나머지는 읽기 전용
	Multi-Primary : 클러스터 내의 모든 서버에서 읽기-쓰기 가능

#clusteradmindb계정 비번 잘못 설정했을때 지우기 (ex.db2)
shell.deleteCredential('clusteradmindb2@db2:3306')


상황 : 클러스터 생성할 때 에러
에러 : 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번부터 다시 진행
= mysql 안에 db 다 날리고 재시작한것임.

참고 : https://dev.mysql.com/doc/mysql-shell/8.0/en/add-instances-cluster.html


#클러스터 삭제
\connect clusteradmin@db1:3306
var cluster = dba.getCluster()
cluster.dissolve()
y


  1. 라우터 구성(router)

1) 방화벽 끄기

    1-1) 네트워크 방화벽 설정
		systemctl stop firewalld

1-2) 로컬 방화벽
setenforce 0

2) mysql-router 설치
yum install -y https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm

yum install -y mysql-router

3) mysql-router 구성
mysqlrouter --bootstrap clusteradmin@db1:3306 --name clusterrouter --directory mycluster --account myrouter --user root

패스워드 입력 qwer1234



--bootstrap	: 대표 서버 주소
--name		: 구성할 라우터 이름
--directory	: 구성 파일이 생성 될 디렉토리의 경로
--account	: 라우터로 접속할 때 사용할 계정
--user		: 파일을 생성할 리눅스의 사용자

4) 라우터 실행
생성된 폴더 안에 있는 start.sh 파일을 실행(pwd로 내가 지금 어디있는지 확인!)

root/mycluster/start.sh		->절대경로

./mycluster/start.sh		->상대경로






#내가 지금 root위치에 있어서 mycluster 들어가서 start.sh실행했음

cd mycluster/
./start.sh

(#ERROR: PID ~Already running 떠도 괜찮음. 이미실행된것!)

5) workbench에서 접속 테스트
hostname : [mysql-router 컴퓨터의 IP주소]
username : [mysql-router에서 생성한 계정] -> myrouter로!(7-3번 --account myrouter라서)
port : [6446 or 6447] 6446은 읽기/쓰기, 6447 읽기 전용

접속 후 

show variables LIKE '%server_id%'; 실행해서 server-id를 확인, 접속할 때마다 server-id가 바껴야 정상

#4-1에서 server-id를 설정하고 4-2에서 적용함,
7-5에서 server-id를 확인했을 때 설정한 값이 안나오는 이유는??
4-1에서 설정을 잘못한것같은데 크게 상관은없다.
(#나는 workbench에서 server-id가 내가 설정한 1,2,3 같은 숫자가 아닌 랜덤한 이상한 숫자가나옴.
6446에서는 server-id 안바뀌고 6447에서는 바뀌긴하는데 다른 이상한숫자로 바뀜)


	레플리케이션			클러스터링			샤딩

서버 개수 마스터 1, 슬레이브 N 최소 3대
속도 빠름 느림
안전성 조금 안좋음 좋음
방식 비동기 동기
단점 Master가 죽으면 Primary가 죽어도
복구하기 까다로움 Secondary중에서 자동으로
Primary를 선정


0개의 댓글