Hadyai Internet R&D LAB

ผลงานของ Hadyai Internet R&D LAB => คุยกับทีมวิจัย => ข้อความที่เริ่มโดย: admin ที่ 14 พฤศจิกายน 2008, 20:12:43

หัวข้อ: Squid Cache Video Youtube
เริ่มหัวข้อโดย: 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 ที่มีอยู่แทน
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: admin ที่ 14 พฤศจิกายน 2008, 20:44:19
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 เกมส์ได้นะครับ
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: admin ที่ 14 พฤศจิกายน 2008, 20:47:46
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
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: gudgeee ที่ 17 พฤศจิกายน 2008, 19:10:08
งั้น คงต้องขอวิธี  จำกัด แบนวิท ของ web hi5  กับ youtube  แล้วกันนะครับ
ของ ผม เน็ต 2 mb  1  เส้น ไม่ว่าจะแก้ตรงไหนครับ ช่วยแนะนำด้วยครับ admin
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: fuckerboyd ที่ 17 พฤศจิกายน 2008, 20:03:39
งั้น คงต้องขอวิธี  จำกัด แบนวิท ของ web hi5  กับ youtube  แล้วกันนะครับ
ของ ผม เน็ต 2 mb  1  เส้น ไม่ว่าจะแก้ตรงไหนครับ ช่วยแนะนำด้วยครับ admin

ทำ delay pool สิครับ บีบไฟล์ mp3 flv อะไรประมาณนี้ครับ ผมก็ใช้อยู่
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: gudgeee ที่ 18 พฤศจิกายน 2008, 03:33:27
แบบนี้ พอได้ป่าวครับ 
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

 หรือมีตัวอย่างบ้างมั้ยครับ ขอดูบ้างซิ
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: gudgeee ที่ 18 พฤศจิกายน 2008, 18:39:35
หรือ  แบบนี้ดี
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
หัวข้อ: Re: Squid Cache Video Youtube
เริ่มหัวข้อโดย: T@NR@K ที่ 18 พฤศจิกายน 2008, 23:36:19
มันก็ดีอยู่ครับ...
แต่มันก็ไม่ได้ทำให้โหลดเร็วอะไรนิครับ
ยิ่งจะทำให้ลูกค้ารู้สึกว่ามันโหลดช้า...