http://oxyworld.egloos.com/3209340

MySQL Cluster Quick Start Guide - LINUX(CentOS), mysql 클러스터 세팅


속도나 비용면에서 mySQL이 좋은거 같고, 그 중에 클러스터 방법이 게임서버에 적절한 DB인거 같다.

설치하기 전에 참고로 내 컴퓨터 제 소프트/하드 웨어 사양이다.


OS: Windows 2008 R2 x64 Enterprise (full) Terminal (Remote User)   V6.01  Build 7601  Service Pack 1

CPU: Intel Core i7 Quad 2600 (Sandy Bridge) 3.40GHz [D2]

RAM: 4.00GB




1. VMware Player 설치 (ver. 5.0.1)

설치 링크: 링크


2. CentOS ISO이미지 다운 받기 (ver. 6.3)

실치 링크: 링크






이 근처에 있는거 아무거나들어가서 6.3을 다운 받으면 됨




3. VMware로 CentOS 설치하기~






Customize Hardware를 누르면 하드웨어 세팅을 할 수 있는데 원한다면 더 고사양이나 저사양으로 세팅하면 됨~


4. CentOS에서 Cluster 돌리기








set.zip에 cmd.txt에 있는 명령어를 한번 실행해주면 된다.

아래 "set.zip"에 실제로 세팅에 사용했던 파일을 업로드 해뒀다. 참고하면 된다.

set.zip


 - cmd.txt -

 -Run-

[user1@localhost ~]$ cd ~

[user1@localhost ~]$ tar xvf Downloads/mysql-cluster-gpl-7.2.10-linux2.6-i686.tar.gz

[user1@localhost ~]$ ln -s mysql-cluster-gpl-7.2.10-linux2.6-i686/ mysqlc

[user1@localhost ~]$ mkdir my_cluster my_cluster/ndb_data my_cluster/mysqld_data my_cluster/conf

[user1@localhost ~]$ vi my_cluster/conf/my.cnf

[user1@localhost ~]$ vi my_cluster/conf/config.ini

[user1@localhost ~]$ chmod 755 my_cluster/conf/my.cnf

[user1@localhost ~]$ cd mysqlc

[user1@localhost mysqlc]$ scripts/mysql_install_db --no-defaults --datadir=/home/user1/my_cluster/mysqld_data/

[user1@localhost my_cluster]$ cd ../my_cluster/

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/ndb_mgmd -f conf/config.ini --initial --configdir=/home/user1/my_cluster/conf/

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/ndbd -c localhost:1186

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/ndbd -c localhost:1186

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/ndb_mgm -e show

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/mysqld --defaults-file=conf/my.cnf &


 -Test-

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/mysql -h 127.0.0.1 -P 5000 -u root

mysql> create database clusterdb;use clusterdb;

mysql> create table simples (id int not null primary key) engine=ndb;

mysql> insert into simples values (1),(2),(3),(4);

mysql> select * from simples;

+----+

| id |

+----+

|  3 |

|  1 |

|  2 |

|  4 |

+----+

4 rows in set (0.03 sec)


 -Safely shut down-

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/mysqladmin -u root -h 127.0.0.1 -P 5000 shutdown

[user1@localhost my_cluster]$ /home/user1/mysqlc/bin/ndb_mgm -e shutdown

 - end cmd.txt -


 - my.cnf -

[mysqld]

ndbcluster

datadir=/home/user1/my_cluster/mysqld_data

basedir=/home/user1/mysqlc

port=5000

 - end my.cnf -

 - config.ini -
[ndb_mgmd]
hostname=localhost
datadir=/home/user1/my_cluster/ndb_data
NodeId=1

[ndbd default]
noofreplicas=2
datadir=/home/user1/my_cluster/ndb_data

[ndbd]
hostname=localhost
NodeId=3

[ndbd]
hostname=localhost
NodeId=4

[mysqld]
NodeId=50
 - end config.ini -


위와 동일한 버전으로 똑같이 따라했다면 아마 별 무리 없이 세팅이 가능할 것이다.








1. 원도우 키 + R

2. cmd 실행

3. slmgr -rearm

4. 재부팅

1. 원도우 키 + R

2. cmd 실행

3. slmgr /dlv




---------------------------

Windows Script Host

---------------------------

Software licensing service version: 6.1.7601.17514




Name: Windows Server(R), ServerStandard edition


Description: Windows Operating System - Windows Server(R), TIMEBASED_EVAL channel


Activation ID: da71774d-b2c9-4c42-bb7b-a66365d5abb2


Application ID: 55c92734-d682-4d71-983e-d6ec3f16059f


Extended PID: 00477-00168-001-000034-00-1042-7601.0000-1362012


Installation ID: 005170525401783855619911354565442066339180044582488124


Processor Certificate URL: http://go.microsoft.com/fwlink/?LinkID=88342


Machine Certificate URL: http://go.microsoft.com/fwlink/?LinkID=88343


Use License URL: http://go.microsoft.com/fwlink/?LinkID=88345


Product Key Certificate URL: http://go.microsoft.com/fwlink/?LinkID=88344


Partial Product Key: J9HDR


License Status: Initial grace period


Time remaining: 14400 minute(s) (10 day(s))


Remaining Windows rearm count: 4


Trusted time: 2013-01-28 오후 2:07:23





---------------------------

OK   

---------------------------



ODBC에서 DB와 서버랑 맵핑하는 자료형 정리


Table 1. C vs ODBC Naming Correspondence

C Type identifier

ODBC C Typedef

C Type

SQL_C_CHAR

SQLCHAR

unsigned char

SQL_C_STINYINT

SCHAR

char

SQL_C_UTINYINT [i]

UCHAR

unsigned char

SQL_C_SSHORT [h]

SQLSMALLINT

short int

SQL_C_USHORT [h] [i]

SQLUSMALLINT

unsigned short int

SQL_C_SLONG [h]

SQLINTEGER

int

SQL_C_ULONG [h] [i]

SQLUINTEGER

unsigned int

SQL_C_SBIGINT

SQLBIGINT

_int64 [g]

SQL_C_UBIGINT [i]

SQLUBIGINT

unsigned _int64 [g]

solidDB does not support unsigned data types such as this.

SQL_C_FLOAT

SQLREAL

float

SQL_C_DOUBLE

SQLDOUBLE

SQLFLOAT

double

SQL_C_NUMERIC

SQLNUMERIC

unsigned char [f]

SQL_C_DECIMAL

SQLDECIMAL

unsigned char [f]

SQL_C_BINARY

SQLCHAR *

unsigned char *

SQL_C_TYPE_DATE [c]

SQL_DATE_STRUCT

struct tagDATE_STRUCT{
    SQLSMALLINT year;
    SQLUSMALLINT month;
    SQLUSMALLINT day;
} DATE_STRUCT; [a]          

SQL_C_TYPE_TIME [c]

SQL_TIME_STRUCT

struct tagTIME_STRUCT {
    SQLUSMALLINT hour;
    SQLUSMALLINT minute;[d]
    SQLUSMALLINT second;[e]
}          

SQL_C_TYPE_TIMESTAMP [c]

SQL_TIMESTAMP_STRUCT

struct tagTIMESTAMP_STRUCT {
    SQLSMALLINT year; [a]
    SQLUSMALLINT month; [b]
    SQLUSMALLINT day; [c]
    SQLUSMALLINT hour;
    SQLUSMALLINT minute; [d]
    SQLUSMALLINT second;[e]
    SQLUINTEGER fraction; 
}          

원본링크

void 맵이동()

{

if( 맵을 생성해야 하나? )

{

맵 생성;

Npc 생성;

}


기존 맵에 있는 클라가 걸려있는 버프 저장;


기존 맵에 있는 클라에 유닛 제거;


방금 접속한 클라 생성;

방금 접속한 클라에게 이전맵에서 가지고 있었던 버프를 걸어줌;


방금 접속한 클라 정보를 맵안에 모든 클라에게 정보 전송;

방금 접속한 클라 버프정보를 맵안에 모든 클라에게 정보 전송;


Npc 정보 -> 방금 접속한 클라에게 전송;

Npc 버프 정보-> 방금 접속한 클라에게 전송;


기존 맵에 있었던 클라 정보 -> 방금 접속한 클라에게 정보 전송;

기존 맵에 있었던 클라 버프 정보 -> 방금 접속한 클라에게 버프 정보 전송;

}

제 1 장 총칙

제 1 조 [명칭] - 본 회의 명칭은 "1.5"로 한다.

제 2 조 [목적] - 회원 상호간의 친목을 도모하고, 우정을 깊게하는데 목적이 있다.


제 2 장 회원

제 1 조 [가입]

1) 입회를 원하는 사람이 있을 때 회원들의 만장일치로 입회한다.

2) 입회비로는 기존 잔액을 1/n로 나눈 금액을 입금해야 한다.


제 2 조 [탈퇴]

1) 회원 탈퇴는 개인자유이며, 기존 잔액을 받지 못 한다. 하지만 부득이한 사정에 의한 탈퇴는 1/n을 지급한다.


제 3 장 회원 운영

제 1 조 [조직구성] - 회장 1명, 부회장 1명

제 2 조 [회장의 임무] - 회장은 총괄 운영과 회무를 관장하며, 부회장은 서포트를 한다.

제 3 조 [임원선출 및 임기] - 분기별(1월, 4월, 7월, 10월) 정기모임에 다수결로 회장을 선출하며 임기는 3개월이다. 부회장은 회장 마음대로 뽑는다.


제 4장 모임

제 1조 [모임]

1) 정기 모임은 매월 1째주 금요일로 지정한다.

2) 정기 모임 이외에도 회장과 회원이 조율해서 날짜를 지정해 모임이 잡힐 수 있다.


제 5장 회비 운영

제 1 조 [회비의 징수]

1) 매월 7일까지 이만오천원(\25,000)씩 전용계좌(신한은행, 110-377-292650)로 입금 한다.

2) 날짜를 어길 시 벌금 오천원이며, 무단으로 3회 이상 입금하지 않을 시 강제 탈퇴가 된다.

3) 회장이 일일이 신경쓰는 일이 없도록 자동이체를 걸어두는걸 원칙으로 한다.

4) 모임에 참석하지 않아도 동일하게 납부해야 한다.


제 2 조 [회비의 사용]

1) 모든 결제는 반드시 체크카드로 하도록 한다. 따로 서면으로 기록하는 번거로움을 피하기 위함이다.

2) 모임이 진행되는데 사용되는 모든 금전적인 부분에서 사용하도록 한다.

3) 사용 내역(통장 내역)은  회장에게 요청해 언제든지 열람 가능하다.


제 6장 해산

제 1 조 [해산] - 해산은 회원들의 만장일치로 결정이 되며, 기존 잔액을 1/n로 나눠서 배분하고 해산한다.


1. 로비서버 -> 게임서버

 클라 정보 전달


2. 게임서버

 클라가 접속하길 기다린다. (10초간)


3. 게임서버

 접속이 완료 되면 각 클라 정보를 각 클라에게 보낸다.


4. 클라 -> 게임서버

 클라에서 준비가 완료되면 게임서버로 게임을 시작 할 모든 준비가 끝났음을 알린다.


5. 게임서버 -> 클라

 모든 클라에게 게임 시작을 알린다.


서버에서 사용하는 패킷 구조


 전체 4096 Bytes

전체 패킷 길이

4 Bytes

고유번호(패킷복사, 해킹방지)

4 Bytes

프로토콜

4 Bytes

데이터

4084 Bytes 

 

 암호화



1. 전체 패킷 길이

 1개의 패킷이 어디까지 인지 알려준다.


2. 고유번호

 클라에서 패킷을 보낼 때 마다 하나씩 증가시키는 것이 원칙이고, 서버에서는 순차적으로 패킷이 왔는데, 만약 증가되지 않으면 복사 패킷으로 인지해서 그 패킷은 무시하게 된다.


3. 프로토콜

 패킷의 용도를 담는 곳으로, 캐릭터가 이동한다던지, 공격한다던지 정해진 규칙에 따라서 패킷 내용을 채운다.


4. 데이터

 프로토콜에서 정한 규칙에 따른 데이터들을 나열해 놓은 것으로, 캐릭터 이동이라면 X, Y 좌표 값이고, 공격이라면 특정 몬스터 인덱스 값, 사용되는 스킬 번호등 이러한 정보들이 담기게 된다.



대략의 코드 구조

// LENGTH(4) | PACKET_NUMBER(4) | PROTOCOL(4) | DATA (4084)

// 패킷의 전체 길이 계산

// 패킷 전체 길이 = 패킷 길이 + 패킷 고유 번호 + 프로토콜 + 데이터 길이

WORD PacketLength = sizeof(PacketLength)/*LENGTH*/ + 

sizeof(DWORD)/*PACKETNUMBER*/ + 

sizeof(DWORD)/*PROTOCOL*/ + 

(WORD)packetLength;


// 패킷 길이가 최대 버퍼 길이보다 길면 실패함

if (PacketLength >= MAX_BUFFER_LENGTH)

return FALSE;


// 고유번호를 하나 증가시킵니다.

mCurrentPacketNumber++;


// 들어온 데이터를 이용해서 패킷을 만들기 위한 버퍼

BYTE TempBuffer[MAX_BUFFER_LENGTH] = {0,};

// 패킷을 만듭니다.

// 패킷에 인덱스를 붙여 순서 보정을 해 주어야 한다.

// [=>패킷전체길이][고유번호][프로토콜][데이터]

memcpy(TempBuffer, &PacketLength, sizeof(PacketLength));

// [패킷전체길이][=>고유번호][프로토콜][데이터]

memcpy(TempBuffer + 

sizeof(WORD)/*LENGTH*/, 

&mCurrentPacketNumber, sizeof(DWORD));

// [패킷전체길이][고유번호][=>프로토콜][데이터]

memcpy(TempBuffer + 

sizeof(WORD)/*LENGTH*/ + 

sizeof(DWORD)/*PACKETNUMBER*/, 

&protocol, sizeof(DWORD));


// [패킷전체길이][고유번호][프로토콜][=>데이터]

memcpy(TempBuffer + 

sizeof(WORD)/*LENGTH*/ + 

sizeof(DWORD)/*PACKETNUMBER*/ +

sizeof(DWORD)/*PROTOCOL*/,

packet, packetLength);


// 보내는 데이터를 Encrypt 함수를 이용해서 암호화합니다.

CCrypt::Encrypt(TempBuffer + sizeof(DWORD), TempBuffer + sizeof(DWORD), PacketLength - sizeof(DWORD));






클라이언트와 논의 후 바뀐 패킷 구조


 전체 4096 Bytes

전체 패킷 길이

2 Bytes

고유번호(패킷복사, 해킹방지)

4 Bytes

프로토콜

4 Bytes

데이터

4086 Bytes 

 


 

  암호화




---------------------------

Microsoft Visual Studio

---------------------------

Navigation failed. Cannot find C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\VCWizards\AppWiz\Generic\Application\HTML\1033\default.htm

---------------------------

OK   

---------------------------


도구->옵션



+ Recent posts