Skip to content

조회 수 10032 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

프로젝트로 내가맡은 부분이 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-

 

출처 : http://dexter.tistory.com/892


List of Articles
번호 제목 글쓴이 날짜 조회 수
46 MySQL 4.1 이상에서 한글 사용 ADMINPLAY 2009.09.28 7455
45 mysql 초간단 설치 ADMINPLAY 2009.10.15 6820
44 mysqli 동적모듈 추가 file ADMINPLAY 2009.11.01 9545
» Mysql 5.0.67 Cluster 소스설치 구성하기 ADMINPLAY 2009.11.19 10032
42 HeartBeat를 이용한 MySQL HA 구성 ADMINPLAY 2009.11.19 10486
41 MySQL 클러스터 ADMINPLAY 2009.11.19 10077
40 Mysql Replication(Master, Slave) 설정 ADMINPLAY 2009.11.19 9863
39 MySQL Replication ADMINPLAY 2009.11.19 8245
38 MySQL Replication(복제) ADMINPLAY 2009.11.19 7951
37 리눅스를 이용한 클러스터링 구축법 ADMINPLAY 2009.11.19 10888
36 Mysql bin log 로테이션 방법 ADMINPLAY 2009.11.26 9714
35 MySQL 데이터 정리후에도 용량변동이 없을 경우 ADMINPLAY 2009.12.31 8784
34 Starting MySQL.Manager of pid-file quit without updating fi[실패] ADMINPLAY 2010.01.28 20024
33 Redmine database를 복구 하고자 할 때 file l2zeo 2010.03.06 15806
32 MySQL Error 2006 : MySQL server has gone away 해결하기 l2zeo 2010.03.08 12783
31 PHP5와 MySQL5 연동시 한글 인코딩 문제 해결방법 (UTF-8으로의 변환) 1 l2zeo 2010.03.08 12765
30 Another app is currently holding the yum lock; waiting for it to exit 해결법 l2zeo 2010.03.08 18425
29 MySQL 명령어 정리 1 l2zeo 2010.03.08 10412
28 lower_case_table_names=1 ADMINPLAY 2010.04.02 18210
27 mySQL 설치 ADMINPLAY 2010.05.03 13083
Board Pagination Prev 1 2 3 4 5 Next
/ 5

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234