프로젝트로 내가맡은 부분이 mysql 클러스터였다.
원래는 Oracle클러스터 였지만 장비도 열악하고
RAW 디바이스에 대한 개념을 매우 못잡겠다
그것때문에 Oracle Cluster 를 설치못해서
매우해매다 팀원끼리 회의를 하다가 mysql로 변경
4대의 컴퓨터로 클러스터를 구현해보았다 -0-
테스트부분은 내가한것이 아니지만 잘된다는거!
일단 간략하게 설명을 해드려야겠다.
클러스터는 rpm으로 깐것도 구성할수있고
소스설치로도 구성할수있다. 하지만 rpm으로설치한것을
클러스터로 구현하려면 mysql-max라는 놈이 필요하고 그놈을 압축을 풀어서
각종 클러스터 데몬 파일들을 복사하는 개념이고
소스설치시엔 --with-ndb-cluster 라는 옵션을 주면 구성할수있다.
Mysql 5.0.67 Cluster 구성
MGM & SQL & Data
모두다 공통사항 설치.
기존의 mysql이 있는지 확인합니다.
[root@server06 ~]# rpm -qa |grep mysql
mysql-4.1.20-1.RHEL4.1
mysqlclient10-devel-3.23.58-4.RHEL4.1
mysql-bench-4.1.20-1.RHEL4.1
mod_auth_mysql-2.6.1-2.2
mysqlclient10-3.23.58-4.RHEL4.1
mysql-devel-4.1.20-1.RHEL4.1
php-mysql-5.0.5-8.12AX
mysql-server-4.1.20-1.RHEL4.1
freeradius-mysql-1.0.1-3.RHEL4.3
libdbi-dbd-mysql-0.6.5-10.RHEL4.1.1AX
관련있는것들을 지웁니다.
[root@server06 ~]# rpm -e mysqlclient10-devel-3.23.58-4.RHEL4.1
[root@server06 ~]# rpm -e mysql-bench-4.1.20-1.RHEL4.1
[root@server06 ~]# rpm -e mod_auth_mysql-2.6.1-2.2
[root@server06 ~]# rpm -e mysql-devel-4.1.20-1.RHEL4.1
[root@server06 ~]# rpm -e php-mysql-5.0.5-8.12AX
[root@server06 ~]# rpm -e mysql-server-4.1.20-1.RHEL4.1
[root@server06 ~]# rpm -e freeradius-mysql-1.0.1-3.RHEL4.3
[root@server06 ~]# rpm -qa |grep mysql
[root@server06 ~]# rpm -e libdbi-dbd-mysql-0.6.5-10.RHEL4.1.1AX
[root@server06 ~]# rpm -e mysqlclient10-3.23.58-4.RHEL4.1
의존성 에러가 뜨는군요
오류: Failed dependencies:
libmysqlclient.so.10 is needed by (installed) MySQL-python-1.0.0-1.RHEL4.1.i386
libmysqlclient.so.10 is needed by (installed) MyODBC-2.50.39-21.RHEL4.1.i386
libmysqlclient.so.10 is needed by (installed) qt-MySQL-3.3.3-9.3.8AX.i386
mysqlclient10 is needed by (installed) MySQL-python-1.0.0-1.RHEL4.1.i386
nodeps 를 붙여서 조심스레 지워봅니다. -0- 혹시나 안된다고 저에게
전화하지마세요 -0-
[root@server06 ~]# rpm -e mysqlclient10-3.23.58-4.RHEL4.1 --nodeps
[root@server06 ~]# rpm -e mysql-4.1.20-1.RHEL4.1 --nodeps
[root@server06 ~]#
[root@server06 ~]# rpm -qa|grep mysql
[root@server06 ~]#
말끔히 지워진걸 확인합니다.
[root@server06 ~]# cat /etc/passwd | grep mysql
[root@server06 ~]#
[root@server06 ~]# useradd mysql
mysql 유저가있는지 찾아봅니다. -0-
[root@server06 ~]# mkdir /usr/local/mysql
[root@server06 ~]# mkdir /db
미리 mysql이깔릴 곳과 db파일들이 깔리곳을 만듭니다.
[root@server06 ~]# cd mysql-5.0.67/
[root@server06 mysql-5.0.67]# ./configure --prefix=/usr/local/mysql/ --localstatedir=/db --with-ndbcluster
--prefix= mysql 엔진이깔릴곳을 지정합니다.
--localstatedir= database 파일들이 깔릴곳을 지정합니다.
--with-ndbcluster cluster 기능을 사용하겠다하는 설정입니다.
[root@server06 ~]# make && make install
[root@server06 ~]# cd /usr/local/mysql
[root@server06 mysql]# bin/mysql_install_db --user=mysql
데이터베이스파일을 만듭니다. localstatedir=/db 로 한거기억하시죠?거기있겠죠?
그렇지안아요 -_- 당연히 거기갈줄알았는데 아래와같이 벙찐곳에 깔렸습니다.
[root@server06 mysql]# ls -al /usr/local/mysql/var/
합계 16
drwx------ 4 mysql root 4096 9월 11 14:55 .
drwxr-xr-x 12 root root 4096 9월 11 14:55 ..
drwx------ 2 mysql root 4096 9월 11 14:55 mysql
drwx------ 2 mysql root 4096 9월 11 14:55 test
그래서 고치기로했습니다...
------------------------------------
Data NODE & SQL NODE 설정
------------------------------------
소스디렉토리에서 기본 설정파일을 복사합니다.
[root@server06 mysql]# cp /root/mysql-5.0.67/support-files/my-medium.cnf /etc/my.cnf
[root@server06 mysql]# vi /etc/my.cnf
[mysqld]
port = 3306
socket = /tmp/mysql.sock
datadir = /db <--- 이곳에 다 이한줄을써줍니다.
하는김에 아래작업도하져 -0-
MGM서버를 지칭하는겁니다. -0-
이아래 두줄은 DATA NODE만 추가
ndbcluster # run NDB engine
ndb-connectstring = 10.10.64.7 # location of MGM node
이아래 두줄은 SQL노드만
[MYSQL_CLUSTER]
ndb-connectstring = 10.10.64.7 # location of MGM node
[root@server06 mysql]# chown -R root .
[root@server06 mysql]# chgrp -R mysql .
[root@server06 mysql]#
혹시 모를 권한오류가있을지 모르니 -0- 구릅으로 같이쓰개설정 (루트님...굽신굽신)
[root@server06 mysql]# chown -R mysql /db
mysql로 database 파일을 생성할예정이무로 쓰기가능하게끔 -0- 그냥해줬습니다.
[root@server06 mysql]# rm -rf /usr/local/mysql/var
기존에있던 database파일 디렉토리를 날립니다.
[root@server06 mysql]# bin/mysql_install_db --user=mysql
--user=mysql mysql 계정으로 만들겠다는겁니다.
[root@server06 mysql]# ls -al /db
합계 660
drwxrwx--- 4 mysql 27 4096 9월 11 15:16 .
drwxr-xr-x 27 root root 4096 9월 11 14:10 ..
drwx------ 2 mysql root 4096 9월 11 15:16 mysql
-rw-rw---- 1 mysql mysql 15068 9월 11 15:16 mysql-bin.000001
-rw-rw---- 1 mysql mysql 628368 9월 11 15:16 mysql-bin.000002
-rw-rw---- 1 mysql mysql 38 9월 11 15:16 mysql-bin.index
drwx------ 2 mysql root 4096 9월 11 15:16 test
[root@server06 mysql]#
/db 에 기본 database 파일이 만들어졌습니다.
----------------------
MGM Server 셋팅
----------------------
위와 설치과정은같구요 굳이 Install_db 하지안아도 되는걸로 알고있습니다.
SQL서버도 사실 Install_db 하지안아도되구요 왜냐면 저장을 클러스터 노드로하면되거든요
어찌됫던 위와 설치는 동등하고 다른점만 집고넘어가겠습니다.
[root@MGM /]# cd db/
[root@MGM db]# mkdir cluster
[root@MGM db]#
MGM 설정파일이 저장될곳으로 /db/cluster 를만들엇습니다.
[root@MGM cluster]# vi /db/cluster/config.ini
Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
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
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
# TCP/IP options:
[TCP DEFAULT]
portnumber=2202 # This the default; however, you can use any
# port that is free for all the hosts in cluster
# Note: It is recommended beginning with MySQL 5.0 that
# you do not specify the portnumber at all and simply allow
# the default value to be used instead
# Management process options:
[NDB_MGMD]
hostname=10.10.64.7 # Hostname or IP address of MGM node
datadir=/db/cluster # Directory for MGM node logfiles
#MGM 의 config.ini 파일이있는위치를 지정해주면된다.
# Options for data node "Server05":
[NDBD]
# (one [NDBD] section per data node)
hostname=10.10.65.5 # Hostname or IP address
datadir=/db # Directory for this data node's datafiles
#NDB 1 (Server05) 주소와 DB디렉토리 지정
# Options for data node "Server06":
[NDBD]
hostname=10.10.64.6 # Hostname or IP address
datadir=/db # Directory for this data node's datafiles
#NDB 2(Server06) 주소와 DB디렉토리 지정
# SQL node options:
[MYSQLD]
hostname=10.10.64.8 # Hostname or IP address
#SQL Server # (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
데몬 순서는 MGM 서버에서 올리고 그다음에 SQL 서버에서 올리고
그다음에 NDB 서버에서 올려야된다.
MGM 같은경우 두개의 파일이 필요한데요
ndb_mgmd 관리데몬이고 항상떠있어야되고
ndb_mdm 이것이 노드관리 실행파일이에요 노드들의 정보를 볼수있데요
[root@MGM bin]# find / -name ndb_mgmd
/usr/local/mysql/libexec/ndb_mgmd
/root/mysql-5.0.67/ndb/src/mgmsrv/ndb_mgmd
[root@MGM cluster]# find / -name ndb_mgm
/usr/local/mysql/bin/ndb_mgm
/root/mysql-5.0.67/ndb/src/mgmclient/ndb_mgm
ndb_mgm 같은경우 그냥 bin에있으니까 대비두고 -0-
mgm_mgmd 는 /usr/local/mysql/bin 으로 카페해도되고 링크떠도되고 편한대로 쓰심됩니다.
저는 카피했어요 -0-
[root@MGM db]# cp /usr/local/mysql/libexec/ndb_mgmd /usr/local/mysql/bin/
------------------------------
SQL Server 에서 해야될일
------------------------------
[root@SQL mysql]# cp /root/mysql-5.0.67/support-files/mysql.server /etc/rc.d/init.d/
소스 디렉토리에있는 mysql.server파일을 init.d 로 카피합니다...
이런방법이있었어...fedora5 에서 복사해서 편법으로썻던게 기억나네 ㅠㅠ
[root@SQL mysql]# chmod +x /etc/init.d/mysql.server
[root@SQL mysql]# chkconfig --add mysql.server
실행권한을 주고 모든 레벨에서 자동실행되도록 얻집니다....보안그딴거없습니다.
결과적으로 뭐 띄울껀 없고요 재부팅후 MYSQL 서버는 Mysqld_safe 와 mysql.sock 만띄워있으면됩니다.
[root@SQL ~]# ps -aux|grep mysql
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.3/FAQ
root 3161 0.0 0.1 5868 1176 ? S 08:57 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/db --pid-file=/db/SQL.pid
mysql 3194 0.0 1.4 125016 14404 ? Sl 08:57 0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/db --user=mysql --pid-file=/db/SQL.pid --skip-external-locking --port=3306 --socket=/tmp/mysql.sock
root 5147 0.0 0.0 6004 716 pts/0 S+ 10:03 0:00 grep mysql
[root@SQL ~]#
-------------------------------
Data Server 에서 해야될일
-------------------------------
[root@server06 ~]# find / -name ndbd
/usr/local/mysql/libexec/ndbd
[root@server06 ~]# cp /usr/local/mysql/libexec/ndbd /usr/local/mysql/bin/
ndbd 이것은 Network Database 데몬을 구동하는것으로
이파일을 역시 관리편하게 복사했다.
나머지 한대 Server05도 이렇게 해주었다.
---------------------------
구동 및 테스트
---------------------------
1. MGM Node
위에서 언급한것처럼 MGM 서버부터 올려야된다.
[root@MGM /]# /usr/local/mysql/bin/ndb_mgmd -f /db/cluster/config.ini
-f는 파일위치를 지정하는것
[root@MGM /]# /usr/local/mysql/bin/ndb_mgm -e shutdown
MGM Node 샷다운 할때 사용
2. DATA Node
그다음으로 Data Node 시작한다.
[root@server05 /]# ndbd --initial
주의할 것은 ndbd 를 처음 시작할 때만 --initial 옵션을 사용해야 한다.
혹은 backup/restore 한 후 재 시작할 경우나, 설정 변경할 때 사용 해야 한다.
--initial옵션을 사용하면 초기에 생성한 데이터파일과 로그파일을 지우게 되기 때문이다.
3. SQL Node
Sql 노드는 뭐 아무것도 할것이 없다. 그냥아까 옮긴 파일을
/ect/init.d/mysql.server start 만해주면된다.
----------------------
노드 확인
----------------------
MGM Node 에서 한다.
[root@MGM /]# /usr/local/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @10.10.64.5 (Version: 5.0.25, Nodegroup: 0, Master)
id=3 @10.10.64.6 (Version: 5.0.25, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.10.64.7 (Version: 5.0.25)
[mysqld(SQL)] 1 node(s)
id=4 (Version: 5.0.25)
------------------
테스터
------------------
MySQL 클러스터 테스트
잘 연동되고 있다는 것을 확인했으니, 자료가 연동되는지의 여부도 확인해야 한다.
Id가 1인 서버에서 MySQL을 실행시켜 MySQL사이트에서 제시하는 예문을 입력시켜 보자
.
mysql> use test;
mysql> DROP TABLE IF EXISTS City;
CREATE TABLE City (
ID int(11) NOT NULL auto_increment,
Name char(35) NOT NULL default '',
CountryCode char(3) NOT NULL default '',
District char(20) NOT NULL default '',
Population int(11) NOT NULL default '0',
PRIMARY KEY (ID)
) ENGINE=NDBCLUSTER;
이 때 ENGINE=NDB 혹은 ENGINE=NDBCLUSTER 옵션을 잊지 말자.
이 옵션이 없으면 서버간 연동이 되지 않는다.
mysql> INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000);
mysql> INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500);
mysql> INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800);
mysql> select * from City;
+----+----------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+----------+-------------+----------+------------+
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
| 1 | Kabul | AFG | Kabol | 1780000 |
+----+----------+-------------+----------+------------+
3 rows in set (0.00 sec)
여기에선 당연히 입력한 데이터들이 잘 나온다.
그러면 Id가 2인 서버에서 MySQL을 실행시킨 후 연동이 잘 되었는지 확인해 보자.
mysql> use test;
mysql> select * from City;
+----+----------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+----+----------+-------------+----------+------------+
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
| 1 | Kabul | AFG | Kabol | 1780000 |
+----+----------+-------------+----------+------------+
3 rows in set (0.05 sec)
Cluster의 동기화 과정에서 시간이 걸리는 것인지 네트워크 상에서 시간이 걸리는 것
인지 입력한 서버에서 확인할 때보다 시간이 더 걸리는 것을 확인할 수 있다.
자. 이렇게 MySQL 클러스터의 설치와 연동 과정을 확인할 수 있었다.
서버 데몬
* ndbd : 데이터 노드 데몬
* ndb_mgmd : MGM서버 데몬
클라이언트 프로그램
* ndb_mgm : MGM 클라이언트
* ndb_waiter : 클러스터의 모든 노드들의 상태를 확인할 때 사용
* ndb_restore : 백업으로부터 클러스터의 데이터를 복구할 때 사용
ndb_mgmd : cluster manager 실행 명령어
ndbd : manager에 데이타 노드 등록 명령어
ndb_mgm : cluster 환경 확인 명령어
ndb_mgmd [-f | --config-file=][--defaults-file=]
config 파일이 위치한 디렉토리에서 실행하거나 다른 경로에서 실행할 경우
-f 혹은 --config-file= 옵션을 주어 config.ini 파일 위치를 지정해 줄 수 있다.
--defaults-file= 옵션으로 my.cnf 파일 위치를 알려줄 수도 있다.
ndb_mgm -e show
현재 상태를 확인
ndbd -c [cluster manager ip]
양 서버에서 모두 실행
ndb_mgm -e show
mysqld_safe &
mysql 실행 양 서버에서 모두 실행
ndb_mgm -e show
mysqladmin -u root -p shutdown
mysql 종료
ndb_mgm -e shutdown
cluster 종료
그외 인터넷에서 클러스터 구성시 예외오류들은 인터넷 참조해주세요 -0-