Hadyai Internet R&D LAB
ผลงานของ Hadyai Internet R&D LAB => คุยกับทีมวิจัย => ข้อความที่เริ่มโดย: admin ที่ 14 พฤศจิกายน 2008, 20:12:43
-
เกริ่นนำกันก่อนนะครับ ก่อนจะเข้าเรื่อง
ก่อนอื่นต้องอธิบายก่อนว่า ทำไม Squid ถึงไม่เก็บ Cache Video ของ Youtube
เนื่องจากในการเข้า web youtube นั้น url ของ youtube ที่ใช้เก็บ video ไฟล์ จะมีการเปลี่ยนแปลงทุกครั้ง
ถึงแม้จะเข้าชม ไฟล์ video อันเดิมก็ตาม
เช่น
1226635657.319 46941 192.168.200.101 TCP_MISS/200 8020790 GET http://58.147.1.199/youtube/1/0NPYO9r7w9Q.34?ivit=5772&original=www.youtube.com/get_video?video_id=0NPYO9r7w9Q&t=OEgsToPDskIYtusBMJfotlXByGSkbxWq&el=detailpage&ps=&fmt=34 - DIRECT/58.147.1.199 video/flv
1226636671.937 39267 192.168.200.101 TCP_MISS/200 8020790 GET http://58.147.1.199/youtube/1/0NPYO9r7w9Q.34?ivit=6794&original=www.youtube.com/get_video?video_id=0NPYO9r7w9Q&t=OEgsToPDskKFVmH7tmlIN8VwmVVf7sLx&el=detailpage&ps=&fmt=34 - DIRECT/58.147.1.199 video/flv
1226637272.374 41802 192.168.200.101 TCP_MISS/200 8020790 GET http://58.147.1.199/youtube/1/0NPYO9r7w9Q.34?ivit=7392&original=www.youtube.com/get_video?video_id=0NPYO9r7w9Q&t=OEgsToPDskLDiJqHQFM5IcaNf1DXktWN&el=detailpage&ps=&fmt=34 - DIRECT/58.147.1.199 video/flv
จากตัวอย่างจะเห็นว่า video_id และขนาดไฟล์ จะเป็นอันเดียวกัน แต่ตัวพารามิเตอร์ t จะแตกต่างกันทุกครั้งที่เข้าชม
และ Youtube ก็ยังมี url ในรูปแบบอื่น ๆ ที่คล้าย ๆ กัน แตกต่างกันในเรื่องของ signature บ้าง
เช่น
1226641046.961 68113 192.168.200.101 TCP_MISS/200 10205115 GET http://ash-v225.ash.youtube.com/get_video?video_id=X2LaIAwDpdg&ip=222.1
23.139.157&signature=1B8ABF039BD23F6EBEB35B3494C824EA2CFF56B0.
12E2A792F9A5C17B0E7CD06B4B5129EF69B57CD6&sver=2&expire=1226662740&key=
yt4&ipbits=2 - DIRECT/64.15.119.178 video/flv
1226641324.612 105734 192.168.200.101 TCP_MISS/200 9042408 GET http://v10.cache.googlevideo.com/get_video?origin=ash-v187.ash.youtube.c
om&video_id=ZGNgE5zz3Eg&ip=222.123.139.157&signature=B1E361E95586BB6D9312B77E055D3F05E60735D2.
7C20F38BA40C826ED42870B16865D65C763125B2&sver=2&expire=1226662981&key=yt4&ipbits=2 - DIRECT/74.125.96.84 video/flv
1226639361.780 149854 192.168.200.101 TCP_MISS/200 13743131 GET http://sjc-v146.sjc.youtube.com/get_video?video_id=nH-ly_HIfVs&ip=222.1
23.139.157&signature=DDD840A0223D17F368780D14CDE045CB053B605F.
B4CB5B2C6E7C8D83B8CA7A53F43DF42031F35A6C&sver=2&expire=1226660973&key=
yt4&ipbits=2 - DIRECT/64.15.125.239 video/flv
ดังนั้นจึงทำให้ Squid เข้าใจว่า เป็นไฟล์คนละไฟล์กัน จึงทำการโหลดใหม่ทุกครั้งที่มีการเข้า video ไฟล์ดังกล่าว
ในการที่จะให้ Squid เก็บไฟล์ดังกล่าว จึงจะต้องทำให้ Squid รับรู้ได้ว่า url ทั้งสองนี้ ระบุไฟล์ที่เหมือนกัน
สิ่งที่สามารถระบุได้ว่า video ไฟล์ ของ youtube นั้น เป็นไฟล์เดียวกันหรือไม่ ก็คือ พารามิเตอร์ video_id ที่อยู่ใน url นั่นเอง
ดังนั้นก็ได้มีความพยายามหารูปแบบ วิธีการต่าง ๆ ในการจะนำมาระบุให้ Squid รู้ว่า url นั้นอ้างอิงไฟล์เดียวกัน
และไม่ต้องไปดึงมาใหม่ ให้ดึงจาก cache ที่มีอยู่แทน
-
Reff :: http://ubuntuforums.org/showpost.php?p=6153907&postcount=2
วิธีการแรกที่ผมไปเจอและได้ศึกษามา ก็คือการใช้ url_rewrite (สามารถใช้ได้กับ squid 2.6 ขึ้นไป)
หลักการก็คือ ทำการดักจับ URL ที่เป็น url ของ video ไฟล์ youtube แล้วใช้ url_rewrite_program เป็นตัวเช็ค
ถ้าหาก url นั้นเป็นไฟล์ video ที่ยังไม่มีใน cache ก็ให้ทำการโหลดมาเก็บไว้
ถ้าหาก url นั้นเป็นไฟล์ video ที่อยู่ใน cache แล้ว ให้ทำการ rewrite url ใหม่ เพื่อให้ดึงจาก server (apache2 แทน)
วิธีการนี้ จะใช้วิธีการ url_rewrite เช่น จาก url เดิมเป็น
http://www.youtube.com/get_video?video_id=0NPYO9r7w9Q&t=OEgsToPDskIOgEUn33QfGdtWxdqpBQN7&el=detailpage&ps=&fmt=34
ถ้าพบว่ามีอยู่ใน cache แล้ว จะถูก rewrite เป็น
http://192.168.200.1/video_cache/youtube/0NPYO9r7w9Q.flv?video_id=0NPYO9r7w9Q&t=OEgsToPDskIOgEUn33QfGdtWxdqpBQN7&el=detailpage&ps=&fmt=34
แทน จึงทำให้ไม่มีการดึงใหม่จากอินเตอร์เน็ต
หลักการเหล่านี้ สามารถนำไปประยุกต์ใช้ในการเก็บ patch เกมส์ได้นะครับ
-
Reff :: http://wiki.squid-cache.org/ConfigExamples/DynamicContent/YouTube/Discussion
วิธีที่สอง เป็นการใช้ storeurl_rewrite (ซึ่งสามารถใช้ได้ตั้งแต่ squid 2.7 ขึ้นไป)
สำหรับแบบที่สองนี้ หลักการจะคล้าย ๆ กับแบบแรก ก็คือใช้หลักการปรับเปลี่ยน URL เหมือนกัน แต่วิธีการนี้จะใช้
Internal Cache ของ Squid เอง ซึ่งจะต่างกับวิธีแรก ที่ใช้ apache2 มาช่วยในการเก็บ cache
และใช้การเปลี่ยน url ในการเก็บ(store)ใน cache โดยการตัดค่าตัวแปรที่ไม่จำเป็นออก ในการเก็บ
ยกตัวอย่างเช่น url ในการเรียกไฟล์ คือ
http://58.147.1.199/youtube/1/0NPYO9r7w9Q.34?ivit=5772&original=www.youtube.com/get_video?video_id=0NPYO9r7w9Q&t=OEgsToPDskIYtusBMJfotlXByGSkbxWq&el=detailpage&ps=&fmt=34
แต่ URL ที่เก็บอยู่ใน cache จะเป็น (ผ่านกระบวนการ storeurl_rewrite)
squid://videos.youtube.INTERNAL/ID=0NPYO9r7w9Q
เมื่อมีการเรียก ไฟล์อีกครั้ง (video_id อันเดิม แต่ url จะเปลี่ยน)
http://58.147.1.199/youtube/1/0NPYO9r7w9Q.34?ivit=6794&original=www.youtube.com/get_video?video_id=0NPYO9r7w9Q&t=OEgsToPDskKFVmH7tmlIN8VwmVVf7sLx&el=detailpage&ps=&fmt=34
กระบวนการ storeurl_rewrite ก็จะทำการแปลง ได้เป็น
squid://videos.youtube.INTERNAL/ID=0NPYO9r7w9Q
ซึ่งเมื่อเทียบใน cache แล้ว จะตรงกัน ถ้ามี refresh pattern กำหนดให้ cache ก็จะเกิดการ HIT เกิดขึ้น
วิธีการนี้จะง่าย และสะดวก เนื่องจากใช้ Internal Cache ของ Squid นั่นเอง
แต่จะต้องปรับแต่ง refresh pattern เพื่อกำหนดให้เก็บลง cache
-
งั้น คงต้องขอวิธี จำกัด แบนวิท ของ web hi5 กับ youtube แล้วกันนะครับ
ของ ผม เน็ต 2 mb 1 เส้น ไม่ว่าจะแก้ตรงไหนครับ ช่วยแนะนำด้วยครับ admin
-
งั้น คงต้องขอวิธี จำกัด แบนวิท ของ web hi5 กับ youtube แล้วกันนะครับ
ของ ผม เน็ต 2 mb 1 เส้น ไม่ว่าจะแก้ตรงไหนครับ ช่วยแนะนำด้วยครับ admin
ทำ delay pool สิครับ บีบไฟล์ mp3 flv อะไรประมาณนี้ครับ ผมก็ใช้อยู่
-
แบบนี้ พอได้ป่าวครับ
acl pool1 src 0.0.0.0/0.0.0.0
acl pool2 url_regx -i .flv
delay_pools 2
delay_class 1 2
delay_class 2 2
delay_access 1 allow pool1
delay_access 2 allow pool2
delay_parameters 1 -1/-1 102400/102400
delay_parameters 2 12800/12800 12800/12800
หรือมีตัวอย่างบ้างมั้ยครับ ขอดูบ้างซิ
-
หรือ แบบนี้ดี
acl delay_mime_type rep_mime_type video/flv application/download video/mpeg
acl pool1 src 192.168.200.101-192.168.200.154/255.255.255.255
acl pool2 url_regex -i hi5 youtube .flv .3gp .aac .ac3 .act .aif .aiff .amr .a$
delay_pools 2
delay_class 1 2
delay_class 2 2
delay_access 1 deny all
delay_access 1 allow pool1
delay_access 2 allow delay_mime_type
delay_access 2 allow pool2
delay_parameters 1 -1/-1 102400/102400
delay_parameters 2 12800/12800 12800/12800
-
มันก็ดีอยู่ครับ...
แต่มันก็ไม่ได้ทำให้โหลดเร็วอะไรนิครับ
ยิ่งจะทำให้ลูกค้ารู้สึกว่ามันโหลดช้า...