การใช้และจัดการ Memcached Cache ใน ServBay
Memcached คือระบบแคชออบเจกต์แบบอินเมมโมรี่ที่มีประสิทธิภาพสูงและรองรับการกระจายข้อมูล โดยออกแบบมาเพื่อแคชผลลัพธ์การคิวรีฐานข้อมูล, การตอบสนองของ API, ข้อมูล session และข้อมูลที่ใช้งานบ่อยอื่น ๆ เพื่อช่วยลดภาระการทำงานของฐานข้อมูลและบริการ backend ให้เว็บแอปพลิเคชันแบบไดนามิกทำงานได้เร็วขึ้นมาก Memcached เก็บข้อมูลในรูปแบบ key-value และจะเก็บข้อมูลทั้งหมดไว้ใน RAM เพื่อให้การเข้าถึงข้อมูลมี latency ต่ำที่สุด
ServBay ในฐานะเครื่องมือสำหรับพัฒนาเว็บแบบโลคัลที่ทรงพลัง มีการติดตั้งและผนวก Memcached เข้ามาด้วย ช่วยให้นักพัฒนาสามารถใช้เมมโมรี่แคชได้สะดวกใน Stack การพัฒนาโลคัลของตนเอง คู่มือนี้จะอธิบายวิธีการจัดการและใช้งาน Memcached ใน ServBay อย่างละเอียด เช่น การเปิดใช้งาน การตั้งค่าพื้นฐาน วิธีเชื่อมต่อ การคอนฟิก รวมถึงข้อแนะนำในการใช้งาน
การติดตั้งและตั้งค่า Memcached
ServBay มาพร้อมกับ Memcached ในตัว ไม่ต้องติดตั้งเพิ่ม Memcached ถูกจัดเตรียมเป็นแพ็คเกจซอฟต์แวร์สำคัญที่มาพร้อมกับ ServBay
การเปิดใช้งานและจัดการแพ็คเกจ Memcached
คุณสามารถจัดการสถานะการทำงานของแพ็คเกจ Memcached (เริ่ม, หยุด, รีสตาร์ท) ได้ผ่านแพลตฟอร์มการจัดการแบบกราฟิกของ ServBay หรือใช้คำสั่งผ่าน CLI ด้วย servbayctl
การใช้แพลตฟอร์มการจัดการของ ServBay
- เปิดแพลตฟอร์มการจัดการ ServBay
- ไปที่เมนูด้านซ้ายหัวข้อ
ซอฟต์แวร์แพ็คเกจ
- ค้นหา
Memcached
ในหมวดหมู่NoSQL
- คุณสามารถเริ่ม, หยุด หรือรีสตาร์ท Memcached ได้อย่างง่ายดายที่นี่
การใช้ CLI ด้วย servbayctl
สำหรับนักพัฒนาที่ถนัดใช้งานเทอร์มินัล สามารถควบคุม Memcached ได้ด้วยคำสั่ง servbayctl
bash
# เริ่ม Memcached service
servbayctl start memcached -all
# หยุด Memcached service
servbayctl stop memcached -all
# รีสตาร์ท Memcached service
servbayctl restart memcached -all
# ตรวจสอบสถานะของ Memcached service
servbayctl status memcached -all
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
หมายเหตุ: คำสั่ง servbayctl
จะอ้างอิง Memcached เวอร์ชันที่เปิดใช้งานใน ServBay ปัจจุบัน
การตั้งค่า Memcached
ServBay ให้แผงควบคุมแบบกราฟิกเพื่อปรับแต่งตั้งค่าต่าง ๆ ของ Memcached ได้โดยไม่ต้องแก้ไขไฟล์คอนฟิกเอง คุณสามารถกำหนดค่าต่าง ๆ เช่น ขีดจำกัดหน่วยความจำสูงสุด, ที่อยู่ที่ Memcached ฟัง, หมายเลขพอร์ต ฯลฯ ได้จากแผงควบคุมของ ServBay
กรุณาดูเอกสาร แก้ไขการตั้งค่า Memcached เพื่อศึกษาแนวทางในการปรับแต่งค่า Memcached ให้เหมาะสมใน ServBay การตั้งค่าที่ถูกต้องมีผลต่อประสิทธิภาพและการใช้ทรัพยากรของ Memcached อย่างมาก
การเชื่อมต่อกับ Memcached
โดยค่าเริ่มต้น Memcached จะฟังที่พอร์ต 11211
บน localhost
คุณสามารถเชื่อมต่อ Memcached ได้หลายวิธี ทั้งผ่านเครื่องมือบรรทัดคำสั่งหรือไลบรารีลูกค้าของแต่ละภาษา
การเชื่อมต่อผ่านเครื่องมือบรรทัดคำสั่ง
คุณสามารถใช้ telnet
หรือ nc
(netcat) เชื่อมต่อและโต้ตอบกับ Memcached ได้โดยตรง เพื่อใช้งานคำสั่ง Memcached Protocol
ใช้ telnet เชื่อมต่อ:
bashtelnet localhost 11211
1เมื่อเชื่อมต่อสำเร็จ สามารถพิมพ์คำสั่ง Memcached ได้ เช่น
version
เพื่อดูเวอร์ชัน,stats
ดูสถิติ หรือquit
เพื่อออกใช้ nc เชื่อมต่อ:
bashnc localhost 11211
1เช่นเดียวกัน พิมพ์คำสั่ง Memcached ผ่านเทอร์มินัล ใช้ Ctrl+C เพื่อออกจากการเชื่อมต่อ
การเชื่อมต่อผ่านไลบรารีลูกค้าของแต่ละภาษา
ภาษาโปรแกรมส่วนใหญ่มีไลบรารี Memcached Client ที่สมบูรณ์ให้เลือกใช้เพื่อใช้งานในโค้ดแอปพลิเคชันของคุณ
ตัวอย่าง Python
ใช้ไลบรารี pylibmc
(แนะนำ เนื่องจากใช้ libmemcached) หรือ python-memcached
เพื่อเชื่อมต่อ
ติดตั้งผ่าน pip ดังนี้:
bash
pip install pylibmc
# หรือ
pip install python-memcached
1
2
3
2
3
ตัวอย่างโค้ดเชื่อมต่อและใช้งาน Memcached:
python
import pylibmc
# เชื่อมต่อกับ Memcached ระบุโฮสต์และพอร์ต
# pylibmc ใช้พอร์ตเริ่มต้น 11211
mc = pylibmc.Client(["localhost:11211"], binary=True)
# ตั้งค่า key-value
# set(key, value, time=0, min_compress_len=0)
# time=0 หมายถึงไม่มีวันหมดอายุ (จนกว่า Memcached จะลบออกตามนโยบาย memory)
mc.set("my_python_key", "Hello from Python!", time=3600) # แคช 1 ชั่วโมง
# ดึงข้อมูลจาก key
value = mc.get("my_python_key")
if value:
print(f"ค่าที่ได้จาก Memcached: {value.decode('utf-8')}") # pylibmc คืนค่าแบบ bytes
else:
print("คีย์ 'my_python_key' ไม่พบหรือหมดอายุแล้ว")
# ลบ key
mc.delete("my_python_key")
print("ลบคีย์ 'my_python_key' แล้ว")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ตัวอย่าง PHP
PHP มี ext Memcached
และ Memcache
(เก่า) ServBay มักจะรองรับ Memcached extension
ก่อนอื่น ตรวจสอบให้แน่ใจว่าเปิดใช้งาน Memcached extension ใน PHP ที่คุณต้องการใน ServBay แล้ว สามารถปรับได้จากหน้าตั้งค่า PHP บน ServBay
จากนั้นใช้ตัวอย่างโค้ดนี้ใน PHP:
php
<?php
// สร้างอินสแตนซ์ของ Memcached client
$memcached = new Memcached();
// เพิ่มเซิร์ฟเวอร์ Memcached ลงใน pool
// addServer(host, port, weight=0)
$memcached->addServer("localhost", 11211);
// ตรวจสอบการเชื่อมต่อ (ออฟชั่น, Memcached จะต่อเมื่อจำเป็น)
if (!$memcached->getStats()) {
echo "ไม่สามารถเชื่อมต่อ Memcached server! โปรดตรวจสอบสถานะและพอร์ตของ Memcached\n";
// จัดการตามการใช้งานจริง
} else {
echo "เชื่อมต่อกับ Memcached server สำเร็จ\n";
// ตั้งค่า key-value ในแคช
// set(key, value, expiration=0)
// expiration=0 ไม่มีวันหมดอายุ (จนกว่าเม็มโมรี่จะลบตามนโยบาย)
$memcached->set("my_php_key", "Hello from PHP!", 3600); // แคช 1 ชั่วโมง
echo "ตั้งค่าคีย์ 'my_php_key' สำเร็จ\n";
// อ่านค่าจากคีย์
$value = $memcached->get("my_php_key");
if ($value !== false) {
echo "ค่าที่ได้จาก Memcached: " . $value . "\n";
} else {
// Memcached::get() คืนค่า false เมื่อ key ไม่เจอหรือมี error
// ตรวจสอบเหตุผลเพิ่มเติมด้วย getResultCode()
if ($memcached->getResultCode() == Memcached::RES_NOTFOUND) {
echo "คีย์ 'my_php_key' ไม่พบหรือหมดอายุ\n";
} else {
echo "เกิดข้อผิดพลาดขณะอ่านคีย์ 'my_php_key': " . $memcached->getResultMessage() . "\n";
}
}
// ลบคีย์
if ($memcached->delete("my_php_key")) {
echo "ลบคีย์ 'my_php_key' แล้ว\n";
} else {
echo "ลบคีย์ 'my_php_key' ไม่สำเร็จ\n";
}
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
การดำเนินการกับข้อมูล Memcached
ฟังก์ชันหลักของ Memcached คือการจัดการ key-value ผ่านชุดคำสั่งที่เรียบง่าย การเข้าใจคำสั่งพื้นฐานเหล่านี้มีความสำคัญมากสำหรับการใช้งาน Memcached อย่างถูกต้อง ตัวอย่างต่อไปนี้แสดงให้เห็นการใช้คำสั่งหลัก ๆ ผ่านเทอร์มินัล (telnet
หรือ nc
)
หมายเหตุ: โดยทั่วไปในงานจริง คุณจะใช้ไลบรารี client แทนการส่งคำสั่งโดยตรง ไลบรารีเหล่านี้จะจัดการโปรโตคอลให้เบื้องหลัง
ตัวอย่างคำสั่งพื้นฐาน
หลังเชื่อมต่อกับ Memcached (telnet localhost 11211
):
ตั้งค่า Key-Value (set): สำหรับเก็บข้อมูล key-value ถ้า key ซ้ำจะเขียนทับ
bashset mykey 0 900 11 Hello, Memcached!
1
2mykey
: ชื่อคีย์0
: Flag (ตั้งค่าอิสระ, สำหรับ client ใช้)900
: เวลาหมดอายุ (วินาที),0
= ไม่มีวันหมดอายุ, มากกว่า 0 (< 2592000) คือเวลาสัมพัทธ์เป็นวินาที, >=2592000 คือ unix timestamp11
: ไบต์ของข้อมูล ต่อมาป้อนข้อมูลจริง (Hello, Memcached!
) เมื่อเสร็จ Memcached จะตอบกลับSTORED
หากสำเร็จ
เพิ่ม Key-Value ถ้าไม่มี (add): คำสั่งนี้จะเก็บข้อมูลเฉพาะเมื่อ key ไม่มีอยู่
bashadd anotherkey 0 60 5 World
1
2ถ้า
anotherkey
ไม่มี จะได้STORED
ถ้ามีอยู่แล้วจะได้NOT STORED
แทนที่ Key-Value เดิม (replace): คำสั่งนี้ใช้ได้เฉพาะเมื่อ key มีอยู่แล้ว
bashreplace mykey 0 300 18 New value for key!
1
2ถ้า
mykey
มีจะได้STORED
ถ้าไม่มีจะได้NOT STORED
ดึงข้อมูลด้วยคีย์ (get): ดึงค่าของคีย์ที่ต้องการ
bashget mykey anotherkey
1รูปแบบผลลัพธ์:
VALUE mykey 0 18 New value for key! VALUE anotherkey 0 5 World END
1
2
3
4
5END
คือจุดสิ้นสุดของผลลัพธ์ลบข้อมูลด้วยคีย์ (delete):
bashdelete mykey
1ถ้า key มีและถูกลบจะได้
DELETED
ถ้าไม่พบจะได้NOT FOUND
ข้อพิจารณาเรื่อง Backup และการกู้คืน
หลักการสำคัญของ Memcached คือเป็น แคชบน RAM เท่านั้น ไม่ได้ถูกออกแบบมาสำหรับการเก็บถาวร ไม่มีระบบ backup/persistent ในตัว ดังนั้นเมื่อเซอร์วิสหยุด, เครื่องรีสตาร์ท หรือ ram เต็ม ข้อมูลแคชอาจหายได้
ฟีเจอร์ backup ที่ ServBay จัดให้ครอบคลุม ข้อมูลติดตั้ง, ไฟล์เว็บ, ฐานข้อมูล, SSL certificate และการตั้งค่าต่างๆ ที่มีการ persistent เช่นไฟล์ของ MySQL, PostgreSQL, การตั้งค่า ServBay, ไฟล์ของคุณและ SSL ส่วน ข้อมูลแคชใน Memcached จะไม่ถูก backup เพราะ Memcached มีนิยามเป็นแคชที่ volatile (ข้อมูลพร้อมจะหายได้ตลอดเวลา)
สำหรับ Memcached นิยามของ "backup & restore" มีเพียง:
- การ export ข้อมูลแคช: หากมีความจำเป็น (เช่น debug หรือย้ายบางคีย์) ต้องเขียน script เชื่อมต่อ Memcached, ไล่คีย์แล้วบันทึก key-value ออกไฟล์/สื่อเก็บ คุณสมบัติแบบดึงคีย์ทั้งหมด Memcached ไม่มีในโปรโตคอลมาตรฐาน (เพื่อประสิทธิภาพ) ดังนั้นมักต้องพึ่ง
stats cachedump
(ซึ่งต้องเปิด log/detail สูง) หรือวิธี workaround จากแอปฝั่ง client - การ import ข้อมูลแคช: โหลดข้อมูลกลับเข้า Memcached ด้วย script โดยใช้
set
หรือadd
ข้อควรรู้: โดยทั่วไปข้อมูลที่เก็บใน Memcached ควร rebuild ได้จาก datasource หลัก (เช่น ฐานข้อมูล) แอปพลิเคชันจึงควรรับมือสถานการณ์ที่แคชหายได้ เช่น เมื่อตรวจสอบไม่พบข้อมูลในแคช (miss) สามารถดึงข้อมูลต้นทาง/เติมแคชใหม่ ดังนั้นจึงไม่จำเป็นต้องมี workflow สำหรับ backup/restore ข้อมูลแคชจริง ๆ
การเพิ่มประสิทธิภาพการทำงาน
Memcached จะมีประสิทธิภาพดีที่สุดหากตั้งค่าถูกต้องและใช้งานอย่างเหมาะสม โดยใน ServBay คุณสามารถปรับแต่งค่าต่าง ๆ เหล่านี้ผ่านแผงควบคุมกราฟิกได้ง่าย เพื่อรีดประสิทธิภาพ
การใช้งานหน่วยความจำ
ตั้งค่าขนาดเม็มโมรี่สูงสุดที่ Memcached ใช้ได้ (-m
flag)
- กำหนดขีดจำกัดเม็มโมรี่เหมาะสม: ปรับผ่านหน้าคอนฟิกใน ServBay หากให้ mem มาก จะลดการ eviction (ไล่ข้อมูลเก่าออก), เพิ่มอัตราการ hit ในแคช แต่ถ้าให้เม็มโมรี่เยอะเกินไปอาจแย่งทรัพยากรกับโปรแกรมอื่น ต้องประเมินตามโหลดและความจุที่มี
การตั้งค่าการเชื่อมต่อ
กำหนดจำนวนการเชื่อมต่อสูงสุด (-c
flag)
- กำหนดจำนวน concurrent connection: ปรับผ่านคอนฟิก ServBay หากแอปมีคำร้องขอเยอะขึ้น ควรเพิ่มค่านี้เพื่อให้รองรับ connection พร้อม ๆ กันได้มากขึ้น
ข้อแนะนำการ optimize อื่น ๆ
- ออกแบบชื่อคีย์ให้เหมาะสม: ใช้ชื่อสั้น อ่านเข้าใจง่าย เลี่ยงคีย์ที่ยาวหรือซับซ้อนเกิน
- การ serialize ข้อมูล: เลือกวิธี serialize เช่น JSON, MessagePack, ProtoBuf ให้เหมาะกับขนาดข้อมูล-ความเร็ว
- กลยุทธ์การแคช: วางแผนการหมดอายุแคชให้ดี (เช่น fill เมื่ออ่าน, update/delete เมื่อ write) เพื่อให้ข้อมูลถูกต้องและทันสมัย
- ลด latency เครือข่าย: แม้ dev โหมดจะอยู่ที่ localhost (latency ต่ำ) แต่ใน production, Server Memcached ควรอยู่ใกล้ application เพื่อ RTT ที่ต่ำ
การจัดการความปลอดภัย
Memcached ไม่มี security feature ในตัวมากนัก การป้องกันจึงจำเป็น โดยเฉพาะถ้าไม่ได้ run แบบ local ใน ServBay Dev environment จะปลอดภัยระดับนึงเพราะบริการจะฟังแค่ local แต่ควรเรียนรู้เทคนิคเหล่านี้
จำกัด address ที่ Memcached ฟังคอย
- Bind เฉพาะ loopback address: ปรับค่านี้ในคอนฟิกของ ServBay ให้ Memcached ฟังที่
127.0.0.1
หรือlocalhost
(-l
flag) (ซึ่งปกติ ServBay ก็เซ็ตมาให้แล้ว) อย่า expose Memcached บนเครือข่ายสาธารณะเด็ดขาดถ้าขาดมาตรการรักษาความปลอดภัย
ตั้งค่า firewall
- เสริมด้วย firewall: แม้ ServBay จะ bind local อยู่แล้ว ควรปิดพอร์ต 11211 จาก external network ที่ firewall OS (macOS firewall, pf หรือโปรแกรม third-party)
การยืนยันตัวตนและการเข้ารหัส (ขั้นสูง)
Memcached ไม่มี authentication/authorization/encryption ใน protocol หากต้องใช้งานในเครือข่ายที่ไม่ไว้วางใจหรือมีความต้องการเฉพาะ:
- ใช้ SSH tunnel: encrypt ท่อระหว่าง client กับ Memcached server
- ใช้ VPN: ให้เซิร์ฟเวอร์ Memcached อยู่ในเครือข่ายที่เข้าได้เฉพาะผ่าน VPN
- ใช้ proxy ที่ดักหน้า Memcached: วาง proxy ที่รองรับ auth & encryption ไว้ข้างหน้า
แต่สำหรับ dev environment ของ ServBay ขั้นตอนเหล่านี้ไม่จำเป็น เพราะบริการจะรับแค่ localhost เท่านั้น
คำถามที่พบบ่อยและแนวทางแก้ไข
เชื่อมต่อ Memcached ไม่ได้
- คำอธิบาย: แอปหรือเครื่องมือ CLI เชื่อมต่อไม่ได้ที่
localhost:11211
- วิธีแก้ไข:
- ตรวจสอบว่า Memcached run อยู่: เปิดแผงจัดการ ServBay ไปที่
ซอฟต์แวร์แพ็คเกจ
->NoSQL
ตรวจสอบว่า Memcached ทำงานอยู่หรือไม่ หรือรันคำสั่งservbayctl status memcached
ถ้าไม่ทำงาน ให้เริ่มใหม่ - ตรวจสอบค่าพอร์ตและ address ที่ฟัง: ให้แน่ใจว่าแอปหรือ CLI ต่อไปยัง
localhost
หรือ127.0.0.1
ที่พอร์ต11211
และ Memcached ถูกตั้งค่าให้ฟัง address/pot นี้ใน ServBay - ตรวจสอบ firewall: ยืนยันว่า firewall OS หรือ software ไม่บล็อกพอร์ต 11211 สำหรับแอปบนเครื่อง
- ตรวจสอบว่า Memcached run อยู่: เปิดแผงจัดการ ServBay ไปที่
อัตราการ hit แคชต่ำ
- คำอธิบาย: แอปฯ มักไม่เจอข้อมูลใน Memcached (miss rate สูง) ทำให้ต้อง query แหล่งข้อมูลหลักบ่อย ๆ
- แนวทาง:
- ทบทวนกลยุทธ์แคช: ตรวจว่า logic แอปฯ ตั้งค่าแคชและช่วงเวลาหมดอายุ (exptime ใน set) สั้นเกินไปไหม มีการ update หรือ flush cache ตอนข้อมูลเปลี่ยนหรือเปล่า
- ตรวจสอบขนาดเม็มโมรี่: Memcached เหลือ mem ไว้ให้เก็บข้อมูลพอไหม ถ้า mem เต็มจะเกิด eviction/ข้อมูลเก่าถูกลบ ปรับขนาด mem ได้ใน ServBay ดูค่า
evictions
จากstats
- ออกแบบคีย์แคช: คีย์ควร unique และสื่อความหมายของข้อมูลแคชได้ดี
- วัดสถิติแคช: เชื่อมต่อ Memcached (telnet) แล้วดู
stats
เช่นget_hits
,get_misses
เพื่อคำนวณอัตรา hit (get_hits/(get_hits+get_misses)), eviction สูงแปลว่า mem ไม่พอ
สรุป
Memcached คือโซลูชันแคชในหน่วยความจำที่เรียบง่ายแต่ทรงพลัง มีความสำคัญอย่างยิ่งต่อการเพิ่มความเร็วให้เว็บแอปพลิเคชัน ServBay ถูกออกแบบมาโดยเน้น developer ช่วยให้คุณติดตั้งและบริหาร Memcached ได้ง่ายในการพัฒนาแบบ local
ทั้งนี้ ServBay มีอินเตอร์เฟซกราฟิกและคำสั่ง servbayctl
อำนวยความสะดวกในการควบคุม service และตั้งค่าต่าง ๆ ของ Memcached นอกจากนี้ คู่มือนี้ยังแนะนำวิธีเชื่อมต่อ การใช้งานคำสั่งหลัก ตลอดจนเคล็ดลับการ optimize และมาตรการด้านความปลอดภัย ให้คุณนำ Memcached ไปใช้อย่างมั่นใจในทุกขั้นตอน อย่าลืมเข้าใจธรรมชาติของแคชที่ volatile เพื่อออกแบบกลยุทธ์การใช้งานให้เหมาะกับแอปพลิเคชันของคุณ