อยากรู้ว่าเค้าจัดการกับข้อมูลจำนวนมากอย่างไร และ ถ้ามีการดึงเรียกใช้งานจำนวนมากกว่าปกติต้องเตรียมการรองรับอย่างไรบ้างครับ
ใช้ฐานข้อมูลอะไรครับ MySQL หรือ SQl อื่น ๆ และ NoSQL
การกำหนดแคชฐานข้อมูลช่วยได้ไหม แล้วเคยล่มไหมครับ การสำรองข้อมูลขนาดใหญ่ทำอย่างไรครับ
ขอถามเพื่อเป็นกรณีศึกษาครับ

Hiring! บริษัทที่น่าสนใจ

Carmen Software company cover
Carmen Software
Hotel Financial Solutions
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
MuvMi (Urban Mobility Tech Co.,Ltd.) company cover
MuvMi (Urban Mobility Tech Co.,Ltd.)
Shape the future of urban mobility towards affordable, clean, and safe solutions
T.N. Digital Solution Co., Ltd. company cover
T.N. Digital Solution Co., Ltd.
TNDS has been involving in every first move of banking’s major digital transformation.
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
The Gang Technology Co., Ltd. company cover
The Gang Technology Co., Ltd.
We're a Digital Agency that helps our customers transform their business into digital with ease.
LTMH company cover
LTMH
LTMH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

จากประสบการณ์คือกับ MySQL ส่วนมากสเกลใหญ่คือทำ Cluster โดยจะแยกระหว่างเครื่องเขียนกับอ่านออกจากกัน ส่วนสัดส่วนระหว่างเครื่องเขียนกับงานจะดูตามงาน (โดยมากคือดูจากระดับโปรแกรมที่จะมาใช้ก็จะรู้แล้ว) อย่างถ้าอ่านเยอะเขียนน้อย จะเครื่องเขียนจะ 1 ตัว เครื่องอ่านอาจตั้งแต่ 2-4 เลย ของพวกนี้ต้องมอนิเตอร์แล้ว scale out ออกไป (อันนี้ต้องดูสภาพการใช้งานจริง)

โดยส่วนตัวถ้า MySQL สิ่งที่ต้องระวังคือ

  1. Slow Query
  2. DB Lock ตอนขาเขียน
  3. การตั้งค่า TCP Connection พวก wait_timeout connect_timeout
  4. การทำ index field ให้พอดี

ของพวกนี้โปรแกรมเมอร์กับอินฟราฯ ต้องร่วมมือกัน ระบุงานให้ชัดๆ ไปว่าจะเขียนกันแบบไหน อย่างที่ผมทำมาจะเขียนเน้นไม่ให้เกิด slow query เอาให้น้อยๆ ป้องกันเรื่อง DB Lock โดยเลี่ยงไปใช้ Transaction ช่วย และพวก timeout เอาน้อยๆ ไปเลย อันนี้ก็คือแบบหนึ่ง

แต่จากที่เจอมา มีงานบางกลุ่มเหมือนกัน แต่ slow query ยอมได้ join table เอาให้ระเบิดกันไปข้าง (ผมไม่รู้เหตุผลนะ ไมไ่ด้อยู่ทีมเขา) ซึ่งเรื่องพวกนี้ server จะจูนไปอีกแบบ ดังนั้นถึงบอกโปรแกรมเมอร์กันอินฟราฯ ควรคุยกับให้เคลียร์ของเซ็ต env เซ็ต staging

ส่วนเรื่อง การทำ index field ให้พอดี อันนี้ตามเนื้องานครับ คือทำน้อยไป select ช้า ทำมากไป insert ช้า เผลอๆ table lock ดังนั้นเลือกให้เหมาะครับ ของพวกนี้อาศัยประสบการณ์จริงๆ ไม่มีหรอก เซ็ตครั้งเดียวแล้ว perfect น่ะ (แต่ก็เคยเห็นเทพๆ อยู่นะ น้อยคนจริงๆ) เรื่องพวกนี้อินฟราฯ ต้องร่วมมือด้วยการให้ slow query report ด้วยนะครับ ไม่งั้นโปรแกรมเมอร์ก็หน้ามืด หรือถ้ามี DBA ก็ อันนี้หน้าที่คุณล่ะ

และสุดท้ายที่ต้องระวังในกรณีบริษัทใหญ่มักจะมีเรื่อง share resource อันนี้จากที่พูดไป อย่าให้งานคนล่ะสไตล์มาใช้ resource ร่วมกัน เพราะการตั้งค่าต่างกันเอง แม้คุณจะแยก config variable ในระดับ user ได้ก็เถอะ แต่ที่มันไม่เปลี่ยนคือแรมกับcpu ดังนั้น slow query แยกไปเครื่อง fast query แยกไปอีกเครื่อง อันนี้จะดีกว่านะ

แถมนิดเรื่อง DB Lock หรือ Table Lock

ส่วนตัวถ้างานไหนที่ transaction ขาเขียนมันเยอะจนโหด ผมแนะนำถ้าไม่เปลี่ยน DB ไปใช้ที่ไวกว่า พวก MongoDB หรือ Cassandra หรือยัดใส่ Redis ไว้ชั่วคราวก็ได้ ไม่ก็ถ้าพวก job manager มาเป็นคน insert แทน (Gearman Beantalk บลาๆๆ) แบบนี้จะช่วยได้ครับ

สำหรับโปรแกรมเมอร์ คำสั่ง sql ที่ควรรู้เรื่องนี้มีสองคำสั่ง

SHOW PROCESSLIST;

อันนี้ใช้ดู tcp connection ครับ ดูเลยว่าค้างเท่าไร มีรอ timeout เท่าไร และนรกแตกว่ากลายเป็น zombie ไปเท่าไร ซึ่งคือ connection ที่ reuse ไม่ได้ อันนี้เราคอยดูได้บ้างครับ

อีกคำสั่งคือ
SHOW VARIABLES;

ใช้ดูการตั้งค่าของ MySQL ครับ ส่วนตัวแนะนำให้ดูกลุ่มคำสั่ง timeout นั้นแหละ เหตุผลก็ตามข้างต้นที่พิมพ์ไปแล้ว
SHOW VARIABLES LIKE '%timeout%'

ผมขออธิบายเท่านี้ครับ จริงๆ มีอีกเยอะ เรื่องพวกนี้คุยกันได้ยาวครับ เช่น zombie process เกิดได้ไง จะมีผลยังไง เรื่อง table lock ถ้าระดับ software ควรทำยังไง ควรจะเขียนโค้ดแนวไหนถึงจะช่วยลดภาระอินฟราฯ แม้กระทั่งการออกแบบ schema ให้เหมาะสมควรทำยังไงครับ มีเยอะแยะครับ

ปล. ผมไม่ใช่อินฟราฯ ไม่ใช่ DBA ผมเป็นแค่ PHP Programmer ดังนั้นใครเห็นข้อผิดพลาดก็เสริมด้วยนะครับ

ปล2. ขอโฆษณาหน่อย LOL

อันนี้พูดจริงๆ เดิมเรื่องพวกนี้ผมไม่ค่อยเป็นครับ เขียนเป็นอย่างเดียว ทุกวันนี้เพราะทำงานเลยได้สกิลเพิ่ม ดังนั้นถ้าใครกำลังหางานที่ได้พัฒนาตัวเอง งานที่คุณไม่ได้ถูกผูกว่าคุณเป็นแค่โปรแกรมเมอร์ คุณอยากมีปากเสียงคุณกับ business ได้แบบมีเหตุมีผล และงานที่ไม่ใช่งาน routine ทำแต่เรื่องเดิมๆ แนะนำให้มาสมัครบริษัทที่ผมทำงานครับ

ประกาศที่พี่ๆ เขาเคยลงไว้
https://www.blognone.com/node/61513
https://www.blognone.com/node/47908
https://www.facebook.com/jQueryTips/posts/953491481329182

ดังนั้นถ้ามาทำงานด้วยกันจะเล่าต่อให้ฟังครับ 555+

ใช้ storage engine เป็น innodb จะได้เป็น row-level locking
แต่ต้องขึ้นอยู่กับเงื่อนไขด้วยว่ามี index มารองรับหรือไม่
ถ้าไม่มี index มารองรับ ก็เป็น table-level locking

icez Sun, 15/02/2015 - 18:49

"ใหญ่" สุดเท่าที่เคยทำมาคือข้อมูล "เพิ่ม" วันละประมาณ 50 GB ครับ เก็บมาแล้วประมาณสองปี data รวมก็เฉียดๆ 40TB

ส่วน generic case ข้อมูลเพิ่มจริงวันละประมาณ 5GB ครับ

คร่าวๆ นะครับ

  • สำหรับ full data ลืม mysql ไปได้เลย scale ขนาดนี้ให้ตายยังไงก็เอาไม่อยู่
  • mysql/rdbms เอาไว้เก็บผลลัพท์จากการประมวลผลแล้วที่ไว้โชว์หน้าเว็บเท่านั้น
  • เก็บข้อมูลหลายๆ format โดยเฉพาะ plain text แบบ log file สำคัญมาก
  • unix command line tool (grep / find) เวิร์กมากสำหรับการค้นแบบด่วนๆ เพราะเร็วมากๆ
  • เครื่องมือที่ออกแบบมารองรับการ scale out อยู่แล้วให้ผลดีกว่ากันเยอะมากๆ (ใช้ elasticsearch ซึ่งทำงานบน apache lucene)
  • เครื่องมือพวกนี้ หลักการง่ายที่สุดที่ทำให้เร็วคือ อัดจำนวนเครื่องเยอะๆ เข้าว่า
  • ideal case คือ เก็บเครื่องละประมาณ 50-100GB ซึ่งจากปริมาณข้อมูลเพิ่มนี่ แทบจะต้องเพิ่ม node ทุกวัน
  • ใช้งานจริงเลยเป็นเครื่องที่แรม 32GB เก็บเครื่องละเกือบๆ 1TB ทำให้ไม่ต้องเพิ่มเครื่องบ่อยมาก
  • แต่ elasticsearch เดี่ยวๆ ก็ไม่รอดเหมือนกัน เลยต้องทำเป็น multi tier database (raw data ==> redis == map ==> elasticsearch + plain text log == reduce ==> mysql)

สรุปแล้วมี db หลักทั้งหมด 3 service (redis, elasticsearch, mysql) ไม่นับ memcache แล้วก็เอา log ไป store ใน plain text ซ้ำอีกเพื่อการทำ filter แบบด่วนๆ

เสริมนิดว่าอย่าใช้ elasticsearch ทำ storage ครับ แม้มันจะดีและเร็ว แต่ว่าถ้า insert update มันช้า เพราะมันต้องทำ index ยิ่งกำหนด mapping ละเอียด ยิ่งช้าลงไปอีก การแยก multi tier database แบบคุณไอซ์บอกคืออะไรที่ดีจริงๆ ไม่ทำไม่ได้ในสเกลใหญ่ (แต่ต้องถาม infra เล่นด้วยไหม ส่วนโปรเจ็คส่วนตัว ผมจัดแบบนี้เลยล้ะ)

ส่วนตัวแนะนำคือใช้ search เก็บแต่ index แต่ไม่ store แล้วถ้าทูลอย่างอื่นมาจัด queue ในการ build เข้า elasticsearch จะดีกว่า ผมเคยใช้เต็มๆ กับ itruemart.com มาแล้วเลยบอกได้ว่าอยากทำให้ดีกว่านี้

ส่วนมากคือ search เท่านั้นควรไปอ่านจาก elasticsearch เพราะเร็ว และจัดการพวก boost scoring ได้ดี ไม่ต่างกับค้นจาก Google เลย แล้วค่อยเอาเลข id ที่ได้ไปค้น DB อันอื่นที่ทำ storage จริงๆ จากที่ใช้มา elasticsearch ทำระบบ search ดีมากและผมชอบที่สุดเลยล่ะ

ส่วน redis นี้ของชอบผมเลยนะ ชอบกว่า memcache อีกเพราะเจอ memcache ไม่เคลียร์ตอนมันหมดอายุมาล่ะ ไม่รู้เพราะอะไร (แน่นอนว่าตอนนั้นผมอยู่ในฐานะโปรแกรมเมอร์ และอินฟราเป็นของบริษัทอื่น ดังนั้นผมก็งงๆ และก็ใช้ๆ ไปเหอะ)

ปล. elasticsearch กินแรมดีจริงๆ ถ้า search เยอะๆ แนะนำแยกเครื่องครับ ถ้าทำใช้เองแล้วเครื่องจำกัด อย่าลืมเซ็ต memheap ไม่ให้มันจองเมมเกินไปนะครับ

jaideejung007 Mon, 16/02/2015 - 15:33

In reply to by icez

คุณไอซ์ พอจะบอกใบ้ชื่องานนี้ได้ไหมครับ เป็นงานเกี่ยวกับอะไรครับ

ทำไมถึงดูโหดจัง วันละ 50GB

ขอบคุณครับ

pantip ใช้ mongodb เป็น base ถ้ายังใช้ elasticsearch อีกมันดูแปลกๆ
เพราะ mongodb และ elasticsearch เป็นฐานข้อมูลประเภทเดียวกันคือ document เหมือนกัน ความสามารถจะคล้ายๆกัน ทำงานได้พอๆกัน
ถ้าใช้ elasticsearch แล้วใช้ MemcacheDB มาช่วยหรือใช้ mongodb แล้วใช้ redis มาช่วยอันนี้ไม่แปลก

ประเภทของฐานข้อมูล Nosql คือ

  • Document databases เช่น MongoDB, CouchDB, Elasticsearch
  • Graph stores เช่น Neo4J, Infinite Graph, InfoGrid
  • Key-value stores เช่น DynamoDB, Redis, MemcacheDB
  • Wide-column stores เช่น Cassandra, Amazon SimpleDB, Hadoop / HBase

PaPaSEK Wed, 18/02/2015 - 10:08

In reply to by icez

โอว ... แล้วที่เล่าว่าต้องเพิ่มเครื่องวันละเครื่องเนี่ย ในทางปฏิบัติเพิ่มจริงมั้งครับ?

mmanic Mon, 06/09/2021 - 13:05

In reply to by jaideejung007

ใหญ่สุดและกากที่สุดเลยครับ เพราะผมมารับช่วงต่อจากคนเก่า ปัญหาเยอะมากตั้งแต่วางโครงสร้างระบบยันฐานข้อมูล ไม่มีเอกสารหรือข้อสรุปจากทางลูกค้าเลย ช่วงที่ผมเข้าไปคืองานเลทมาแล้วเกือบปี ผมใช้เวลาอีกปีครึ่งเพื่อปรับโครงสร้างใหม่ทั้งหมด เป็นงานที่รากเลือดสุดๆ เลยครับ เดินทางไกล ทำงานหนัก ถึงบ้านดึก

พอจบงานนี้ทาง บ ก็เลิกรับงานแนวนี้อีกเลย

ปรกติครับ ผมเจอมาเยอะ
ขึ้น project แห่กัน เข้ามา
พอจะ deploy ลาออก

ใช้ชีวิตง่ายดี ไม่ต้องรับผิดชอบอะไร
ใครรับ maintain ปัญหาต่อได้ คุณจะมีงาน ไม่จบไม่สิ้น แถมชาร์ตได้ แพงมากด้วยนะ

บ. ผมนี่แหล่ะ รับงาน ที่เน่าจาก ที่อื่น ๆ แบบประมาณ เอาไม่รอดแล้ว ผมจะเข้าไปจัดการให้ ถ้าสู้ราคานะครับ
โดยเฉพาะงานรัฐบาล ที่เอกชนใหญ่ ๆ ไปรับแล้ว ไม่รอดอ้ะ ผมเจอมาเยอะ DATA ใหญ่มาก ๆ ดันให้เด็กมือใหม่
มาทำเพราะราคาถูก แล้วพอเจอ TEST SCRIPT เข้าไป ล่มไปไม่เป็นสิ แรก ๆ ก็เห็น show power กันซะ
DATABASE โครงการรัฐเนี่ย เยอะมาก แต่ขอบอก เอาที่จำเป็นจริง ๆ อาจจะไม่ถึง 60% นอกนั้น ขยะดี ๆ นี่เองเพราะ
แต่ละเจ้าที่มารับก็ต่างคนต่างทำ ไม่มีคนคุม เส้นทาง และ ข้อมูล กว่าจะมานึกได้ ก็เดินมาไกลละ

ผมเป็นมือสมัครเล่น ระบบไม่ได้ใหญ่เท่าไหร่ ก็ลองปรับไปเรื่อยๆแหละครับ ตาม Hardware ที่มีอย่างจำกัด
ใช้ mysql mongodb ผสมๆ กันไป เพราะบางส่วนถ้าจะย้ายจาก mysql ไป mongodb นี่งานช้างเลย

ส่วนด้าน write จะใช้ Redis และ memcache มาช่วย โดยเก็บลง redis ก่อนแล้วใช้ nodeJS เป็น distribute worker มา aggregate / reduce ก่อน Write ลง DB

ด้าน read ก็ใช้ redis / memcache มา cache query ไว้ บางส่วน
บางส่วนที่ไม่ได้อัพเดทบ่อยก็ใช้วิธีสร้าง static html ให้ web server ดึงตรงไปเลย

คิดว่าแรมครับ เพราะที่ทำงานได้เร็วเพราะข้อมูลส่วนมาจะอยู่ในแรม
แต่บางกรณีก็ต้องใช้ cpu แยอะเหมือนกัน เช่น การทำ mapreduce

เอาจริงๆทั้ง cpu และ ram มันก็จะต้องมาด้วยกันแหละครับ ให้มัน balance กันไป

ขออย่าเจอแบบเครื่อง 20 core แต่ให้แรมมาแค่ 16g ละกันครับ 5555

zixs Fri, 20/02/2015 - 00:42

ผมเคยทำ DB ไว้รองรับข้อมูลขนาดใหญ่ครับ แต่ถึงเวลาจริงๆมันไม่ใหญ่อย่างที่คิด 5555
ผมเอาทุกอย่างยัดลง Cassandra ครับ ศึกษา data model design + db architech อยู่เปนเดือน ทำเสร็จแล้วมาถึงคิดได้ว่าน่าจะรอให้มันใหญ่จริงๆแล้วค่อยทำดีกว่า 5555
แต่ผลลัพที่ได้น่าประทับใจมากนะครับ เวลาในการ select ข้อมูลออกมานี่เร็วมาก ยิ่งใช้ Go เขียนเป็น Backend นี่ response เร็วมากครับ (ไม่ได้เก็บ log ไว้นะครับจำตัวเลขไม่ได้)
สุดท้ายนี้ขอฝาก Go lang และ Cassandra ไว้ในอ้อมอกของทุกคนด้วยนะครับ

EThaiZone Sat, 21/02/2015 - 21:28

In reply to by zixs

Cassandra มันออกแบบมาสำหรับเรื่อง write durability นะครับ อันนี้บอกก่อน select ไม่ใช่จุดเด่นของมันครับ

ถ้าอยาก select เร็วๆ ไป mongodb ดีกว่าครับ

bochaiyadej Sat, 05/09/2020 - 11:38

ผมลง PostgressSQL ในโน้ตบุ้คของตัวเอง แล้วสร้าง table เดี่ยว ๆ ไม่ join table อื่น
ข้อมูลเกี่ยวกับยอดขายและสต็อคของสาขา แล้วทำการ random gen data 100 ล้านเรคอร์ด size 36 GB
เป็นข้อมูล by date,store,inv_no,barcode แล้วทำการ selecu sum()
date,store,barcode ใช้เวลาในการ sum() 3.18 นาที ถือว่าช้าหรือใช้ได้แล้วครับ
ผมต้องทดลองกับเครื่องโน้ตบุ้คตัวเองก่อน ยังไม่กล้าไปลองกับ Server on Cloud