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 เอาไว้ครั้งหน้าผมจะมาเขียนให้อีกทีแล้วกันนะครับ
July 3rd, 2008 at 6:47 pm
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 ..
July 17th, 2008 at 4:01 pm
สุดยอดครับ ขอบคุณมาก กำลังออกแบบdbอยู่ครับ ระบบประมาณ 2000 request หรือ8000query per sec. คิดว่าคงต้องใช้ mysql แบบ cluster ไม่ทราบว่าควรใช้กี่node ดีครับแล้วแต่ละnode specขั้นต่ำแค่ไหนดีครับ ช่วยแนะนำด้วยครับ
July 17th, 2008 at 6:05 pm
ส่วนของ MySQL Cluster ผมทดสอบแล้ว เรื่อง Speed ค่อขข้างช้ากว่า ปกติครับ อาจจะเพราะต้องเขียน data ลง network ตอนนี้ย้ายกลับมาทำ Master/Slave ครับผม
October 29th, 2008 at 5:57 pm
แจ่มมากพี่อัท บังเอิญ search เจอบลอกนี้
แล้วล่าสุดตอนนี้เป็นไงบ้าง กลับมาใช้ระบบ master/slave แล้วหรอพี่