본 포스팅은 Ubuntu 20.04에서 Mysql Cluster 8.0을 구축하기 위한 포스팅입니다.
다른 여러 개발자 분들께서 MySQL Cluster 7.x 버전의 유익하고 훌륭한 가이드를 남겨주셨지만 8.0 버전에서의 구축 정보가 많지 않아 포스팅해봅니다.
(그렇게 대중적으로 사용되는 기술은 아니라는 점도 작용하지 않았을까 조심스레 추측해 봅니다.)
예제에서는 Virtual Box에서 총 4대의 가상 머신을 만들어 구축합니다.
Mysql Cluster는 1개의 관리 노드, 2개의 데이터 노드 그리고 1개의 SQL 노드를 최소 구성으로 합니다.
이를 근거한 각 PC의 스펙과 IP 분배, 구성 정보는 아래와 같습니다.
No. |
OS |
Storage |
RAM |
IP |
Node |
1 |
Ubuntu20.04 Desktop 64Bit |
20GB |
2GB |
169.254.61.11 |
관리 노드(MGM Node) |
2 |
Ubuntu20.04 Server 64Bit |
20GB |
2GB |
169.254.61.12 |
데이터 노드 1 (Data Node) |
3 |
Ubuntu20.04 Server 64Bit |
20GB |
2GB |
169.254.61.13 |
데이터 노드 2 (Data Node) |
4 |
Ubuntu20.04 Server 64Bit |
20GB |
2GB |
169.254.61.14 |
SQL 노드 (SQL Node) |
관리 노드는 각 데이터 노드와 SQL 노드의 연결을 제어하며, SQL 노드는 데이터베이스 접속, 질의문 수행을 담당합니다.
진행하기에 앞서 각 PC에는 반드시 고정 IP가 할당되어있어야 하며, 각 PC의 저장소 용량은 최소 20GB이상은 되어야 원활한 설치가 가능합니다.
클러스터 구축은 wget을 이용해 바이너리 파일을 확보해서 진행했습니다.
1. MGM Node 설치
IP 주소 169.254.61.11을 갖고 있는 1번 PC에서 아래의 명령어로 MySQL Cluster 바이너리 파일을 받습니다.
$ cd
$ wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-cluster-8.0.21-linux-glibc2.12-x86_64.tar.gz
# 파일 압축 해제
$ tar -xzvf mysql-cluster-8.0.21-linux-glibc2.12-x86_64.tar.gz
# 이름 변경
$ mv mysql-cluster-8.0.21-linux-glibc2.12-x86_64 mysql
가장 먼저 해야 할 일은 각 노드들을 제어하는 명령들을 /usr/local/bin/에 복사한 후 실행 권한 부여하는 것입니다.
$ sudo cp ~/mysql/bin/ndb_mgm* /usr/local/bin/
$ sudo chmod +x /usr/local/bin/ndb_mgm*
위 명령으로 /usr/local/bin/ 디렉터리에 이동되는 명령은 ndb_mgm, ndb_mgmd입니다.
ndb_mgmd 명령은 클러스터 프로세스를 시작하기 위한 명령이고 ndb_mgm 명령은 구동 중인 클러스터를 제어하는 데 사용합니다.
이제 연결할 각 노드의 설정 정보를 정의할 파일을 생성해야 합니다.
먼저, 아래의 명령어로 /var/lib 디렉터리에 mysql-cluster라는 이름의 폴더를 생성하고 그 안에 config.ini라는 이름으로 설정 파일을 생성합니다.
$ sudo mkdir -p /var/lib/mysql-cluster/
$ sudo vim /var/lib/mysql-cluster/config.ini
vim 명령어로 config.ini라는 이름으로 편집기가 열리면 아래의 노드 설정 정보를 입력합니다.
# config.ini 파일에 아래 내용 작성
[ndbd default]
NoOfReplicas=2
DataMemory=80M
[ndb_mgmd default]
[tcp default]
# Cluster Control / Management node
[ndb_mgmd]
hostname=169.254.61.11
DataDir=/var/lib/mysql-cluster
# Data Node 1
[ndbd]
hostname=169.254.61.12
DataDir=/var/lib/mysql/data
#Data Node 2
[ndbd]
hostname=169.254.61.13
DataDir=/var/lib/mysql/data
# SQL Node
[mysqld]
hostname=169.254.61.14
[mysqld]
여기서 ndbd default 섹션의 NoOfReplicas 기본 권장 값은 2입니다.
NoOfReplicas는 테이블 복제본 수와 노드 그룹의 크기를 정의하는 값입니다.
이를테면 NoOfReplicas=2라면, 데이터 노드가 4개라면 하나의 노드 그룹은 2개의 노드를 보유하며 데이터 복제본이 2개가 존재한다는 의미입니다.
각 hostname의 정보는 구축하는 환경에서의 IP 정보를 입력해야 합니다.
위 설정 정보는 클러스터를 구동하기 위한 아주 최소한의 정보만 입력되어있으며, 실제로 활용하기 위해서는 필연적으로 추가적인 설정 정보들을 더 작성해 주어야 합니다.
config.ini 파일의 작성이 완료되었다면 아래의 명령어로 노드 프로세스 실행하고, 부팅 시에도 자동으로 실행할 수 있도록 설정합니다.
$ sudo apt-get install libtinfo5
$ sudo ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/
# 부팅 시 자동 실행 하도록 rc.local에 명령어 추가
$ sudo -s
# echo 'ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/' >> /etc/rc.local
# exit
여기서 만약 rc.local이 없다면 아래의 링크를 참고해서 rc.local을 사용할 수 있도록 해주세요.
linuxmedium.com/how-to-enable-etc-rc-local-with-systemd-on-ubuntu-20-04/
이제 터미널에서 ndb_mgm 명령어를 입력하면 CLI가 ndb_mgm> 으로 바뀌며 노드 관리 프롬프트로 접속합니다.
아래의 명령어로 각 노드들의 연결 정보를 확인할 수 있습니다.
$ ndb_mgm
ndb_mgm> show
아직 다른 노드를 구축하지 않았기 때문에 모든 노드들이 not connected로 표시됩니다.
2. SQL Node & Data Node 설정 (공통)
2-1. Node 연결 설정 파일 작성
MGM Node를 제외한 다른 모든 PC에서 아래의 명령어로 MGM Node로 연결하기 위한 설정 파일을 작성합니다.
$ sudo vim /etc/my.cnf
#아래의 내용 작성
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
# Options for mysqld process:
ndbcluster # run NDB storage engine
user=mysql
[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=169.254.61.11 # location of management server
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
2-2. 바이너리 파일 다운로드 및 디렉터리 설정
wget으로 바이너리 파일을 받습니다.
$ cd
$ wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-cluster-8.0.21-linux-glibc2.12-x86_64.tar.gz
#파일 압축 해제
$ tar -xzvf mysql-cluster-8.0.21-linux-glibc2.12-x86_64.tar.gz
# 이름 변경
$ mv mysql-cluster-8.0.21-linux-glibc2.12-x86_64 mysql
# 디렉터리 변경
$ sudo mv mysql /usr/local/
$ cd /usr/local/mysql
2-3 DB 생성
DB를 관리하기 위한 새 사용자를 작성합니다.
# 유저 생성
$ sudo groupadd mysql
$ sudo useradd -g mysql mysql
# DB 생성
$ sudo bin/mysqld --initialize-insecure --user=mysql
위 명령어를 수행하면 /usr/local/mysql 디렉터리에 data라는 디렉터리와 그 안에 파일들이 생성됩니다.
여기서, 이후 mysql 접속에 필요한 라이브러리를 미리 설치해 줍니다.
sudo apt-get install libtinfo5
이제, support-files디렉터리에 있는 mysql.server를 부팅 시마다 실행할 수 있도록 init.d에 mysqld라는 이름으로 복제합니다.
# 재시작 해도 실행 가능 하도록 서비스 등록
$ sudo cp support-files/mysql.server /etc/init.d/mysqld
#소유권 변경
$ sudo chown mysql:mysql /etc/init.d/mysqld
복제한 mysqld의 내용을 아래의 명령어로 수정합니다.
# 서비스 파일 내 디렉터리 설정 변경
$ sudo vim /etc/init.d/mysqld
# 아래와 같이 내용 수정
basedir=/usr/local/mysql
datadir=/var/lib/mysql/data
여기서 datadir은 MGM Node에서의 config.ini에서 설정한 경로입니다.
mysqld를 부팅 시에 실행할 수 있도록 합니다.
#서비스 등록
$ sudo systemctl enable mysqld
데이터 경로를 생성하고 소유권을 변경합니다.
$ sudo mkdir -p /var/lib/mysql/data
$ sudo chown -R mysql /var/lib/mysql
여기까지는 Data Node와 SQL Node의 공통사항이었습니다.
이후부터는 Data Node와 SQL Node의 설정이 다르니 주의해주세요.
3. Data Node 설정
아래의 순서대로 mysqld 프로세스를 실행하고 데이터 노드를 관리 노드에 연결합니다.
$ sudo bin/ndbd --initial
$ sudo systemctl start mysqld
sudo systemctl status mysqld로 실행 상태를 확인합니다.
netstat으로 프로세스를 확인합니다.
정상적으로 ndbd와 mysqld가 실행되고 있습니다.
3. SQL Node 설정
SQL Node에서는 바로 mysqld 프로세스를 실행합니다.
$ sudo systemctl start mysqld
SQL Node가 시작되었으므로, mysql의 root 계정의 패스워드를 수정해야 합니다.
DB를 생성할 때 $ sudo bin/mysqld --initialize-insecure --user=mysql 명령어를 통해 생성을 했는데, 여기서
--initialize-insecure
위 인자로 인해 mysql의 root 계정의 비밀번호가 빈 값으로 지정되었기 때문입니다.
아래의 명령어로 root 계정의 패스워드를 등록합니다.
$ sudo bin/mysql_secure_installation
위 명령을 수행하면 자세하게 안내 지문을 제공하니 본 포스팅에서는 별도의 설명은 생략하겠습니다.
3. 데이터베이스 클라스터 테스트
SQL Node에서 데이터베이스에 접속합니다.
$ bin/mysql -uroot -p
여기서 테스트 DB를 생성하고 다른 노드에 복제가 되는지 확인합니다.
mysql> create database test_db;
정상적으로 데이터 베이스가 복제되었습니다.
본 포스팅의 내용은 빙산에 일각이라 할 정도로 설정 정보와 설계가 단조롭습니다.
MySQL Cluster를 기초적인 형태로나마 구현해본다라는 취지에서 작성한 포스팅이므로 이를 감안해서 읽어주시면 감사하겠습니다.
이것으로 기본적인 MySQL Cluster 구축 포스팅을 마치겠습니다.
'Dev > etc' 카테고리의 다른 글
[Jenkins] Docker를 이용한 Jenkins - Spring Boot 프로젝트 배포 (16) | 2021.01.29 |
---|---|
[Jenkins] Jenkins - Spring Boot 프로젝트 jar 배포 (0) | 2021.01.26 |
SSL connection error로 인해 외부 MySQL 접속이 안되는 문제 해결 (0) | 2020.10.11 |
Windows 환경에서의 MySql5.1~ 설치 (0) | 2020.03.12 |
Linux 환경에서의 MySql5.1~ 설치와 root 계정 접속 세팅 (0) | 2020.03.12 |