18.5.13.3 MySQL Cluster 데이터 노드의 온라인 추가 : 자세한 예제
이 섹션에서는 MySQL Cluster 데이터 노드를 온라인으로 추가하는 방법을 설명하는 자세한 예제를 보여줍니다. 먼저 단일 노드 그룹에 2 개의 데이터 노드를 가진 MySQL Cluster에서 시작하여 두 노드 그룹에 4 개의 데이터 노드 클러스터에서 종료합니다.
구성의 시작 설명을 위해 최소한의 구성으로 다음의 정보만을 포함 config.ini 파일을 클러스터에서 사용한다고 가정합니다.
[ndbd default] DataMemory = 100M IndexMemory = 100M NoOfReplicas = 2 DataDir = /usr/local/mysql/var/mysql-cluster [ndbd] Id = 1 HostName = 192.168.0.1 [ndbd] Id = 2 HostName = 192.168.0.2 [mgm] HostName = 192.168.0.10 Id = 10 [api] Id=20 HostName = 192.168.0.20 [api] Id=21 HostName = 192.168.0.21
데이터 노드 ID와 다른 노드 간의 순서에 간격을두고 있습니다. 그러면 나중에 새롭게 추가되는 데이터 노드에 아직 사용되지 않은 노드 ID를 쉽게 지정할 수 있습니다.
또한 적절한 명령 행 또는 my.cnf 옵션을 사용하여 클러스터를 이미 시작하고, 관리 클라이언트에서 SHOW 를 실행하면 다음 것과 유사한 출력이 생성된다고 가정합니다.
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
마지막으로, 다음과 같이 생성 된 단일 NDBCLUSTER 테이블이 클러스터에 포함되어 있다고 가정합니다.
USE n;
CREATE TABLE ips (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
country_code CHAR(2) NOT NULL,
type CHAR(4) NOT NULL,
ip_address varchar(15) NOT NULL,
addresses BIGINT UNSIGNED DEFAULT NULL,
date BIGINT UNSIGNED DEFAULT NULL
) ENGINE NDBCLUSTER;
이 섹션 뒷부분에 나와있는 메모리 사용률 및 관련 정보는이 테이블에 약 50000 개 삽입 한 후에 생성되었습니다.
이 예에서는 데이터 노드 프로세스에 단일 스레드 ndbd를 사용하는 것을 나타냅니다. 그러나 MySQL Cluster NDB 7.0.4 이상에서는 멀티 스레드 ndbmtd를 사용하는 경우에도 아래의 단계 ndbd가 표시된 부분을 ndbmtd에 대체하여이 예를 적용 할 수 있습니다. (Bug # 43108)
1 단계 : 구성 파일의 업데이트 텍스트 편집기에서 클러스터의 글로벌 구성 파일을 열고 2 개의 새로운 데이터 노드에 해당하는 [ndbd] 섹션을 추가합니다. (이러한 데이터 노드에 ID 3과 4를 부여하고 그들이 각각 192.168.0.3와 192.168.0.4의 주소에있는 호스트 시스템에서 실행된다고 가정합니다.) 새로운 섹션을 추가 한 후 config.ini 파일 내용이 다음과 같이 보입니다. 여기서 파일에 추가 한 부분은 굵게 표시되어 있습니다.
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 192.168.0.1
[ndbd]
Id = 2
HostName = 192.168.0.2
[ndbd]
Id = 3
HostName = 192.168.0.3
[ndbd]
Id = 4
HostName = 192.168.0.4
[mgm]
HostName = 192.168.0.10
Id = 10
[api]
Id=20
HostName = 192.168.0.20
[api]
Id=21
HostName = 192.168.0.21
필요한 변경이 완료되면 파일을 저장합니다.
2 단계 : 관리 서버를 재시작 클러스터 관리 서버를 다시 시작하려면 다음과 같이 별도의 명령을 실행하여 관리 서버를 중지 한 후 다시 시작해야합니다.
다음과 같이 관리 클라이언트의
STOP명령을 사용하여 관리 서버를 중지합니다.ndb_mgm>
10 STOPNode 10 has shut down. Disconnecting to allow Management Server to shutdown shell>관리 서버를 종료하면 관리 클라이언트가 종료하기 위해 시스템 쉘에서 관리 서버를 시작해야합니다. 단순하게하기 위해
config.ini는 관리 서버 바이너리와 같은 디렉토리에 있다고 가정하고 있습니다 만, 실제로는 구성 파일의 정확한 경로를 지정해야합니다. 또한 관리 서버가 구성 캐시가 아니라 파일에서 새로운 구성을 읽을 수 있도록--reload또는--initial옵션도 지정해야합니다. 쉘의 현재 디렉토리를 관리 서버 바이너리가 배치되어있는 디렉토리와 동일한 경우는 다음과 같이 관리 서버를 호출 할 수 있습니다.shell>
ndb_mgmd -f config.ini --reload2008-12-08 17:29:23 [MgmSrvr] INFO -- NDB Cluster Management Server. 5.6.27-ndb-7.4.9 2008-12-08 17:29:23 [MgmSrvr] INFO -- Reading cluster configuration from 'config.ini'
ndb_mgm 프로세스가 다시 시작 된 후 관리 클라이언트에서 SHOW 의 출력을 선택하면 다음과 같이 표시됩니다.
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
id=3 (not connected, accepting connect from 192.168.0.3)
id=4 (not connected, accepting connect from 192.168.0.4)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
3 단계 : 기존의 데이터 노드의 롤링 재시작 실행 다음과 같이 RESTART 명령을 사용하면이 단계를 완전히 클러스터 관리 클라이언트에서 제공합니다.
ndb_mgm>1 RESTARTNode 1: Node shutdown initiated Node 1: Node shutdown completed, restarting, no start. Node 1 is being restarted ndb_mgm> Node 1: Start initiated (version 7.4.9) Node 1: Started (version 7.1.36) ndb_mgm>2 RESTARTNode 2: Node shutdown initiated Node 2: Node shutdown completed, restarting, no start. Node 2 is being restarted ndb_mgm> Node 2: Start initiated (version 7.4.9) ndb_mgm> Node 2: Started (version 7.4.9)
각 명령을 실행하면 관리 클라이언트가 X RESTART「Node 라는 보고서가 출력 될 때까지 대기 한 후 계속합니다. X : Started (version ...)」
mysql 클라이언트에서 ndbinfo.nodes 테이블을 선택하면 기존의 데이터 노드가 모든 업데이트 된 구성을 사용하여 다시 시작 된 것을 확인할 수 있습니다.
4 단계 : 모든 클러스터 API 노드의 롤링 재시작 실행 mysqladmin shutdown에 이어 mysqld_safe (또는 다른 시작 스크립트)를 사용하여 클러스터의 SQL 노드로 작동하는 각 MySQL 서버를 종료하고 다시 시작합니다. 이것은 다음 것과 비슷합니다. 여기서 password 는 특정 MySQL 서버 인스턴스의 MySQL root 암호입니다.
shell>mysqladmin -uroot -p081208 20:19:56 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended shell>passwordshutdownmysqld_safe --ndbcluster --ndb-connectstring=192.168.0.10 &081208 20:20:06 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 081208 20:20:06 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
당연히 정확한 입력 및 출력은 MySQL이 시스템에 설치되어있는 방법과 장소, 그리고 시작할 때 선택한 옵션 (및 이러한 옵션의 일부 또는 전부를 my.cnf 파일에 지정되어 있는지 여부 )에 따라 다릅니다.
5 단계 : 새로운 데이터 노드의 초기 부팅 수행 다음과 같이 새로운 데이터 노드의 각 호스트 시스템 쉘에서 --initial 옵션을 사용하여 데이터 노드를 시작합니다.
shell> ndbd -c 192.168.0.10 --initial
기존 데이터 노드를 다시 시작하는 경우와는 달리 새로운 데이터 노드는 동시에 시작할 수 있습니다. 데이터 노드의 시작이 완료 될 때까지 기다린 후 다른 데이터 노드를 시작할 필요가 없습니다.
새로운 데이터 노드가 모두 시작될 때까지 기다린 후 다음 단계로 이동합니다. 새로운 데이터 노드가 시작되면 관리 클라이언트의 SHOW 명령의 출력에서 (아래 굵게 표시된 것처럼) 그들이 어떤 노드 그룹에도 속하지 않는 것을 확인할 수 있습니다.
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
id=3 @192.168.0.3 (5.6.27-ndb-7.4.9, no nodegroup)
id=4 @192.168.0.4 (5.6.27-ndb-7.4.9, no nodegroup)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
6 단계 : 새로운 노드 그룹 만들기 이것은 클러스터 관리 클라이언트에서 CREATE NODEGROUP 명령을 실행하여 실행할 수 있습니다. 다음과 같이이 명령은 인수로 새로운 노드 그룹에 포함 된 데이터 노드의 ID를 쉼표로 구분 된 목록을 가지고 있습니다.
ndb_mgm> CREATE NODEGROUP 3,4
Nodegroup 1 created
다시 SHOW 를 발행하면 (마찬가지로 굵게 표시된대로) 데이터 노드 3과 4가 새로운 노드 그룹에 참여한 것을 확인할 수 있습니다.
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
id=3 @192.168.0.3 (5.6.27-ndb-7.4.9, Nodegroup: 1)
id=4 @192.168.0.4 (5.6.27-ndb-7.4.9, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
7 단계 : 클러스터 데이터 재배포 관리 클라이언트에서 적절한 REPORT 명령을 실행하여 확인할 수 있도록 노드 그룹을 만들 때 기존 데이터 및 인덱스는 자동으로 새 노드 그룹의 데이터 노드에 배포되지 않습니다.
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(177 32K pages of total 3200)
Node 1: Index usage is 0%(108 8K pages of total 12832)
Node 2: Data usage is 5%(177 32K pages of total 3200)
Node 2: Index usage is 0%(108 8K pages of total 12832)
Node 3: Data usage is 0%(0 32K pages of total 3200)
Node 3: Index usage is 0%(0 8K pages of total 12832)
Node 4: Data usage is 0%(0 32K pages of total 3200)
Node 4: Index usage is 0%(0 8K pages of total 12832)
-p 옵션을 붙여 ndb_desc을 사용하면 출력에 분할 정보가 포함되어 있으므로 테이블에서는 아직 2 개의 파티션만을 사용되지 않은 것을 (여기에 굵은 글씨로 표시된 출력 「Per partition info」 섹션) 확인할 수 있습니다.
shell> ndb_desc -c 192.168.0.10 -d n ips -p
-- ips --
Version: 1
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 340
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 26086 26086 1572864 557056
1 26329 26329 1605632 557056
NDBT_ProgramExit: 0 - OK
NDBCLUSTER 테이블마다 mysql 클라이언트에서 ALTER ONLINE TABLE ... REORGANIZE PARTITION 명령문을 실행하여 모든 데이터 노드간에 데이터 재배포되도록 할 수 있습니다. ALTER ONLINE TABLE ips REORGANIZE PARTITION 명령문을 발행 한 후, ndb_desc을 사용하면 다음과 같이 (굵은 출력 관련 부분에 의해)이 테이블의 테이터가 4 개의 파티션을 사용하여 저장되도록 된 것을 확인할 수 있습니다.
shell> ndb_desc -c 192.168.0.10 -d n ips -p
-- ips --
Version: 16777217
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 341
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 4
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 12981 52296 1572864 557056
1 13236 52515 1605632 557056
2 13105 13105 819200 294912
3 13093 13093 819200 294912
NDBT_ProgramExit: 0 - OK
일반적으로 ALTER [ONLINE] TABLE 파티션 식별자 목록 및 파티션 정의의 세트와 함께 사용하여 이미 명시 적으로 분할되어있는 테이블에 새로운 파티셔닝을 만듭니다. 이 점에서 새로운 MySQL Cluster 노드 그룹에 데이터를 재배포 여기의 사용법은 예외입니다. 이와 같이 사용하는 경우 table_name REORGANIZE PARTITIONTABLE 키워드 뒤에 테이블 이름 만 사용하고 다른 키워드와 식별자는 REORGANIZE PARTITION 다음에 계속 않습니다.
자세한 내용은 섹션 13.1.7 "ALTER TABLE 구문" 을 참조하십시오.
또한 낭비되고있는 영역이 재사용 될 수 있도록 각 테이블에 ALTER ONLINE TABLE 문 뒤에 OPTIMIZE TABLE 을 계속 지정해야합니다. INFORMATION_SCHEMA.TABLES 테이블에 대해 다음 쿼리를 사용하면 모든 NDBCLUSTER 테이블의 목록을 얻을 수 있습니다.
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = 'NDBCLUSTER';
MySQL Cluster 테이블에서는 테이블을 만드는 데 사용 된 CREATE TABLE 문 (또는 다른 스토리지 엔진에서 기존 테이블을 변환하는 데 사용 된 ALTER TABLE 문)의 ENGINE 옵션 NDB 가 사용되었는지, 또는 NDBCLUSTER 가 사용되었는지에 관계없이 INFORMATION_SCHEMA.TABLES.ENGINE 값은 항상 NDBCLUSTER 입니다.
이 문을 실행 한 후에는 다음과 같이 ALL REPORT MEMORY 의 출력 데이터 및 인덱스가 모든 데이터 노드간에 재배포 된 것을 확인할 수 있습니다.
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(176 32K pages of total 3200)
Node 1: Index usage is 0%(76 8K pages of total 12832)
Node 2: Data usage is 5%(176 32K pages of total 3200)
Node 2: Index usage is 0%(76 8K pages of total 12832)
Node 3: Data usage is 2%(80 32K pages of total 3200)
Node 3: Index usage is 0%(51 8K pages of total 12832)
Node 4: Data usage is 2%(80 32K pages of total 3200)
Node 4: Index usage is 0%(50 8K pages of total 12832)
NDBCLUSTER 테이블에 동시에 1 회 DDL 작업 만 수행 할 수 없기 때문에 각 ALTER ONLINE TABLE ... REORGANIZE PARTITION 문이 완료 될 때까지 기다린 후 다음 문을 실행해야합니다.
새로운 데이터 노드가 추가 된 후에 생성 된 NDBCLUSTER 테이블에 대해서는 ALTER ONLINE TABLE ... REORGANIZE PARTITION 명령문을 발행 할 필요가 없습니다. 이 같은 테이블에 추가 된 데이터는 모든 데이터 노드간에 자동으로 배포됩니다. 그러나 새 노드가 추가되기 전에 존재했던 NDBCLUSTER 테이블에서는 그 테이블이 ALTER ONLINE TABLE ... REORGANIZE PARTITION 을 사용하여 재구성 될 때까지 기존 데이터도 새 데이터도 새로운 노드 를 사용하여 배포되지 않습니다.
롤링 재시작을 사용하지 않는 대체 절차 클러스터를 처음 시작할 때 여분의 데이터 노드를 구성하지만, 그들을 시작하지 않음으로써 롤링 다시 시작의 필요성을 피할 수 있습니다. 예전처럼 먼저 하나의 노드 그룹 내의 2 개의 데이터 노드 (노드 1과 2)에서 시작하여 나중에 노드 3과 4로 구성된 두 번째 노드 그룹을 추가하여 클러스터를 4 하나의 데이터 노드까지 확장한다고 가정합니다.
[ndbd default] DataMemory = 100M IndexMemory = 100M NoOfReplicas = 2 DataDir = /usr/local/mysql/var/mysql-cluster [ndbd] Id = 1 HostName = 192.168.0.1 [ndbd] Id = 2 HostName = 192.168.0.2 [ndbd] Id = 3 HostName = 192.168.0.3 Nodegroup = 65536 [ndbd] Id = 4 HostName = 192.168.0.4 Nodegroup = 65536 [mgm] HostName = 192.168.0.10 Id = 10 [api] Id=20 HostName = 192.168.0.20 [api] Id=21 HostName = 192.168.0.21
나중에 온라인에 데이터 노드 (노드 3과 4)를 NodeGroup = 65536 로 구성 할 수 있습니다. 이 경우 노드 1과 2는 각각 다음과 같이 시작할 수 있습니다.
shell> ndbd -c 192.168.0.10 --initial
NodeGroup = 65536 로 구성된 데이터 노드는 StartNoNodeGroupTimeout 데이터 노드 구성 매개 변수의 설정에 의해 지정된 시간 동안 대기 한 후 --nowait-nodes=3,4 를 사용하여 노드 1과 2를 시작했는지 같이 관리 서버에 의해 처리됩니다. 기본적으로 이것은 15 초 (15000 밀리 초)입니다.
StartNoNodegroupTimeout 는 클러스터의 모든 데이터 노드에서 동일해야합니다. 따라서 이것은 개별 데이터 노드가 아니라 항상 config.ini 파일의 [ndbd default] 섹션에 설정하도록하십시오.
두 번째 노드 그룹을 추가 할 준비가되면 다음 추가 단계를 수행 할 필요가있을뿐입니다.
데이터 노드 3과 4를 시작하고 새 노드마다 데이터 노드의 프로세스를 한 번씩 호출합니다.
shell>
ndbd -c 192.168.0.10 --initial관리 클라이언트에서 적절한
CREATE NODEGROUP명령을 실행합니다.ndb_mgm>
CREATE NODEGROUP 3,4mysql 클라이언트에서 기존
NDBCLUSTER테이블마다ALTER ONLINE TABLE ... REORGANIZE PARTITION및OPTIMIZE TABLE문을 발행합니다. (이 섹션의 다른 곳에서 언급했듯이, 이것이 완료 될 때까지 기존의 MySQL Cluster 테이블은 데이터 배포에 새로운 노드를 사용할 수 없습니다.)