Thursday, November 22, 2007

ทำความรู้จัก LVS

งานของผมนอกเหนือจากพัฒนา application ที่เป็น web แล้ว
ก็ยังมีงานเก่าๆที่เป็นพวกจอเขียวๆ (พวก terminal) อยู่ด้วย

ช่วงนี้มีโจทย์ที่ต้อง solve ก็คือ ต้องทำให้ telnel service นั้นมีคุณสมบัติ HA (High Availability)
ตัวเครื่องมือที่เลือกใช้ก็คือ LVS (Linux Virtual Service)
ซึ่ง support service ที่ run อยู่บน TCP หรือ UDP
ตัว LVS จัดได้ว่าเป็น Layer 4 Switching

คำศัพท์เบื้องต้น

  • Director คือเครื่องที่ทำหน้าที่รับ packet จาก client และ forward ต่อให้ Real Server

  • Real Server คือเครื่องที่ทำหน้าที่ให้บริการจริง

  • Virtual IP Address (VIP) คือ IP ที่ client ใช้ติดต่อ service

  • Real IP Address (RIP) คือ IP ของ Real Server




รูปแบบการ config LVS แบ่งออกเป็น 3 ประเภทตามลักษณะการ forward packet คือ
  1. NAT (Network Address Translation)
    packet ที่ส่งมาจะถูกแปลงเบอร์ IP address แล้วส่งต่อให้ real server
    ส่วน packet ที่ real server ตอบ ก็จะต้องส่งผ่าน Director เพื่อแปลง IP Address กลับเป็นตัวเดิม
  2. DR (Direct Routing)
    packet ที่ส่งมาจะไม่ถูกแปลง แต่จะถูก forward ไปให้ real server เลย
    เมื่อ real server ตอบ, packet ก็จะส่งกลับไปที่ client โดยตรง
    Note: เพื่อให้ real server ยอมรับ packet ที่ forward มา (ซึ่งมี IP Address เป็น VIP)
    ก็ต้องมีสร้าง hidden dummy interface)
  3. IP-IP Encapsulation (Tunnelling)
    คล้ายๆ direct routing แต่ packet ที่ถูก forward จะถูกห่อก่อนจะส่งไปให้ real server
    เพื่อที่จะได้ส่งข้ามวง network ได้


concept ที่สำคัญอันหนึ่งของ LVS ก็คือ Scheduling
หรือการจัดสรร request แจกให้กับ real server
ซึ่งมี algorithm ให้เลือกเยอะเลย เช่น

  • Least-Connection (lc): Allocate connections to the real-server with the least number of connections.

  • Weighted Least-Connection (wlc):

  • Weighted version of Least-Connection.

  • Round-Robin (rr): Place the real-servers in a circular list and allocate connections to each real-server in turn.

  • Weighted Round-Robin (wrr): Weighted version of rount-robin.

  • Locality-Bassed Least-Connection (lblc): Try to assign connections addressed to the same IP address to the same real-server. This is frequently used in conjunction with transparent http proxy services.

  • Locality-Based Least-Connection with Replication (lblcr): Variation of Locality-Bassed Least-Connection that allows a pool of servers for a given destination IP address to be maintained in sutiations of high load.

  • Destination-Hashing (dh): Use a static hash of the destination IP address to allocate connections.

  • Source-Hashing (sh): Similar to Destination-Hashing, but the source IP address is hashed.

  • Shortest Expected Delay (sed): Allocate connections to the server that will service the request with the shortest expected delay.

  • Never Queue (nq): Allocate a connections to a idle real-servers if there are any, else use the Shortest Expected Delay altgorithm.


ที่ผมชอบก็คือ เราสามารถ config น้ำหนัก(weight) ให้กับแต่ละ server ได้
ทำให้เรา mix real server ระหว่างเครื่อง performance ดี กับเครื่องปกติได้

การใช้ LVS อย่างเดียว ไม่สามารถทำ HA ได้
เนื่องจากเราต้องเตรียมเครื่อง Director ไว้มากกว่า 1 เครื่อง
ทำให้เราต้องใช้ Heartbeat เข้ามาช่วย config ว่า
ถ้าเครื่อง director เครื่องหลักตาย เครื่องสำรองต้องเข้ามา take over งานไปทำ

นอกจากนั้นยังมีประเด็นที่ Director ยังต้องสามารถ monitor เครื่อง Real server ด้วย
ถ้า real server ตายไป จะได้จัดการปรับปรุง route table ของตัวเอง ไม่ให้แจกงานไปที่ server ตัวนั้นอีก
กรณีนี้ผมเลือกใช้ Ldirectord

เนื่องจาก service ที่ผมจะ implement คือ telnet service
ที่มีธรรมชาติที่เปิด connection ค้างไว้ตลอด
กรณีที่ Director down ไป จะทำให้ session ของ user หลุดหมด
เพื่อแก้ปัญหานี้ ก็ต้องเลือกใช้ Connection Synchronisation
โดยการระบุให้เครื่องหลักเป็น master และเครื่องสำรองเป็น backup

default synchronization model ของ LVS เป็นแบบ master-slave ซึ่งจะมีปัญหาตามมาว่า
ถ้าเครื่องหลักมัน up ขึ้นมาอีกครั้ง การส่งข้อมูล routing table กลับจะทำอย่างไร
สำหรับกรณีนี้มีคน implement model การ synchronization แบบ peer-to-peer ขึ้นมา
ซึ่งผมเห็นแต่ในเอกสาร แต่ยังหา source ไม่เจอ

Related link from Roti

Sunday, November 18, 2007

ความผิดพลาด

ผมชอบที่อาจารย์สกล เขียนไว้ในนี้ Link

ความผิดพลาดนั้นเป็นของควบคู่กับงาน แต่ความผิดพลาดของหมอกับของครูนั้น มีความรุนแรงเหมือนกันอยู่อย่างนึง ของหมอนั้น ความผิดพลาดมักจะไปลงเอยหลายที่ หน้าหนังสือพิมพ์ website ปาฐกถา บรรยาย small group, etc และเป็นเรื่องของความเป็น ความตาย หรือ พิการ ส่วนความผิดพลาดของครูนั้น อาจจะหมายถึงชาติกำเนิดและการพัฒนาจิตที่บิดเบี้ยว เสียรูปร่างอย่างแรง และกรอบการเติบโตอันคับแคบ อับจนปัญญา ไร้ความคิดคะนึงหา ติดกับดักวิญญาณ การใช้ชีวิตที่ไม่เต็มสมศักยภาพของตนเอง

Related link from Roti