อยากรู้ว่าเค้าจัดการกับข้อมูลจำนวนมากอย่างไร และ ถ้ามีการดึงเรียกใช้งานจำนวนมากกว่าปกติต้องเตรียมการรองรับอย่างไรบ้างครับ
ใช้ฐานข้อมูลอะไรครับ MySQL หรือ SQl อื่น ๆ และ NoSQL
การกำหนดแคชฐานข้อมูลช่วยได้ไหม แล้วเคยล่มไหมครับ การสำรองข้อมูลขนาดใหญ่ทำอย่างไรครับ
ขอถามเพื่อเป็นกรณีศึกษาครับ
เข้ามาลงชื่อฟังด้วยครับ
จากประสบการณ์คือกับ 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+
มันไม่ง่ายเลยที่จะทำ GIF ให้มีขนาดน้อยกว่า 20kB
ขอบคุณครับ
บล็อก: wannaphong.com และ Python 3
ใช้ storage engine เป็น innodb จะได้เป็น row-level locking
แต่ต้องขึ้นอยู่กับเงื่อนไขด้วยว่ามี index มารองรับหรือไม่
ถ้าไม่มี index มารองรับ ก็เป็น table-level locking
"ใหญ่" สุดเท่าที่เคยทำมาคือข้อมูล "เพิ่ม" วันละประมาณ 50 GB ครับ เก็บมาแล้วประมาณสองปี data รวมก็เฉียดๆ 40TB
ส่วน generic case ข้อมูลเพิ่มจริงวันละประมาณ 5GB ครับ
คร่าวๆ นะครับ
สรุปแล้วมี 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 ไม่ให้มันจองเมมเกินไปนะครับ
มันไม่ง่ายเลยที่จะทำ GIF ให้มีขนาดน้อยกว่า 20kB
คุณไอซ์ พอจะบอกใบ้ชื่องานนี้ได้ไหมครับ เป็นงานเกี่ยวกับอะไรครับ
ทำไมถึงดูโหดจัง วันละ 50GB
ขอบคุณครับ
น่าจะ Pantip
ถ้าใช่ อ่านต่อที่นี่
http://macroart.net/2013/10/mongodb-lessons-learned-on-pantip/
พันทิพย์ไม่ได้ใช้ครับ ที่ออฟฟิตผมมีคนหนึ่งมาจากพันทิพย์ เขายังสนใจ elasticsearch เลย แต่ว่าเขาไม่เคยใช้ครับ
มันไม่ง่ายเลยที่จะทำ GIF ให้มีขนาดน้อยกว่า 20kB
pantip ใช้ mongodb เป็น base ถ้ายังใช้ elasticsearch อีกมันดูแปลกๆ
เพราะ mongodb และ elasticsearch เป็นฐานข้อมูลประเภทเดียวกันคือ document เหมือนกัน ความสามารถจะคล้ายๆกัน ทำงานได้พอๆกัน
ถ้าใช้ elasticsearch แล้วใช้ MemcacheDB มาช่วยหรือใช้ mongodb แล้วใช้ redis มาช่วยอันนี้ไม่แปลก
ประเภทของฐานข้อมูล Nosql คือ
Blognone Quest for High Scalabilty Computing: เสวนาคนไทยทำเว็บขนาดใหญ่กันอย่างไร
analytic tools ตัวนึงครับ aggregate log มา process
โอว ... แล้วที่เล่าว่าต้องเพิ่มเครื่องวันละเครื่องเนี่ย ในทางปฏิบัติเพิ่มจริงมั้งครับ?
ตอนนี้เหลือแต่ที่วันละ 5GB ครับ เครื่องนึงอยู่ได้เกือบปี ดีหน่อย
ขอบคุณครับ ผมยังนึกว่าจะมีองค์กรแบบกูเกิลในไทย ที่ต้องมีแผนกนึงเพิ่มเครื่องเพิ่มฮาร์ดดิสก์ทุกวัน
อยากรู้ครับว่า Log เยอะขนาดนี้ มีระยะเวลาการจัดเก็บอย่างไรครับ
บล็อก: wannaphong.com และ Python 3
guidewire online training
cyber security online training
snaplogic online training
SDET online training
SAP HANA online training
SAP SCM online training
python online training
SAP ABAP online training
SAP BW online training
SAP SD online training
SAP MM online training
SAP FICO online training
SAP HR online training
SAP GRC online training
SAP QM online training
ขอบคุณครับ ฐานข้อมูลใหญ่มากเลย
บล็อก: wannaphong.com และ Python 3
อ่านสนุกดีครับ อยากอ่านอีก
ใหญ่สุดและกากที่สุดเลยครับ เพราะผมมารับช่วงต่อจากคนเก่า ปัญหาเยอะมากตั้งแต่วางโครงสร้างระบบยันฐานข้อมูล ไม่มีเอกสารหรือข้อสรุปจากทางลูกค้าเลย ช่วงที่ผมเข้าไปคืองานเลทมาแล้วเกือบปี ผมใช้เวลาอีกปีครึ่งเพื่อปรับโครงสร้างใหม่ทั้งหมด เป็นงานที่รากเลือดสุดๆ เลยครับ เดินทางไกล ทำงานหนัก ถึงบ้านดึก
พอจบงานนี้ทาง บ ก็เลิกรับงานแนวนี้อีกเลย
บาดเจ็บล้มตายกันไปมาก
ปรกติครับ ผมเจอมาเยอะ
ขึ้น project แห่กัน เข้ามา
พอจะ deploy ลาออก
ใช้ชีวิตง่ายดี ไม่ต้องรับผิดชอบอะไร
ใครรับ maintain ปัญหาต่อได้ คุณจะมีงาน ไม่จบไม่สิ้น แถมชาร์ตได้ แพงมากด้วยนะ
บ. ผมนี่แหล่ะ รับงาน ที่เน่าจาก ที่อื่น ๆ แบบประมาณ เอาไม่รอดแล้ว ผมจะเข้าไปจัดการให้ ถ้าสู้ราคานะครับ
โดยเฉพาะงานรัฐบาล ที่เอกชนใหญ่ ๆ ไปรับแล้ว ไม่รอดอ้ะ ผมเจอมาเยอะ DATA ใหญ่มาก ๆ ดันให้เด็กมือใหม่
มาทำเพราะราคาถูก แล้วพอเจอ TEST SCRIPT เข้าไป ล่มไปไม่เป็นสิ แรก ๆ ก็เห็น show power กันซะ
DATABASE โครงการรัฐเนี่ย เยอะมาก แต่ขอบอก เอาที่จำเป็นจริง ๆ อาจจะไม่ถึง 60% นอกนั้น ขยะดี ๆ นี่เองเพราะ
แต่ละเจ้าที่มารับก็ต่างคนต่างทำ ไม่มีคนคุม เส้นทาง และ ข้อมูล กว่าจะมานึกได้ ก็เดินมาไกลละ
ขอบคุณครับ ถึงว่าเลิกรับงานแนวนี้กัน
บล็อก: wannaphong.com และ Python 3
รอฟังด้วยครับ สนใจมากเป็นพิเศษ
ผมเป็นมือสมัครเล่น ระบบไม่ได้ใหญ่เท่าไหร่ ก็ลองปรับไปเรื่อยๆแหละครับ ตาม 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 ดึงตรงไปเลย
ขอบคุณครับ
บล็อก: wannaphong.com และ Python 3
เครื่องที่ใช้งานด้านฐานข้อมูลระดับใหญ่นี้ ส่วนใหญ่เขาเน้นอะไรมากกว่าครับ ระหว่าง CPU กับ RAM
บล็อก: wannaphong.com และ Python 3
คิดว่าแรมครับ เพราะที่ทำงานได้เร็วเพราะข้อมูลส่วนมาจะอยู่ในแรม
แต่บางกรณีก็ต้องใช้ cpu แยอะเหมือนกัน เช่น การทำ mapreduce
เอาจริงๆทั้ง cpu และ ram มันก็จะต้องมาด้วยกันแหละครับ ให้มัน balance กันไป
ขออย่าเจอแบบเครื่อง 20 core แต่ให้แรมมาแค่ 16g ละกันครับ 5555
ถ้าเจอจะเป็นอย่างไรครับ ฐานข้อมูลที่ผมดูแล ไม่เคยถึงครับ
บล็อก: wannaphong.com และ Python 3
ผมเคยทำ DB ไว้รองรับข้อมูลขนาดใหญ่ครับ แต่ถึงเวลาจริงๆมันไม่ใหญ่อย่างที่คิด 5555
ผมเอาทุกอย่างยัดลง Cassandra ครับ ศึกษา data model design + db architech อยู่เปนเดือน ทำเสร็จแล้วมาถึงคิดได้ว่าน่าจะรอให้มันใหญ่จริงๆแล้วค่อยทำดีกว่า 5555
แต่ผลลัพที่ได้น่าประทับใจมากนะครับ เวลาในการ select ข้อมูลออกมานี่เร็วมาก ยิ่งใช้ Go เขียนเป็น Backend นี่ response เร็วมากครับ (ไม่ได้เก็บ log ไว้นะครับจำตัวเลขไม่ได้)
สุดท้ายนี้ขอฝาก Go lang และ Cassandra ไว้ในอ้อมอกของทุกคนด้วยนะครับ
Blog: https://medium.com/@tanakritsai
ชอบ Dust eater มากๆ ครับ
จะมีกี่คนที่เข้าใจ =_=
เออะ! ผมนี่ถึงกับต้องไปเสริท =_=
Blog: https://medium.com/@tanakritsai
ตายอย่างสมศักดิ์ศรีสินะ
Russia is just nazi who accuse the others for being nazi.
someone once said : ผมก็ด่าของผมอยู่นะ :)
Cassandra มันออกแบบมาสำหรับเรื่อง write durability นะครับ อันนี้บอกก่อน select ไม่ใช่จุดเด่นของมันครับ
ถ้าอยาก select เร็วๆ ไป mongodb ดีกว่าครับ
มันไม่ง่ายเลยที่จะทำ GIF ให้มีขนาดน้อยกว่า 20kB
ผมลง 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
ถ้าทำเป็นเว็บ ก็น่าจะขึ้น Request Timeout ไปแล้วครับ
กระทู้นานมาก แต่ละเม้นมีประโยชน์ๆ