ความ หมายของคำว่า High Availability คือศักยภาพของ ระบบบริการระบบหนึ่งที่สามารถให้บริการได้อย่างต่อเนื่อง มีประสิทธิภาพรองรับการขอเข้าใช้บริการได้ตลอดเวลา หรือที่เรียกกันว่า 24 x 7 ซึ่งก็คือสามารถให้บริการได้ตลอด 24 ชั่วโมงทั้ง 7 วันต่อ 1 สัปดาห์ โดยไม่มีช่วงเวลาที่เรียกว่า downtime หรือมีน้อยที่สุดจนผู้ขอใช้บริการไม่รู้สึกช่วงเวลาที่ไม่ต่อเนื่องนั้น
ถ้าถามถึงประโยชน์ของ High Availability นั้นแน่นอนว่าคงพอจะนึกกันออก แต่ขอสรุปให้ฟังว่ามีดังต่อไปนี้
• ป้องกันความเสียหายและความสูญเสียที่องค์กรจะต้อง เผชิญทางด้านตัวเงิน หากระบบที่ไม่สามารถหยุดทำงานได้ เกิดปัญหาจนไม่สามารถให้บริการได้ ความเสียหายดังกล่าวสามารถคำนวนโดยใช้ค่าที่เรียกว่า Cost of Downtime ซึ่งเกิดจากการประเมินและรวบรวมตัวเลขของความเสียหายที่อาจจะเกิดขึ้น ในกรณีที่เครื่องคอมพิว เตอร์หยุดทำงาน เช่น การสูญเสียรายได้ ค่าใช้จ่ายคงที่ หรือค่าใช้จ่ายแปรผันที่เกิดขึ้นในช่วงเวลาที่เครื่องไม่สามารถทำงานได้ ค่าแรง ค่าจ้างพนักงาน ค่าปรับต่างๆ ที่ต้องจ่ายให้แก่คู่ค้า
• ป้องกันและแก้ไขความสูญเสียทางด้านอื่น ๆ ไม่ว่าจะเป็น โอกาสของธุรกิจ ความสามารถในการแข่งขันกับคู่แข่ง และที่สำคัญก็คือ ข้อมูลที่สำคัญ ๆ ขององค์กร ไม่ว่าจะเป็นข้อมูลทางด้านการเงิน หรือข้อมูลทางด้านการตลาด ตลอดจนข้อมูลของลูกค้าที่ใช้กันอยู่ตลอดเวลาที่อาจจะสูญเสียไปด้วย
และเพื่อให้สามารถเข้าใจเรื่องของ Linux high availability มากขึ้น นี่คือภาพแสดงโครงสร้างของกลุ่ม server ที่รองรับการทำงานของ Linux high availability
Note
Cost of Downtime นี้เมื่อ ลองรวบรวมตัวเลขจริงๆ แล้ว อาจจะพบว่ามีมูลค่าสูงมาก และสามารถนำมาเป็นจุดตัดสินใจในการจัดสรรงบประมาณ เพื่อใช้ในการป้องกันความเสียหายที่อาจจะเกิดขึ้นได้ ทั้งนี้เพื่อให้ระบบมีเสถียรภาพในการทำงานให้ได้มากที่สุด จึงเป็นที่มาของบทความในวันนี้ของเรา Linux high availability ซึ่งเป็นส่วนหนึ่งในความสามารถของ Linux clustering concept
จากภาพจะเห็นว่ามี ip address เสมือน (virtual ip address) ซึ่งเป็น ip address ที่ เครื่องไคลเอนต์เข้าใจว่าเป็นผู้ให้บริการ แต่แท้จริงแล้วมีเครื่อง server ที่คอยให้บริการอยู่ 2 เครื่องด้วยกัน คือ
เครื่อง heartbeat1 ที่มี ip เท่ากับ 10.0.13.201 และ
เครื่อง heartbeat2 ที่มี ip เท่ากับ 10.0.13.202
ทั้ง 2 เครื่องจะสลับกันให้บริการผ่าน virtual ip address ซึ่งในที่นี้ก็คือ 10.0.13.200 โดยจะมีเครื่องหนึ่งที่ถูกระบุให้ทำหน้าที่เป็นเครื่องหลักในบทความนี้ขอใช้ เครื่อง heartbeat1 เป็นเครื่องหลัก และเครื่องที่ทำหน้าที่สำรองขอใช้เครื่อง heartbeat2 ในการอธิบายต่อไป
Prerequisite
ก่อนอื่นจะต้องทำการดาวน์โหลดโปรแกรมที่ช่วยในการทำ Linux high availability ซึ่งก็คือโปรแกรม Heartbeat ซึ่งปัจจุบันได้พัฒนาไปถึงเวอร์ชั่น 1.0.3 ซึ่งถูกอัพเดทครั้งสุดท้ายเมื่อวันที่ 26/06/2003 ได้ที่ web site http://www.linux-ha.org/download/
การเชื่อมต่อ
ส่วนเชื่อมต่อหรือ Interface ที่ใช้ในการทำ heartbeat สามารถเลือกได้ 2 แบบคือ ผ่าน serial line หรือผ่าน UTP cable ดังรูป
รูปที่ 1 การเชื่อมต่อ heartbeat interface ผ่าน serial line
รูปที่ 2 การเชื่อมต่อ heartbeat interface ผ่าน UTP Cable (แยก interface ของ ethernet )
หลังจากสามารถเลือกรูปแบบของการเชื่อมต่อในส่วน heartbeat ได้แล้ว ก็ต้องมีวิธีการตรวจสอบการเชื่อมต่อดังกล่าว เพื่อไม่ให้เกิดปัญหาทางด้านเทคนิคในการติดตั้งและใช้งานระบบโดย
ส่วนของการเชื่อมต่อเป็นดังรูปที่ 1 คือเชื่อมต่อผ่าน serial line สามารถทดสอบโดยการ ส่ง message ผ่าน serial line ระหว่างเครื่อง เช่น ที่เครื่อง heartbeat1 พิมพ์
#cat < /dev/ttyS0
ที่เครื่อง heartbeat2 พิมพ์
#echo test message > /dev/ttyS0
ควรจะปรากฎข้อความ test message ที่หน้าจอของเครื่อง heartbeat1
ส่วนของการเชื่อมต่อเป็นดังรูปที่ 2 คือเชื่อมผ่าน UTP cable ซึ่งแยก interface ของ ethernet ตามความเหมาะสมทางด้านความปลอดภัยและ traffic ของเน็ตเวิร์ค สามารถทดสอบโดยการ ping ip address ของเครื่อง server อื่น ๆ ในกลุ่ม เช่น ที่เครื่อง heartbeat1 ใช้คำสั่ง
#ping heartbeat2
และที่เครื่อง heartbeat2 ใช้คำสั่ง #ping heartbeat1 ควรจะมีแพ็กเกจตอบกลับ เป็นต้น
หลักการทำงาน
ที่เครื่อง server แต่ละตัวจะทำการตรวจสอบกันแบบไขว้ (cross checking) เพื่อตรวจสอบว่าเครื่องอื่น ๆ ในกลุ่มยังทำงานอยู่หรือไม่
ต้องขอให้ทำความเข้าใจกันก่อนว่าการตรวจสอบการให้บริการบนเครื่องหลักของโปรแกรม Heartbeat นั้นมีอยู่ 2 ส่วนด้วยกันคือ
1. ผ่าน LAN Interface เพื่อตรวจสอบการเชื่อมต่อของ network แต่ตัวเครื่องหลักเองอาจจะยังไม่มีปัญหาก็ได้
2. ผ่าน Heartbeat Interface (ที่กล่าวในส่วนของ “การเชื่อมต่อ”)เพื่อตรวจสอบว่าเครื่องหลัก (main) ยังทำงานปกติอยู่หรือไม่
Note
เราสามารถเลือก configuration ให้โปรแกรม Heartbeat ดังกล่าวตรวจสอบการเชื่อมต่อในทั้ง 2 ส่วน หรือเลือกตรวจสอบเพียงอย่างใดอย่างหนึ่งก็ได้ เช่น High Availability ของคุณให้บริการเป็น web server การตรวจสอบเพียงแค่ส่วนของ LAN Interface ว่ามีปัญหาในการให้บริการหรือไม่ ก็ถือว่าเพียงพอต่อการที่เครื่องสำรองจะเข้าใจว่าเครื่องหลักตายและทำการ take over virtual ip เพื่อให้บริการแทนนั้น อาจ configure ให้ทำการตรวจสอบเพียง Interface เดียว โดย set ไว้ในไฟล์ /etc/ha.d/ha.cf (ระบุให้ใช้ interface Heartbeat เป็นอันเดียวกับ interface LAN โดยการเพิ่ม comment หน้าพารามิเตอร์ serial นั่นเอง ) ดังรูป
โดยหลักการทำงานจะขออธิบายในกรณีที่โปรแกรม Heartbeat ของคุณตรวจสอบการเชื่อมต่อในทั้ง 2 ส่วนโดยเริ่มจาก เครื่องที่หน้าที่เป็นเครื่องสำรอง (backup) จะทำการส่ง packet ผ่าน LAN Interface และ Heartbeat Interface เพื่อตรวจสอบว่าเครื่องหลัก (main) ยังทำงานปกติอยู่หรือไม่
ถ้าพบว่าที่ LAN Interface และ Heartbeat Interface ไม่มี packet ตอบกลับมาทั้งคู่ ก็จะทำการ take over Virtual IP Address เพื่อทำงานแทนเครื่องหลักทันที
กล่าวคือ กรณีนี้การ Take over IP Address จะทำงานสมบูรณ์ได้ก็ต่อเมื่อ
1. LAN IP Address คุย (syn-ack connection)กันไม่ได้
2. Heartbeat Interface คุยกันไม่ได้
Installation
การติดตั้งโปรแกรม Heartbeat ดังกล่าว ต้องทำการติดตั้งทั้งเครื่องหลักและเครื่องสำรองในกลุ่ม (cluster) ที่ต้องการทำ High Avaibility ร่วมกัน วิธีการติดตั้งเป็นไปตามขั้นตอนต่าง ๆ ดังต่อไปนี้
1.login โดย root หรือเทียบเท่าและติดตั้งโดยใช้คำสั่ง
#rpm-Uvh heartbeat-x.x.x-x.i386.rpm
หรือในกรณีที่ source ของโปรแกรมเป็นไฟล์ .tar.gz ให้ทำการแตกsourceโดยใช้คำสั่ง
#tar xzvpf heartbeat-x.x.x.tar.gz
เปลี่ยนพาธไปยังพาธsourceของโปรแกรมที่ tar ออกมา ทำการคอมไพล์ และติดตั้ง (install) ตามลำดับ
#cd heartbeat-x.x.x
#./ConfigureMe configure
#make
#make install
2. แก้ไขไฟล์ /etc/hosts เพื่อใส่ชื่อสมาชิกทุกตัวในกลุ่ม (cluster) ที่ต้องการทำให้มีความสามารถในการ High Availability โดยใช้คำสั่ง
#vi /etc/hosts
ตัวอย่างไฟล์ได้แก่
10.0.13.201 heartbeat1
10.0.13.202 heartbeat2
3. เปลี่ยนพาธไปยัง /etc/ha.d ด้วยคำสั่ง
#cd /etc/ha.d
ทำการค้นหาไฟล์ที่เกี่ยวข้องกับโปรแกรม Heartbeat ด้วย คำสั่ง
#rpm-q heartbeat -d
ซึ่งการค้นหาไฟล์ดังกล่าวเป็นความสามารถของคำสั่ง rpm ที่ ช่วยในการ list ไฟล์และไดเรกทอรี่ทั้งหมดที่ถูกติดตั้งเข้าสู่ระบบขณะทำการinstallโปรแกรม rpm ใด ๆ ซึ่งในที่นี้คือโปรแกรม heartbeat
4. ทำการ copy ไฟล์ /usr/share/doc/packages/heartbeat/authkey มายังพาธปัจจุบันซึ่งก็คือ /etc/ha.d ด้วยคำสั่ง
#cp /usr/share/doc/packages/heartbeat/authkey .
5. เปลี่ยนแปลง permission หรือสิทธิในการเข้าใช้ไฟล์ให้ ผู้ใช้ที่เป็น root เท่านั้น ที่สามารถอ่าน (read) และเขียน (write) ได้ด้วยคำสั่ง
#chmod 600 authkey
6. ทำการแก้ไขไฟล์ authkey ด้วยคำสั่ง #vi authkey และนำ comment หน้าบรรทัด auth 1 ออก ไฟล์ /etc/ha.d/authkey จะมีตัวอย่างดังต่อไปนี้
auth 1
1 crc
Note
ไฟล์ authkey เป็นไฟล์ที่ใช้สำหรับการระบุวิธีการตรวจสอบสิทธิ (authentication) ซึ่งในเรื่องของการทำ High Availability นี้มีชนิดของการตรวจสอบสิทธิหรือเข้ารหัสอยู่ 3 ชนิดคือ crc , md5 และ sha1 โดย
• หากคุณมั่นใจว่าระบบ heartbeat ของคุณทำงานร่วมกันในสภาพแวดล้อมที่ปลอดภัยจากการโจมตี ก็ควรใช้ crc เนื่องจากใช้ทรัพยากรของเครื่องน้อยที่สุด
• หากคุณไม่มั่นใจในเรื่องของความปลอดภัย แต่ยังคงห่วงเรื่องทรัพยากรของเครื่องอยู่ เราขอแนะนำให้ใช้ md5
• แต่หากคุณต้องการความปลอดภัยสูงสุดจากการบุกรุกและไม่ห่วงเรื่องทรัพยากรก็สามารถใช้ sha1 ได้
โดยรูปแบบของไฟล์ authkey คือ
auth
ภายใต้เงื่อนไขคือ ทั้ง 2 บรรทัดจะต้องตรงกัน
7. ทำการ copy ไฟล์ /usr/share/doc/packages/heartbeat/ha.cf มายังพาธปัจจุบัน ด้วยคำสั่ง
#cp /usr/share/doc/packages/heartbeat/ha.cf .
8. นำ comment หน้าพารามิเตอร์ที่ต้องการออก เพิ่มและแก้ไขบรรทัดดังต่อไปนี้
node [hostname1]
node [hostname2]
nice_failback on
ตัวอย่างไฟล์ /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 4
deadtime 10
initdead 30
udpport 694
udp eth0
mcast eth0 225.0.0.1 694 1 1
node heartbeat1
node heartbeat2
nice_failback on
9. ทำการ copy ไฟล์ /usr/share/doc/packages/heartbeat/haresources มายังพาธปัจจุบัน ด้วยคำสั่ง
#cp /usr/share/doc/packages/heartbeat/haresources .
10. แก้ไขไฟล์ haresources ด้วยการเพิ่มบรรทัด [hostname] [virtual ip address] [service] โดย hostname คือชื่อของโฮสต์ที่ต้องการให้เป็นตัวหลักในการให้บริการ
service คือบริการที่ถูกระบุไว้ใต้พาธ /etc/rc.d/init.d หรือพาธ /etc/ha.d/resource.d
การ start โปรแกรม Heartbeat
Note
ให้ทำการแก้ไขไฟล์ haresources ให้เหมือนกันสำหรับทุกเครื่องที่อยู่ในกลุ่ม (cluster)
ตัวอย่างไฟล์ /etc/ha.d/haresources
heartbeat 110.0.13.200 httpd
โดยปกติหากติดตั้งโปรแกรม Heartbeat จากแพ็กเกจ rpm นั้นโปรแกรมจะถูกติดตั้งไปในพาธ /etc/rc.d/init.d และลิงค์ไปยังพาธของ run level ต่าง ๆ เพื่อใช้ในการstart/stop โปรแกรมขณะเปิดหรือปิดเครื่อง ภายใต้การทำงานของ system V startup คือภายใต้เงื่อนไขของ run level ต่าง ๆ นั่นเอง แต่หากเป็นการติดตั้งโปรแกรมโดยคอมไพล์ด้วยตนเองผ่านไฟล์ heartbeat-x.x.x.tar.gz แล้วหล่ะก็ คุณควรทำการสร้างลิงค์ไฟล์ จาก /etc/rc.d/init.d/heartbeat ไปยัง run level ต่าง ๆ เพื่อให้การทำงานของโปรแกรม Heartbeat เป็นไปอย่างอัตโนมัติดังนี้
1. เพื่อให้ service heartbeat ถูกฆ่า (stop) ขณะ halt ระบบให้ใช้คำสั่ง
#cd /etc/rc.d/rc0.d
#ln -s ../init.d/heartbeat K05heartbeat
2. เพื่อให้ service heartbeat ถูกstart ขณะเปิดเครื่องให้ใช้ คำสั่ง
#cd /etc/rc.d/rc3.d
#ln -s ../init.d/heartbeat S75heartbeat
3. เพื่อให้ service heartbeat ถูกstart ขณะ startx(graphic mode)ให้ใช้คำสั่ง
#cd /etc/rc.d/rc5.d
#ln -s ../init.d/heartbeat S75heartbeat
4. เพื่อให้ service heartbeat ถูกฆ่า (stop) ขณะ reboot ระบบให้ใช้คำสั่ง
#cd /etc/rc.d/rc6.d
#ln -s ../init.d/heartbeat K05heartbeat
การทดสอบ
หลังจากติดตั้งและทำความเข้าใจหลักการทำงานของ Linux high availability กันแล้วก็มาถึงขั้นของการทดสอบโดยการ down ระบบที่เป็นเครื่องหลัก (main server) จะปรากฏว่าเครื่องสำรอง (backup server) ในกลุ่มเดียวกันจะขึ้นมาทำงาน โดย take over Virtual IP Address และทำงานรองรับบริการต่าง ๆ ที่เครื่องหลักให้บริการอยู่ได้ตามปกติ โดยผู้ขอใช้บริการเครื่อง server ดังกล่าวจะไม่รู้สึกว่ามีการเปลี่ยนแปลงเครื่องที่ใช้ในการให้บริการเกิด ขึ้น
ข้อมูลล็อกของโปรแกรม Heartbeat (logging)
ในขณะที่ Linux high availability (heartbeat) ของคุณถูก start และให้บริการนั้นคุณสามารถเข้าไปดู log ของการทำงานได้ที่ไฟล์ /var/log/ha-log หรือไฟล์ตามค่าพารามิเตอร์ logfile (ที่คุณกำหนดไว้ในไฟล์ /etc/ha.d/ha.cf)ของเครื่องสำรองที่ให้บริการซึ่งในที่นี้คือ เครื่อง heartbeat2 ขณะทำการ take over virtual ip (10.0.13.200) เมื่อเครื่องหลัก (heartbeat1) มีปัญหา ณ เวลา 08:48 จนกระทั่งหยุดการทำงานของ heartbeat2 เพื่อให้ heartbeat1 กลับมาทำงานเป็นเครื่องหลักอีกครั้งในเวลา 18:51 ซึ่งควรมีข้อมูลดังต่อไปนี้
heartbeat: 2003/06/23_08:47:26 info: **************************
heartbeat: 2003/06/23_08:47:27 info: Configuration validated. Starting heartbeat 0.4.9.2
heartbeat: 2003/06/23_08:47:27 info: nice_failback is in effect.
heartbeat: 2003/06/23_08:47:27 info: heartbeat: version 0.4.9.2
heartbeat: 2003/06/23_08:47:32 info: Heartbeat generation: 12
heartbeat: 2003/06/23_08:47:33 info: Creating FIFO /var/run/heartbeat-fifo.
heartbeat: 2003/06/23_08:47:33 notice: UDP heartbeat started on port 694 interface eth0
heartbeat: 2003/06/23_08:47:33 notice: UDP multicast heartbeat started for group 225.0.0.1 port 694 interface eth0 (ttl=1 loop=1)
heartbeat: 2003/06/23_08:47:33 info: Local status now set to: ‘up’
heartbeat: 2003/06/23_08:47:35 info: Heartbeat restart on node heartbeat2
heartbeat: 2003/06/23_08:47:35 info: Link heartbeat2:eth0 up.
heartbeat: 2003/06/23_08:47:36 info: Running /etc/ha.d/rc.d/ifstat ifstat
heartbeat: 2003/06/23_08:48:06 WARN: node heartbeat1: is dead
heartbeat: 2003/06/23_08:48:06 info: Local status now set to: ‘active’
heartbeat: 2003/06/23_08:48:06 info: Node heartbeat2: status up
heartbeat: 2003/06/23_08:48:06 info: Node heartbeat2: status active
heartbeat: 2003/06/23_08:48:06 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/06/23_08:48:06 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/06/23_08:48:06 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/06/23_08:48:06 info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys heartbeat2]
heartbeat: 2003/06/23_08:48:06 info: Resource acquisition completed.
heartbeat: 2003/06/23_08:48:07 info: Taking over resource group 10.0.13.200
heartbeat: 2003/06/23_08:48:07 info: Acquiring resource group: heartbeat1 10.0.13.200
heartbeat: 2003/06/23_08:48:07 info: Running /etc/ha.d/resource.d/IPaddr 10.0.13.200 start
heartbeat: 2003/06/23_08:48:08 info: ifconfig eth0:0 10.0.13.200 netmask 255.255.0.0 broadcast 160.1.255.255
heartbeat: 2003/06/23_08:48:08 info: Sending Gratuitous Arp for 10.0.13.200 on eth0:0 [eth0]
heartbeat: 2003/06/23_08:48:08 info: /usr/lib/heartbeat/mach_down: nice_failback: acquiring foreign resources
heartbeat: 2003/06/23_08:48:08 info: mach_down takeover complete.
heartbeat: 2003/06/23_08:48:08 info: mach_down takeover complete.
heartbeat: 2003/06/23_08:48:18 info: Resource acquisition completed. (none)
heartbeat: 2003/06/23_08:48:18 info: local resource transition completed.
heartbeat: 2003/06/23_08:49:07 info: Heartbeat restart on node heartbeat1
heartbeat: 2003/06/23_08:49:07 info: Link heartbeat1:eth0 up.
heartbeat: 2003/06/23_08:49:07 WARN: Late heartbeat: Node heartbeat1: interval 92380 ms
heartbeat: 2003/06/23_08:49:07 info: Node heartbeat1: status up
heartbeat: 2003/06/23_08:49:07 info: Running /etc/ha.d/rc.d/ifstat ifstat
heartbeat: 2003/06/23_08:49:07 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/06/23_08:49:10 info: Node heartbeat1: status active
heartbeat: 2003/06/23_08:49:10 info: remote resource transition completed.
heartbeat: 2003/06/23_08:49:10 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/06/23_11:49:59 WARN: Late heartbeat: Node heartbeat1: interval 8000 ms
heartbeat: 2003/06/23_12:05:34 WARN: Late heartbeat: Node heartbeat1: interval 8000 ms
heartbeat: 2003/06/23_13:33:03 info: 1 lost packet(s) for [heartbeat1] [4262:4264]
heartbeat: 2003/06/23_13:33:03 WARN: Late heartbeat: Node heartbeat1: interval 8040 ms
heartbeat: 2003/06/23_13:33:04 info: No pkts missing from heartbeat1!
heartbeat: 2003/06/23_18:51:18 info: Heartbeat shutdown in progress. (507)
heartbeat: 2003/06/23_18:51:18 info: Giving up all HA resources.
heartbeat: 2003/06/23_18:51:46 info: Releasing resource group: heartbeat1 10.0.13.200
heartbeat: 2003/06/23_18:51:55 info: Running /etc/ha.d/resource.d/IPaddr 10.0.13.200 stop
heartbeat: 2003/06/23_18:52:04 info: IP Address 10.0.13.200 released
heartbeat: 2003/06/23_18:52:04 info: All HA resources relinquished.
heartbeat: 2003/06/23_18:52:05 info: Heartbeat shutdown complete.
ข้อควรระวัง
การทดสอบโดยทำการดึง สาย LAN หรือ Heartbeat ตัวใดตัวหนึ่งออก จะทำให้ server แต่ละตัวต่างคิดว่า server อีกตัวหนึ่ง down และพยายาม take over IP ทำให้หลังจากเสียบ (plug) สาย LAN หรือ Heartbeat กลับเข้าไปแล้ว จะเกิดปัญหา เนื่องจาก server ทั้งคู่พยายาม take over IP เดียวกัน และเกิดการทำงานขัดแย้ง (conflict) กัน เพราะฉะนั้นควรทำการทดสอบโดยการ shutdown และ restart ระบบ จะดีกว่า การดึงสาย LAN แล้วเสียบกลับเข้าไปใหม่
Thanks : www.opensource.co.th
ไม่มีความคิดเห็น:
แสดงความคิดเห็น