HandlerSocket NoSQL ในรูปแบบของ MySQL by heha
Sep2
ก่อนอื่นต้องเท้าความก่อนว่า HandlerSocket คืออะไร HandlerSocket คือ Plugin MySQL ของ InnoDB Engine (เท่านั้น) ที่จะช่วยให้เราสามารถใช้ NoSQL ในรูปแบบของ MySQL ทำให้ได้ speed เพิ่มขึ้นมากหลายเท่าโดยที่โครงสร้างข้อมูลยังอยู่ในรูปแบบของตารางอยู่ (ผู้เขียน HandlerSocket claim ว่าเร็วกว่า Memcache ถ้าปริมาณข้อมูลใส่ใน memory ได้พอเลยนะเออ!) ซึ่งหลักการของ HandlerSocket คือตัดขั้นตอนที่ไม่จำเป็นออกจาก MySQL ทั้งหมด โดยเฉพาะอย่างยิ่ง SQL Parse ซึ่งเป็นขั้นตอนที่กินเวลามากที่สุด แต่ก่อนอื่น เรามาทำความเข้าใจกันสักนิดก่อนจะใช้งาน HandlerSocket
- ต้องแก้ Code ใหม่เนื่องจากไม่สามารถใช้ SQL query ได้อีกต่อไป ต้องใช้ function ที่ตัวเชื่อมกับ HandlerSocket มีให้เท่านั้น
- Join ไม่ได้เพราะเป็นการใช้งานแบบ NoSQL เต็มรูปแบบ ใช้ได้เฉพาะ Query ง่ายๆ ของ SELECT,INSERT, UPDATE, DELETE ที่อ้างอิงกับ primary key
- Replication ไม่ได้ถ้าใช้เป็นรูปแบบการ write (แก้ปัญหาได้ด้วยการใช้แค่ read อย่างเดียว write ยังใช้เป็น SQL เหมือนเดิม)
- ไม่มีระบบ Autenticatation ไม่มี Security ใดๆ (ต้องเข้าใจก่อนว่า NoSQL เจ้าอื่นๆ เช่น Redis, Memcache ก็เป็นแบบนี้เช่นกัน) แต่สามารถใช้ Firewall block port ที่จะใช้งานจากภายนอกแทนได้
- ควรปิดระบบ query cache เวลาใช้งานไม่งั้นค่าที่อ่านมาได้อาจผิดพลาด (แต่เนื่องจากมันเร็วส์อยู่แล้ว ปิด query cache ก็ไมได้กระทบกับระบบอะไรมากหรอก)
- ถ้า insert รัวๆ Auto Increment จะนับข้ามบ้างเป็นบางครั้ง ถ้าไม่ serious ว่าเลขต้องเรียงต่อกันก็ไม่เป็นไรครับ
- ใช้ได้กับ InnoDB Storage Engine เท่านั้น!
มาดูที่ข้อดีกันบ้าง
- เร็วส์ (750,000 query/sec แต่อันนี้เป็นคำโม้จากคนสร้างนะครับ ใช้จริงอาจไม่ถึง แต่เร็วกว่า memcache ถ้า memory พอดีกับข้อมูลครับ)
- INSERT, UPDATE ตัว HandlerSocket จะจับมัดเป็นก้อนเดียวกันโยนไปทีเดียวเลยเหมือนใช้ Transaction ในตัว (เฉพาะ performance นะครับ ไม่ได้ใช้ transaction ได้เต็มรูปแบบ) จริงๆ ก็คือ เร็วส์แหละครับ
- ข้อมูลยังคงออกมาเป็นรูปแบบของตาราง MySQL ที่เราคุ้นเคย เรายังใช้ SQL มาดึงข้อมูลภายหลังได้ หากเกิดเปลี่ยนใจไม่อยากใช้ HandlerSocket แล้ว
- เร็วส์ เร็วส์ เร็วส์ (ไม่มีข้อดีอย่างอื่นแล้ว)
ถ้าพิจารณาข้อจำกัดต่างๆ แล้ว ทุกอย่างผ่านหมด ก็มาดูที่วิธีติดตั้งได้เลย
1. install percona server ก่อนเลยครับ ถ้าไม่ใช้ Percona Server ก็ต้อง compile plugin ใช้เองซึ่งวุ่นวายกว่ามากครับ วิธี Install ตามนี้เลย
2. แก้ไขไฟล์ my.cnf เพิ่มบรรทัดเหล่านี้เข้าไป
loose_handlersocket_port = 9998
# the port number to bind to for read requests
loose_handlersocket_port_wr = 9999
# the port number to bind to for write requests
loose_handlersocket_threads = 16
# the number of worker threads for read requests
loose_handlersocket_threads_wr = 1
# the number of worker threads for write requests
open_files_limit = 65535
# to allow handlersocket to accept many concurrent
# connections, make open_files_limit as large as
# possible.
9998 คือ port สำหรับ read อย่างเดียว ส่วน 9999 คือ port สำหรับ write นะครับ (แก้เลขเป็น port อื่นได้)
3. login เข้า MySQL เป็น root แล้วพิมพ์คำสั่งไปว่า
install plugin handlersocket soname 'handlersocket.so';
4. สั่ง SHOW PROCESS LIST ถ้า Install สำเร็จจะปรากฏ Worker ใน process list ดังนี้
mysql> SHOW PROCESSLIST;
+—-+————-+—————–+—————+———+——+——————————————-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+————-+—————–+—————+———+——+——————————————-+——————+
| 1 | system user | connecting host | NULL | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL |
| 2 | system user | connecting host | NULL | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL |
…
| 16 | system user | connecting host | NULL | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL |
| 17 | system user | connecting host | handlersocket | Connect | NULL | handlersocket: mode=wr, 0 conns, 0 active | NULL |
5. เสร็จสิ้น หลังจากนี้ก็ต้องหา library ที่สามารถติดต่อกับ HandlerSocket มาใช้ละครับ เช่น php ใช้ php-handlersocket nodejs ใช้ node-handlersocket
วิธี config และใช้ nginx + php-fpm + fast-cgi เบื้องต้นให้ใช้งานกับ Codeigniter by heha
Dec1
เนื่องด้วยทั่วๆ ไปแล้ว web server มาตรฐานทั่วๆ ไปที่ใช้งานกันคือ Apache แต่ว่า Apache นั้นบริโภค Memory อย่างไม่ไยดี และถ้าเว็บเรามีการใช้งาน static file จำพวกรูปภาพหรือ css, js มากๆ ก็จะกิน Memory หนักขึ้นไปอีก หลักการของ nginx จึงเปรียบเสมือนการเป็นป้ายบอกทางว่าถ้าเป็น static file ให้เรียกไฟล์นั้นๆ ขึ้นมาตรงๆ เลยไม่ต้องผ่าน apache หรือตัวกลางอื่นๆ แต่ถ้าเป็น Dynamic file เช่น PHP ก็ให้ส่งไปยัง Fast-cgi แทน ซึ่ง Fast-cgi จะทำหน้าที่อ่าน PHP เพียงอย่างเดียว ไม่ต้องเผื่อรองรับ static file จึงกิน Memory น้อยกว่านั่นเอง สุดท้ายจึงทำให้สามารถรองรับการใช้งานเว็บไซต์ที่มี traffic หนักๆ ได้อย่างสบายๆ กว่า apache มากหลายเท่าตัว
อันที่จริงแล้ว Apache ก็ไม่ได้มีแต่ข้อเสียขนาดนั้น ข้อดีของ Apache คือเหมือนเป็น All-in-one machine ติดตั้งตัวเดียว ทำงานได้ทุกอย่าง ถ้ามีคนใช้งานไม่มาก เราจะแทบไม่ต้องไปยุ่งกับการปรับ config เลยด้วยซ้ำไป เพียงแต่ว่าเมื่อเราต้องการให้รองรับการใช้งานหนักๆ ได้ เราจึงจำเป็นต้องใช้ “ผู้เชี่ยวชาญเฉพาะด้าน” ซึ่งในที่นี้คือ fast-cgi นั่นเอง และจะมี php-fpm คอยควบคุมสั่งการอีกทอดหนึ่งซึ่งแน่นอนว่าการ config เพื่อใช้งานจึงยุ่งยากกว่า แต่ก็แลกมากับประสิทธิภาพที่น่าพอใจ
ทดสอบประสิทธิภาพเครื่องด้วย apachebench + newrelic by heha
Jul0
ช่วงนี้กำลังทดสอบประสิทธิภาพ server เลยต้องใช้งาน apachebench (ขอเรียกสั้นๆ ว่า ab) เป็น tools ในการทดสอบประสิทธิภาพ server อย่างหนึ่ง หลังจากลงโปรแกรมแล้ว เราสามารถทดสอบการใช้งานได้ดังนี้
ลองพิมพ์คำสั่งด้านล่างกัน โดย -n คือจำนวน request ทั้งหมดที่จะยิง และ -c คือจำนวน concurrent connection ที่จะใช้ (คือจำลองว่ามีผู้ใช้เข้าใช้งานพร้อมกันกี่คนนั่นเอง) โดยเวลาพิมพ์ชื่อเว็บอย่าลืมพิมพ์ / ต่อท้ายด้วยไม่งั้นจะยิงไม่ได้ ผลจะเป็นดังนี้
5 เทคนิคการปรับปรุงเว็บไซต์ให้ทำงานได้รวดเร็วขึ้น by heha
May0
บทความนี้ค่อนข้างจะเป็นบทความภาคต่อจาก ทำไมเว็บไซต์ของคุณช้า หรือล่มบ่อย? โดยเป็นรูปแบบ Software Architecture (สถาปัตยกรรมของซอฟต์แวร์) ที่ต้องใช้ในการรันเว็บ application แต่ก่อนจะไปถึงขั้นนั้นคงต้องถามตัวเองให้ดีก่อนว่าเว็บไซต์ของคุณเป็นเว็บไซต์ที่ใช้งานหนักทางด้านไหน? คนนิยมทำอะไรบนเว็บไซต์ของคุณเพื่อที่จะได้ปรับปรุงเปลี่ยนแปลงรูปแบบการวางระบบของเราได้เหมาะสม ได้แก่
- เว็บไซต์ของคุณมีรูปแบบ operation ใดมากกว่ากันระหว่าง Read กับ Write? เป็นเว็บที่เน้น Read อย่างเดียวหรือเป็นส่วนมากหรือไม่
- หากเว็บไซต์ของคุณจำเป็นต้องใช้งาน read มากๆ ลองคิดดูให้ดีว่าข้อมูลที่แสดงให้ User เห็นจำเป็นต้องเป็นข้อมูลที่ Real Time แค่ไหน ข้อมูล update ช้าลงแค่ 5-10 นาทีจะเป็นอะไรหรือไม่ เช่น สถิติการใช้งานต่างๆ ที่มักต้องใช้ข้อมูลจากหลายๆ ส่วนมาประมวลผลรวมกันมากๆ อาจคำนวณแค่เพียงทุกๆ 5-10 นาที แต่ทุกครั้งที่คนคลิกเพื่อดูข้อมูลเราเพียงแสดงข้อมูลที่ผ่านการคำนวณเก็บไว้อยู่แล้วมาแสดงเท่านั้น (Cache)
- หากเว็บไซต์ของคุณจำเป็นต้องใช้งาน write มากๆ ลองคิดดูให้ดีว่าข้อมูลของคุณจำเป็นต้อง Durability สูงหรือไม่ (ข้อมูลเมื่อเปลี่ยนแปลงแล้วต้องคงอยู่ตลอดไปหรือไม่) เช่นระบบ chat ที่ใช้เพียงคนคุยกันแค่ไม่กี่ครั้งก็ล้างข้อมูลทิ้งหมดแล้ว ข้อมูลเก่าๆ ไม่มีการใช้งานอีก แบบนี้อาจพิจารณาการเก็บข้อมูลทั้งหมดใน Memory แทน
- หาก write เยอะ ข้อมูลที่คุณต้องเปลี่ยนในการเซพข้อมูลลงหนึ่งครั้ง สามารถเปลี่ยนแนวคิดจากการ write ทุกครั้งที่เปลี่ยนแปลงทันทีมา write เฉพาะตอนที่ web server สิ้นสุดการทำงานครั้งสุดท้ายเพียงแค่ครั้งเดียวได้หรือไม่
- และอื่นๆ อีกมาก
หลายคนจึงอาจเกิดข้อสงสัยขึ้นมาว่าแล้วเราจะทำอะไรได้บ้าง? ก็มีวิธีต่างๆ ดังต่อไปนี้
9 เครื่องมือตรวจสอบสถานะ server by heha
Feb2
จากบทความที่แล้ว Newrelic เครื่องมือสำหรับ monitor server บน Cloud ขั้นเทพ เรามาดูกันต่อด้วย tools ที่เจาะลึกมากขึ้นผ่านทาง shell ดังนี้ครับ
- top เครื่องมือหากินที่มีติดมากับ server ทุกตัว ใช้ดู CPU, Memory ของแต่ละ process ได้ เพื่อสังเกตถึงความผิดปกติของ process และยังสั่ง kill process ได้อีกด้วย
- prstat -Z ตัวนี้คล้าย top แต่เอาไว้ใช้บน Solaris ครับ จะให้ข้อมูลที่เที่ยงตรงกว่า top แต่ถ้าเป็น linux ตระกูลอื่นก็ใช้ top นั่นแหละ
- ps -elf มี process อะไรรันอยู่บ้างด้วย command อะไร
- uptime ตรวจสอบว่าเครื่องนี้รันมาโดยไม่ล่มเป็นเวลากี่วันแล้ว
- df -h ใช้เช็คพื้นที่ harddisk ที่เหลือ เอาไว้ดูว่าเครื่อง server หรือเครื่อง database ของเราพื้นที่ใกล้เต็มหรือยัง
- apachetop -f <access_log_path> ใช้เช็คว่ามี URL ไหนที่ถูกรันถี่เป็นพิเศษ หรือมีการส่งข้อมูลมากเป็นพิเศษในขณะนั้น อันนี้รวมไปถึงถ้าโดนใครยิงถล่ม server ก็สามารถ monitor ได้เช่นกันว่ายิงมาจาก IP ไหน
- mysql -u<username> -p แม้แต่ตัวคำสั่ง mysql เองก็สามารถใช้ตรวจสอบสถานะของ Database ได้เช่นกัน หลังจากเราพิมพ์ mysql -uroot -p เข้ามาแล้ว สามารถรันคำสั่งต่างๆ ได้ เช่น
- SHOW PROCESSLIST; ใช้ดูสถานะ Query ของ mysql ในขณะนั้น ถ้า table โดน Lock บ่อยมากๆ เราจะเห็นสถานะ LOCK ค้างตอนรันคำสั่งนี้เป็นจำนวนมาก
- SHOW STATUS; ใช้ดูสถานะค่าต่างๆ ของ mysql ซึ่งมีอยู่มากมายมหาศาล อ่านรายละเอียดของค่าแต่ละตัวได้ที่นี่
- mytop -u <username> -p <password> -d <database_name> เมื่อเรามี top ใน server ก็ต้องมี mytop ใน mysql ตัวนี้เอาไว้ monitor สถานะปัจจุบันของ mysql ได้ทั้ง Query per sec, mysql รันมากี่วัน กี่ชั่วโมงโดยที่ไม่ล่มแล้ว, มีปริมาณ Select/Insert/Update/Delete ในขณะนั้นมากน้อยเพียงใด, มี slow query ไหม, Bytes per sec ฯลฯ มีประโยชน์มากครับ
- dtrace อันนี้มีเฉพาะใน Solaris แต่ขอบอกว่าเป็น Tools ที่เทพมากๆ ครับ โดยหากจะใช้เราควรไป Download Dtracetoolkit มา ถ้าใครเคยใช้ Firefox ก็คิอซะว่า Dtrace คือ greasemonkey และ Dtracetoolkit คือชุดของ script สำหรับรันจำนวนมากนั่นเอง ซึ่งภายใน toolkit จะมีหลากหลายภาษาการเขียนโปรแกรมมาให้เป็นจำนวนมาก วิธีใช้จะต้องลง extension ของภาษานั้นๆ เช่นจะใช้งาน dtrace สำหรับ php ต้องลง pecl install dtrace เสียก่อน จึงจะสามารถรัน script ที่ download มาได้ เมื่อรันแล้วจะมีข้อมูลหลายอย่างที่น่าสนใจเช่น function อะไรที่ class ไหนใช้เวลารันไปกี่วินาที รันไปกี่รอบ หรือแม้แต่กิน memory ไปเท่าไร ช่วยให้การหา bottleneck ของโปรแกรมว่าส่วนไหนของโปรแกรมทำงานช้าทำได้ง่ายมากๆ เพราะลงไปถึงระดับ function กันเลยทีเดียว อ่านรายละเอียดเพิ่มเติมได้ที่นี่
ก็ตามนี้ครับ list tools ช่วยตรวจสอบสถานะ server ใครมีปัญหาอะไรก็ลองรันดูเผื่อจะเจออะไรนะครับ tool ทุกตัวที่ผมแนะนำคิดว่าน่าจะมีอยู่ใน server อยู่แล้ว ไม่ต้องติดตั้งอะไรเพิ่มครับ ขอให้โชคดีครับ
