MySQL Cluster on Debian AMD64


สวัสดีเพื่อนๆรวมโลกทุกท่าน วันนี้ก็ได้โอกาศมาเขียนบทความเรื่อง MySQL Cluster สะที หลังจากที่ได้ทำการติดตั้ง และงมกะ Config มาหลายวันจริงๆผมต้องย้าย Database ให้เสร็จตั้งแต่วันที่ 2/6/2008 แต่จนถึงวันนนี้ก็ยังไม่ได้ย้าย

Database เลย เหตุผลหลักคือ

1. Database ค่อนข้างใหญ่ ประมาณ 7G และมี Redcord อยู่ประมาณ 38 ล้าน Redcord
2. ตอน Import Data ผม Dump database มาผิดแบบ
3. MySQL ตอนที่ผม Lab test + ใช้งานจริงเป็นคนละ Version

ด้วยเหตุผลเหล่านี้ทำให้ผมขึ้น MySQL Cluster ไม่ได้ หลังจากลองหาทางแก้อยู่หลายวัน ก็แก้ได้จนหมด งั้นวันนี้ผมก็ของบอกวิธีติดตั้ง และ Config ให้สามารถใช้งานได้ก่อนละกันนะครับ ส่วนเรื่องการ Tuning เอาไว้เดี๋ยวมาบอกอีกที

อุปกรณ์
- Dell 1950, CPU 4Core 2.66GHz x2, Ram 16G (ndbd+mysqld)
- PC P4, Ram 1G (ndb_memd)

การตั้งค่า
- DBC1 IP: 192.168.1.21
- BDC2 IP: 192.168.1.22
- MGM IP: 192.168.1.11

1. ทำการ Download ไฟล์มาเพื่อทำการติดตั้ง ทีแรกผมดันไปเอา Version ใหม่มาลงทำให้เกิดปัญหา แนะนำให้ใช้ MySQL 5.1x + ndb 6.2.x นะครับ

cd /usr/src
wget http://mirror.siambox.com/mysql/mysql-5.1.23-ndb-6.2.15.tar.gz
tar zxf mysql-5.1.23-ndb-6.2.15.tar.gz
 
cd mysql-5.1.23-ndb-6.2.15
./configure --prefix=/usr/local/mysql --with-plugins=max --with-ndbcluster --with-charset=tis620 --with-extra-charsets=all --with-collation=tis620_thai_ci
make -j9
make install

2. หลังจากติดตั้งทุกเครื่องแล้ว ให้ทำการตั้งค่า config ที่เครื่อง Manager Node (MGM) ดั่งนี้

mkdir /home/mysql-cluster
vi /home/mysql-cluster/config.ini
[TCP DEFAULT]
SendBufferMemory=2M
ReceiveBufferMemory=2M
 
[NDB_MGMD DEFAULT]
PortNumber=1186
Datadir=/home/mysql-cluster/
 
[NDBD DEFAULT]
NoOfReplicas=2
Datadir=/home/mysql-cluster/
DataMemory=8019M
IndexMemory=1003M
 
MaxNoOfConcurrentOperations=10000000
 
StringMemory=25
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=24576
DiskCheckpointSpeedInRestart=100M
FragmentLogFileSize=256M
NoOfFragmentLogFiles=47
RedoBuffer=32M
 
TimeBetweenLocalCheckpoints=20
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=100
 
TransactionDeadlockDetectionTimeout=5000
HeartbeatIntervalDbDb=3000
HeartbeatIntervalDbApi=3000 
 
[NDB_MGMD]
id=1
Hostname=192.168.1.11
 
[NDBD]
id=11
Hostname=192.168.1.21
 
[NDBD]
id=12
Hostname=192.168.1.22
 
[MYSQLD]
id=21
Hostname=192.168.1.21
 
[MYSQLD]
id=22
Hostname=192.168.1.22

ค่าที่ต้องแก้ไขคือ

NoOfReplicas คือจำนวนของ DataNode ที่มี
Datadir คือ Directory ที่จะทำการเก็บ Data ของ DataNode
DataMemory คือจำนวน Memory ที่จะ Allow ให้ MySQL นำมาใช้งานเก็บ Data ควรเหลือให้ System ใช้งานอย่างน้อง 1G สูตรคือ (SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes
IndexMemory คือการกำหนดค่าให้ NDB ทำการ Allow Memory ที่จะให้เก็บ Index ส่วนใหญ่ใช้ค่า DataMemory/8 ครับ

3. ทำการตั้งค่าที่เครื่อง NDB ทั้ง 2 เครื่อง

vi /etc/my.cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = tis620
 
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
 
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
default-character-set = tis620
 
skip-innodb
 
user=mysql
basedir=/usr/local/mysql/
datadir=/home/mysql/
ndb-cluster-connection-pool=1
ndbcluster
ndb-connectstring="192.168.1.11"
ndb-force-send=1
ndb-use-exact-count=0
ndb-extra-logging=1
ndb-autoincrement-prefetch-sz=256
engine-condition-pushdown=1
 
key_buffer = 256M
max_allowed_packet = 16M
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
thread_cache_size=1024
myisam_sort_buffer_size = 8M
init_connect='set autocommit=0'
memlock
sysdate_is_now
max-connections=200
thread-cache-size=64
skip_thread_priority
query-cache-type = 0
query-cache-size = 0
table-open_cache=1024
table-cache=512
lower-case-table-names=0
 
[MYSQL_CLUSTER]
ndb-connectstring=192.168.1.11

4. ทำการ start ndb_mgmd ก่อนและทำการตรวจสอบว่าทำงาน ดั่งนี้

/usr/local/mysql/libexec/ndb_memd -f /home/mysql-cluster/config.ini
/usr/local/mysql/bin/ndb_mgm

5. ทำการ start ndbd โดยการ start ครั้งแรกนั้นต้องใส่ options –initial ด้วย หากทำการ shutdown ndbd ไปแล้ว ครั้งต่อไปไม่ต้องทำการใส่ option อีก หากใส่เข้าไป ndb จะทำการ clean data เก่าทั้งหมดทิ้ง

/usr/local/mysql/libexec/ndbd  --initial

6. ทำการตรวจสองว่า NDB ทำงานแล้ว โดยไปที่เครื่อง Manager Node แล้วใช้คำสั่ง show เพื่อดู status ของ ndb

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=11   @192.168.1.21  (mysql-5.1.23 ndb-6.2.15, Nodegroup: 0, Master)
id=12   @192.168.1.22  (mysql-5.1.23 ndb-6.2.15, Nodegroup: 0)
 
[ndb_mgmd(MGM)] 1 node(s)
id=2    @192.168.1.11  (mysql-5.1.24 ndb-6.3.15)
 
[mysqld(API)]   2 node(s)
id=21   (not connected, accepting connect from 192.168.1.21)
id=22   (not connected, accepting connect from 192.168.1.22)
 
ndb_mgm>

หรือใช้คำสั่ง ALL STATUS จะเป็นการ show status ของแต่ละ node ดั่งนี้

-- NDB Cluster -- Management Client --
ndb_mgm> ALL STATUS
Connected to Management Server at: localhost:1186
Cluster Configuration
Node 11: started (mysql-5.1.23 ndb-6.2.15)
Node 12: started (mysql-5.1.23 ndb-6.2.15)
 
ndb_mgm>

7. ทำการ start mysqld เพื่อให้ Client conenct มายัง API Node ได้

useradd -u 90 mysql
mkdir /home/mysql/
/usr/local/mysql/bin/mysql_install_db
chown -R mysql:mysql /home/mysql/
 
/usr/local/mysql/bin/mysqld_safe &

ทำการตรวจสองว่า API Node ได้ทำการ Connect ไปยังเครื่อง Manager Node แล้ว โดยตรวจสอบที่เครื่อง MGM

ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=11   @192.168.1.21  (mysql-5.1.23 ndb-6.2.15, Nodegroup: 0, Master)
id=12   @192.168.1.22  (mysql-5.1.23 ndb-6.2.15, Nodegroup: 0)
 
[ndb_mgmd(MGM)] 1 node(s)
id=2    @192.168.1.11  (mysql-5.1.24 ndb-6.3.15)
 
[mysqld(API)]   2 node(s)
id=21   @192.168.1.21  (mysql-5.1.23 ndb-6.2.15)
id=22   @192.168.1.22  (mysql-5.1.23 ndb-6.2.15)
 
ndb_mgm>

หากขึ้นแบบ ขั้นต้น ก็แปลว่า MySQL Cluster ของเราสามารถทำงานได้แล้วครับผม

วิธีการใช้งาน ก็สามารถให้ Client Connect มายังเครื่อง DBC1, DBC2 ได้เลยครับ เวลา Create tables เราก็เปลี่ยจาก Engine=MyISAM เป็น Engine=NDBCLUSTER แค่นี้ ก็สามารถใช้งานได้แล้วครับ เรื่องการทำ HA และการ Convert Data เอาไว้ครั้งหน้าผมจะมาเขียนให้อีกทีแล้วกันนะครับ

Tags: , ,


4 Responses to “MySQL Cluster on Debian AMD64”

  1. Local Mysql Server Through Mysqld Says:

    found your site on del.icio.us today and really liked it.. i bookmarked it and will be back to check it out some more later ..

  2. eak Says:

    สุดยอดครับ ขอบคุณมาก กำลังออกแบบdbอยู่ครับ ระบบประมาณ 2000 request หรือ8000query per sec. คิดว่าคงต้องใช้ mysql แบบ cluster ไม่ทราบว่าควรใช้กี่node ดีครับแล้วแต่ละnode specขั้นต่ำแค่ไหนดีครับ ช่วยแนะนำด้วยครับ

  3. อัทศักดิ์ วงศ์กิตตะ Says:

    ส่วนของ MySQL Cluster ผมทดสอบแล้ว เรื่อง Speed ค่อขข้างช้ากว่า ปกติครับ อาจจะเพราะต้องเขียน data ลง network ตอนนี้ย้ายกลับมาทำ Master/Slave ครับผม

  4. rukawa Says:

    แจ่มมากพี่อัท บังเอิญ search เจอบลอกนี้
    แล้วล่าสุดตอนนี้เป็นไงบ้าง กลับมาใช้ระบบ master/slave แล้วหรอพี่

Leave a Reply