ก็ยังมีงานเก่าๆที่เป็นพวกจอเขียวๆ (พวก 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 คือ
- NAT (Network Address Translation)
packet ที่ส่งมาจะถูกแปลงเบอร์ IP address แล้วส่งต่อให้ real server
ส่วน packet ที่ real server ตอบ ก็จะต้องส่งผ่าน Director เพื่อแปลง IP Address กลับเป็นตัวเดิม - DR (Direct Routing)
packet ที่ส่งมาจะไม่ถูกแปลง แต่จะถูก forward ไปให้ real server เลย
เมื่อ real server ตอบ, packet ก็จะส่งกลับไปที่ client โดยตรง
Note: เพื่อให้ real server ยอมรับ packet ที่ forward มา (ซึ่งมี IP Address เป็น VIP)
ก็ต้องมีสร้าง hidden dummy interface) - 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 ไม่เจอ
No comments:
Post a Comment