본문 바로가기

Database/MySQL

MySQL NDB Cluster 설치

shell> useradd -m chlee

0.설치 기준

  1. 기능 검증시 노드 장애 테스트 편의를 위해서 virtual box에 설치한다.
  2. linux OS는 centos(7로 한다.)
  3. HA 테스트를 위해서 data 노드 2개, sql 노드 2개, management 노드 1개를 설치한다.
  4. 가상머신간에 통신이 가능한 구성으로 설치한다.
    1. https://technote.kr/213
    2. NAT network 방식으로 먼저 해보고 가상머신에 IP 할당이 필요하다면 인프라팀에 요청한다

1.설치 준비


1.1 사용자 생성하기

mysql 데몬을 실행하는 unix 계정을 생성한다. 일반적으로 root 혹은 mysql 을 계정을 사용하지만 여기서는 chlee 계정을 사용하여 생성한다.

shell> useradd -m chlee

1.2 package 준비

MySQL package 를 얻기 위해서는아래와 같이 3가지 방법이 있다. 3가지 모두 mysql download ( community ) 에서 받을 수 있다.

  • binary
  • RPM
  • source code compile

간편하고 설치 위치를 사용자 계정으로 하기 위해 binary 를 통해 설치를 진행 한다.

[chlee@base ~]$ cd package/
[chlee@base package]$ pwd
/home/chlee/package
[chlee@base package]$ tar xvfz mysql-cluster-gpl-7.6.9-linux-glibc2.12-x86_64.tar.gz
... ... (압축해제)
[chlee@base package]$ ls -al
합계 892816
drwxrwxr-x.  3 chlee chlee       121  3월 11 16:35 .
drwx------. 16 chlee chlee      4096  3월 11 18:20 ..
drwxrwxr-x. 13 chlee chlee       269  3월 11 17:58 mysql-cluster-gpl-7.6.9-linux-glibc2.12-x86_64
-rw-rw-r--.  1 chlee chlee 914236523  3월 11 16:35 mysql-cluster-gpl-7.6.9-linux-glibc2.12-x86_64.tar.gz
[chlee@base package]$ cd ..
[chlee@base ~]$ ln -s package/mysql-cluster-gpl-7.6.9-linux-glibc2.12-x86_64 mysqlc

위 package 준비 과정을 5개의 node 동일한 파일과 동일한 경로로 작업을 진행한다.

1.3 virtualbox

NDB 구성을 위해 virtualbox 를 사용하였으면 별도의 설치과정은 생략한다.

2. NDB 설치


2.1 NDB 설치 개요

NDB 를 설치하기 위해서는 최소 3개의 노드설치가 필요하다.

  • Management Node
  • SQL Node
  • Data Node

구성된 node 정보는 다음과 같다.

node poshostnameip

Management base 192.168.56.2
SQL sql1 192.168.56.3
sql2 192.168.56.4
DATA data1 192.168.56.5
data2 192.168.56.6

2.2 Management node 설치하기

management node 는 기존의 mysql 바이너리가 필요없다. ndb_mgmd (server) 와 ndb_mgm(client) 만 필요하다. 상기 package 에 포함되어 있다.

바이너리 확인 이외에 별도의 설치과정이 필요하지 않으며 sql 및 data node 와는 다르게 NDB cluster 구성에 관련된 config.ini 파일이 필요하다.

아래는 config.ini 내용이다. node 에 대한 정보를 제외하고는 property 에 대한 조사가 필요하기에 manual 의 기본값으로 설정하였다.

[chlee@base ~]$ cd mysqlc
[chlee@base mysqlc]$ mkdir mysql-cluster
[chlee@base mysqlc]$ cd mysql-cluster/
[chlee@base mysql-cluster]$ cat config.ini

[ndbd default]
# Options affecting ndbd processed on all data nodes.
NoOfReplicas=2   # number of replicas
DataMemory=80M   # How much memory to allocate for data storage
#IndexMemory=18M  # How much memory to allocate for index storage
serverPort=2202  # This the default value


[ndb_mgmd]
# Management process options
HostName=192.168.56.2   # hostname or ip address of mgm node
DataDir=/home/chlee/mysqlc/mysql-cluster

[mysqld]
# Options for data node "sql1"
NodeId=3
HostName=192.168.56.3

[mysqld]
# Options for data node "sql1"
NodeId=4
HostName=192.168.56.4


[ndbd]
# Options for data node "data1"
Hostname=192.168.56.5
NodeId=5
DataDir=/home/chlee/mysqlc/data

[ndbd]
# Options for data node "data2"
Hostname=192.168.56.6
NodeId=6
DataDir=/home/chlee/mysqlc/data

2.3 DATA node 설치하기

data node 는 기존의 mysql 바이너리가 필요없다. ndbd (single-threaded) 와 ndbmtd(multi-threaded) 만 필요하다. 상기 package 에 포함되어 있다.

바이너리 확인 이외에 별도의 설치과정이 필요하지 않으며 my.cnf 설정이 필요하다. my.cnf 파일은 모든 data node 에 동일하게 설정한다.

[chlee@sql1 ~]$ cat /home/chlee/mysqlc/etc/my.cnf
[mysqld]
# options for mysqld process:
ndbcluster   # run NDB storage engine

[mysql_cluster]
# options for Cluster processes:
ndb-connectstring=192.168.56.2 # location of management server

2.4 SQL node 설치하기

sql node 는 일반 mysql 설치와 매우 유사하다.(같은가?..)

아래명령을 통해 기본 데이터베이스를 생성한다.

[chlee@sql1 ~]$ cd mysqlc
[chlee@sql1 mysqlc]$
[chlee@sql1 mysqlc]$ bin/mysqld --initialize-insecure --user=chlee \
 --datadir=/home/chlee/mysqlc/data \
 --basedir=/home/chlee/mysqlc
2019-03-12T01:28:52.136169Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5000)
2019-03-12T01:28:52.136237Z 0 [Warning] Changed limits: table_open_cache: 431 (requested 2000)
2019-03-12T01:28:52.136336Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-03-12T01:28:52.323617Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-03-12T01:28:52.358755Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-03-12T01:28:52.420879Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 31ca5a13-4466-11e9-bb05-080027e58ceb.
2019-03-12T01:28:52.422537Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-03-12T01:28:52.423344Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
[chlee@sql1 mysqlc]$

sql 및 data node 는 my.cnf 를 통해 NDB storage engine 사용한다는 것을 명시해야 하며 management node 정보를 입력 해야 한다.

my.cnf 는 sql node 모두 동일하게 적용한다.

chlee@sql1 ~]$ cat /home/chlee/mysqlc/etc/my.cnf
[mysqld]
# options for mysqld process:
ndbcluster   # run NDB storage engine
datadir=/home/chlee/mysqlc/data
basedir=/home/chlee/mysqlc

[mysql_cluster]
# options for Cluster processes:
ndb-connectstring=192.168.56.2 # location of management server

my.cnf 참조 순서

/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
/home/user/mysqlc/my.cnf
~/.my.cnf

3. NDB 시작하기


기동순서는 아래순서로 진행한다.

  1. Management Node
    1. 먼저실행하지 않을 경우 다른 node 에서 접속 시도시 timeout 이 발생할 수 있다.
  2. DATA Node
    1. SQL 이전에 기동되어 있지 않다면 SQL node 에서 정상기동을 해도 cluster 에 join 을 하지 못한다. ( ndb_mgm -e show )
  3. SQL Node

3.1 Management Node 시작하기

[chlee@base mysqlc]$ bin/ndb_mgmd -f /home/chlee/mysqlc/mysql-cluster/config.ini --configdir=/home/chlee/mysqlc/mysql-cluster
MySQL Cluster Management Server mysql-5.7.25 ndb-7.6.9
[chlee@base mysqlc]$ ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=5 (not connected, accepting connect from 192.168.56.5)
id=6 (not connected, accepting connect from 192.168.56.6)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.56.2  (mysql-5.7.25 ndb-7.6.9)

[mysqld(API)]   2 node(s)
id=3 (not connected, accepting connect from 192.168.56.3)
id=4 (not connected, accepting connect from 192.168.56.4)

ndb_mgmd 를 제외하고는 아직 기동상태가 아니다.

3.2 DATA Node 시작하기

[chlee@data1 mysqlc]$ ndbd --defaults-file=/home/chlee/mysqlc/etc/my.cnf
2019-03-12 13:46:12 [ndbd] INFO     -- Angel connected to '192.168.56.2:1186'
2019-03-12 13:46:12 [ndbd] INFO     -- Angel allocated nodeid: 5
[chlee@data1 mysqlc]$ ps -ef | grep ndbd
chlee     5987     1  0 13:46 ?        00:00:00 ndbd --defaults-file=/home/chlee/mysqlc/etc/my.cnf
chlee     5988  5987  0 13:46 ?        00:00:00 ndbd --defaults-file=/home/chlee/mysqlc/etc/my.cnf

3.3 SQL Node 시작하기

[chlee@sql1 mysqlc]$ bin/mysqld_safe --defaults-file=$MYSQL_HOME/etc/my.cnf --user=chlee &
[1] 7527
[chlee@sql1 mysqlc]$ 2019-03-12T04:50:38.833634Z mysqld_safe Logging to '/home/chlee/mysqlc/data/sql1.err'.
2019-03-12T04:50:38.851344Z mysqld_safe Starting mysqld daemon with databases from /home/chlee/mysqlc/data

기동 이후에 몇가지 설정을 추가 한다.

다음은 접속하여 root 패스워드를 변경하는 부분이다. 처음 데이터베이스 생성시 --initialize-insecure 로 설정하였을 경우에는 패스워드를 입력받지 않는다.

[chlee@sql1 mysqlc]$ mysql -uroot -p
Enter password: (그냥 엔터 입력 )
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.25-ndb-7.6.9-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

접속 이후 root@localhost 조건에 대한 패스워드를 설정한다.

mysql> alter user 'root'@'localhost' identified by 'root';
Query OK, 0 rows affected (0.00 sec)

mysql> flush  privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>

테스트용 데이터베이스 및 사용자 추가 하기

mysql> create database test;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> create user 'test'@'localhost' identified by 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> create user 'test'@'127.0.0.1' identified by 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> create user 'test'@'%'         identified by 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to test@localhost with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to test@127.0.0.1 with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to test@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
[chlee@sql1 mysqlc]$ mysql -utest -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.25-ndb-7.6.9-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

mysql 은 사용자를 추가할때 접속하는 환경을 pair 로 관리한다. 즉 id 가 같아도 접속하는 환경에 따라 별도의 아이디가 된다.

3.4 확인

모든 node 의 데몬을 기동한 이후 정상적으로 연결되었는지 확인한다.

[chlee@base mysqlc]$ ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=5    @192.168.56.5  (mysql-5.7.25 ndb-7.6.9, Nodegroup: 0, *)
id=6    @192.168.56.6  (mysql-5.7.25 ndb-7.6.9, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.56.2  (mysql-5.7.25 ndb-7.6.9)

[mysqld(API)]   2 node(s)
id=3    @192.168.56.3  (mysql-5.7.25 ndb-7.6.9)
id=4    @192.168.56.4  (mysql-5.7.25 ndb-7.6.9)

[chlee@base mysqlc]$

3.5 종료 및 재시작

NDB Cluster 를 종료하는 경우에는 ndb_mgm 명령어로 모든 node 를 종료 시키다. 반대로 재시작으로 해야 하는 경우 모든 node 에서 각각 시작 명령을 실행해야 한다.

# shutdown cluster
[chlee@base mysqlc]$ ndb_mgm -e shutdown
Connected to Management Server at: localhost:1186
3 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
[chlee@base mysqlc]$




# start data node
[chlee@base mysqlc]$ bin/ndb_mgmd -f /home/chlee/mysqlc/mysql-cluster/config.ini --configdir=/home/chlee/mysqlc/mysql-cluster --reload

ndb_mgm -e shutdown 으로 종료되는 process 들
ndb_mgm ( ndb client )
ndb_mgmd ( server )
ndbd ( data node single-thread server )
ndbmtd ( data node multi-thread server )
sql node 는 mysqladmin 으로 종료해야 한다.

[chlee@sql1 data]$ mysqladmin -uroot shutdown -p
Enter password:
2019-03-12T05:07:12.710455Z mysqld_safe mysqld from pid file /home/chlee/mysqlc/data/sql1.pid ended

Reference