การยึดติดเซสชันทำได้อย่างไรในหลาย ๆ เว็บเซิร์ฟเวอร์?


23

StackOverflow / ServerFault มีกี่เว็บ

หากคำตอบคือ "มากกว่าหนึ่ง" มันจะบรรลุSession Stickinessในขณะที่การสำรวจ DNS?


ไม่จริง แต่ถ้ามันถูกใช้คำพูดที่แตกต่างกันมันอาจทำให้คำถามที่น่าสนใจ

คุณควรเรียบเรียงคำถามใหม่ เปลี่ยนชื่อเป็น "ความหนืดของเซสชันทำได้ผ่านเว็บเซิร์ฟเวอร์หลายเครื่องอย่างไร" หรือสิ่งที่ต้องการ ...
วิลเลียม Brendel

คุณสามารถช่วยฉันแสดงวลีที่ถูกต้องให้ฉันได้ไหม?

1
การสันนิษฐานว่าการมีเซิร์ฟเวอร์หลายเครื่องหมายถึงเซสชันที่ติดหนึบซึ่งเป็นสิ่งที่น่ารังเกียจทำให้ฉันเจ็บปวด
womble

คำตอบ:


42

เว็บไซต์ขนาดใหญ่อาจ "โหลดสมดุล" ในหลาย ๆ เครื่อง ในการตั้งค่าโหลดบาลานซ์จำนวนมากผู้ใช้อาจไปที่เครื่องแบ็กเอนด์ใด ๆ ในระหว่างการใช้งาน ด้วยเหตุนี้จึงมีวิธีการจำนวนหนึ่งที่อนุญาตให้เครื่องจำนวนมากแบ่งปันเซสชันผู้ใช้

วิธีที่เลือกจะขึ้นอยู่กับรูปแบบของการทำโหลดบาลานซ์ที่ใช้รวมถึงความพร้อมใช้งาน / ความจุของหน่วยเก็บข้อมูลส่วนหลัง:

ข้อมูลเซสชันที่เก็บไว้ในคุกกี้เท่านั้น : ข้อมูลเซสชัน (ไม่ใช่ตัวระบุเซสชันเท่านั้น) จะถูกเก็บไว้ในคุกกี้ของผู้ใช้ ตัวอย่างเช่นคุกกี้ของผู้ใช้อาจมีเนื้อหาของตะกร้าสินค้าของพวกเขา เพื่อป้องกันผู้ใช้ยุ่งเกี่ยวกับข้อมูลเซสชัน HMAC อาจถูกจัดเตรียมไว้พร้อมกับคุกกี้ วิธีนี้น่าจะเหมาะสมที่สุดสำหรับการใช้งานส่วนใหญ่:

  • ไม่จำเป็นต้องใช้ที่เก็บข้อมูลส่วนหลัง
  • ผู้ใช้ไม่จำเป็นต้องกดปุ่มเครื่องเดียวกันในแต่ละครั้งดังนั้นจึงสามารถใช้การปรับสมดุลโหลด DNS ได้
  • ไม่มีเวลาแฝงที่เกี่ยวข้องกับการดึงข้อมูลเซสชั่นจากเครื่องฐานข้อมูล (ตามที่ได้รับมาพร้อมกับคำขอ HTTP) มีประโยชน์หากไซต์ของคุณโหลดโดยเครื่องในทวีปต่างๆ
  • จำนวนข้อมูลที่สามารถจัดเก็บในเซสชันถูก จำกัด (โดย จำกัด ขนาดคุกกี้ 4K)
  • การเข้ารหัสจะต้องมีการใช้งานหากผู้ใช้ไม่สามารถมองเห็นเนื้อหาของเซสชันของพวกเขา
  • HMAC (หรือคล้ายกัน) จะต้องมีการจ้างงานเพื่อป้องกันไม่ให้ผู้ใช้แก้ไขข้อมูลเซสชั่น
  • เนื่องจากข้อมูลเซสชันไม่ได้เก็บไว้ที่ฝั่งเซิร์ฟเวอร์จึงเป็นเรื่องยากสำหรับนักพัฒนาในการดีบัก

ตัวโหลดบาลานซ์จะนำผู้ใช้ไปยังเครื่องเดียวกันเสมอ : ตัวโหลดบาลานซ์จำนวนมากอาจตั้งค่าคุกกี้เซสชันของตัวเองเพื่อระบุว่าเครื่องแบ็กเอนด์เครื่องใดที่ผู้ใช้ทำการร้องขอและนำพวกเขาไปยังเครื่องนั้นในอนาคต เนื่องจากผู้ใช้จะถูกนำไปยังเครื่องเดียวกันเสมอจึงไม่จำเป็นต้องแชร์เซสชันระหว่างเครื่องหลายเครื่อง สิ่งนี้อาจดีในบางสถานการณ์:

  • การจัดการเซสชันของแอปพลิเคชันที่มีอยู่อาจไม่จำเป็นต้องเปลี่ยนเพื่อให้ทราบถึงเครื่องหลายเครื่อง
  • ไม่จำเป็นต้องใช้ระบบฐานข้อมูลที่ใช้ร่วมกัน (หรือคล้ายกัน) สำหรับการจัดเก็บเซสชันซึ่งอาจเพิ่มความน่าเชื่อถือ แต่มีค่าใช้จ่ายในความซับซ้อน
  • เครื่องแบ็กเอนด์จะลงจะเซสชั่นผู้ใช้ใด ๆ ที่เริ่มต้นกับมันด้วย
  • การนำเครื่องจักรออกจากการให้บริการนั้นยากกว่า ผู้ใช้ที่มีเซสชันบนเครื่องที่จะถูกถอดออกเพื่อการบำรุงรักษาควรได้รับอนุญาตให้ทำงานให้เสร็จก่อนที่จะปิดเครื่อง เพื่อสนับสนุนสิ่งนี้ตัวโหลดบาลานซ์ของเว็บอาจมีคุณสมบัติในการ "ระบาย" การร้องขอไปยังเครื่องแบ็กเอนด์บางเครื่อง

ฐานข้อมูลแบ็กเอนด์ที่ใช้ร่วมกันหรือที่เก็บคีย์ / ค่า : ข้อมูลเซสชั่นจะถูกเก็บไว้ในฐานข้อมูลแบ็กเอนด์ซึ่ง webservers ทั้งหมดสามารถเข้าถึงแบบสอบถามและอัปเดต เบราว์เซอร์ของผู้ใช้จัดเก็บคุกกี้ที่มีตัวระบุ (เช่นรหัสเซสชัน) โดยชี้ไปที่ข้อมูลเซสชัน นี่อาจเป็นวิธีที่สะอาดที่สุดในสามวิธีนี้:

  • ผู้ใช้ไม่จำเป็นต้องเปิดเผยข้อมูลเซสชันที่เก็บไว้
  • ผู้ใช้ไม่จำเป็นต้องกดปุ่มเครื่องเดียวกันในแต่ละครั้งดังนั้นจึงสามารถใช้การปรับสมดุลโหลด DNS ได้
  • ข้อเสียอย่างหนึ่งคือคอขวดที่สามารถใช้กับระบบจัดเก็บข้อมูลส่วนหลังได้
  • ข้อมูลเซสชันอาจหมดอายุและสำรองอย่างต่อเนื่อง

โดยรวมแล้วเว็บแอปพลิเคชั่นแบบไดนามิกส่วนใหญ่จะทำการค้นหาฐานข้อมูลจำนวนมากหรือการร้องขอที่เก็บคีย์ / ค่าดังนั้นฐานข้อมูลหรือที่เก็บคีย์ / ค่าจึงเป็นที่เก็บโลจิคัลของข้อมูลเซสชัน


2
+1 คำตอบที่ครอบคลุมอย่างเป็นธรรมและช่วยฉันเขียนมัน :) เท่าที่ที่จัดเก็บ db ไปฐานข้อมูลเชิงสัมพันธ์อาจเป็นสิ่งที่ผิด สิ่งที่คล้ายกับส้อม memcached หนึ่งในนั้นดีกว่า memcachedb อาจเหมาะสม คุณพลาดการจำลองข้อมูลเซสชันระหว่างเซิร์ฟเวอร์ มันไม่ใช่วิธีที่ดีที่สุด แต่สิ่งต่าง ๆ เช่น tomcat ทำได้ดังนั้นควรบันทึกไว้
David Pashley

Google, Twitter หรือ Facebook ใช้การอนุมัติแบบใด
Dannyboy

1
ไม่แน่ใจเกี่ยวกับ Google, Twitter หรือ Facebook แต่ Redis เหมาะสำหรับเซสชั่นสโตร์ โดยพื้นฐานแล้วมันเป็น "memcached ถาวร" David Pashley แนะนำในปี 2009 เมื่อ Redis เป็นตัวอ่อน
เบ็นอาร์

4

หากคำถามของคุณคือวิธีการรักษาเซสชันในเว็บเซิร์ฟเวอร์หลาย ๆ หน้าคำตอบคือโดยปกติแล้วจะใช้ฐานข้อมูลส่วนกลาง แทนที่จะอาศัยเว็บเซิร์ฟเวอร์อินสแตนซ์เพื่อติดตามไฟล์เซสชั่นในระบบไฟล์โลคอลคุณควรเขียนรหัสเซสชันและข้อมูลลงในฐานข้อมูลส่วนกลางและเว็บเซิร์ฟเวอร์ทั้งหมดจะดึงข้อมูลจากที่นั่นแทน


+1 สำหรับการกล่าวถึงฐานข้อมูลส่วนกลาง เพียงแค่ขยาย / ย่อความคิดเล็ก ๆ น้อย ๆ หากคุณตั้งค่าคุกกี้บนพีซีของผู้ใช้ด้วยสิ่งที่ไม่เหมือนใครเช่น ID ผู้ใช้ส่วนกลางคุณสามารถจัดเก็บ GUID นั้นในฐานข้อมูลได้ ไม่สำคัญว่าไคลเอ็นต์จะเชื่อมต่อกับเซิร์ฟเวอร์ใดตราบใดที่มี GUID / คุกกี้คุณจะสามารถค้นหาฐานข้อมูลและติดตามเซสชันได้
KPWINC

2
การจัดเก็บเซสชันในฐานข้อมูลเชิงสัมพันธ์เป็นความคิดที่ไม่ดีเสมอ คุณไม่ควรใช้ฐานข้อมูลเพื่อจัดเก็บข้อมูลชั่วคราว
David Pashley

2

การใช้ nemcached น่าจะเป็นทางออกที่ดีไม่ใช่ @David Pashley ที่ถูกกล่าวถึง

หมายความว่ามีอินสแตนซ์ memcached ระยะไกลที่ใช้ร่วมกันโดยเซิร์ฟเวอร์ทั้งหมดและใช้ส่วนขยาย memcache PECL ที่ให้ตัวจัดการเซสชั่นของตัวเอง

เพียงต้องการเปลี่ยนพารามิเตอร์สองตัวในการกำหนดค่า php!

นี่คือบทแนะนำที่ดีhttp://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/


แต่มีดาต้าเซ็นเตอร์หลายอันคืออะไร?
แดนนี่บอย

0

IIRC ใน DotNetRocks # 440 พวกเขากล่าวว่าเซิร์ฟเวอร์หนึ่งช่วงเวลา ไม่ทราบว่าเป็นกรณีนี้หรือไม่

แก้ไข: จริง ๆ แล้วมันเป็น Hanselminutes # ขอโทษ


0

คุณสามารถตั้งค่าคุกกี้

คุณสามารถคำนวณแฮชของรีโมต IP (ที่รีโมตโฮสต์ที่มีเลขคี่ที่ง่ายที่สุดไปที่เซิร์ฟเวอร์ A แม้แต่โฮสต์ที่กำหนดหมายเลขไปที่เซิร์ฟเวอร์ B)

ดูเหมือนว่าคุณสามารถทำได้ผ่านค่าบางค่าที่อยู่กับระบบต้นทางหากคุณใช้ช่องสัญญาณ ssl

โดยทั่วไปกลไกดังกล่าวข้างต้นต้องใช้เซิร์ฟเวอร์ "reverse proxy" หรือ load balancer ของบางประเภท ตัวโหลดบาลานซ์นั้นยอมรับทราฟฟิกแล้วนำไปยังเซิร์ฟเวอร์ใดก็ตามที่เริ่มเซสชันในครั้งแรกตามเกณฑ์ข้อใดข้อหนึ่งข้างต้น

ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย "การสำรวจ DNS"


0

a) คุณสามารถจัดเก็บข้อมูลเซสชันในคุกกี้ผู้ใช้ ดูไร้สัญชาติแข็งคุกกี้ที่ร้านค้าไม่มีข้อมูลที่ฝั่งเซิร์ฟเวอร์ แต่สถานะเซสชันรักษาhttp://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf b) คุณสามารถเปลี่ยนที่เก็บข้อมูลแบ็คเอนด์ของเซสชั่นเป็นฐานข้อมูลหรือ memcached ในการกำจัดจุดความล้มเหลวจุดเดียวคุณสามารถตั้งค่าการจำลองแบบฐานข้อมูลหรือหลายโหนด memcached หมายเหตุแนะนำว่า memcached ในการตั้งค่าเช่นนี้ซึ่งการสูญเสียสถานะผู้ใช้ในเซสชันไม่ใช่ข้อผิดพลาดใหญ่และไม่ทำให้เขามีความสุขมาก สำหรับกรณีที่สถานะการสงวนมีความสำคัญให้ใช้ฐานข้อมูล ทั้ง PHP, Django และ Rails ช่วยให้นักพัฒนาสามารถเขียนแบ็กเอนด์เซสชันที่กำหนดเองได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.